Ogłoszenia
- (2 czerwca 2006 r.)
-
Z powodów niezależnych ode mnie nie dotarłem na dzisiejsze zajęcia,
za co niniejszym bardzo Państwa przepraszam. Jeśli zaistnieje taka
potrzeba, zajęcia te zostaną odrobione w dogodnym dla wszystkich
terminie.
- (2 czerwca 2006 r.)
-
Opublikowałem listę zagadnień, o które będę pytał w trakcie
wystawiania ocen na zaliczenie tego przedmiotu. Proszę się z nią
zapoznać i przygotować odpowiedzi!
Literatura
- Papierowa:
-
-
B.W.Kernighan, D.M.Ritchie:
Język ANSI C.
WNT, Warszawa 1994, ISBN 83-204-2433-X.
- Elektroniczna:
-
Organizacja zajęć
- Środowisko programowania:
- W semestrze odbędzie się 11 ćwiczeń laboratoryjnych po dwie
godziny lekcyjne. Celem tych zajęć będzie nauka programowania
prostych aplikacji konsolowych w języku ANSI C z elementami
C++. Programy będą pisane, kompilowane i uruchamiane
w środowisku zintegrowanym Microsoft Visual C++ 6.0
na platformie Windows XP.
- Zadania:
- Na każde zajęcia będzie przygotowana osobna lista zadań. Zadania
na listach będą punktwane adekwatnie do stopnia ich trudności.
Na każdych zajęciach laboratoryjnych będą sprawdzane tylko zadania
z bieżącej listy. Jeśli student będzie nieobecny albo nie zdąży
zrobić wszystkich zadań z listy, to niezaliczone zadania przepadają
bezpowrotnie.
- Rozwiązania:
- Student powinien zaprogramować na zajęciach zadania z bieżącej
listy. Wskazane jest, aby przygotowywać się do laboratorium: napisać
wstępną wersję programu lub przynajmniej mieć precyzyjną koncepcję
rozwiązania zadania. Podczas laboratorium student powinien uruchomić i przetestować swój
program i zaprezentować go prowadzącemu.
- Prezentacje:
- Programy należy prezentować osobiście w czasie zajęć
laboratoryjnych (proszę nie wysyłać programów pocztą elektroniczną,
ani nie przekazywać dyskietek poprzez innych studentów). Student
powinien wykazać się umiejętnością wprowadzenia od ręki prostych
zmian w programie zadanych przez prowadzącego oraz biegłą
znajomością zastosowanych w programie konstrukcji językowych
i używanych funkcji bibliotecznych. Jeżeli zaliczający zadanie
nie potrafi sensownie odpowiadać na pytania dotyczące programu,
prowadzący może takiego programu nie uznać.
- Programy:
- Każdy program jest oceniany za zgodność z treścią, efektywność
algorytmów, styl programowania, czytelność (komentarze, sensowne
nazwy zmiennych, wcięcia itp.). Każdy plik z kodem źródłowym
powinien zawierać na początku komentarz z danymi autora i nazwą
zadania.
- Nieobecności:
- Obecność na laboratorium jest obowiązkowa. Jeśli z jakiś istotnych
powodów student nie będzie obecny na zajęciach (choroba potwierdzona
zwolnieniem lekarskim, wezwanie do Sądu albo USC, itp.), to powinien
obowiązujące w danym terminie programy dokończyć i zaprezentować je
prowadzącemu na początku najbliższych zajęć.
- Oceny:
- Aby zaliczyć laboratorium na ocenę dostateczną trzeba w czasie
semestru zdobyć 40% z wszystkich możliwych do uzyskania punktów;
na ocenę bardzo dobrą należy zgromadzić 80% punktów; oceny pośrednie
pozostają w liniowej zależności od przedstawionych wymagań
granicznych. Warunkiem koniecznym zaliczenia laboratorium jest
obecność na co najmniej 5 laboratoriach.
Zadania na laboratorium
Lista nr 1 (24 marca 2006)
- (2 punkty)
Napisz program, który wczytuje dwie liczby rzeczywiste i wypisuje
sumę ich kwadratów.
- (3 punkty)
Napisz program, który wczytuje trzy liczby rzeczywiste i wypisuje
wartość środkową co do wielkości.
zadania dodatkowe
- (3 punkty)
Napisz program, który będzie w pętli wczytywał liczby rzeczywiste
i obliczał ich pierwiastki kwadratowe. Program ma działać, dopóki
użytkownik nie wpisze liczby ujemnej albo ciągu znaków, który nie
reprezentuje liczby (funkcja scanf zwraca liczbę poprawnie
dopasowanych wzorców).
Wskazówka:
Do wyliczenia pierwiastka z zadanej liczby n skorzystaj
z funkcji standardowej sqrt (double n).
Lista nr 2 (31 marca 2006)
- (2 punkty)
Napisz program, który wczyta dodatnią liczbę całkowitą i wypisze jej
rozwinięcie w układzie dwójkowym.
Wskazówka:
Do rozwiązania tego zadania zastosuj funkcję rekurencyjną.
- (3 punkty)
Napisz program, który wczytuje długość ciągu, a później ciąg liczb
całkowitych. Określ jaka jest w tym ciągu wartość najmniejsza
i największa.
Wskazówka:
Program nie powinien tablicować wczytywanych danych.
zadania dodatkowe
- (3 punkty)
Napisz program, który wczytuje współczynniki równania kwadratowego
Ax2 + Bx + C = 0 a następnie oblicza pierwiastki
tego równania.
Wskazówka:
Zaimplementuj i wykorzystaj w programie funkcję delta (double a,
double b, double c), która będzie obliczała wyróżnik równania
kwadratowego.
Lista nr 3 (14 kwietnia 2006) e-mail
- (2 punkty)
Napisz program, który wczytuje liczbę całkowitą reprezentującą rok.
Program ma sprawdzić, czy podany rok jest przestępny i wypisać
odpowiedni komunikat. Do testowania przestępności roku użyj funkcji
czyPrzestepny (int r), która zwraca 1 gdy rok jest
przestępny albo 0 w przeciwnym przypadku.
- (3 punkty)
Napisz program, który wczytuje dwie liczby całkowite reprezentujące
odpowiednio miesiąc i rok. Program ma sprawdzić, ile dni ma zadany
miesiąc (luty ma różną liczbę dni w zależności od roku). Skorzystaj
z dwuwymiarowej tablicy int dniWMiesiacu[13], w której są
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[czyPrzestepny(rok)][mies].
- (3 punkty)
Napisz program, który wczytuje trzy liczby całkowite reprezentujące
odpowiednio dzień, miesiąc i rok. Program ma wyliczyć, ile dni
upłynęło do zadanego dnia od początku roku, oraz ile dni zostało
jeszcze do jego końca włącznie z tym dniem. Skorzystaj z pomocniczej
tablicy dwuwymiarowej int dniOdPoczRoku[2][13], która
będzie zawierała informacje o liczbie dni od poczatku roku do końca
poprzedniego miesiąca - obie wartości będziesz mógł wtedy bardzo
prosto wyliczyć. Przykładowo, dystans czasowy od początku roku do
1 stycznia wynosi 0 dni, a od 1 grudnia
do końca roku 31 dni.
- (3 punkty)
Napisz program, który wczytuje trzy liczby całkowite reprezentujące
odpowiednio dzień, miesiąc i rok. Program ma sprawdzić czy podana
data jest prawidłowa (miesiąc z zakresu 1...12, dzień 1...),
a jeśli tak, to wypisać ją w postaci naturalnej (miesiąc słownie
w dopełniaczu).
Uwaga:
Skorzystaj z zainicjalizowanej tablicy wskaźników na nazwy miesięcy.
Uwaga:
Weź pod uwagę fakt, że kalendarz Gregoriański obowiązuje od
15 października 1582.
zadania dodatkowe
- (7 punktów)
Napisz program, który wczytuje dwie daty (po trzy liczby całkowite
reprezentujące odpowiednio dzień, miesiąc i rok). Program ma
sprawdzić, ile dni upłynęło od pierwszej daty do drugiej. Liczba
tych dni ma wynieść 0 gdy obie daty są takie same, a w przypadku gdy
pierwsza data jest późniejsza niż druga program powinien wypisać
liczbę ujemną.
Wskazówka:
W swoim programie zaimplementuj i wykorzystaj funkcję
porownanieDat (int d1, int m1, int r1, int d2, int m2,
intr2), która porówna dwie daty i odpowie wartością -1 gdy
pierwsza data jest późniejsza niż druga, 0 gdy daty są takie same,
1 gdy pierwsza data jest wcześniejsza niż druga.
Lista nr 4 (21 kwietnia 2006)
- (5 punktów)
Napisz program, który najpierw wczyta ze standardowego wejścia
stdin liczbę N określającą rozmiar danych
(skontroluj czy wprowadzona wartość nie jest mniejsza od 1
lub większa od pewnego ustalonego MAX) a potem wczyta do
tablicy N liczb rzeczywistych typu double.
Następnie oblicz i wypisz na standardowym wyjściu stdout
średnią arytmetyczną wprowadzonych liczb oraz wartość największą
i najmniejszą. Komunikaty zapraszające do wprowadania danych i
komentarze opisujące wyprowadzane wyniki skieruj na standardowe
wyjście dla błędów stderr.
Uwaga:
W napisanym programie wyodrębnij trzy funkcje: (i)
wczytywanie danych, (ii) obliczanie wartości średniej,
(iii) znajdowanie liczby największej i (iv)
najmniejszej. Zadbaj, aby funkcje nie używały zmiennych globalnych.
zadania dodatkowe
- (5 punktów)
Napisz program, który najpierw wczyta ze standardowego wejścia
stdin liczbę N określającą rozmiar danych
(skontroluj czy wprowadzona wartość nie jest mniejsza od 1
lub większa od pewnego ustalonego MAX) a potem wygeneruje
N losowych liczb rzeczywistych typu double
z zakresu od -10.000 do +10.000 i zapamięta je w tablicy.
Następnie wypisz te liczby standardowym wyjściu stdout
w układzie po 10 w wierszu z dokładnością do trzech miejsc po kropce
dziesiętnej (w każdej kolumnie kropki dziesiętne mają się znaleźć na
tych samych pozycjach). Na końcu oblicz i wypisz również na
standardowym wyjściu średnią arytmetyczną i odchylenie standardowe
wylosowanych liczb. Komunikaty zapraszające do wprowadania danych i
komentarze opisujące wyprowadzane wyniki skieruj na standardowe
wyjście dla błędów stderr.
Uwaga:
W napisanym programie wyodrębnij trzy funkcje: (i)
wczytywanie rozmiaru danych, (ii) generowanie losowych
danych, (iii) wypisywanie wyników (iv) obliczanie
wartości średniej i (v) odchylenia standardowego. Zadbaj,
aby funkcje nie używały zmiennych globalnych.
Wskazówka:
Na początku programu należy zainicjalizować (tylko raz) generator
liczb pseudolosowych. Można to zrobić poleceniem:
srand(time(0));
Wskazówka:
Losowanie liczby rzeczywistej z zakresu od -10.000 do +10.000
z rozkładem jednostajnym można zrealizować następująco:
(20.0/RAND_MAX)*rand()-10.0;
Lista nr 5 (28 kwietnia 2006)
- (2 punkty)
Napisz program, który wczyta dodatnią liczbę całkowitą i wypisze jej
rozwinięcie w układzie dwójkowym.
Wskazówka:
Zastosuj rekurencję do rozwiązania tego zadania.
- (3 punkty)
Napisz program, który wczytuje do tablicy znakowej napis ze
standardowego wejścia i sprawdza, czy jest on palindromem.
Wczytany napis ma mieć nie więcej niż 79 znaków.
Uwaga:
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łaMaMałyBok, ZakopaneNaPokaz,
MożeJutroTaDamaDaTortuJeżom.
- (3 punkty)
Napisz program, który wczytuje znak po znaku ze standardowego
wejścia stdin, aż do napotkania symbolu EOF.
W czasie działania programu należy zliczać ile razy wystąpił każdy
znak. Na końcu program powinien wypisać na standardowym wyjściu dla
błędów stderr statystykę dotycząca wczytanego tekstu:
(i) ile było wszystkich przeczytanych znaków, (ii)
z ilu linii składał się tekst oraz (iii) ile razy wystąpiły
poszczególne cyfry i litery alfabetu angielskiego (z rozróżnieniem
na litery małe i duże).
Wskazówka:
Program powinien posłużyć się tablicą liczników dla wszystkich
wczytywanych znaków.
zadania dodatkowe
- (5 punktów)
Napisz program, który wczyta liczbę naturalna <1000 i wypisze ją
w postaci słownej w języku polskim.
Wskazówka:
Posłuż się tablicami napisów (tablice wskaźników do znaków):
char *J[] = {"","jeden","dwa",/*...*/"dziewietnascie"};
char *D[] = {"","dziesiec","dwadziescia",/*...*/"dziewiecdziesiat"};
char *S[] = {"","sto","dwiescie",/*...*/"dziewiecset"};
- (5 punktów)
Poprzedni program rozbuduj tak, aby wypisywał poprawną polszczyzną
liczbę typu unsigned long (dowolna wartość z zakresu od 0
do 4294967295).
Wskazówka:
Skonstruuj funkcję, która w wyniku zwróci numer formy gramatycznej
dla słowa określającego wagę grupy trzech cyfr (miliard/~y/~ów,
milion/~y/~ów, tysiąc/~e/~y lub brak tekstu). Posłuż się tablicą
napisów (dwuwymiarowa tablica wskaźników do znaków):
char *T[][4] =
{
{"","","",""},
{"","tysiac","tysiace","tysięcy"},
{"","milion","miliony","milionów"},
{"","miliard","miliardy","miliardów"}
};
Lista nr 6 (5 maja 2006)
- (5 punktów)
Napisz program zamieniający liczby arabskie z przedziału od 1
do 3999 na liczby rzymskie. Użyj zainicjowanej tablicy struktur
RZYM.
struct RZYM
{
int wartosc;
char *zapis;
};
Do konwersji wykorzystaj specjalną funkcję, której przekazuje się
poprzez parametr liczbę binarną typu int, a w wyniku
dostaje się napis typu string reprezentujący tą liczbę
w postaci rzymskiej.
string arab2rzym (int liczba);
Program ma działać tak długo, jak długo podawana do konwersji liczba
mieści się w zadanym przedziale.
Wskazówka:
Zastosuj zachłanną metodę rozwiązania tego zadania. Posłuż się
wewnętrzną statyczną tablicą struktur RZYM zainicjalizowaną
następującymi wartościami: 1000, 900, 500, 400, 100, 90, 50, 40, 10,
9, 5, 4, 1.
- (5 punktów)
Napisz program zamieniający liczby rzymskie z przedziału od 1
do 3999 na liczby arabskie. Użyj wewnętrznej statycznej tablicy
struktur RZYM, zainicjalizowanej takimi samymi wartościami
jak w poprzednim zadaniu: 1000, 900, 500, 400, 100, 90, 50, 40, 10,
9, 5, 4, 1. Do konwersji wykorzystaj specjalną funkcję, której
przekazuje się poprzez parametr liczbę rzymską typu string,
a w wyniku dostaje się binarną reprezentację tej liczby typu
int.
int rzym2arab (string liczba);
Program ma działać tak długo, jak długo podawany do konwersji tekst
mieści się w zadanym przedziale.
Zapętlić program tak długo, jak długo podawany do konwersji tekst
jest niepusty.
Uwaga:
Zakładamy, że liczby rzymskie są podawane prawidłowo.
zadania dodatkowe
- (3 punkty)
Napisz program, który wczyta najpierw liczbę rzeczywistą
r≥0 a potem liczbę naturalną k<50.
Następnie program ma stablicować wartości pi
dla i=0...k-1 określone następującym wzorem rekurencyjnym:
p0 = 1
pi = (r/pi-1+pi-1)/2 : i>0
Na koniec program ma wypisać w dwóch kolumnach wszystkie wyniki:
w pierwszej kolumnie wartości pi a w drugiej
różnicę pomiędzy pi a pierwiastkiem kwadratowym
z r (użyj funkcji sqrt z biblioteki
matematycznej).
- (3 punkty)
Napisz program, który będzie w pętli wczytywał liczby rzeczywiste
i obliczał ich pierwiastki kwadratowe. Program ma działać, dopóki
użytkownik nie wpisze liczby ujemnej albo ciągu znaków, który nie
reprezentuje liczby (funkcja scanf zwraca liczbę poprawnie
dopasowanych wzorców). Do wyliczenia pierwiastka z zadanej liczby
n napisz własną rekurencyjną funkcję
pierwiastek (double, double), która będzie korzystała
z podanego w poprzednim zadaniu wzoru. W kolejnych wywołaniach
rekurencyjnych obliczana wartość zbiega właśnie do pierwiastka
kwadratowego z n. Obliczenia należy kontynuować, dopóki:
|pi-pi-1| / pi-1
≥10-6
Lista nr 7 (12 maja 2006)
- (2 punkty)
Napisz program, który wczytuje długość ciągu, a później ciąg liczb
rzeczywistych. Wczytane liczby należy na końcu wypisać w odwrotnej
kolejności.
Uwaga:
Program powinien stablicować wczytywane dane w dynamicznie
przydzielonej tablicy. Miejsce na tablicę zaalokuj funkcją
calloc (int n, int size). Na końcu nie zapomnij zwolnić
uprzednio przydzielonej pamięci funkcją free (void *ptr).
- (5 punktów)
Napisz program, który utworzy i wypełni wartościami boolowskimi
sito Eratostenesa. Program powinien najpierw wczytać
rozmiar sita N≥100, następnie utworzyć je w pamięci
dynamicznej (wypełniając odpowiednimi wartościami), wypisać 10
największych liczb pierwszych zaznaczonych w tym sicie, a na koniec
zwolnić przydzieloną pamięć.
Uwaga:
Podziel to zadanie na trzy części: plik nagłówkowy
z deklaracją funkcji do wypełniania sita Eratostenesa odpowiednimi
wartościami, plik źródłowy z implementacją funkcji z pliku
nagłówkowego, a także plik źródłowy z funkcją
main().
Wskazówka:
Sito Eratostenesa jest wypełnione wartościami zero-jedynkowymi
w taki sposób, że na pozycji i-tej jest wpisana jedynka
tylko wtedy, gdy liczba i jest pierwsza. Początkowe liczby
pierwsze to: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ...
zadania dodatkowe
- (3 punkty)
Napisz program, który utworzy i wypełni losowymi liczbami tablicę
liczb całkowitych. Rozmiar tablicy i zakres losowanych liczb (dolny
i górny) mają być określone przez użytkownika na etapie wykonania
programu. Następnie należy wypisać wszystkie wartości zapamiętane
w kolejnych komórkach tablicy.
Uwaga:
Tablica powinna być dynamicznie utworzona w pamięci wolnej (na
stercie) kiedy zostanie określony jej rozmiar i zwolniona pod koniec
działania programu.
- (3 punkty)
Napisz program, który utworzy tablicę i wypełni ją losową permutacją
początkowych liczb naturalnych. Rozmiar tablicy ma być określoy
przez użytkownika na etapie wykonania programu. Następnie należy
wypisać wszystkie wartości zapamiętane w kolejnych komórkach
tablicy.
Uwaga:
Tablica powinna być dynamicznie utworzona w pamięci wolnej (na
stercie) kiedy zostanie określony jej rozmiar i zwolniona pod koniec
działania programu.
Lista nr 8 (19 maja 2006)
- (2 punkty)
Zaprogramuj funkcję, która dla zadanego znaku char oraz
słowa char[] zwróci wskaźnik do pierwszego wystąpienia
tego znaku w słowie lub NULL jeżeli znak nie występuje.
Następnie napisz program, który wczyta napis i sprawdzi (korzystając
z tej funkcji), które samogłoski występują w tym napisie, a które
w ogóle w nim nie występują.
Uwaga:
Program powinien wypisać wszystkie samogłoski występujące w napisie.
- (3 punkty)
Zaprogramuj funkcję, która pobiera dwa wskaźniki do łańcuchów
znakowych i sprawdza, czy pierwszy występuje w drugim.
Następnie napisz program, który wczyta określoną liczbę napisów
i sprawdzi czy istnieją wśród nich takie pary, że jeden napis
występuje w drugim.
Uwaga:
Program powinien wypisać wszystkie takie pary.
- (3 punkty)
Napisz program, który wczyta określoną liczbę napisów, a następnie
wypisze je uporządkowane leksykograficznie.
Uwaga:
Twój program powinien porządkować tylko tablicę ze wskaźnikami na
napisy (sortowanie napisów poprzez przestawianie wskaźników do
tablic znakowych).
Wskazówka:
Do porównywania napisów użyj funkcji z biblioteki standardowej
strcmp().
zadania dodatkowe
- (2 punkty)
Napisz program, który wczytuje tekst ze standardowego wejścia
i po przefiltrowaniu wypisuje go na standardowe wyjście.
Filtrowanie ma polegać na usunięciu z tekstu wszystkich znaków
o kodach <32 (za wyjątkiem znaków '\n' i '\t')
lub ==127. Wykorzystaj własną funkcję sprawdzającą, czy znak ma być
zatrzymany (wartość 1) czy odrzucony (wartość 0).
Do czytania danych ze strumienia wejściowego wykorzystaj funkcję
getchar() a do pisania do strumienia wyjściowego funkcję
putchar(). Program ma działać w pętli, dopóki nie zostanie
wczytany znak końca pliku EOF.
- (3 punkty)
Napisz program, który wczytuje tekst ze standardowego wejścia
i wypisuje go na standardowe wyjście po przeformatowaniu.
Formatowanie ma polegać na zastąpieniu w tekście wszystkich długich
odstępów pojedynczą spacją i na usunięciu odstępów sprzed znaku
końca linii '\n'. Przez długi odstęp należy rozumieć spójny
ciąg złożony ze znaków spacji ' ' i tabulacji '\t'
za wyjątkiem pojedynczej spacji.
Do czytania danych ze strumienia wejściowego wykorzystaj funkcję
getchar() a do pisania do strumienia wyjściowego funkcję
putchar(). Program ma działać w pętli, dopóki nie zostanie
wczytany znak końca pliku EOF.
Lista nr 9 (26 maja 2006)
- (2 punkty)
Napisz i uruchom program, który wypisze wszystkie parametry z jakimi
został wywołany (oprócz nazwy samego programu).
- (3 punkty)
Napisz program, który sprawdzi czy jego parametry wywołannia tworzą
palindrom.
- (3 punkty)
Napisz program, który wywołany z kilkoma liczbami, wypisze ich
wartości średnie: średnią arytmetyczną i średnią geometryczną.
Uwaga:
Argumenty wywołania programu są tekstami! Jeśli są to teksty liczb,
to teksty te muszą być przekształcone na wartości liczbowe za pomocą
funkcji standardowej atof().
zadania dodatkowe
- (5 punktów)
Zaprogramuj prosty kalkulator. Ma on działać w pętli: najpierw
wczytuje liczbę, potem symbol działania arytmetycznego, i znowu
liczbę i symbol działania arytmetycznego, itd. Program działa,
wyliczając na bieżąco wyniki operacji arytmetycznych, aż do
wczytania symbolu równości (=).
Uwaga:
Dopuszczalne operacje arytmetyczne to: dodawanie (+),
odejmowanie (-), mnożenie (*), dzielenie
(/).
Lista nr 10 (2 czerwca 2006)
- (5 punktów)
W pliku nagłówkowym zdefiniuj strukturę reprezentującą element
listy jednokierunkowej struct ElementLiczbowy , w której
będą pola nast wskazujące na element tego samego typu
oraz wartosc przechowujące liczbę rzeczywistą:
struct ElementLiczbowy
{
ElementLiczbowy *nast;
double wartosc;
};
Oprócz struktury zadeklaruj również funkcje wstawNaPocz()
(wstawienie nowego elementu na początek listy),
wstawNaKon() (wstawienie nowego elementu na koniec listy),
policz() (policzenie ile jest elementów na liście) oraz
wypisz() (wypisanie kolejno wszystkich wartości
zapamiętanych w liście).
Jednym z parametrów tych funkcji powinien być wskaźnik na pierwszy
element listy.
Dalej, w oddzielnym pliku źródłowym zdefiniuj wymienione funkcje
(zaimplementuj je iteracyjnie).
W oddzielnym pliku źródłowym napisz program testujący działanie
zdefiniowanej przez Ciebie struktury danych.
Testowanie ma się odbywać w sposób interakcyjny, a więc program ma
realizować wydawane na konsoli polecenia.
Powinniśmy mieć możliwość wydawania następujących rozkazów:
-
sprawdzenie liczby elementów na liście:
> rozmiar
2
>
-
dopisanie elementu na początku listy:
> poczatek 17
>
-
dopisanie elementu na końcu listy:
> koniec 43
>
-
wypisanie wszystkich elementów listy:
> wypisz
17, 23, 37, 43
>
-
wyjście z programu:
> stop
Uwaga:
Program ma być odporny na błędy użytkownika.
- (5 punktów)
Do poprzedniego zadania dopisz funkcje wstaw() (wstawienie
nowego elementu na i-tą pozycję w liście: i-ta
pozycja oznacza, że i elementów poprzedza dany element)
i usun() (usunięcie elementu z i-tej pozycjji
w liście).
Tak jak poprzednio, delaracje obu funkcji mają być umieszczone
w pliku nagłówkowym, a definicje w pliku źródłowym (zaimplementuj
je iteracyjnie).
W programie testującym dopisz dwa rozkazy: wstaw
i usun.
zadania dodatkowe
- (5 punktów)
W pliku nagłówkowym zdefiniuj strukturę reprezentującą element
drzewa binarnych poszukiwań struct ElementBST , w której
będą pola lewy wskazujące na lewego syna (element tego
samego typu), prawy wskazujące na prawego syna (element
tego samego typu) oraz wartosc przechowujące liczbę
rzeczywistą:
struct ElementBST
{
ElementBST *lewy, *prawy;
double wartosc;
};
Oprócz struktury zadeklaruj również funkcje wstaw()
(wstawienie nowego elementu do drzewa), policz()
(policzenie ile jest elementów w drzewie) oraz wypisz()
(wypisanie wszystkich wartości zapamiętanych w drzewie w sposób
uporządkowany: metoda in-order).
Jednym z parametrów tych funkcji powinien być wskaźnik na korzeń
drzewa.
Dalej, w oddzielnym pliku źródłowym zdefiniuj wymienione funkcje
(zaimplementuj je rekurencyjnie).
W oddzielnym pliku źródłowym napisz program testujący działanie
zdefiniowanej przez Ciebie struktury danych.
Testowanie ma się odbywać w sposób interakcyjny, a więc program ma
realizować wydawane na konsoli polecenia.
Powinniśmy mieć możliwość wydawania następujących rozkazów:
-
sprawdzenie liczby elementów w drzewie:
> rozmiar
8
>
-
dopisanie elementu do drzewa:
> wstaw 23
>
-
wypisanie wszystkich elementów drzewa w sposób uporządkowany:
> wypisz
17, 23, 37, 43
>
-
wyjście z programu:
> stop
Uwaga:
Program ma być odporny na błędy użytkownika.
- (5 punktów)
Do poprzedniego zadania dopisz funkcje szukaj()
(sprawdzenie czy element z podaną wartością jest w drzewie)
i usun() (usunięcie elementu podaną wartością z drzewa).
Tak jak poprzednio, delaracje obu funkcji mają być umieszczone
w pliku nagłówkowym, a definicje w pliku źródłowym (zaimplementuj
je rekurencyjnie).
W programie testującym dopisz dwa rozkazy: szukaj
i usun.
Lista nr 11 (9 czerwca 2006)
- (2 punkty)
Napisz program, który wczyta nazwę pliku tekstowego, a następnie
wypisze jego zawartość, o ile plik istnieje, na standardowym
wyjściu.
Plik należy napierw otworzyć do czytania, potem przeczytać go linia
po linii, a na końcu zamknąć.
Jeśli linia jest dłuższa niż 79 znaków, to pozostałe znaki w tej
linii należy zignorować.
Uwaga:
Należy korzystać tylko z funkcji standardowych zadeklarowanych
w pliku nagłówkowym <stdio.h>.
Wskazówka:
Posłuż się funkcją fgets().
- (3 punkty)
Napisz program, który wczyta nazwę pliku tekstowego, a następnie
zapisze w nim 1000 pierwszych liczb pierwszych (2, 3, 5, 7, ...).
Plik należy napierw otworzyć do pisania, potem zapisać w nim tysiąc
liczb (każda w osobnej linii), a na końcu zamknąć.
Uwaga:
Należy korzystać tylko z funkcji standardowych zadeklarowanych
w pliku nagłówkowym <stdio.h>.
Wskazówka:
Zaprogramuj sito Eratostenesa.
- (5 punktów)
W tekstowym pliku z danymi jest zapisanych N liczb
rzeczywistych a1, ..., aN.
Format pliku z danymi jest taki, że w pierwszej linii jest zapisana
liczba całkowita N typu int, a w kolejnych liniach
pooddzielane białymi znakami wartości rzeczywiste
a1, ..., aN typu
double.
Należy te liczby odczytać, zapamiętując je równocześnie
w dynamicznie przydzielonej tablicy.
Na koniec trzeba je zapisać do pliku binarnego (bez wartości
N na początku) i zwolnić przydzieloną pamięć.
Uwaga:
Należy korzystać tylko z funkcji standardowych zadeklarowanych
w pliku nagłówkowym <stdio.h>.
zadania dodatkowe
- (5 punktów)
W binarnym pliku z danymi jest zapisane są liczby typu
double.
Określ ile tych liczb jest zapisanych w pliku, przydziel dynamicznie
odpowiedni obszar pamięci i wczytaj je tam.
Następnie policz średnią arytmetyczną i odchylenie
standardowe i wypisz te wielkości na standardowym wyjściu.
Na końcu zwolnij przydzieloną pamięć.
Uwaga:
Należy korzystać tylko z funkcji standardowych zadeklarowanych
w pliku nagłówkowym <stdio.h>.
Uwaga:
W celu określenia ilości zapisanych w pliku binarnym danych posłuż
się funkcjami fseek() i ftell().
Lista nr 12 (16 czerwca 2006)
- (3 punkty)
Wylosuj z rozkładem jednostajnym określoną ilość liczb rzeczywistych
z przedziału od -100.00 do +100.00 (z dokładnością 0.01)
i zapamiętaj je w dynamicznie przydzielonej tablicy.
Wylosowane liczby wypisz na standardowym wyjściu tabelarycznie po 10
w każdym wierszu (w każdej kolumnie kropki dziesiętne mają być jedna
pod drugą na teych samych pozycjach).
Następnie posortuj te liczby rosnąco i znowu wypisz je na
standardowym wyjściu.
Wskazówka:
Skorzystaj z funkcji standardowej qsort() zadeklarowanej
w pliku nagłówkowym <stdlib.h>.
- (3 punkty)
Zainicjuj tablicę wskaźników do kilku tekstów (nazwy dni tygodnia,
nazwy miesięcy, nazwy pór roku, itp).
Następnie posortuj tablicę tych wskaźników w kolejności
alfabetycznej wskazywanych przez nie tekstów i wypisz te teksty
w kolejności alfabetycznej.
Wskazówka:
Skorzystaj z funkcji standardowej qsort() zadeklarowanej
w pliku nagłówkowym <stdlib.h>.
zadania dodatkowe
- (3 punkty)
Niech wybrane przez ciebie daty tworzą zainicjowaną tablicę struktur
struct Data {int dz, mies, rok;};.
Posortuj te daty w kolejności kalendarzowej i wypisz je na
standardowym wyjściu.
- (3 punkty)
Niech wybrane przez ciebie daty tworzą zainicjowaną tablicę struktur
struct Data {int dz, mies, rok;};.
Następnie utwórz i posortuj dynamicznie zaalokowaną tablicę
wskaźników do tych dat (posortuj te wskaźniki w kolejności
kalendarzowej wskazywanych przez nie dat).
Na koniec wypisz wszystkie daty chronologicznie.
Zagadnienia egzaminacyjne (23 czerwca 2006)
- słowa kluczowe, identyfikatory, literały
- typy podstawowe / wyliczenia / instrukcja typedef
- deklarowanie i inicjalizacja zmiennych / zmienne rejestrowe, lokalne, globalne i statyczne
- pamięć wolna, czyli sterta / przydział i zwalnianie pamięci na stercie / sprawdzanie ilości dostępnej pamięci wolnej
- operatory arytmetyczne, bitowe, logiczne, relacyjne, operator warunkowy, rzutowanie / priorytety operatorów / standardowe operacje matematyczne
- instrukcje sterujące i ich składnia (instrukcja blokowa, warunkowa, wyboru, instrukcje pętli, kontynuacja, przerwanie, powrót z funkcji)
- deklarowanie i inicjalizacja tablic / tablice wielowymiarowe
- arytmetyka wskaźników / wskaźniki w kontekście tablic / wskaźniki do funkcji
- tablice znakowe do przechowywania tekstów / standardowe operacje na tekstach
- deklaracja i definicja funkcji / funkcje rekurencyjne
- przekazywanie parametrów do funkcji / argumenty wywołania programu
- definicje struktur i unii / struktury odwołujące się do samych siebie
- formatowane pisanie na standardowe wyjście (funkcja printf()) i czytanie ze standardowego wejścia (funkcja scanf())
- współpraca z plikami (otwieranie, zamykanie, czytanie i pisanie) / pliki tekstowe i binarne
- struktura programu (pliki nagłówkowe i źródłowe)
- dyrektywy preprocesora
|