Kontakt:

pokój: 339
telefon: +48 71 3757836
mail:
www: http://www.ii.uni.wroc.pl/~prz/

Konsultacje:

czwartek 10-12
pokój 339
proszę wcześniej uzgodnić dokładny termin konsultacji drogą mailową

ANSI C (semestr zimowy 2011/12)

Adres:

Instytut Informatyki
Uniwersytetu Wrocławskiego
ul. Joliot-Curie 15
50-383 Wrocław
OGŁOSZENIA

31 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

Literatura papierowa polskojęzyczna:

  • K.N.King: Język C. Nowoczesne programowanie. Wydanie 2. Wydawnictwo Helion, Gliwice 2011.
  • B.W.Kernighan, D.M.Ritchie: Język ANSI C. Programowanie. Wydanie 2. Wydawnictwo Helion, Gliwice 2010.
  • S.Oualline: Język C. Programowanie. Wydawnictwo Helion, Gliwice 2003.

Literatura papierowa anglojęzyczna:

  • H.Schildt: C: The Complete Reference, 4th Edition. Osborne/McGraw-Hill, 2000.

Literatura elektroniczna polskojęzyczna:

Literatura elektroniczna anglojęzyczna:

Terminarz

  • wykład: wtorek 10-12 s.25 (Marek Piotrów)
  • laboratorium (grupy PRz):
    środa 10-12 s.110 (Paweł Rzechonek)
    piątek 10-12 s.110 (Paweł Rzechonek)

Materiały do wykładu i ćwiczeń

Laboratorium

Zasady zaliczenia przedmiotu

Ogólnie:
Ćwiczenia laboratoryjne będą podzielone na dwie części: krótkie zadania laboratoryjne i projekt. Część zadaniowa będzie obejmować 10 pierwszych ćwiczeń a projektowa 4 ostatnie (pierwsze ćwiczenia to testowanie środowiska programistycznego Bode::Blocks i platformy edukacyjnej Moodle). Po Nowym Roku będzie jeszcze kolokwium.
Zadania laboratoryjne:
Laboratorium na części zadaniowej będzie przebiegać według następującego scenariusza. Tuż przed ćwiczeniami będzie się pojawiać w internecie na tej stronie lista z zadaniami laboratoryjnymi i z zadaniem domowym.
  • Zadania laboratoryjne należy zaprogramować w czasie trwania zajęć; za poprawne i samodzielne rozwiązanie tych zadań będzie można otrzymać do 20 punktów. Kto nie zdąży zrobić zadań na ćwiczeniach może dokończyć je w domu i przesłać rozwiązania do końca tygodnia na Moodle (dotyczy to również osób nieobenych a mających usprawiedliwienie), ale za spóźnione rozwiązania będzie można otrzymać maksymalnie połowę punktów.
  • Zadanie domowe należy zaprogramować w domu i przesłać rozwiązania do końca tygodnia na Moodle; za poprawne i samodzielne rozwiązanie tego zadania będzie można otrzymać do 10 punktów.
Z części zadaniowej będzie można uzbierać w trakcie semestru maksymalnie 300 punktów.
Projekt:
Część projektowa będzie polegać na zrealizowaniu jednego większego zadania, obejmującego cały przerobiony na części laboratoryjnej materiał. Studenci otrzymają indywidualne zadania projektowe jeszcze przed świętami Bożego Narodzenia. Za samodzielne i poprawne napisanie programu na tej części będzie można dostać do 150 punktów.
Kolokwium:
Po Nowym Roku zostanie przeprowadzone kolokwium. Za kolokwium będzie można dostać do 150 punktów.
Obecności:
Zadania do zaprogramowania będą ogłaszane w internecie tuż przed zajęciami, dlatego obecność na ćwiczeniach jest obowiązkowa.
Prezentacje:
Zadania i projekt można prezentować tylko w czasie trwania pracowni. W trakcie prezentacji programu trzeba się liczyć z pytamiami dotyczącymi rozwiązania: zastosowane metody, zrobione optymalizacje, wykorzystane konstrukcje językowe, itp. Odpowiedzi na te pytania będą miały wpływ na ocenę danego zadania.
Oceny:
Ocena końcowa z ćwiczeń będzie zależeć od zdobytych w semestrze punktów: 50% z częsci zadaniowej, 25% z częsci projektowej i 25% z kolokwium (razem 600 punktów). Ocena będzie wyznaczana według następującej skali:
40% (240 punktów) - dostateczny,
55% (330 punktów) - dostateczny plus,
65% (390 punktów) - dobry,
75% (450 punktów) - dobry plus,
85% (510 punktów) - bardzo dobry.

Lista zadań laboratoryjnych

Laboratorium 0 (30.09/1.10.2011): pierwsze programy.
Poniższe zadania należy edytować, kompilować i uruchamiać w zintegrowanym środowisku programistycznym Code::Blocks (ewentualnie Dev C++).
grupa środowa/sobotnia i piątkowa

Zadanie 1 (laboratoryjne).
Uruchom Code::Blocks (ewentualnie Dev C++), a następnie przepisz, skompiluj i wykonaj wszystkie programy prezentowane na pierwszym wykładzie.

zadanie domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 2.10.2011 do godziny 22:00.

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

Laboratorium 1 (5/7.10.2011): formatowane wejście/wyjście; instrukcje sterujące.
W poniższych zadaniach dane należy wczytywać ze standardowego wejścia za pomocą funkcji scanf(). Wyniki należy wypisywać na standardowym wyjściu za pomocą funkcji printf(). Po wczytaniu każdej liczby sprawdź, czy operacja czytania powiodła się.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 9.10.2011 do godziny 22:00.

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)

Laboratorium 2 (12/14.10.2011): formatowane wejście/wyjście; instrukcje sterujące.
W poniższych zadaniach dane należy wczytywać ze standardowego wejścia stdin za pomocą funkcji scanf(). Wyniki należy wypisywać na standardowym wyjściu stdout za pomocą funkcji printf(). Programy powinny wypisywać na standardowe wyjście dla błędów stderr komunikaty informujące użytkownika o tym, kiedy progam oczekuje na wprowadzenie danych oraz o tym, jakiego rodzaju wyniki zostały wypisane.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 16.10.2011 do godziny 22:00.

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.

Laboratorium 3 (19/21.10.2011): nieformatowane wejście/wyjście; tablice znakowe i napisy.
W poniższych zadaniach nie wolno używać funkcji printf() do pisania formatowanego na satndardowe wyjście ani funkcji scanf() do czytania formatowanego ze standardowego wejścia. W zamian za to posłuż się funkcjami fputc(), fputs(), fgetc() i fgets().
grupa środowa

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.

grupa piątkowa

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.

zadania domowe
Zadania domowe należy przesłać na Moodla do niedzieli 23.10.2011 do godziny 22:00.

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).

Laboratorium 4 (26/28.10.2011): deklaracje i definicje funkcji; rekurencja.
Przed definicją funkcji umieść najpierw ich deklaracje.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 30.10.2011 do godziny 22:00.

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.

Laboratorium 5 (2/4.11.2011): operatory logiczne; pliki nagłówkowe.
Każdy program podziel na pliki nagłówkowe i źródłowe (za wyjątkiem zadania domowego). Zabezpiecz swoje programy przed podaniem nieprawidłowych danych.
grupa środowa

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);

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 6.11.2011 do godziny 22:00.

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ń.

Laboratorium 6 (9/17.11.2011): wskaźniki; pliki nagłówkowe.
Każdy program podziel na pliki nagłówkowe i źródłowe (za wyjątkiem zadania domowego). Używaj raczej wskaźników niż operatorów indeksowania. Zabezpiecz swoje programy przed wyjściem poza tablicę przy przesuwaniu wskaźników.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 20.11.2011 do godziny 22:00.

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.

Laboratorium 7 (23/25.11.2011): struktury, unie, pola bitowe.
Program podziel na pliki nagłówkowe i źródłowe (za wyjątkiem zadania domowego). W każdym programie zdefiniuj w zakresie globalnym nowy typ danych, który jest strukturą lub unią (wykorzystaj instrukcję typedef).
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 27.11.2011 do godziny 22:00.

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.

Laboratorium 8 (30.11/2.12.2011): zarządzanie pamięcią wolną; dynamiczne strukturydanych.
Program podziel na pliki nagłówkowe i źródłowe (za wyjątkiem zadania domowego). Pamiętaj, aby zawsze na końcu programu zwolnić przydzieloną wcześniej pamięć na stercie.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 4.12.2011 do godziny 22:00.

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ę.

Laboratorium 9 (7/9.12.2011): pliki.
Programy podziel na pliki nagłówkowe i źródłowe (za wyjątkiem zadania domowego). Zawsze sprwdzaj w programach czy udało się otworzyć plik a potem po przeczytaniu/zapisaniu danych zamknij go.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 11.12.2011 do godziny 22:00.

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.

Laboratorium 10 (14/16.12.2011): grafika, GTK+.
Zapoznaj się z biblioteką GTK+ z funkcjami do tworzenia aplikacji okienkowych i obsługującymi graficzny interfejs użutkownika.
grupa środowa

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.

grupa piątkowa

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 domowe
Zadanie domowe należy przesłać na Moodla do niedzieli 18.12.2011 do godziny 22:00.

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ę.

Projekt programistyczny (18/20.01.2012).
Poniżej znajduje się lista tematów programistycznych. Z listy tej każdy student wybiera sobie jeden temat i zgłosza go do zaakceptowania w środę 21 grudnia 2011. Jeśli rozkład zgłoszonych tematów nie będzie w miarę jednostajny, to samodzielnie dokonam przydziału tematów (wówczas żadna osoba nie dostanie tego samego tematu, który zadeklarowała). Osoby, które same się nie zadeklarują, otrzymają temat projektu z góry (ode mnie). Można również zgłaszać własne propozycje projektów.
Tematy zadań projektowych:
tautologie
Napisz program badający spełnialność, sprzeczność i własność bycia tautologią w rachunku zdań dowolnej formuły rachunku zdań (bez kwantyfikatorów) ze spójnikami logicznymi: alternatywą (|), koniunkcją (&), negacją (!), implikacją (=>) i równoważnością (<=>). Możesz przyjąć, że zbiór zmiennych zdaniowych jest dowolnym niepustym zbiorem liter alfabetu angielskiego. Program może operować na formule w postaci ONP. Zadaniem programu będzie sprawdzenie czy formuła wylicza się dla każdego wartościowania do wartości true (albo false), czy może dla pewnych wartościowań do wartości true a dla innych do false.
kalkulator
Napisz klakulator dla wyrażeń infiksowych (notacja tradycyjna). Kalkulator ma najpierw przekształcić wyrażenie infiksowe do postaci postfiksowej (Odwrotna Notacja Polska) a potem je wyliczyć i wypisać. Do obliczania wartości wyrażeń ONP wykorzystaj kolejkę i stos zaimplementowane na liście jednokierunkowej. Twój program powinien umożliwiać zapamiętywanie wartości obliczonych wyrażeń za pomoca zmiennych; zbiór zmiennych przechowuj w postaci drzewa BST - elementami tego drzewa będą więc pary nazwa-wartość, gdzie kluczem w takiej parze będzie nazwa zmiennej. Należy sprwdzać poprawność wpisywanych wyrażeń.
maszyna RAM
Maszyna RAM (Random Access Machine) jest abstrakcyjnym modelem obliczeń ze swobodnym dostępem do pamięci. Dokładny opisz tej maszyny (jej budowę, działanie i zestaw rozkazów) można znaleźć na stronie http://wm.ite.pl/stud/ram/doc/index.html. Zadanie polaga na napisaniu symulatora maszyny RAM. Symulator ten powinien działać w trybie tekstowym w jednym z dwóch trybów: w tybie krokowym (wykonujemy kolejną instrukcję dopiero po wydaniu stosownego polecenia a w międzyczasie możemy kontrolować stan rejestrów) i w trybie ciągłym (wykonujemy kolejne instrukcje aż do momentu zatrzymania maszyny).
drzewa zrównoważone
Zaimplementuj słownik, czyli taką strukturę danych, na której można efektywnie wykonać ciąg instrukcji insert, delete i search, w postaci zrównoważonego drzewa BST. Możesz wybrać jedno z następujących drzew:
  1. drzewo AVL
  2. drzewo czerwono-czarne
  3. drzewo SPLAY zwane też drzewem samoorganizującym się
