Konsultacje:
czwartek 10-12Adres:
Instytut Informatyki31 stycznia 2012 r.
Termin konsultacji z ANSI C:
W najbliższą środę 1.02.2012 w godzinach 11-12 będę odbierał projekty końcowe z ANSI C a potem o 13-14 będę wpisywał oceny zaliczeniowe.
24 stycznia 2012 r.
Termin konsultacji z ANSI C:
W najbliższą środę 25.01.2012 w godzinach 12-14 będę odbierał projekty końcowe z ANSI C.
18 stycznia 2012 r.
Termin laboratorium dla grupy piątkowej PRz:
W najbliższy piątek 20.01.2012 potrzebuję wyjść wcześniej z Instytutu, dlatego chciałbym trochę przesunąć zajęcia - odbyłyby się one w godzinach 8:30-10:00. Dodatkowo będę miał w czwartek popołudniu konsultacje (w godzinach 15:15-17:00).
18 grudnia 2011 r.
Dodatkowe laboratorium dla grupy piątkowej PRz:
Dodatkowe laboratorium dla mojej grupy piątkowej odbędzie się w środę 21 grudnia o godzinie 11 w sali 110. Laboratorium to będzie poświęcone wyborowi tematu projektu programistycznego i wymagań dotyczących jego realizacji.
28 listopada 2011 r.
Lista 7:
Skorygowałem punktację zadań z listy 7. Szczegóły dotyczące tej korekty wytłumaczę na najbliższych zajęciach.
9 listopada 2011 r.
Lista 6 - zadanie domowe:
Przeniosłem zadanie 2 z listy 6 do zadań domowych.
19 października 2011 r.
Lista 3 - zadanie domowe:
Przeniosłem zadanie 2 z listy 3 do zadań domowych.
17 października 2011 r.
Literatura elektroniczna do języka C:
Dopisałem kilka nowych linków do elektronicznej, anglojęzycznej literatury o programowaniu w języku C i bibliotekach standardowych.
5 października 2011 r.
Zapisy do Moodla:
Proszę wszystkich moich studentów o jak najszybsze zapisanie się na kurs ANSI C w Moodlu. Dopiero wtedy będę mógł Was przypisać do grup a Wy będziecie mogli wysyłać programy.
29 września 2011 r.
Pierwsze laboratorium:
Pierwsze laboratorium odbędzie się w zaplanowanym terminie. Przetestujemy na nim środowisko programistyczne Code::Blocks, oraz wysyłanie programów na Moodle.
28 września 2011 r.
Punkt informacyjny:
W tym miejscu będą umieszczene informacje dotyczące organizacji zajęć w moich grupach. Proszę zaglądać do ogłoszń co najmniej raz w tygodniu przed laboratorium.
Język C to jeden z najbardziej rozpowszechnionych imperatywnych języków programowania. Celem tych zajęć jest nauka programowania w języku ANSI C (standard C99). Studium języka C ułatwia start w naturalną ich kontynuację, do której obecnie zaliczają się ważne z komercyjnego punktu widzenia języki C++, C# oraz Java.
Literatura papierowa polskojęzyczna:
Literatura papierowa anglojęzyczna:
Literatura elektroniczna polskojęzyczna:
Literatura elektroniczna anglojęzyczna:
Zadanie 1 (laboratoryjne).
Uruchom Code::Blocks (ewentualnie Dev C++), a następnie
przepisz, skompiluj i wykonaj wszystkie programy prezentowane na pierwszym wykładzie.
Zadanie 2 (domowe).
Napisz program, który wczyta liczbę całkowitą, a następnie sprawdzi czy jest ona liczbą pierwszą.
Gdy wczytana liczba jest pierwsza, program ma wypisać 1, w przeciwnym przypadku wartość 0.
Przykład 1:
dla wczylanej liczby 51 program powinien wypisać:
0
Przykład 2:
dla wczylanej liczby 61 program powinien wypisać:
1
Zadanie 1 (10 punktów).
Napisz program, który wczytuje liczbę rzeczywistą oznaczającą odległość
pomiędzy dwoma punktami mierzona w metrach.
Oblicz i wypisz, ile wynosi ta odległość w calach i stopach.
Wypisz wyniki z dokładnością do 3 miejsc po kropce dziesiętnej.
Uwaga!
W swoim programie zdefiniuj odpowiednie stałe symboliczne o wartościach
0.0253995 (do przeliczania na cale) i 0.304794 (do przeliczania na stopy)
za pomocą dyrektywy #define i wykorzystaj je do bliczeń.
Zadanie 2 (10 punktów).
Napisz program, który wczyta trzy dodatnie liczby rzeczywiste będące
długościami boków trójkąta.
Najpierw sprawdź, czy wczytane liczby mogą być długościami boków w trójkącie -
jeśli nie, to natychmiast zakończ działanie programu.
Program ma wyliczyć i wypisać powierzchnię tego trójkąta z dokładnością do
2 miejsc po kropce dziesiętnej.
Uwaga!
Skorzystaj ze wzoru Herona.
Zadanie 1 (10 punktów).
Napisz program, który wczytuje liczbę rzeczywistą oznaczającą temperaturę
mierzoną w stopniach Celsjusza.
Oblicz i wypisz, ile wynosi ta temperatura w stopniach Fahrenheita,
Kelwina i Rankina.
Wypisz wyniki z dokładnością do 2 miejsc po kropce dziesiętnej.
Uwaga!
W swoim programie zdefiniuj odpowiednie stałe symboliczne o wartościach
273.15 (do przeliczania na stopnie Kelwina) i 459.67 (do przeliczania
na stopnie Rankina) za pomocą dyrektywy #define i wykorzystaj je do
bliczeń.
Zadanie 2 (10 punktów).
Napisz program, który wczyta trzy dodatnie liczby rzeczywiste będące
długościami boków trójkąta.
Najpierw sprawdź, czy wczytane liczby mogą być długościami boków w trójkącie -
jeśli nie, to natychmiast zakończ działanie programu.
Program ma wyliczyć i wypisać kosinusy wszystkich kątów w tym trójkącie z dokładnością
do 4 miejsc po kropce dziesiętnej.
Uwaga!
Skorzystaj z twierdzenia cosinusów dla dowolnego trójkąta.
Zadanie 3 (10 punktów).
Napisz program, który wczyta współrzędne rzeczywiste dwóch punktów na
płaszczyźnie A=(x1,y1)
i B=(x2,y2), które są końcami pewnego odcinka.
Program ma wypisać współrzędne punktów przecięcia odcinka AB z osią
OX i z osią OY (o ile takie punkty istnieją).
Współrzędne punktów przecięcia wypisz z dokładnością do 2 miejsc po kropce
dziesiętnej.
Uwaga!
Program nie powinien wypisać dwa razy tego samgo punktu (chodzi o początek
układu współrzędnych (0,0)).
Przykład 1:
dla punktów (-2,1) i (6,3) program powinien wypisać:
(0.00, 1.50)
Przykład 2:
dla punktów (-2,1) i (6,-3) program powinien wypisać:
(0.00, 0.00)
Przykład 3:
dla punktów (-2,1) i (-6,3) program nie powinien nic
wypisać.
Przykład 4:
dla punktów (-2,1) i (0,-1) program powinien wypisać:
(-1.00, 0.00)
(0.00, -1.00)
Zadanie 1 (10 punktów).
Napisz program, który wypisze w słupku kolejne potęgi 2 zaczynając
od 20 a kończąc na 260.
Cyfry jedności mają się znajdować w tej samej kolumnie dla wszystkich
wypisywanych liczbach.
Wskazówka.
Użyj typu long long; znacznik konwersji dla tego typu danych ma
postać %lld we wzorcu w funkcji printf().
Zadanie 2 (10 punktów).
Napisz program, który wydrukuje w estetyczny sposób tabelę z kodami dla
znaków ASCII.
Należy wypisać kod znaku najpierw w postaci dziesiętnej (na 3 pozycjach),
potem szesnastkowej (na 2 pozycjach) a na końcu sam znak.
Program powinien wydrukować tabelę tylko dla znaków o kodach od 32 do 126.
Znaki należy wydrukować w taki sposób, aby kolejność ich kodów była
uporządkowana kolumnami.
Tabela ma się składać z 6 kolumn (16 wierszy), przy czym ostania kolumna
będzie niepełna.
Uwaga!
Kolumny mają być odseparowane tylko za pomocą spacji.
Zadanie 1 (10 punktów).
Napisz program, który wypisze w słupku kolejne potęgi 2 zaczynając
od 2-1 a kończąc na 2-60.
Kropki dziesiętne mają się znajdować w tej samej kolumnie dla wszystkich
wypisywanych liczb.
Nie wolno wypisywać nieznaczących zer pojawiających się na końcu liczby.
Wskazówka.
Użyj znaku * w znaczniku konwersji we wzorcu w funkcji printf().
Zadanie 2 (10 punktów).
Napisz program, który wydrukuje w estetyczny sposób tabelę z kodami dla
znaków ASCII.
Należy wypisać kod znaku najpierw w postaci dziesiętnej (na 3 pozycjach),
potem szesnastkowej (na 2 pozycjach) a na końcu sam znak.
Program powinien wydrukować tabelę tylko dla znaków o kodach od 32 do 126.
Znaki należy wydrukować w taki sposób, aby kolejność ich kodów była
uporządkowana kolumnami.
Tabela ma się składać z 4 kolumn (24 wiersze), przy czym ostania kolumna
będzie niepełna.
Uwaga!
Kolumny mają być odseparowane tylko za pomocą spacji.
Zadanie 3 (10 punktów).
Napisz program, który wczyta liczbę naturalną n a potem wydrukuje
na standardowym wyjściu romb (taki jak karo w kartach), używając
tylko spacji i gwiazdek.
Wszystkie boki rombu mają być równe i mają składać się z n gwiazdek.
Przykład:
Dla n=5 program powinien wydrukować na ekranie następującą figurę:
*
* *
* *
* *
* *
* *
* *
* *
*
Uwaga!
Twój program powinien sobie poradzić z przypadkiem, gdy n=1.
Zadanie 1 (10 punktów).
Napisz program, który przepisze tekst ze standardowego wejścia na standardowe
wyjście, i który w trakcie działania przytnie długie linie do k
znaków (liczba k ma być zadana przez argument wywołania programu).
Dodatkowo program ma skompresować bloki odstępów (spacje i tabulacje)
występujące w linii do pojedynczej spacji oraz pomijać odstępy występujące na
końcu linii.
Zadanie 1 (10 punktów).
Napisz program, który przepisze tekst ze standardowego wejścia na standardowe
wyjście, i który w trakcie działania przytnie długie linie do k
znaków (liczba k ma być zadana przez argument wywołania programu).
Dodatkowo program ma usunąć znaki odstępów (spacje i tabulacje) występujące
na końcu przygotowanej do wypisania linii oraz pomijać linie puste.
Zadanie 2 (10 punktów).
Napisz program, który odczyta standardowe wejście linia po linii, aż
do napotkania symbolu EOF.
Każdą z linii należy umieścić w tablicy znakowej i sprawdzić, czy zawiera
ona poprawnie zapisany identyfikator (taki jak w języku C).
Identyfikator to ciąg znaków składający się z małych lub dużych liter
alfabetu angielskiego, cyfr dziesiętnych i znaku podkreślenia
'_'; identyfikator nie rozpoczyna się od cyfry.
Do sprawdzenia poprawności danych zdefiniuj własną funkcję.
Jeśli napis zawiera identyfikator, to wypisz go na standardowym wyjściu,
w przeciwnym przypadku wypisz linię pustą.
Uwaga!
Zakładamy, że długość żadnej z linii nie przekracza 79 znaków - można więc
użyć 80-znakowego bufora.
Zadanie 3 (10 punktów).
Napisz program, który przeczyta ze standardowego wejścia wszystkie znaki,
aż do napotkania symbolu EOF.
Na końcu program powinien wypisać na standardowym wyjściu statystykę
dotycząca wczytanego tekstu: ile było wszystkich przeczytanych
znaków, z ilu linii składał się tekst, z ilu słów (pooddzielanych odstępami)
oraz ile w tym tekście wystąpiło liter, cyfr i znaków przestankowych (kropek,
przecinków, dwukrpków, średników, pytajników, wykrzykników i myślników).
Zadanie 1 (10 punktów).
Napisz program, który wczyta liczbę naturalną n, potem n
liczb rzeczywistych, umieszczając je w automatycznie utworzonej tablicy.
Następnie program ma obliczyć i wypisać sumę i iloczyn tych liczb.
Do wyliczenia sumy i iloczynu zdefiniuj osobne funkcje.
Ich deklaracje umieść na początku programu źródłowego.
Uwaga!
Program powinien sprawdzić, czy wszystkie liczby zostały poprawnie wczytane.
Zadanie 2 (10 punktów).
Napisz program, który dla zadanych liczb naturalnych p i q
wyliczy i wypisze ich najwięszy wspólny dzielnik i najmniejszą wspólną
wielokrotność.
Liczby p i q niech będą zadane poprzez argumenty wywołania
programu.
Do wyliczenia najwięszego wspólnego dzielnika zdefiniuj funkcję rekurencyjną,
implementującą algorytm Euklidesa.
Jej deklarację umieść na początku programu źródłowego.
Uwaga!
Program powinien sprawdzić, czy został wywołany z poprawnymi parametrami.
Zadanie 1 (10 punktów).
Napisz program, który wczyta liczbę naturalną n, potem n
liczb rzeczywistych, umieszczając je w automatycznie utworzonej tablicy.
Następnie program ma obliczyć i wypisać średnią arytmetyczną i odchylenie
standardowe dla tych liczb.
Do wyliczenia średniej arytmetycznej i odchylenia standardowego zdefiniuj
osobne funkcje.
Ich deklaracje umieść na początku programu źródłowego.
Uwaga!
Program powinien sprawdzić, czy wszystkie liczby zostały poprawnie wczytane.
Zadanie 2 (10 punktów).
Napisz program, który zadaną liczbę całkowitą r wypisze w postaci
binarnej.
Liczba r niech będzie zadana poprzez argumenty wywołania programu.
Do wypisania liczby w postaci binarnej zdefiniuj funkcję rekurencyjną, która
zapisze ją we wskazanym strumieniu.
Funkcja ta ma sobie radzić również z liczbami ujemnymi, wypisując na
początku znak minusa.
Jej deklarację umieść na początku programu źródłowego.
Uwaga!
Program powinien sprawdzić, czy został wywołany z poprawnymi parametrami.
Zadanie 3 (10 punktów).
Napisz program, który dla zadanych liczb naturalnych n i k
wyliczy i wypisze dwa razy wartość symbolu Newtona
(nk).
Liczby n i k niech będą zadane poprzez argumenty wywołania
programu.
Do wyliczenia symbolu Newtona zdefiniuj dwie funkcje rekurencyjne, które będą
liczyć to samo ale w inny sposób.
Ich deklaracje umieść na początku programu źródłowego.
Pierwszy sposób wyliczenia symbolu Newtona ma być bezpośrednią implementacją
definicji:
(n0) = (nn) = 1
dla n≥0
(nk) =
(n-1k-1) + (n-1k)
dla 0<k<n
Drugi sposób ma być implementacją wzoru przekształconego do postaci:
(n0) = (nn) = 1
dla n≥0
(nk) = (n-1k-1)·n/k
dla 0<k<n
Uwaga!
Program powinien sprawdzić, czy został wywołany z poprawnymi parametrami.
Zadanie 1 (10 punktów).
Napisz program, który wczyta datę w postaci dd.mm.rrrr i sprawdzi
czy podany rok jest przestępny.
Program ma najpierw wczytać ze standardowego wejścia datę, następnie sprawdzić
czy czytanie przebiegło prawidłowo a na koniec wypisać na standardowym wyjściu
informację o przestępności roku.
Uwaga!
Do testowania przestępności zdefiniuj osobną funkcję, która zwróci 1 gdy rok
jest przestępny albo 0 gdy nie jest przestępny:
int przestepny (int rok);
Zadanie 2 (10 punktów).
Napisz program, który wczyta datę w postaci dd.mm.rrrr i sprawdzi
czy podana data jest prawidłowa w kalendarzu Gregoriańskim.
Program ma najpierw wczytać datę a następnie sprawdzić i wypisać informację
o tym, czy podana data jest prawidłowa (miesiąc z zakresu 1...12, dzień
z zakresu 1...28/29/30/31 w zależności od miesiąca i roku oraz nieujemny rok).
Należy wziąć pod uwagę fakt, że kalendarz Gregoriański obowiązuje od
15 października 1582 roku.
Uwaga!
Do sprawdzenia poprawności daty zdefiniuj osobną funkcję, która odpowie
wartością 1 gdy data jest poprawna albo wartością 0 w przeciwnym przypadku:
int poprawna (int dz, int mies, int rok);
Do obliczeń wykorzystaj statyczną dwuwymiarową tablicę
dniWMiesiacu[2][13], w której będą zapisane liczby dni
w poszczególnych miesiącach - osobno dla lat zwykłych i przestępnych.
Do tablicy tej powinieneś się odwoływać w nastepujacy sposób:
dniWMiesiacu[przestepny(rok)][mies]
Zdefiniuj i wykorzystaj funkcję, która porówna ze sobą dwie daty:
int wczesniejsza (int d1, int m1, int r1, int d2, int m2, int r2);
Zadanie 1 (10 punktów).
Napisz program, który wczyta datę w postaci dd.mm.rrrr i sprawdzi
czy podany rok jest przestępny.
Program ma najpierw wczytać ze standardowego wejścia datę, następnie sprawdzić
czy czytanie przebiegło prawidłowo a na koniec wypisać na standardowym wyjściu
informację o przestępności roku.
Uwaga!
Do testowania przestępności zdefiniuj osobną funkcję, która zwróci 1 gdy rok
jest przestępny albo 0 gdy nie jest przestępny:
int przestepny (int rok);
Zadanie 2 (10 punktów).
Napisz program, który wczyta datę w postaci dd.mm.rrrr i wyliczy ile
dni upłynęło od początku roku i ile dni pozostało do Sylwestra.
Program ma najpierw wczytać datę, potem sprawdzić czy jest ona prawidłowa
w kalendarzu Gregoriańskim (miesiąc z zakresu 1...12, dzień
z zakresu 1...28/29/30/31 w zależności od miesiąca i roku oraz nieujemny rok)
a na koniec wyliczyć i wypisać, który to jest dzień w zadanym roku (licząc
od 1 stycznia do podanedo dnia włącznie) oraz ile dni pozostało do końca roku
(od podanego dnia do 31 grudnia).
Uwaga!
Do sprawdzenia poprawności daty zdefiniuj osobną funkcję, która odpowie
wartością 1 gdy data jest poprawna albo wartością 0 w przeciwnym przypadku:
int poprawna (int dz, int mies, int rok);
Do wyliczenia liczby dni jakie upłynęły od początku roku do zadanego dnia
zdefiniuj osobne funkcje pomocnicze:
int od1stycznia (int dz, int mies, int rok);
int do31grudnia (int dz, int mies, int rok);
Do obliczeń wykorzystaj statyczną dwuwymiarową tablicę
dniWMiesiacu[2][13], w której będą zapisane liczby dni
w poszczególnych miesiącach - osobno dla lat zwykłych i przestępnych.
Do tablicy tej powinieneś się odwoływać w nastepujacy sposób:
dniWMiesiacu[przestepny(rok)][mies]
Możesz też potrzebować tablicy, która będzie przechowywać sumy częściowe dni
w poszczególnych miesiącach sumaDniWMiesiacach[2][13] licząc od
początku roku.
Zadanie 3 (10 punktów).
Napisz program, który wczyta datę w postaci dd.mm.rrrr i wypisze
jaki to dzień tygodnia.
Program powinien najpierw sprawdzić czy podana data jest prawidłową datą
w kalendarzu Gregoriańskim (kalendarz Gregoriański obowiązuje od
15 października 1582 roku).
Uwaga 1!
Program powinien korzystać z tablicy napisów z nazwami dnia tygodnia.
Uwaga 2!
Aby wyliczyć dzień tygodnia użyj funkcji, która wyliczy ile dni upłynęło od
wirtualnej daty 1 stycznia 1 roku (otrzymaną wartość podziel modulo
7):
int od1roku (int dz, int mies, int rok);
Funkcja ta może wykonać obliczenia bez używania pętli, korzystając
z zasady włączeń i wyłączeń.
Zadanie 1 (10 punktów).
Napisz program, który odczyta linię tekstu ze standardowego wejścia
i sprawdzi, czy zawiera ona palindrom.
Twój program nie powinien rozróżniać małych i wielkich liter, za to
powinien pomijać odstępy.
Uwaga!
Zakładamy, że długość każdej linii nie przekracza 79 znaków.
Użyj więc 80-znakowego bufora i funkcji fgets() do czytania danych
ze standardowego wejścia oraz funkcji fputs() do wypisywania wyników.
Wyjaśnienie.
Palindrom to napis, który ma to samo znaczenie niezależnie od tego, czy
czytamy go normalnie czy wspak.
Przykładowe znane palindromy w języku polskim to: kajak,
Anna, kobyła ma mały bok, Zakopane na pokaz,
może jutro ta Dama da tortu jeżom.
Zadanie 1 (10 punktów).
Napisz program, który odczyta standarowe wejście linia po linii, każdą
odczytaną linię zaszyfruje szyfrem Cezara i wypisze ją na
standardowym wyjściu.
Przesunięcie wykorzystywane w szyfrowaniu określ za pomocą argumentu wywołania
programu.
Szyfrowaniu mają podlegać tylko litery i cyfry.
Uwaga!
Zakładamy, że długość każdej linii nie przekracza 79 znaków.
Użyj więc 80-znakowego bufora i funkcji fgets() do czytania danych
ze standardowego wejścia oraz funkcji fputs() do wypisywania wyników.
Wyjaśnienie.
Jeden z najstarszych sposobów szyfrowania pochodzi od Juliusza Cezara, który
szyfrował swoją korespondencję z Cyceronem.
Sposób ten polegał na tym, że zamiast każdej litery pisał literę występującą
w alfabecie trzy miejsca dalej.
Zadanie 2 (10 punktów).
Napisz program, który wczyta liczbę rzeczywistą x>0 i liczbę
całkowitą k>1 a następnie stablicuje wartości
pi dla i=0...k-1 określone następującym wzorem
rekurencyjnym:
p0 = 1
pi = (x/pi-1+pi-1)/2 : i>0
Na zakończenie program powinien wypisać pierwiastek kwadratowy z x
(użyj funkcji sqrt() z biblioteki standardowej do wyznaczenia
pierwiastka) i dalej w dwóch kolumnach następujące zestawienie:
w pierwszej kolumnie wartości pi a w drugiej
różnicę pomiędzy pi a pierwiastkiem kwadratowym
z x z dokładnością do 12 miejsc po kropce dziesiętnej.
Uwaga!
Tablica z wyliczonymi wartościami pi powinna być
automatycznie utworzona na stosie i zawierać dokładnie k komórek.
Zadanie 3 (10 punktów).
Napisz program, który liczby całkowite typu unsigned long
przekazane do programu poprzez argumenty wywołania wypisze w postaci słownej.
Program powinien korzystać z tablic liczebników:
char *JEDNO[] = {””, ”jeden”, ”dwa”, ”trzy”, ..., ”osiemnascie”, ”dziewietnascie”};
char *DZIES[] = {””, ”dziesiec”, ”dwadziescia”, ... , ”osiemdziesiat”, ”dziewiecdziesiat”};
char *SETKI[] = {””, ”sto”, ”dwiescie”, ”trzysta”, ... , ”osiemset”, ”dziewiecset”};
W swoim programie zdefiniuj i wykorzystaj funkcję, która przekształci liczbę
na napis, umieszczając wynik w zewnętrznym buforze.
void konwersja (int x, char buf[]);
Liczebniki tysiąc, milion i miliard (oraz następne) same dają się liczyć
z użyciem mnożnej tak jak zwykłe rzeczowniki (konstrukcja z mianownikiem
l.~mn.~występuje przy mnożnych zakończonych na 2, 3, 4 z wyjątkiem
zakończonych na 12, 13, 14 a konstrukcja z dopełniaczem l.~mn.~obowiązuje
we wszystkich pozostałych przypadkach).
Zadbaj o to, by w liczebnikach większych od 999 użyć właściwej deklinacji
(miliard (-y,-ów), milion (-y,-ów), tysiąc (-e,tysięcy), lub brak tekstu).
Posłuż się tablicą:
char *MMT[][4] = { {””, ”miliard”, ”miliardy”, ”miliardow”},
{””, ”milion”, ”miliony”, ”milionow”},
{””, ”tysiac”, ”tysiace”, ”tysiecy”},
{””, ””, ””, ””} };
Uwaga 1!
Program ma poprawnie działać także dla wartości 0.
Uwaga 2!
Pomiędzy poszczególnymi liczebnikami powinny się znajdować pojedyncze odstępy.
Zadanie 1 (10 punktów).
Dość często potrzebujemy ustawiać lub sprawdzać wartości pojedynczych bitów
w słowie typu int lub unsigned int.
Zdefiniuj dwie funkcje: jedną do odczytywania wartości określonego bitu
w słowie (funkcja ma zwracać wartość 0 lub 1), a drugą do ustawiania
wartości określonego bitu (funkcja ma ustawić bit na 1 tylko wtedy, gdy
parametr ma wartość różną od 0):
int jakiBit (char *tablica, unsigned int nrBitu);
void ustawBit (char *tablica, unsigned int nrBitu, int wartosc);
Przy programowaniu tych funkcji skorzystaj z operatorów bitowych.
Na koniec przetestuj działanie obu funkcji.
Zadanie 3 (10 punktów).
Zdefiniuj unię, która będzie zawierała pole typu int oraz pole
będące tablicą znakową char[sizeof(int)].
Następnie napisz krótki program testowy, który w nieskończonej pętli będzie
wczytywał liczbę całkowitą typu int, umieszczał ją w unii a następnie
wypisywał kolejne bity reprezentujące tą liczbę (korzystając tablicy znakowej
w tej unii oraz z funkcji z poprzedniej części zadania).
Sprawdź za pomocą tego programu, czy na twoim komputerze są zapisywane
w systemie little-endian czy big-endian (uzasadnij swoją
opinię).
Przy wypisywaniu kolejnych bitów liczby skorzystaj z funkcji zdefiniowanych
w zadaniu 1.
Zadanie 1 (10 punktów).
Dość często potrzebujemy ustawiać lub sprawdzać wartości pojedynczych bitów
w słowie typu int lub unsigned int.
Zdefiniuj dwie funkcje: jedną do odczytywania wartości określonego bitu
w słowie (funkcja ma zwracać wartość 0 lub 1), a drugą do ustawiania
wartości określonego bitu (funkcja ma ustawić bit na 1 tylko wtedy, gdy
parametr ma wartość różną od 0):
int jakiBit (char *tablica, unsigned int nrBitu);
void ustawBit (char *tablica, unsigned int nrBitu, int wartosc);
Przy programowaniu tych funkcji skorzystaj z operatorów bitowych.
Na koniec przetestuj działanie obu funkcji.
Zadanie 3 (10 punktów).
Zdefiniuj unię, która będzie zawierała pole typu float oraz pole
będące tablicą znakową char[sizeof(float)].
Następnie napisz krótki program testowy, który w nieskończonej pętli będzie
wczytywał liczbę rzeczywistą typu float, umieszczał ją w unii
a następnie wypisywał kolejne bity reprezentujące tą liczbę (korzystając
tablicy znakowej w tej unii oraz z funkcji z poprzedniej części zadania)
- oddziel spacją znak od cechy i cechę od mantysy.
Sprawdź za pomocą tego programu, jak jest obliczana kodowana w liczbach
zmiennopozycyjnych typu float.
Przy wypisywaniu kolejnych bitów liczby skorzystaj z funkcji zdefiniowanych
w zadaniu 1.
Wskazówka.
Liczba rzeczywista typu float w standardzie IEEE-754 ma 23
najmniej znaczące bity przeznaczone na zapamiętanie mantysy, potem
jest 8 bitów cechy i 1 najbardziej znaczący bit to znak.
Mantysa to liczba stałopozycyjna z przedziału [1,2) ale w 23-bitowym polu
mantysy pamiętana jest tylko część ułamkowa.
Zadanie 2 (10 punktów).
Zdefiniuj strukturę z polami bitowymi do zapamiętywania godziny (5 bitów na
godziny, 6 bitów na minuty i 6 bitów na sekundy).
Napisz też funkcję, która podane wartości typu unsigned int
reprezentujące określoną godzinę upakuje do pola bitowego:
godzina upakuj (int g, int m, int s);
Potem zdefiniuj strukturę opisująca rozmowę telefoniczną: numer dzwoniącego,
numer odbierającego oraz godzina rozpoczęcia i zakończenia rozmowy
(skorzystaj ze struktury godzina z polami bitowymi do pamiętania
czasu).
typedef struct { /*...*/ } polaczenie;
Następnie napisz program, który dla wczyta ze standardowego wejścia liczbę
całkowitą n>0 oznaczającą ilość rozmów, potem utworzy
automatyczną n-elementową tablicę struktur i wczyta do niej
informacje o n rozmowach telefonicznych prowadzonych w jakimś dniu
za pośrednictwem pewnej centrali.
Na koniec program powinien najpierw wypisać połączenia od najdłuższego do
najkrótszego a potem obliczyć i wypisać średnią długość połączeń
telefonicznych w danym dniu (liczoną w sekundach z dokładnościa do 2 miejść
po kropce dziesiętnej).
Do sortowania połączeń telefonicznych użyj funkcji qsort()
z biblioteki standardowej.
Zadanie 1 (15 punktów).
Część A
Zdefiniuj strukturę reprezentującą węzeł listy jednokierunkowej struct
element, w której będzie pole nast wskazujące na następny
element na liście oraz pole wartosc przechowujące pewną wartość typu
TYP (nazwę TYP zdefiniuj za pomocą dyrektywy
#define):
typedef struct element {
TYP wartosc;
struct element *nast;
} wezel;
Oprócz struktury zadeklaruj i zdefiniuj funkcje wstaw_na_pocz()
(wstawienie nowego elementu na początek listy), wstaw_na_kon()
(wstawienie nowego elementu na koniec listy), ile() (policzenie
ile jest elementów na liście) oraz wypisz() (wypisanie kolejno
wszystkich wartości zapamiętanych w liście).
Pierwszym argumentem tych funkcji powinien być wskaźnik na początek listy.
Część B
Napisz program testujący zaprogramowaną przez Ciebie listę.
Program ma działać interaktywnie w pętli, czyli realizować wydawane na konsoli
polecenia do czasu, aż zostanie wydane polecenie kończące działanie programu.
Część C
Uzupełnij wcześniejszy program o możliwość usunięcia z listy elementu
na zadanej pozycji funkcją usun_z_pozycji(), sprawdzenia gdzie
w liście znajduje się element o zadanej wartości funkcją
szukaj_wartosci() oraz sprawdzenia jaka wartość znajduje się na
zadanej pozycji w liście funkcją sprawdz_pozycje().
Zmodyfikuj program testowy tak, aby uzwględniał wymienione funkcje.
Zadanie 1 (15 punktów).
Część A
Zdefiniuj strukturę reprezentującą węzeł listy jednokierunkowej struct
element, w której będzie pole nast wskazujące na następny
element na liście oraz pole wartosc przechowujące pewną wartość typu
TYP (nazwę TYP zdefiniuj za pomocą dyrektywy
#define):
typedef struct element {
TYP wartosc;
struct element *nast;
} wezel;
Oprócz struktury zadeklaruj i zdefiniuj funkcje wstaw() wstawiającą
nowy element do listy w takim miejscu, aby zachowany był porządek
niemalejący, ile() (policzenie ile jest elementów na liście) oraz
wypisz() (wypisanie kolejno wszystkich wartości zapamiętanych
w liście).
Pierwszym argumentem tych funkcji powinien być wskaźnik na początek listy.
Część B
Napisz program testujący zaprogramowaną przez Ciebie listę.
Program ma działać interaktywnie w pętli, czyli realizować wydawane na konsoli
polecenia do czasu, aż zostanie wydane polecenie kończące działanie programu.
Część C
Uzupełnij wcześniejszy program o możliwość usunięcia z listy elementu
na zadanej pozycji funkcją usun_z_pozycji(), sprawdzenia gdzie
w liście znajduje się element o zadanej wartości funkcją
szukaj_wartosci() oraz sprawdzenia jaka wartość znajduje się na
zadanej pozycji w liście funkcją sprawdz_pozycje().
Zmodyfikuj program testowy tak, aby uzwględniał wymienione funkcje.
Zadanie 2 (15 punktów).
Część A
Zdefiniuj strukturę reprezentującą węzeł drzewa BST struct element,
w której będą pola lewe i prawe wskazujące odpowiednio na
lewe i prawe poddrzewo zaczepione w danym węźle oraz pole wartosc
przechowujące pewną wartość typu TYP (nazwę TYP zdefiniuj
za pomocą dyrektywy #define):
typedef struct element {
TYP wartosc;
struct element *lewe, *prawe;
} wezel;
Oprócz struktury zadeklaruj i zdefiniuj funkcje wstaw() (wstawienie
nowego elementu do drzewa), ile() (policzenie ile jest elementów
w drzewie) oraz wypisz() (wypisanie wszystkich wartości zapamiętanych
w drzewie w porządku inorder).
Pierwszym argumentem tych funkcji powinien być wskaźnik do wskaźnika na korzeń
drzewa (lub poddrzewa).
Wszystkie wymienione funkcje zaimplementuj rekurencyjnie.
Uwaga!
Do drukowania wartości typu TYP zdefiniuj osobną makrodefinicję
z parametrem.
W podobny sposób rozwiąż problem porównywania - zdefiniuj makrodefinicję
z dwoma parametrami typu TYP, która będzie zwracała wartość -1, 0
lub 1 w zależności od tego czy odpowiednio parametr pierwszy będzie mniejszy
od drugiego, czy będą one równe czy też pierwszy będzie większy od drugiego.
Część B
Napisz program testujący zaprogramowane przez Ciebie drzewo BST.
Program ma działać interaktywnie w pętli, czyli realizować wydawane na konsoli
polecenia do czasu, aż zostanie wydane polecenie kończące działanie programu.
Część C
Uzupełnij wcześniejszy program dopisując funkcje usun_min()
(usunięcie elementu minimalnego z drzewa), usun_max() (usunięcie
elementu maksymalnego z drzewa) i usun() (usunięcie z drzewa
elementu o zadanej wartości).
Zmodyfikuj program testowy tak, aby uzwględniał wymienione funkcje.
Część D
Uzupełnij ponownie wcześniejszy program dopisując funkcję drukuj()
(wyświetlenie struktury drzewa wraz z wartościami w węzłach).
Przykładowe wywołanie tej funkcji w programie testującym może wygenerować
następujący wynik dla drzewa BST z wartością 37 w korzeniu:
+ - - * 11
| + - - * 13
+ - - * 17
| + - - * 23
* 37
+ - - * 43
| + - - * 47
+ - - * 53
+ - - * 57
Zmodyfikuj program testowy tak, aby uzwględniał wymienioną funkcję.
Zadanie 1 (15 punktów).
Część A
Napisz program, który zapisze w pliku tekstowym kolejne liczby ciągu
Fibonacciego, aż do wyczerpania zakresu liczb typu long long:
F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 : n≥2
Nazwę pliku przekaż do programu poprzez parametry wywołania.
Każdą liczbę zapisz w oddzielnej linii.
Plik należy napierw otworzyć do pisania, potem zapisać w nim wspomniany ciąg
a na końcu zamknąć.
Część B
Napisz program, który wypisze zawartość pliku tekstowego, o ile podany plik
istnieje, na standardowym wyjściu.
Nazwę pliku przekaż do programu poprzez parametry wywołania.
Plik należy napierw otworzyć do czytania, potem przeczytać linia po linii
a na końcu zamknąć.
Twój program ma przycinać długie linie do 24 znaków (ignorować pozostałe
w tej linii znaki) oraz pomijać przy wypisywaniu linie puste.
Zadanie 1 (15 punktów).
Część A
Napisz program, który zapisze w pliku tekstowym kolejne liczby ciągu
Catalana, aż do wyczerpania zakresu liczb typu long long:
C0 = 1
Cn = (4n+2/n+2) · Cn-1 : n≥1
Nazwę pliku przekaż do programu poprzez parametry wywołania.
Każdą liczbę zapisz w oddzielnej linii.
Plik należy napierw otworzyć do pisania, potem zapisać w nim wspomniany ciąg
a na końcu zamknąć.
Część B
Napisz program, który wypisze zawartość pliku tekstowego, o ile podany plik
istnieje, na standardowym wyjściu.
Nazwę pliku przekaż do programu poprzez parametry wywołania.
Plik należy napierw otworzyć do czytania, potem przeczytać linia po linii
a na końcu zamknąć.
Twój program ma kompresować spójne ciągi białych znaków wewnątrz linii do
jednej spacji oraz pomijać przy wypisywaniu linie puste.
Zadanie 2 (15 punktów).
W tekstowym pliku z rozszerzeniem .in jest zapisanych N
liczb całkowitych a0, a1, ..., aN-1.
Zawartość pliku z danymi jest następująca: w pierwszej linii jest zapisana
liczba całkowita N≥1 a w kolejnych liniach pooddzielane białymi
znakami wartości rzeczywiste a0, a1, ...,
aN-1.
Należy te liczby najpierw odczytać, zapamiętując je w dynamicznie
zaalokowanej tablicy typu int[], potem posortować funkcją
z biblioteki standardowej qsort() a na koniec zapisać do pliku
tekstowego z rozszerzeniem .out wszystkie liczby złożone
(niepierwsze) z zadanego ciągu w kolejności niemalejącej.
Pamiętaj, aby przed wyjściem z programu zwolnić przydzieloną wcześniej pamięć.
Nazwę bazową dla plików (z danymi i na wyniki) przekaż poprzez parametry
wywołania programu.
Zadanie 1 (15 punktów).
Zapoznaj się z obiema częściami A i B tego zadania i wybierz tylko jedno
z nich do zaprogramowania w czasie laboratorium.
Część A
Napisz program, który wygenereuje plik postscriptowy z kolorowym
fraktalem.
Fraktalem tym niech będzie
trójkąt Sierpińskiego
albo krzywa C Leviego.
Poszczególne odcinki fraktala mają być rysowane losowo wybranymi kolorami.
Aby kolory były przypadkowe, zdefiniuj tablicę z 7 kolorami i losowo wybieraj
kolor do bieżącego rysowania linii.
Posłuż się w tym celu generatorem liczb pseudolosowych z biblioteki
stdlib.h.
Uwaga!
Rysowanie fraktala zaprogramuj jako procedurę rekurencyjną.
Warunkiem zakończenia rekurencji niech będzie długość boku rysowanego
fragmentu <2mm.
Część B
Stwórz aplikację okienkową używając GTK+, która będzie konwerterem
liczb naturalnych z zakresu od 1 do 3999 z postaci arabskiej na rzymską.
Twoja aplikacja powinna zawierać pole tekstowe do wpisania liczby arabskiej,
przycisk do uruchamiania konwersji i etykietę do prezentowania wyniku.
Zadanie 1 (15 punktów).
Zapoznaj się z obiema częściami A i B tego zadania i wybierz tylko jedno
z nich do zaprogramowania w czasie laboratorium.
Część A
Napisz program, który wygenereuje plik postscriptowy z kolorowym
fraktalem.
Fraktalem tym niech będzie
dywan Sierpińskiego
albo krzywa Kocha.
Poszczególne odcinki fraktala mają być rysowane losowo wybranymi kolorami.
Aby kolory były przypadkowe, zdefiniuj tablicę z 7 kolorami i losowo wybieraj
kolor do bieżącego rysowania linii.
Posłuż się w tym celu generatorem liczb pseudolosowych z biblioteki
stdlib.h.
Uwaga!
Rysowanie fraktala zaprogramuj jako procedurę rekurencyjną.
Warunkiem zakończenia rekurencji niech będzie długość boku rysowanego
fragmentu <2mm.
Część B
Stwórz aplikację okienkową używając GTK+, która będzie wyliczała
pole zadanego trójkąta.
Twoja aplikacja powinna zawierać trzy pola tekstowe do wpisania długości
poszczególnych boków trójkąta, przycisk do uruchamiania obliczeń (sprawdź czy
wpisane wartości spełniają warunek trójkąta) i etykietę do prezentowania
wyniku.
Zadanie 2 (15 punktów).
Stwórz aplikację okienkową używając GTK+, która będzie grą
w kółko i krzyżyk.
Użytkownik tej aplikacji ma grać z komputerem - opracuj więc jakąś prostą ale
nietrywialną strategię wybierania kolejnego ruchu dla komputera.
Przed rozpoczęciem rozgrywki pozwól na dokonaie wyboru, kto ma rozpocząć grę
- komputer czy użytkownik.
Twój program powinien też rozpoznać koniec gry i wskazać zwycięzcę.