Lista 3 (25 października 2005): 12 punktów.

Przeczytaj z książki B.W.Kernighana i D.M.Ritchiego Język ANSI C rozdział 2: Typy, operatory i wyrażenia.

  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), która zwraca 1 gdy rok jest przestępny, albo 0 w przeciwnym przypadku.
  2. (2 punkty, kontynuacja poprzednego zadania) 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 dniWMiesiacu, 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. (2 punkty, kontynuacja poprzednego zadania) 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 dniOdPoczRoku, która będzie zawierała informacje o liczbie dni od poczatku roku do końca poprzedniego miesiąca minus jeden dzień. 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, kontynuacja poprzednego zadania) 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...). Weź też pod uwagę fakt, że kalendarz Gregoriański obowiązuje od 15 października 1582. W swoim programie koniecznie zaimplementuj funkcję porownanieDat(int,int,int,int,int,int) porównującą dwie daty, która będzie odpowiadać 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.
  5. (3 punkty, kontynuacja poprzednego zadania) Napisz program, który dwukrotnie wczytuje trzy liczby całkowite reprezentujące odpowiednio dzień, miesiąc i rok (wczytujemy dwie daty). Program ma sprawdzić, czy podane daty są poprawne, a potem wyliczyć, 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ą.

  6. (5 punktów) 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).
  7. (7 punktów, kontynuacja poprzednego zadania) 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.