Na strukturze tej powinieneś wykonywać operacje słownikowe odczytane ze standardowego wejścia. Powinieneś też umieć wydrukować schematycznie strukturę takiego drzewa.
kompresja danych
Napisz program, który będzie umożliwiał kompresję i dekompresję zadanych plików. Możesz wybrać jedną z następujących metod kompresji:
  1. kodowanie Hufmana
  2. LZ77 albo wariant ulepszony LZSS
  3. LZ78 albo wariant ulepszony LZW
Twój program powinien umieć skompresować wiele różnych plików umieszczając je wszystkie w jednym archiwum.
sudoku
Napisz parę programów - jeden, który będzie generował łamigłówkę sudoku i drugi, który będzie ją rozwiązywał. Przy rozwiązywaniu sudoku zastosuj określone reguły wnioskowania i wypisuj je kolejno dla każdej umieszczanej w rozwiązaniu liczbie (w ostateczności użyj algorytmu z nawrotami). Przy generowaniu pamiętaj, że prawidłowa łamigłówka powinna posiadać dokładnie jedno rozwiązanie.
geometria analityczna
Rozważmy przestrzeń 3--wymiarową z kartezjańskim układem współrzędnych. W przestrzeni tej umieszczamy figury takie jak punkty, odcinki, trójkąty i czworościany. Figury te mogą się nawzajem zasłaniać lub przenikać. Zadaniem programu jest wygenerowanie rysunku w formacie PS, który byłby rzutem na pewną ustaloną płaszczyznę wszystkich umieszczonych w przestrzeni figur z uwzględnieniem ich wzajemnego zasłaniania.
inne tematy
Można zgłaszać własne propozycje zadań projektowych. Takie indywidualne projekty muszą być jednak ze mną szczegółowo przedyskutowane i zatwierdzone!
Ogólne uwagi dotyczące realizacji projektu:
  • Temat projektu student wybiera samodzielnie spośród zamieszczonych na powyższym wykazie. Należy jednak pamiętać, że rozkład zadań na poszczególnych studentów w grupie ma być w miarę możliwości jednostajny. Można także zgłaszać własne propozycje projektów.
  • Szczegóły dotyczące zakresu prac powinny być uzgodnione ze mną jeszcze przed Bożym Narodzeniem.
  • Projekty mają być wykonane samodzielnie.
  • Program trzeba rozsądnie podzielić na pliki nagłówkowe i źródłowe.
  • W programach należy wykorzystywać pamięć wolną (sterta) i pliki (czytanie danych, zapisywanie wyników).
  • Programy mają być napisane optymalnie, z myślą o łatwych modyfikach i rozszerzeniach.
  • Do projektu należy dołączyć dokumentację w postaci komentarza na początku pliku źródłowego, w którym znajduje się funkcja main(). W dokumentacji należy umieścić:
    1. imię, nazwisko i numer indeksu autora;
    2. opis metody rozwiązania problemu;
    3. opis używanych struktur danych;
    4. bibliografię (ksiązki, czasopisma, artykuły, linki w internecie).
  • Nieprzekraczalny termin realizacji projektu to 20 stycznia 2012 r.

Ranking

  • stan punktowy można sprawdzić w Moodlu

Instytut Informatyki