Korzystając w programie z pętli możemy wpływać na ich wykonanie za pomocą specjalnych operacji break oraz continue.
break powoduje przerwanie wykonywania pętli
program pierwszy;
var
i: longint;
begin
for i:=1 to 10 do
Begin
write(i,' ');
if(i>=5) then break;
End;
readln();
End.
będzie skutkowało wypisaniem na ekran wartości:
1 2 3 4 5
continue wymusza przejście do następnego wykonania pętli
program pierwszy;
var
i: longint;
begin
for i:=1 to 10 do
Begin
if(i mod 2 = 0) then
continue
else
write(i,' ');
End;
readln();
End.
będzie skutkowało wypisaniem na ekran wartości
1 3 5 7 9
Standardowe wypisanie wartości zmiennej typu rzeczywistego jest mało przejrzyste, np. polecenie:
Writeln(-3.5);
bedzie skutkowało wyswietleniem
-3.50000000000000E+0000,
co oznacza \(-3.5·10^0\). Aby wypisać liczbę w bardziej przystępny sposób stosujemy dodatkowe parametry w operacji writeln:
Writeln(wartość:liczba miejsc:miejsc po przecinku);
Przykład:
program pierwszy;
var
a: double;
begin
a:= 3.5;
Writeln(a); //wyświetli ’-3.39999999E+0000’ - 10 znaków
Writeln(a:5:2); //wyświetli ’-3.40’ - 5 znaków, w tym 2 po przecinku
Writeln(a:8:2); //wyświetli ’ -3.40’ - 8 znaków (dopełnione spacjami z przodu)
readln();
End.
Ćwiczenie
Zamień w powyższym kodzie wartość zmiennej "a" na 3.4. Uruchom i sprawdź wynik.
---
Dlaczego 3.4 sprawia problemy komputerowi? Liczby przechowywane są w pamięci w postaci binarnej jako ciąg zer i jedynek. Gdy zamienimy 3.4 na zapis binarny otrzymamy 01000000 00001011 (00110011), gdzie nawias oznacza liczbę w okresie. Stąd nie jesteśmy w stanie dokładnie zapisać jej na skończonej liczbie bitów, co czasem powoduje problemy i tak zwane "błędy zaokrągleń". Dlatego też należy pamiętać, że dla programów wykorzystujących obliczenia na liczbach rzeczywistych należy brać pod uwagę możliwe błedy obliczeń (o tym jak sobie z nimi radzić usłyszycie Państwo być może na przedmiocie Metody Numeryczne).
Procedura to wyróżniony fragment algorytmu wybrany z głównego programu. Procedury i funkcje deklarujemy przed głównym (pierwszym) słowem begin i stosujemy głównie wtedy, gdy dany fragment kody chcemy wywoływać wielokrotnie w naszym programie. Np. zamiast
if (a1 > b1) then max1:=a1 else max1:=b1;
if (a2 > b2) then max2:=a2 else max2:=b2;
if (a3 > b3) then max3:=a3 else max3:=b3;
if (a4 > b4) then max4:=a4 else max4:=b4;
możemy utworzyć procedurę
procedure wyliczMax(x: integer; y:integer; var maks:integer);
begin
if (x>y) then maks:=x else maks:=y;
end;
i zmienić wywołanie w kodzie na
wyliczMax(a1,b1,max1);
wyliczMax(a2,b2,max2);
wyliczMax(a3,b3,max3);
wyliczMax(a4,b4,max4);
Co czyni kod bardziej przejrzystym i krótszym (szczególnie jeżeli procedura jest bardziej skomplikowana niż tylko obliczanie maksimum). W ogólności deklaracja procedury wygląda następująco:
procedure nazwa( lista parametrów );vardeklaracja zmiennych lokalnychbegin...end;
Przykład procedury i jej wywołania widzieliśmy już powyżej. Parametrami wywołania procedury nazywamy zmienne, które przekazujemy do procedury w czasie jej wywołania. Wywołując procedurę czy funkcję liczba przekazywanych parametrów, ich kolejność i typy muszą zgadzać się z deklaracją procedury. Procedurę jak i funkcję można zdefiniować również bez parametrów. Przykładowa deklaracja procedury:
nazwaProcedury ( param1 : typ; param2:typ; ...; param3:typ );
Domyślnie parametry wewnątrz procedury są kopią parametrów przekazywanych do niej w wywoływaniu (tzw. przekazywanie przez wartość). Co powoduje, że zmiana ich wartości nie zmienia wartości przekazywanych zmiennych. Aby zmiana wartości parametru powodowała zmianę wartości przekazywanej zmiennej należy w deklaracji procedury dodać słówko
nazwaProcedury ( var param1 : typ; var param2:typ; ...; var param3:typ );
Wewnątrz procedury (funkcji) można zadeklarować zmienne. Są to zmienne lokalne, wykorzystywane tylko we wnętrzu procedury (funkcji), w odróżnieniu od zmiennych globalnych, które definiujemy przed definicjami procedur i funkcji. Zmienne lokalne są widziane tylko wewnątrz procedury, w której są zadeklarowane. Przykład:
program pierwszy;
var
a,b,m: integer;
procedure wyliczMax(x: integer; y:integer; var maks:integer);
begin
if (x>y) then maks:=x else maks:=y;
end;
begin
writeln('Podaj pierwszą liczbę');
readln(a);
writeln('Podaj drugą liczbę');
readln(b);
wyliczMax(a,b,m);
writeln('Maks to ', m);
readln();
End.
Zauważ, że treść procedury umieszczamy w programie pomiędzy deklaracjami zmiennych w sekcji z var a pierwszym wystąpieniem begin. Ponadtwo zwróć uwagę na to, że zmmienne w procedurze mają inne nazwy niż te w programie. Jak podane wyżej zmiennych zadeklarowanych w procedurze nie będziemy widzieć (mogli korzystać) w głównym bloku Begin...End. Możemy związać wartości obu zmiennych (użytej w procedurze i tej podanej przy wywołaniu procedury) przy użyciu słowa kluczowego var w definicji procedury, tak powyżej poczyniono ze zmnienną maks, która zmienia wartość zmiennej m.
Zmieńmy trochę powyższy przykład i dodajmy słowo var także przed deklaracją zmiennej y. Uruchom i zobacz jaki będzie efekt:
program pierwszy;
var
a,b,m: integer;
procedure wyliczMax(x: integer; var y:integer; var maks:integer);
begin
if (x>y) then maks:=x else maks:=y;
x:=0;
y:=0;
end;
begin
writeln('Podaj pierwszą liczbę');
readln(a);
writeln('Podaj drugą liczbę');
readln(b);
m:=0;
wyliczMax(a,b,m);
writeln('Maks to ', m);
writeln('a to ', a);
writeln('b to ', b);
readln();
End.
Zadanie 1
Korzystając z pętli While napisz program, który wypisuje na ekran sumę liczb podawanych przez użytkownika aż do momentu gdy poda on 0.
Zadanie 2
Korzystając z pętli While i operacji break napisz program, który wypisuje na ekran sumę liczb podawanych przez użytkownika aż do momentu gdy poda on 0 lub suma przekroczy 100.
Zadanie 3
Napisz program, który wczyta dwie 5-elementowe posortowane rosnąco tablice i połączy je w jedną 10-elementową tablicę posortowaną rosnąco.
Zadanie 4
Napisz program wczytujący tablicę 10 elementów, następnie proszący użytkownika o podanie liczby i wyszukujący czy w tablicy znajduje się ten element.
Zadanie 5
Napisz program wczytujący tablicę 10 elementów posortowanych rosnąco, następnie proszący użytkownika o podanie liczby i wyszukujący czy w tablicy znajduje się ten element stosując wyszukiwanie binarne.
Zadanie 6
Dana jest n-elementowa tablica A[1..n] zawierająca liczby naturalne. Napisz pseudokod algorytmu, który obliczy sumę wszystkich liczb trzycyfrowych występujących w tej tablicy na miejscach o indeksach podzielnych przez 3.
Zadanie Domowe (5 pkt)
Napisz program wypisujący w jednej linii Twoje imię i nazwisko oraz numer indeksu, a następnie wyliczający wszystkie dzielniki całkowite Twojego numeru indeksu oraz zapisujący je do tablicy.
W kolejnym kroku algorytm ma poprosić użytkownika o liczbę dzielników (oznaczmy ja przez m), które chciałby on wypisać. Następnie w pętli m razy zapyta użytkownika o numer dzielnika n i dla każdej podanej liczby wypisze n-ty dzielnik numeru indeksu lub napis ’Mój indeks nie ma tylu dzielników!’ jeżeli n przekroczy dostępną liczbą dzielników (zakładamy, że użytkownik nie może wpisać liczby mniejszej niż 1).
Przykład działania (dla osoby o danych personalnych Marcin Witkowski, numer indeksu 12):
-> Marcin Witkowski 12-> Podaj liczbę dzielników3-> Podaj numer dzielnika1-> 15-> 67->Mój indeks nie ma tylu dzielników!
Gdzie przez -> oznaczone są linie wypisywane przez program (reszta linii wprowadza użytkownik).
Termin wykonania zadań: Sobota 7.04.2016 do godziny 24.00. Proszę o przesłanie rozwiązań mailem . W temacie powinien znajdować się numer indeksu i słowo APR.
Wykorzystano materiały z: