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)

  1. (2 punkty) Napisz program, który wczytuje dwie liczby rzeczywiste i wypisuje sumę ich kwadratów.
  2. (3 punkty) Napisz program, który wczytuje trzy liczby rzeczywiste i wypisuje wartość środkową co do wielkości.
  3. zadania dodatkowe
  4. (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)

  1. (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ą.
  2. (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.
  3. zadania dodatkowe
  4. (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

  1. (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.
  2. (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. (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.
  4. (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.
  5. zadania dodatkowe
  6. (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)

  1. (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.
  2. zadania dodatkowe
  3. (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)

  1. (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.
  2. (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. (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.
  4. zadania dodatkowe
  5. (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"};
  6. (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)

  1. (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.
  2. (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.
  3. zadania dodatkowe
  4. (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).
  5. (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)

  1. (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).
  2. (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, ...
  3. zadania dodatkowe
  4. (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.
  5. (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)

  1. (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.
  2. (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. (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().
  4. zadania dodatkowe
  5. (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.
  6. (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)

  1. (2 punkty) Napisz i uruchom program, który wypisze wszystkie parametry z jakimi został wywołany (oprócz nazwy samego programu).
  2. (3 punkty) Napisz program, który sprawdzi czy jego parametry wywołannia tworzą palindrom.
  3. (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().
  4. zadania dodatkowe
  5. (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)

  1. (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.
  2. (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.
  3. zadania dodatkowe
  4. (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. (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)

  1. (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().
  2. (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.
  3. (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>.
  4. zadania dodatkowe
  5. (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)

  1. (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>.
  2. (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>.
  3. zadania dodatkowe
  4. (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.
  5. (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)

  1. słowa kluczowe, identyfikatory, literały
  2. typy podstawowe / wyliczenia / instrukcja typedef
  3. deklarowanie i inicjalizacja zmiennych / zmienne rejestrowe, lokalne, globalne i statyczne
  4. pamięć wolna, czyli sterta / przydział i zwalnianie pamięci na stercie / sprawdzanie ilości dostępnej pamięci wolnej
  5. operatory arytmetyczne, bitowe, logiczne, relacyjne, operator warunkowy, rzutowanie / priorytety operatorów / standardowe operacje matematyczne
  6. instrukcje sterujące i ich składnia (instrukcja blokowa, warunkowa, wyboru, instrukcje pętli, kontynuacja, przerwanie, powrót z funkcji)
  7. deklarowanie i inicjalizacja tablic / tablice wielowymiarowe
  8. arytmetyka wskaźników / wskaźniki w kontekście tablic / wskaźniki do funkcji
  9. tablice znakowe do przechowywania tekstów / standardowe operacje na tekstach
  10. deklaracja i definicja funkcji / funkcje rekurencyjne
  11. przekazywanie parametrów do funkcji / argumenty wywołania programu
  12. definicje struktur i unii / struktury odwołujące się do samych siebie
  13. formatowane pisanie na standardowe wyjście (funkcja printf()) i czytanie ze standardowego wejścia (funkcja scanf())
  14. współpraca z plikami (otwieranie, zamykanie, czytanie i pisanie) / pliki tekstowe i binarne
  15. struktura programu (pliki nagłówkowe i źródłowe)
  16. dyrektywy preprocesora

Ranking