Laborki z Pascala – Lista 6
Udostępniam rozwiązania Listy 6!
Laboratorium 6
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 | PROGRAM lista6_zad1(INPUT, OUTPUT); USES CRT; PROCEDURE WypelnijTablice(a, b : INTEGER); VAR tablica : ARRAY OF INTEGER; x : INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; FOR x := 0 TO (a - 1) DO tablica[x] := RANDOM(b) + 1; FOR x := 0 TO (a - 1) DO WRITE(tablica[x], ' '); END; BEGIN CLRSCR; WypelnijTablice(10, 20); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele procedury WypelnijTablice. Ilość liczb oraz ich zakres podaje użytkownik w postaci parametrów aktualnych. W treści zadania nie zostało sprecyzowane, czy algorytm losowania ma eliminować duplikaty, dlatego też przedstawiłem go w najprostszej postaci.
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 | PROGRAM lista6_zad2(INPUT, OUTPUT); USES CRT; FUNCTION PoliczSrednia(a, b : INTEGER) : REAL; VAR tablica : ARRAY OF INTEGER; x, wynik : INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; wynik := 0; FOR x := 0 TO (a - 1) DO BEGIN tablica[x] := RANDOM(b) + 1; wynik := wynik + tablica[x]; END; PoliczSrednia := wynik / a; END; BEGIN CLRSCR; WRITELN(PoliczSrednia(10, 20):0:1); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele funkcji PoliczSrednia, po czym obliczam średnią z tych liczb.
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 | PROGRAM lista6_zad3(INPUT, OUTPUT); USES CRT; FUNCTION PoliczSume(a, b : INTEGER) : REAL; VAR tablica : ARRAY OF INTEGER; x, wynik : INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; wynik := 0; FOR x := 0 TO (a - 1) DO BEGIN tablica[x] := RANDOM(b) + 1; wynik := wynik + tablica[x]; END; PoliczSume := wynik; END; BEGIN CLRSCR; WRITELN(PoliczSume(10, 20):0:1); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele funkcji PoliczSume, po czym obliczam sumę wszystkich liczb.
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 | PROGRAM lista6_zad4(INPUT, OUTPUT); USES CRT; PROCEDURE WyznaczMax(a, b : INTEGER); VAR tablica : ARRAY OF INTEGER; x, max, pozycja: INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; max := 0; FOR x := 0 TO (a - 1) DO BEGIN tablica[x] := RANDOM(b) + 1; IF tablica[x] > max THEN BEGIN max := tablica[x]; pozycja := x + 1; END ELSE CONTINUE; END; WRITELN(max, ', ', pozycja); END; BEGIN CLRSCR; WyznaczMax(10, 20); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele procedury WyznaczMax. Następnie, na podstawie porównania wyznaczam maksymalną liczbę wraz z jej pozycją w ciągu.
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 | PROGRAM lista6_zad5(INPUT, OUTPUT); USES CRT; FUNCTION OdszukajElement(a, b, c : INTEGER) : INTEGER; VAR tablica : ARRAY OF INTEGER; x : INTEGER; BEGIN SETLENGTH(tablica, b); RANDOMIZE; FOR x := 0 TO (b - 1) DO BEGIN tablica[x] := RANDOM(c) + 1; IF a = tablica[x] THEN BEGIN OdszukajElement := x + 1; EXIT; END ELSE CONTINUE; END; OdszukajElement := -1; END; BEGIN CLRSCR; WRITELN(OdszukajElement(5, 10, 20)); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele funkcji OdszukajElement. Następnie, każdą z tych liczb porównuję z liczbą podaną przez użytkownika, zwracając ustaloną w treści zadania wartość. W sytuacji kiedy liczby są sobie równe, zwracam pozycję liczby, w przeciwnym wypadku (brak szukanego elementu) -1. W związku z tym, że w (Free) Pascalu zwracanie danych przez funkcję wcale nie kończy jej działania, wykorzystałem instrukcję EXIT, która “wychodzi” z funkcji i wraca do głównego ciała programu.
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 | PROGRAM lista6_zad6(INPUT, OUTPUT); USES CRT; PROCEDURE WyswietlTablice(a, b : INTEGER); VAR tablica : ARRAY OF INTEGER; x : INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; FOR x := 0 TO (a - 1) DO tablica[x] := RANDOM(b) + 1; FOR x := (a - 1) DOWNTO 0 DO WRITE(tablica[x], ' '); END; BEGIN CLRSCR; WyswietlTablice(10, 20); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele procedury WyswietlTablice, po czym wyświetlam jej elementy w odwrotnej kolejności.
Zadanie 7
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 lista6_zad7(INPUT, OUTPUT); USES CRT; FUNCTION ZliczParzyste(a, b : INTEGER) : INTEGER; VAR tablica : ARRAY OF INTEGER; x, ilosc : INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; ilosc := 0; FOR x := 0 TO (a - 1) DO BEGIN tablica[x] := RANDOM(b) + 1; IF (tablica[x] MOD 2) = 0 THEN ilosc := ilosc + 1 ELSE CONTINUE; END; ZliczParzyste := ilosc; END; BEGIN CLRSCR; WRITELN(ZliczParzyste(10, 20)); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele funkcji ZliczParzyste. Następnie, na podstawie dzielenia modulo i zwracanej wartości zliczam ilość elementów parzystych w tablicy.
Zadanie 8
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 | PROGRAM lista6_zad8(INPUT, OUTPUT); USES CRT; PROCEDURE SortujTablice(a, b : INTEGER); VAR tablica : ARRAY OF INTEGER; x, y, temp : INTEGER; BEGIN SETLENGTH(tablica, a); RANDOMIZE; FOR x := 0 TO (a - 1) DO tablica[x] := RANDOM(b) + 1; FOR x := 0 TO (a - 2) DO BEGIN FOR y := (a - 1) DOWNTO (x + 1) DO BEGIN IF tablica[y - 1] > tablica[y] THEN BEGIN temp := tablica[y]; tablica[y] := tablica[y - 1]; tablica[y - 1] := temp; END ELSE CONTINUE; END; END; FOR x := 0 TO (a - 1) DO WRITE(tablica[x], ' '); END; BEGIN CLRSCR; SortujTablice(10, 20); REPEAT UNTIL KEYPRESSED; END. |
Wypełniam tablicę (dynamiczną) losowymi liczbami całkowitymi, zadeklarowaną w ciele procedury SortujTablice. Następnie, sortuję elementy tablicy, wykorzystując algorytm sortowania bąbelkowego.
Zadanie 9
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 | PROGRAM lista6_zad9(INPUT, OUTPUT); USES CRT; CONST LINIA = CHR(13) + CHR(10); rozmiar = 10; przedzial = 20; VAR x : INTEGER; tablica : ARRAY OF INTEGER; wybor : CHAR; // Wybór 1 :: WypelnijTablice PROCEDURE WypelnijTablice(a, b : INTEGER); BEGIN SETLENGTH(tablica, a); RANDOMIZE; FOR x := 0 TO (a - 1) DO tablica[x] := RANDOM(b) + 1; TEXTCOLOR(WHITE); WRITE(LINIA, 'Wynik: '); FOR x := 0 TO (a - 1) DO WRITE(tablica[x], ' '); READLN; END; // Wybór 2 :: WyznaczMax PROCEDURE WyznaczMax(a, b : INTEGER); VAR max, pozycja: INTEGER; BEGIN max := 0; FOR x := 0 TO (a - 1) DO BEGIN IF tablica[x] > max THEN BEGIN max := tablica[x]; pozycja := x + 1; END ELSE CONTINUE; END; TEXTCOLOR(WHITE); WRITELN(LINIA, 'Wynik: ', max, ', ', pozycja); READLN; END; // Wybór 3 :: WyswietlTablice PROCEDURE WyswietlTablice(a, b : INTEGER); BEGIN TEXTCOLOR(WHITE); WRITE(LINIA, 'Wynik: '); FOR x := (a - 1) DOWNTO 0 DO WRITE(tablica[x], ' '); READLN; END; // Wybór 4 :: SortujTablice PROCEDURE SortujTablice(a, b : INTEGER); VAR y, temp : INTEGER; BEGIN FOR x := 0 TO (a - 2) DO BEGIN FOR y := (a - 1) DOWNTO (x + 1) DO BEGIN IF tablica[y - 1] > tablica[y] THEN BEGIN temp := tablica[y]; tablica[y] := tablica[y - 1]; tablica[y - 1] := temp; END ELSE CONTINUE; END; END; TEXTCOLOR(WHITE); WRITE(LINIA, 'Wynik: '); FOR x := 0 TO (a - 1) DO WRITE(tablica[x], ' '); READLN; END; BEGIN WHILE TRUE DO BEGIN CLRSCR; TEXTCOLOR(YELLOW); WRITELN('1) Wypełnij tablicę losowanymi liczbami', LINIA); WRITELN('2) Znajdź wartość i pozycję maksymalnej liczby', LINIA); WRITELN('3) Wypisz (w odwrotnej kolejności) wszystkie liczby', LINIA); WRITELN('4) Posortuj liczby', LINIA); WRITELN('5) EXIT', LINIA); WRITE('Wybór: '); READLN(wybor); CASE wybor OF '1' : WypelnijTablice(rozmiar, przedzial); '2' : WyznaczMax(rozmiar, przedzial); '3' : WyswietlTablice(rozmiar, przedzial); '4' : SortujTablice(rozmiar, przedzial); '5' : EXIT; ELSE EXIT; END; END; END. |
Zadanie ma na celu przetestować działanie tej samej tablicy (dynamicznej) względem powyższych procedur. Wiąże się to z tym, że deklaracji tablicy należy dokonać w głównym bloku deklaracyjnym zmiennych.
Zadanie 10
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 lista6_zad10(INPUT, OUTPUT); USES CRT; PROCEDURE GenerujTabliczke; VAR tablica : ARRAY [1..10, 1..10] OF INTEGER; x, y: INTEGER; BEGIN FOR x := 1 TO 10 DO BEGIN FOR y := 1 TO 10 DO tablica[x][y] := x * y; END; FOR x := 1 TO 10 DO BEGIN WRITELN; FOR y := 1 TO 10 DO WRITE(tablica[x][y]:7); WRITELN; END; END; BEGIN CLRSCR; GenerujTabliczke; REPEAT UNTIL Keypressed; END. |
Generuję w dwuwymiarowej tablicy (statycznej) tabliczkę mnożenia (10 x 10), a następnie wyświetlam jej wynik na ekranie.
Wszystkie zadania z tej lekcji można pobrać: tutaj.
Dzięki Tobie proste jak Żaba :).