z3, Podstawy programowania, laborki
[ Pobierz całość w formacie PDF ]
Wstęp teoretyczny
oprac. Robert Tomaszewski
Uzupełnienie wiadomości dot. instrukcji IF - instrukcje te można
zagnieżdżać, tzn. umieszczać IF w IF.
Przykłady:
if warunek then
if warunek then instrukcja
else instrukcja
else instrukcja;
if warunek then instrukcja
else if warunek then instrukcja
else instrukcja;
if warunek then instrukcja
else if warunek then instrukcja
else if warunek then instrukcja;
Zamiast pojedynczej instrukcji można użyć kilku zgrupowanych
między słowami kluczowymi begin ... end
Zasada sprawdzania warunku jest zawsze taka sama - warunek między
'if' i 'then' MUSI być prawdziwy, żeby wykonała się instrukcja po
słowie 'then'. W przeciwnym wypadku przechodzimy do sekcji 'else',
jeżeli takowa istnieje (else nie jest sekcją obowiązkową!).
>>>> Zadanie 1
Napisz program obliczający pierwiastki (pojedynczy lub podwójny)
trójmianu kwadratowego. Jeżeli delta<0 program musi wyświetlać
komunikat o niemożności obliczenia pierwiastków rzeczywistych.
Użyj odpowiednio skonstruowanych instrukcji IF...THEN...ELSE.
delta = sqr(b)-4*a*c
x1 = (-b+sqrt(delta))/2*a
x2 = (-b-sqrt(delta))/2*a
Zmienne tablicowe i instrukcja pętli FOR
Struktura tablicowa to kilka zmiennych tego samego typu
zgrupowanych w jednÄ… zmiennÄ… (tablicÄ™).
Ważne!
Dostęp do elementów
grupy odbywa siÄ™ na zasadzie indeksowania (podania numeru elementu
w tablicy). Zamiast deklarować kilka zmiennych tego samego typu,
tzn.:
var
a, b, c: Byte;
możemy utworzyć kilkuelementową tablicę:
type {sekcja 'type' powinna wystąpić przed sekcją 'var'}
tab = array[0..2] of Byte;
tab1 = array[1..3] of Byte;
tab2 = array[-2..0] of Byte;
tab3 = array[100..102] of Byte;
{wszystkie powyższe typy są jednakowe co do rozmiaru (ilości) i rodzaju
przechowywanych elementów - Byte;
różnią się jedynie użytą numeracją do indeksowania}
var
a: tab;
b: tab1;
c: tab2;
d: tab3;
begin
writeln('Podaj pierwszy element tablicy a: ');
readln(a[0]);{wczytaj liczbę podaną przez użytkownika do pozycji 0 w tablicy}
b[3]:=a[0];{przypisz ostatniemu elementowi tablicy b wartość pierwszego
elementu z tablicy a}
c[-1]:=2*b[3];{na wartościach przechowywanych w tablicy można wykonywać
różnorakie operacje}
a[1]:=a[0];{to jest instrukcja przypisania poprawna}
a[1]:=a[2];{sytuacja nieprawidłowa - nie określiliśmy uprzednio wartości a[2]}
a[1]:=a[3];{to też jest źle, bo indeks 3 nie występuje w tej tablicy}
d[102]:=a[1]+b[3];{tablice a, b oraz d zawierają liczby typu Byte, więc
instrukcja jest poprawna}
UWAGA!
Zmienne typu String to też tablice - tablice znaków. Dzięki
temu stosując indeksację możemy dostać się do poszczególnych
znaków tworzących napis, np.:
var
tekst: String[10];
begin
readln(tekst);
writeln(tekst[1]);{wypisz pierwszÄ… literÄ™ napisu}
tekst[2]:=tekst[3];{przypisz znakowi 2 to co jest pod znakiem 3}
writeln(tekst[11]);{źle - poza dopuszczalnym indeksem}
UWAGA!
Pod indeksem 0 (np. tekst[0]) znajduje siÄ™ liczba typu
Byte, opisująca AKTUALNĄ długość napisu (czyli w powyższym
przykładzie będzie to liczba <=10, bo z deklaracji wynika
String[10]).
Tak jak instrukcja warunkowa (IF) służy do rozgałęzienia programu,
tak pętla służy do kilkukrotnego wykonania tej samej lub tych
samych czynności (grupa instrukcji w pomiędzy begin ... end).
Ważne!
Czynności (instrukcje) są w każdym przebiegu takie same,
ale przetwarzane dane mogą być już różne. Najlepiej zaobserwować
to na przykładzie przetwarzania w pętli zmiennych tablicowych.
Ogólna postać pętli FOR:
for poczÄ…tek_zliczania to/downto koniec_zliczania do instrukcja
(lub 'begin ... end');
dla liczby kroków pętli od ... do ... wykonaj)
czyli np.:
for i:=1 to 10 do tekst[i]:='a';{przypisz wszystkim znakom w
tablicy tekstowej wartość 'a'}
for i:=10 downto 1 do tekst[i]:='a';{jak wyżej, ale indeksowanie
odbywa się 'w dół'}
WAŻNE!
Zmienna licznikowa (w naszym przykładzie 'i') MUSI być
uprzednio zadeklarowana w sekcji 'var' i musi być typu
całkowitego (w ogólności - porządkowego). Jeżeli wewnątrz pętli
jedna z jej instrukcji zmieni wartość zmiennej licznikowej ulegnie
też zmianie liczba kroków pętli (czasem może powstać pętla
nieskończona!).
Przykład programu sumującego wszystkie liczby w tablicy
maksymalnie 10-elementowej:
type
tab_liczb = array[0..9] of Word;
okrojony = 0..20;{typ okrojony - pozwala jedynie na liczby z zakresu [0..10]}
var
n: okrojony;
i: Byte;
a: tab_liczb;
wynik: Word; {Word może okazać się zbyt mały do pomieszczenia wyniku, zalecany
LongInt lub Real}
begin
writeln('Ile liczb chcesz sumować? Podaj liczbę <=10);
readln(n);
if n>10 then begin
writeln('Podales zbyt duzy zakres tablicy!');
exit;{natychmiastowe zakończenie programu}
end;
wynik:=0; {dobry nawyk to wstępne zerowanie zmiennych}
for i:=0 to n-1 do begin {liczymy do n-1, bo zaczynamy od 0 a nie od 1}
writeln('Podaj liczbe ',i);
readln(a[i]);
wynik:=wynik+a[i];{wynik to rezultat dosumowania do poprzedniej wartości
wyniku aktualnie wczytanej liczby}
end;
Writeln('Wynik koncowy sumowania:',wynik);
end.
>>>> Zadanie 2
Przepisz powyższy program, uruchom i sprawdź jego działanie.
Zmodyfikuj działanie – sumowanie zastąp mnożeniem. Wyświetl oprócz
wyniku wszystkie wprowadzone do tablicy liczby (zastosuj
formatowanie wyniku w instrukcji writeln).
Teoria
Dodatkowe funkcje pomocne przy programowaniu z użyciem tablic:
High(A) - zwraca wartość największego indeksu tablicy A
Low(A) - zwraca wartość najmniejszego indeksu tablicy A
Length(S) - zwraca długość łańcucha (String) S
Przykład
var
lista: array[-10..5] of Byte;
tekst: String[50];
i: Byte;
begin
for i:=Low(lista) to High(lista) do begin {to samo co 'for i:=-10 to 5 do
begin'}
writeln('Podaj liczbÄ™ ',i,': ');
readln(lista[i]);
end;
tekst:='przyklad';
writeln(Length(tekst)); {wyświetli 8, bo słowo 'przyklad' ma tyle znaków}
end.
>>>> Zadanie 3
Napisz program obliczający średnią arytmetyczną z podanych przez
użytkownika liczb (dodatnie, ujemne, całkowite, rzeczywiste –
według własnego uznania). Użytkownik deklaruje ile liczb będzie
wprowadzał. Wskazówka - posłuż się pętlą 'for', zaś wprowadzane
zmienne umieszczaj w tablicy. Wprowadź zabezpieczenie nie
pozwalające użytkownikowi wprowadzić więcej liczb niż jest w
stanie pomieścić zadeklarowana tablica.
>>>> Zadanie domowe
Zapoznać się z działaniem instrukcji pętli 'repeat ... until ...'
oraz 'while ... do ...'.
Ogólna postać powyższych pętli:
repeat
instrukcja
until warunek;
while warunek do instrukcja;
warunek
- to samo co dla instrukcji IF THEN ELSE
instrukcja
- pojedyncza instrukcja lub ich grupa ujęta w słowa
kluczowe 'begin ... end;'
UWAGA!
W przypadku użycia kilku instrukcji w pętli 'repeat ...
until' nie ma potrzeby ujmowania ich w słowa 'begin ... end'.
Zapoznać się z działaniem funkcji Int, Trunc, Round, Frac, UpCase.
Zapoznać się z działaniem procedur Inc, Dec.
[ Pobierz całość w formacie PDF ]