Konspekt z przedmiotu Programowanie strukturalne
Temat: Procedury.
Prowadzący: inż. Marek Pudełko
Klasa I SP, specjalność technik Informatyk
Lekcja odbyła się 21.10.2004
Czas zajęć: 2 x 45 minut.
Cele dydaktyczne:
Nauczenie się konstruowania i używania procedur w języku Pascal.
Cele operacyjne:
Po zajęciach słuchacze powinni umieć:
Konstruować poprawną procedurę w języku Pascal
Modyfikować program, tak by zawierał procedurę.
Środki dydaktyczne: komputer, tablica, karteczki z przykładowym programem.
Metody: pogadanka, praca z komputerem, praca samodzielna, dyskusja.
Formy: praca z zespołem klasowym, praca indywidualna słuchacza
Przebieg lekcji:
1) Część wstępna:
powitanie
sprawdzenie listy obecności
2) Lekcja właściwa:
Informacja. Procedura to wydzielony fragment programu. Służy do wykonywania pewnych zbiorów instrukcji, które stanowią pewną zwartą całość. Często jest stosowana do zmniejszenia ilości linijek kodu programu.
program funkcja;
var liczba:byte;
procedure wykonaj;
begin
liczba:=10;
end;
begin
writeln ('Zaraz napisze liczbe 10');
wykonaj;
end.
informacja. Pisanie programu przez uczniów.
Praca z nauczycielem. Poprawa błędów powstałych przy kompilacji. Zaznaczenie pewnych fragmentów kodu przy pomocy klamer komentujących {,}.
Praca z tablicą. Wypisanie podstawowych kroków i fragmentów kodu tworzonych przez uczniów.
Praca samodzielna ucznia. Zmiana programu - rozszerzenie sprawdzanych liczb do 20.
Przykład. Napisanie programu, który rysuje ramkę. Po napisaniu programu należy go skrócić stosując odpowiednią procedurę.
Program Rameczka1;
Uses CRT;
var numer:byte;
Begin
Write('1 - Ramka pierwsza 2 - Ramka druga :');
Read(numer);
If numer=1 Then
Begin
ClrScr;
Writeln('I-------------------------------------------I');
Writeln('I I');
Writeln('I I');
Writeln('I I');
Writeln('I-------------------------------------------I');
GotoXY(8,3);
Write('Oto Ramka 1');
End;
If numer=2 Then
Begin
ClrScr;
Writeln('I-------------------------------------------I');
Writeln('I I');
Writeln('I I');
Writeln('I I');
Writeln('I-------------------------------------------I');
GotoXY(8,3);
Write('Oto Ramka 2');
End;
End.
Po zastosowaniu procedury program ma następująca postać:
Program Rameczka2;
Uses CRT;
var numer:byte;
procedure Ramka;
begin
clrscr;
writeln('i-------------------------------------------i');
writeln('i i');
writeln('i i');
writeln('i i');
writeln('i-------------------------------------------i');
gotoxy(8,3);
end;
Begin
Write('1 - Ramka pierwsza 2 - Ramka druga :');
Read(numer);
If numer=1 Then
Begin
ClrScr;
Ramka;
GotoXY(8,3);
Write('Oto Ramka 1');
End;
If numer=2 Then
Begin
ClrScr;
Ramka;
GotoXY(8,3);
Write('Oto Ramka 2');
End;
End.
Ćwiczenie. Napisanie programu, który wczytuje liczbę z zakresu od 1 do 12 i podaje jaki miesiąc jej odpowiada.
Program Miesiac;
var m:INTEGER; {numer miesiaca w roku}
Begin
Write ('Podaj numer miesiaca w roku: ');
Readln (m) ;
CASE m OF
1 : Writeln ('1 - Styczen ');
2 : Writeln ('2 - Luty ');
3 : Writeln ('3 - Marzec');
4 : Writeln ('4 - Kwiecien');
5 : Writeln ('5 - Maj');
6 : Writeln ('6 - Czerwiec ');
7 : Writeln ('7 - Lipiec ');
8 : Writeln ('8 - Sierpien');
9 : Writeln ('9 - Wrzesien');
10: Writeln ('10- Pazdziernik');
11: Writeln ('11- Listopad');
12: Writeln ('12- Grudzien')
ELSE
Writeln('Numer nie poprawny');
End;
readln;
End.
Informacja. Funkcja wielowyboru świetnie się nadaje na zastąpienie zagnieżdżonych instrukcji IF. Dzięki temu mamy bardziej czytelną postać programu, zmniejszamy możliwość wystąpienia błędu oraz zmniejszamy złożoność obliczeniową algorytmu.
Ćwiczenie. Usuwanie instrukcji zagnieżdżonych. Uczniowie przerabiają program kalkulator, by wykorzystywał funkcję CASE zamiast IF.
program kalkulator;
var x,y,z:real;
a:integer;
begin
writeln ('To program kalkulacyjny');
writeln ('Wybierz dzialanie, jakie chcesz wykonac');
writeln ('1 - dodawanie');
writeln ('2 - odejmowanie');
writeln ('3 - mnozenie');
writeln ('4 - dzielenie');
readln(a);
writeln ('Podaj pierwsza liczbe');
readln(x);
writeln ('Podaj druga liczbe');
readln(y);
if a=1 then
z:=x+y
else
if a=2 then
z:=x-y
else
if a=3 then
z:=x*y
else
if a=4 then
z:=x/y;
writeln (z:10:3);
readln;
end.
---------------------------------------------------------------
program kalkulator_case;
var x,y,z:real;
a:integer;
begin
writeln ('To program kalkulacyjny');
writeln ('Wybierz dzialanie, jakie chcesz wykonac');
writeln ('1 - dodawanie');
writeln ('2 - odejmowanie');
writeln ('3 - mnozenie');
writeln ('4 - dzielenie');
readln(a);
writeln ('Podaj pierwsza liczbe');
readln(x);
writeln ('Podaj druga liczbe');
readln(y);
CASE y of
1: z:=x+y;
2: z:=x-y;
3: z:=x*y;
4: z:=x/y;
else
writeln (`podales zla liczbe!');
writeln (z:10:3);
readln;
end.
Zadanie domowe. Napisanie programu, który wczytuje liczbę z zakresu od 1 do 6 i podaje jej słowny odpowiednik oceny.
3) Zajęcia końcowe:
powtórzenie materiału z lekcji:
Podstawowe problemy napotkane przy pisaniu programu.
Definicja funkcji CASE w języku Pascal.
Wykorzystanie w programach
Zamiana zagnieżdżonych funkcji IF na funkcję CASE.
Interesujące rozwiązania.
ocena pracy słuchaczy.
Program Rameczka1;
Uses CRT;
var numer:byte;
Begin
Write('1 - Ramka pierwsza 2 - Ramka druga :');
Read(numer);
If numer=1 Then
Begin
ClrScr;
Writeln('I-------------------------------------------I');
Writeln('I I');
Writeln('I I');
Writeln('I I');
Writeln('I-------------------------------------------I');
GotoXY(8,3); Write('Oto Ramka 1');
End;
If numer=2 Then
Begin
ClrScr;
Writeln('I-------------------------------------------I');
Writeln('I I');
Writeln('I I');
Writeln('I I');
Writeln('I-------------------------------------------I');
GotoXY(8,3); Write('Oto Ramka 2');
End;
End.
Program Rameczka2;
Uses CRT;
var numer:byte;
procedure Ramka;
begin
clrscr;
writeln('i-------------------------------------------i');
writeln('i i');
writeln('i i');
writeln('i i');
writeln('i-------------------------------------------i');
gotoxy(8,3);
end;
Begin
Write('1 - Ramka pierwsza 2 - Ramka druga :');
Read(numer);
If numer=1 Then
Begin
ClrScr;
Ramka;
GotoXY(8,3); Write('Oto Ramka 1');
End;
If numer=2 Then
Begin
ClrScr;
Ramka;
GotoXY(8,3); Write('Oto Ramka 2');
End;
end.program delta_moja_prosta;
var a,b,c:real;
delta,x1,x2,x:real;
begin
writeln ('program liczy pierwiastki rownania kwadratowego');
writeln('podaj po kolei');
writeln('podaj wspolczynnik a');
readln(a);
writeln('podaj wspolczynnik b');
readln(b);
writeln('podaj wspolczynnik c');
readln(c);
delta:=b*b-(4*a*c);
writeln('delta wynosi: ',delta:5:2);
if delta=0 then
begin
x:=-b / 2*a;
writeln('pierwiastek wynosi: ',x:5:2);
end;
if delta>0 then
begin
x1:=(-b-sqrt(delta)) / (2*a);
x2:=(-b+sqrt(delta)) / (2*a);
writeln('pierwiastki wynosza: x1= ',x1:5:2,', x2= ', x2:5:2);
end;
if delta<0 then writeln('blad');
readln;
end.
program delta_moja_prosta;
var a,b,c:real;
delta,x1,x2,x:real;
begin
writeln ('program liczy pierwiastki rownania kwadratowego');
writeln('podaj po kolei');
writeln('podaj wspolczynnik a');
readln(a);
writeln('podaj wspolczynnik b');
readln(b);
writeln('podaj wspolczynnik c');
readln(c);
delta:=b*b-(4*a*c);
writeln('delta wynosi: ',delta:5:2);
if delta=0 then
begin
x:=-b / 2*a;
writeln('pierwiastek wynosi: ',x:5:2);
end;
if delta>0 then
begin
x1:=(-b-sqrt(delta)) / (2*a);
x2:=(-b+sqrt(delta)) / (2*a);
writeln('pierwiastki wynosza: x1= ',x1:5:2,', x2= ', x2:5:2);
end;
if delta<0 then writeln('blad');
readln;
end.
program delta_moja_procedura;
var a,b,c:real;
delta,x1,x2,x:real;
procedure delt(a1,b1,c1:real;var delta1:real);
begin
delta1:=b1*b1-(4*a1*c1);
end;
procedure dwa_pierwiastki(a1,b1,c1,delta2:real);
begin
x1:=(-b1-sqrt(delta2)) / (2*a1);
x2:=(-b1+sqrt(delta2)) / (2*a1);
writeln('pierwiastki wynosza: x1= ',x1:5:2,', x2= ', x2:5:2);
end;
procedure jeden_pierwiastek(a2,b2:real);
begin
x:=-b2 / 2*a2;
writeln('pierwiastek wynosi: ',x:5:2);
end;
begin
writeln ('program liczy pierwiastki rownania kwadratowego');
writeln('podaj po kolei');
writeln('podaj wspolczynnik a');
readln(a);
writeln('podaj wspolczynnik b');
readln(b);
writeln('podaj wspolczynnik c');
readln(c);
delt (a,b,c,delta);
writeln('delta wynosi ', delta:5:2);
if delta=0 then jeden_pierwiastek(a,b);
if delta>0 then dwa_pierwiastki(a,b,c,delta);
if delta<0 then writeln('blad');
readln;
end.
6
START
a := 1
. . .
Wczytaj a
Cykl operacji nr 1
STOP
Wybór a
(czy należy do zakresu)
NIE
TAK
Cykl operacji nr 2
. . .
Cykl operacji nr n
2
1
n
Cykl operacji dla a nie z zakresu
. . .