Algorytmy i programowanie

Procedury *

Przerwania w pętlach

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

Wypisywanie wartości rzeczywistych

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).

Procedury

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 );
var
deklaracja zmiennych lokalnych
begin
...
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ów
3
-> Podaj numer dzielnika
1
-> 1
5
-> 6
7
->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: