Laborki z Pascala – Lista 8 i 9
Do Waszej dyspozycji udostępniam dziś dwie ostatnie, najbardziej pracochłonne listy: 8 i 9. Zadania poświęcone są przede wszystkim tematyce zmiennych rekordów i plikom, będących przykładem zmiennych złożonych.
Laboratorium 8
Zadanie 1
Przeanalizowałem :).
Zadanie 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | PROGRAM lista8_zad2(INPUT, OUTPUT); USES CRT; TYPE ZBIOR_PKT = ARRAY OF RECORD a, b : INTEGER; END; VAR punkt : ZBIOR_PKT; x, y, ilosc, X1, Y1, X2, Y2 : INTEGER; wynik, max : REAL; BEGIN CLRSCR; WRITE('Podaj ilość punktów: '); READLN(ilosc); WRITELN; SETLENGTH(punkt, ilosc); max := 0; FOR x := 0 TO (ilosc - 1) DO BEGIN WITH punkt[x] DO BEGIN WRITE('Podaj współrzędne punktu ', x + 1, ': '); READLN(a, b); END; END; FOR x := 0 TO (ilosc - 1) DO BEGIN FOR y := 0 TO (ilosc - 1) DO BEGIN WITH punkt[y] DO BEGIN wynik := SQRT(SQR(punkt[x].a - a) + SQR(punkt[x].b - b)); IF wynik > max THEN BEGIN max := wynik; X1 := punkt[x].a; Y1 := punkt[x].b; X2 := a; Y2 := b; END ELSE CONTINUE; END; END; END; WRITELN; WRITELN('Punkty: (', X1, ', ', Y1, ') i (', X2, ', ', Y2, '), Odległość: ', max:0:2); REPEAT UNTIL KEYPRESSED; END. |
Zgodnie z treścią zadania, współrzędne podanych punktów dodaję do tablicy rekordów. Następnie wyliczam odległości pomiędzy wszystkimi punktami z wzoru na odległość euklidesową i wyznaczam maksymalną wartość, która jest rozwiązaniem problemu.
Zadanie 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | PROGRAM lista8_zad3(INPUT, OUTPUT); USES CRT; VAR rok, miesiac, dzien : INTEGER; FUNCTION UstalDzien(rok, miesiac, dzien : INTEGER) : STRING; VAR M, C, D, N : INTEGER; CONST dni : ARRAY[0..6] OF STRING = ('Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'); BEGIN M := 1 + ((miesiac + 9) MOD 12); IF M > 10 THEN rok := rok - 1; C := rok DIV 100; D := rok MOD 100; N := ((((13 * M) - 1) DIV 5) + D + (D DIV 4) + (C DIV 4) + (5 * C) + dzien) MOD 7; UstalDzien:= dni[N]; END; BEGIN CLRSCR; WRITE('Podaj datę (YYYY MM DD): '); READLN(rok, miesiac, dzien); WRITELN; WRITELN('Jest to: ', UstalDzien(rok, miesiac, dzien)); REPEAT UNTIL KEYPRESSED; END. |
Sposobów na określenie dnia tygodnia na podstawie podanej daty jest kilka. Do tego zadania wykorzystałem jeden z nich, czyli wieczny kalendarz.
Zadanie 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | PROGRAM lista8_zad4(INPUT, OUTPUT); USES CRT; TYPE DATA = RECORD dzien, miesiac, rok : STRING; END; UCZEN = ARRAY[1..5] OF RECORD imie, nazwisko : STRING; dataur : DATA; END; VAR info : UCZEN; wybor : INTEGER; PROCEDURE UzupelnijBaze; VAR x : INTEGER; BEGIN FOR x := 1 TO 5 DO BEGIN WITH info[x], dataur DO BEGIN WRITELN; WRITELN('Uzupełnij formularz - Osoba nr', x, ':'); WRITELN; WRITE('Imię: '); READLN(imie); WRITE('Nazwisko: '); READLN(nazwisko); WRITE('Dzień urodzin: '); READLN(dzien); WRITE('Miesiąc urodzin: '); READLN(miesiac); WRITE('Rok urodzin: '); READLN(rok); END; END; READLN; CLRSCR; END; PROCEDURE WyswietlBaze; VAR x : INTEGER; BEGIN WRITELN; FOR x := 1 TO 5 DO BEGIN WITH info[x], dataur DO WRITELN('NR', x, ': ', imie, ' ', nazwisko, ' :: ', dzien, '-', miesiac, '-', rok); END; READLN; CLRSCR; END; PROCEDURE SzukajNazwiskiem; VAR x : INTEGER; nazw : STRING; BEGIN WRITELN; WRITE('Wpisz szukane nazwisko: '); READLN(nazw); WRITELN; FOR x := 1 TO 5 DO BEGIN WITH info[x] DO BEGIN IF nazw = nazwisko THEN WRITELN('- ', imie, ' ', nazwisko) ELSE CONTINUE; END; END; READLN; CLRSCR; END; PROCEDURE SzukajData; VAR x : INTEGER; rokur : STRING; BEGIN WRITELN; WRITE('Wpisz rok urodzenia: '); READLN(rokur); WRITELN; FOR x := 1 TO 5 DO BEGIN WITH info[x], dataur DO BEGIN IF rokur = rok THEN WRITELN('- ', imie, ' ', nazwisko) ELSE CONTINUE; END; END; READLN; CLRSCR; END; BEGIN WHILE TRUE DO BEGIN CLRSCR; WRITELN('1. Uzupełnij bazę'); WRITELN('2. Wyświetl bazę'); WRITELN('3. Szukaj względem nazwiska'); WRITELN('4. Szukaj względem roku urodzenia'); WRITELN; WRITE('Wybór: '); READLN(wybor); CASE wybor OF 1 : UzupelnijBaze; 2 : WyswietlBaze; 3 : SzukajNazwiskiem; 4 : SzukajData; ELSE EXIT; END; END; END. |
W zadaniu tym należy skorzystać z rekordów zagnieżdżonych, czyli pól adresowych, będących rekordami umieszczonymi wewnątrz głównego rekordu. Należy zwrócić uwagę na to, w jakiej kolejności definiowane są poszczególne (zależne od siebie) rekordy! Zwróćcie uwagę na to, że skorzystałem z instrukcji WITH, w celu pominięcia nazwy rekordów przed nazwali pól. Całe zadanie dotyczy zdefiniowanych procedur, których rolę realizują założenia wytyczone w treści.
Zadanie 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | PROGRAM lista8_zad5(INPUT, OUTPUT); USES CRT; TYPE KLASA = ARRAY[1..36] OF RECORD imie, nazwisko : STRING; END; TABLICA = ARRAY[1..36] OF INTEGER; VAR uczen : KLASA; ludzie : TABLICA; x : INTEGER; FUNCTION LosowanieBezPowtorzen : TABLICA; VAR losy : TABLICA; x, temp : INTEGER; BEGIN RANDOMIZE; FOR x := 1 TO 36 DO losy[x] := 0; FOR x := 1 TO 36 DO BEGIN REPEAT temp := RANDOM(36) + 1; UNTIL losy[temp] = 0; ludzie[x] := temp; losy[temp] := 1; END; LosowanieBezPowtorzen := ludzie; END; BEGIN CLRSCR; FOR x := 1 TO 36 DO BEGIN WITH uczen[x] DO BEGIN WRITE('Imię i nazwisko ucznia: '); READLN(imie, nazwisko); END; END; ludzie := LosowanieBezPowtorzen; WRITELN; WRITELN('Wyniki losowania: '); WRITELN; FOR x := 1 TO 36 DO BEGIN IF (x MOD 2 = 0) THEN BEGIN WITH uczen[ludzie[x]] DO WRITELN(imie, ' ', nazwisko); END ELSE WITH uczen[ludzie[x]] DO WRITE('Para: ', imie, ' ', nazwisko, 'oraz '); END; REPEAT UNTIL KEYPRESSED; END. |
W celu wylosowania nazwisk uczniów i stworzenia par odbywających dyżury, napisałem funkcję LosowanieBezPowtorzen, która generuje tablicę liczb (z uwzględnionym przedziałem), pozbawioną duplikatów. Tablica posłuży mi jako indeks, za pomocą którego odwołam się do tablicy rekordów przechowującej dane wszystkich uczniów.
Zadanie 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | PROGRAM lista8_zad6(INPUT, OUTPUT); USES CRT; CONST rozmiar = 3; TYPE COMPLEX = ARRAY OF ARRAY OF RECORD re, im : REAL; END; VAR zespolona : COMPLEX; x, y : INTEGER; BEGIN CLRSCR; SETLENGTH(zespolona, rozmiar, rozmiar); FOR x := 0 TO (rozmiar - 1) DO BEGIN FOR y := 0 TO (rozmiar - 1) DO BEGIN WITH zespolona[x][y] DO BEGIN WRITE('Podaj Re i Im: '); READLN(re, im); END; END; END; WRITELN; FOR x := 0 TO (rozmiar - 1) DO BEGIN FOR y := 0 TO (rozmiar - 1) DO BEGIN WITH zespolona[x][y] DO WRITELN('z = ', re:0:0, ' i', im:0:0); END; END; REPEAT UNTIL KEYPRESSED; END. |
Wartość stałej nadaje rozmiar macierzy (NxN), przechowującej nowo zdefiniowany typ, jakim są liczby zespolone (COMPLEX). Tablica rekordów zostanie uzupełniona polami przechowującymi część rzeczywistą i urojoną podanych liczb.
Laboratorium 9
Zadanie 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | PROGRAM lista9_zad1(INPUT, OUTPUT); USES CRT; TYPE BYTEFILE = FILE OF BYTE; VAR plik : BYTEFILE; x, ilosc, liczba : INTEGER; BEGIN CLRSCR; RANDOMIZE; ASSIGN(plik, 'zad1.txt'); REWRITE(plik); ilosc := RANDOM(801) + 200; FOR x := 1 TO ilosc DO BEGIN liczba := RANDOM(101) + 100; WRITE(plik, liczba); END; CLOSE(plik); REPEAT UNTIL KEYPRESSED; END. |
Zadanie jest dobrym przykładem sposobu definiowania i korzystania z pliku nietekstowego (w formacie binarnym). Plik ten składa się z losowej ilości liczb o przypadkowych wartościach, ograniczonych przedziałami. Posłuży nam do wykonania pozostałych zadań tej listy.
Zadanie 2a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | PROGRAM lista9_zad2a(INPUT, OUTPUT); USES CRT; TYPE BYTEFILE = FILE OF BYTE; VAR plik, plik2 : BYTEFILE; temp : BYTE; BEGIN CLRSCR; ASSIGN(plik, 'zad1.txt'); RESET(plik); ASSIGN(plik2, 'zad2a.txt'); REWRITE(plik2); WHILE NOT EOF(plik) DO BEGIN READ(plik, temp); IF (temp MOD 2 = 0) THEN WRITE(plik2, temp) ELSE CONTINUE; END; CLOSE(plik2); CLOSE(plik); REPEAT UNTIL KEYPRESSED; END. |
Bazując na pliku z Zadania 1, znajduję wszystkie liczby parzyste. Następnie umieszczam je w pliku docelowym. W tym celu analizuję cały plik źródłowy wykorzystując funkcję EOF.
Zadanie 2b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | PROGRAM lista9_zad2b(INPUT, OUTPUT); USES CRT; TYPE BYTEFILE = FILE OF BYTE; BYTEARRAY = ARRAY OF BYTE; STATS = ARRAY OF RECORD cyfra, ile : INTEGER; END; VAR plik : BYTEFILE; tablica : BYTEARRAY; statystyka : STATS; temp : BYTE; x, y, ilosc : INTEGER; BEGIN CLRSCR; ilosc := 0; ASSIGN(plik, 'zad1.txt'); RESET(plik); WHILE NOT EOF(plik) DO BEGIN SETLENGTH(tablica, ilosc + 1); SETLENGTH(statystyka, ilosc + 1); READ(plik, temp); tablica[ilosc] := temp; ilosc := ilosc + 1; END; CLOSE(plik); FOR x := 0 TO (ilosc - 1) DO BEGIN statystyka[x].ile := 0; statystyka[x].cyfra := tablica[x]; FOR y := 0 TO (ilosc - 1) DO BEGIN IF tablica[x] = tablica[y] THEN statystyka[x].ile := statystyka[x].ile + 1 ELSE CONTINUE; END; END; ASSIGN(plik, 'zad2b.txt'); REWRITE(plik); FOR x := 0 TO (ilosc - 1) DO BEGIN IF statystyka[x].ile = 1 THEN WRITE(plik, statystyka[x].cyfra) ELSE CONTINUE; END; CLOSE(plik); REPEAT UNTIL KEYPRESSED; END. |
Bazując na pliku z Zadania 1, wyodrębniam liczby, które w całym ciągu pojawiły się jeden raz. Aby tego dokonać tworzę statystykę (tablicę rekordów), która dla każdej analizowanej liczby przypisuje ilość jej wystąpień. Następnie do pliku docelowego trafiają liczby, których to wystąpienie w ciągu równe jest 1. Warto szczególną uwagę zwrócić na budowę pierwszej pętli WHILE, odpowiedzialnej za jednoczesne ustalenie ilości liczb w ciągu, jak i dynamiczny przyrost wielkości obu tablic.
Zadanie 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | PROGRAM lista9_zad3(INPUT, OUTPUT); USES CRT; TYPE BYTEFILE = FILE OF BYTE; BYTEARRAY = ARRAY OF BYTE; VAR plik : BYTEFILE; tablica : BYTEARRAY; temp : BYTE; x, ilosc : INTEGER; FUNCTION SortujTablice(tablica : BYTEARRAY) : BYTEARRAY; VAR x, y, liczba : INTEGER; BEGIN FOR x := 0 TO (ilosc - 2) DO BEGIN FOR y := (ilosc - 1) DOWNTO (x + 1) DO BEGIN IF tablica[y - 1] > tablica[y] THEN BEGIN liczba := tablica[y]; tablica[y] := tablica[y - 1]; tablica[y - 1] := liczba; END ELSE CONTINUE; END; END; SortujTablice := tablica; END; BEGIN CLRSCR; ilosc := 0; ASSIGN(plik, 'zad1.txt'); RESET(plik); WHILE NOT EOF(plik) DO BEGIN SETLENGTH(tablica, ilosc + 1); READ(plik, temp); tablica[ilosc] := temp; ilosc := ilosc + 1; END; CLOSE(plik); tablica := SortujTablice(tablica); ASSIGN(plik, 'zad1.txt'); REWRITE(plik); FOR x := 0 TO (ilosc - 1) DO WRITE(plik, tablica[x]); CLOSE(plik); REPEAT UNTIL KEYPRESSED; END. |
Bazując na pliku z Zadania 1, sortuję cały ciąg liczb, bez tworzenia pliku pomocniczego. W tym celu stworzyłem tablicę dynamiczną zawierającą dane liczby, którą to “przepuściłem” przez funkcję SortujTablice. Następnie wynik nadpisałem na plik źródłowy.
Zadanie 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | PROGRAM lista9_zad4(INPUT, OUTPUT); USES CRT; TYPE LINEARRAY = ARRAY OF STRING; VAR plik : TEXT; x, ilosc, dlugosc : INTEGER; liczba, temp : STRING; tablica : LINEARRAY; BEGIN CLRSCR; ilosc := 0; ASSIGN(plik, 'zad4.txt'); RESET(plik); WHILE NOT EOF(plik) DO BEGIN SETLENGTH(tablica, ilosc + 1); READLN(plik, temp); tablica[ilosc] := temp; ilosc := ilosc + 1; END; CLOSE(plik); ASSIGN(plik, 'zad4.txt'); REWRITE(plik); FOR x := 0 TO (ilosc - 1) DO BEGIN STR(x + 1, liczba); dlugosc := LENGTH(liczba); IF dlugosc = 1 THEN WRITE(plik, CONCAT('000', liczba, tablica[x])) ELSE IF dlugosc = 2 THEN WRITE(plik, CONCAT('00', liczba, tablica[x])) ELSE IF dlugosc = 3 THEN WRITE(plik, CONCAT('0', liczba, tablica[x])) ELSE WRITE(plik, CONCAT(liczba, tablica[x])); IF x = (ilosc - 1) THEN WRITE(plik) ELSE WRITELN(plik); END; CLOSE(plik); REPEAT UNTIL KEYPRESSED; END. |
W celu prawidłowego uruchomienia tego programu, należy wcześniej przygotować plik tekstowy zad4.txt (z zawartością). Każdej linii pliku zostaje przyporządkowany numer wiersza, który powinien zajmować (zawsze) 4 pozycje.
Zadanie 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | PROGRAM lista9_zad5(INPUT, OUTPUT); USES CRT; TYPE MACIERZ = ARRAY OF ARRAY OF INTEGER; VAR plik, plik2 : TEXT; x, y, wiersze, kolumny, a, b : INTEGER; znak : CHAR; tablica : MACIERZ; BEGIN CLRSCR; ASSIGN(plik, 'zad5.txt'); RESET(plik); wiersze := 0; kolumny := 0; WHILE NOT EOF(plik) DO BEGIN WHILE NOT EOLN(plik) DO BEGIN READ(plik, znak); IF znak IN ['0'..'9'] THEN kolumny := kolumny + 1 ELSE CONTINUE; END; READLN(plik); wiersze := wiersze + 1; END; CLOSE(plik); kolumny := ROUND(kolumny / wiersze) - 1; a := 0; b := 0; SETLENGTH(tablica, wiersze, kolumny); ASSIGN(plik, 'zad5.txt'); RESET(plik); ASSIGN(plik2, 'zad5-trans.txt'); REWRITE(plik2); FOR y := 0 TO (kolumny - 1) DO BEGIN FOR x := 0 TO (wiersze - 1) DO BEGIN WHILE NOT EOF(plik) DO BEGIN WHILE NOT EOLN(plik) DO BEGIN READ(plik, tablica[a, b]); b := b + 1; END; READLN(plik); b := 0; a := a + 1; END; IF x = (wiersze - 1) THEN WRITE(plik2, tablica[x][y]) ELSE WRITE(plik2, tablica[x][y], ' '); END; IF y = (kolumny - 1) THEN WRITE(plik2) ELSE WRITELN(plik2); END; CLOSE(plik2); CLOSE(plik); REPEAT UNTIL KEYPRESSED; END. |
W celu prawidłowego uruchomienia tego programu, należy wcześniej przygotować plik tekstowy zad5.txt, z zawartością macierzy (NxM). Program dokona przestawienia macierzy, a wynik zapisze w pliku docelowym.
Zadanie 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | PROGRAM lista9_zad6(INPUT, OUTPUT); USES CRT, DOS, SYSUTILS; CONST baza = 'zad6.txt'; TYPE OSOBA = RECORD imie, nazwisko : STRING[25]; dzien, miesiac : BYTE; rok : INTEGER; END; VAR plik : TEXT; wybor : CHAR; PROCEDURE SprBaza; BEGIN IF FSEARCH(baza, '') = '' THEN BEGIN ASSIGN(plik, baza); REWRITE(plik); CLOSE(plik); END; END; PROCEDURE DodajOsobe; VAR nowy : OSOBA; d, m, r : STRING; BEGIN ASSIGN(plik, baza); APPEND(plik); WITH nowy DO BEGIN WRITELN; WRITE('Podaj imię i nazwisko: '); READLN(imie, nazwisko); WRITE('Podaj datę urodzenia (DD MM RRRR): '); READLN(dzien, miesiac, rok); STR(dzien, d); STR(miesiac, m); STR(rok, r); IF LENGTH(d) = 1 THEN d := '0' + d; IF LENGTH(m) = 1 THEN m := '0' + m; WRITELN(plik, CONCAT(imie, nazwisko, ' ', d, '-', m, '-', r)); END; CLOSE(plik); READLN; CLRSCR; END; PROCEDURE WyswietlPelnoletnich; VAR linia, data : STRING; akt_d, akt_m, akt_r, d, m, r : INTEGER; BEGIN WRITELN; ASSIGN(plik, baza); RESET(plik); WHILE NOT EOF(plik) DO BEGIN READLN(plik, linia); data := DATETOSTR(Date); VAL(COPY(linia, LENGTH(linia) - 9, 2), d); VAL(COPY(linia, LENGTH(linia) - 6, 2), m); VAL(COPY(linia, LENGTH(linia) - 3, 4), r); VAL(COPY(data, 9, 2), akt_d); VAL(COPY(data, 6, 2), akt_m); VAL(COPY(data, 1, 4), akt_r); IF (akt_r - r) > 18 THEN WRITELN('- ', linia) ELSE IF (akt_r - r) = 18 THEN BEGIN IF (akt_m - m) > 0 THEN WRITELN('- ', linia) ELSE IF (akt_m - m) = 0 THEN BEGIN IF (akt_d - d) >= 0 THEN WRITELN('- ', linia); END; END; END; CLOSE(plik); READLN; CLRSCR; END; PROCEDURE WyswietlWzgledemDaty; VAR linia : STRING; ust_d, ust_m, ust_r, d, m, r : INTEGER; BEGIN WRITELN; WRITE('Podaj datę (DD MM RRRR): '); READLN(ust_d, ust_m, ust_r); WRITELN; ASSIGN(plik, baza); RESET(plik); WHILE NOT EOF(plik) DO BEGIN READLN(plik, linia); VAL(COPY(linia, LENGTH(linia) - 9, 2), d); VAL(COPY(linia, LENGTH(linia) - 6, 2), m); VAL(COPY(linia, LENGTH(linia) - 3, 4), r); IF (ust_r - r) < 0 THEN WRITELN('- ', linia) ELSE IF (ust_r - r) = 0 THEN BEGIN IF (ust_m - m) < 0 THEN WRITELN('- ', linia) ELSE IF (ust_m - m) = 0 THEN BEGIN IF (ust_d - d) < 0 THEN WRITELN('- ', linia); END; END; END; CLOSE(plik); READLN; CLRSCR; END; BEGIN CLRSCR; WHILE TRUE DO BEGIN SprBaza; WRITELN('1. Dodaj nową osobę'); WRITELN('2. Wyświetl osoby pełnoletnie'); WRITELN('3. Wyświetl osoby później urodzone'); WRITELN; WRITE('Wybór: '); READLN(wybor); CASE wybor OF '1' : DodajOsobe; '2' : WyswietlPelnoletnich; '3' : WyswietlWzgledemDaty; ELSE EXIT; END; END; END. |
Na podstawie ustalonego już typu – OSOBA, należy wykonać sprawnie działającą bazę danych. Na początku każdego uruchomienia programu sprawdzam, czy w obrębie aplikacji nie znajduje się już plik tekstowy, przechowujący dane tych osób. Dokonuję tego przy pomocy funkcji FSEARCH, z modułu DOS. Brak pliku spowoduje utworzenie nowej bazy. Dodawanie osób odbywa się przy pomocy procedury DodajOsobe ściśle powiązanej z typem OSOBA. WyswietlPelnoletnich, to kolejna procedura naszego menu, która na podstawie dogłębnej analizy daty urodzenia każdej z osób oraz aktualnej daty, wyznacza tylko te, które ukończyły 18 lat. Dzisiejszą datę ustala funkcja DATETOSTR(Date), z modułu SYSUTILS. WyswietlWzgledemDaty, działa podobnie do powyższej procedury. Algorytm postępowania jest analogiczny, zmieniają się tylko warunki logiczne.
Wszystkie zadania z tych lekcji można pobrać: tutaj i tutaj.
Będą teraz inni rżnąć z tąd na głupa ;]. Milo było troche pomóc panie PRACOWITY, kawał dobrej roboty!