Konspekt z przedmiotu Programowanie strukturalne
Temat: sigma i silnia.
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ę tworzenia i korzystania ze wzorów na silnię i sigmę w języku Pascal.
Cele operacyjne:
Po zajęciach słuchacze powinni umieć:
Konstruować wzór na silnię i sigmę w języku Pascal
Modyfikować odpowiednio wzory, by osiągnąć zamierzony efekt.
Ś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:
Przypomnienie wiadomości. Co to jest sigma?
Sigma to suma kolejnych liczb naturalnych od 1 do n.
Przypomnienie wiadomości. Co to jest silnia?
Silnia to iloczyn kolejnych liczb naturalnych od 1 do n.
Właściwości silni. 0! =1, 1!=1.
Informacja. Ogólna zasada działania funkcji silnia i sigma. Schemat blokowy i opis słowny.
SIGMA
Start -uruchomienie programu
inicjalizacja wstępna zmiennych - i:=0, n:=0, sigma:=0;
wczytaj n - program wczytuje n
i ≤ n - postawienie warunku
Nie - niespełnienie warunku (licznik > n) przejście programu do punktu 8
Tak - spełnienie warunku (licznik ≤ n) dalsza praca programu
Sigma jest powiększana o wartość i.
Operacja zwiększania licznika i o 1 (INKREMENTACJA)
Powrót do sprawdzenia warunku, dwie możliwości
NIE - przejście programu do punktu 8
TAK - kontynuowanie zwiększania sigmy, aż do niespełnienia warunku
Wyświetlenie wyniku - sigma i zakończenie pracy.
Prezentacja. Przedstawienie schematu programu sigma.
program sigma;
var n,i,suma:integer;
begin
i:=0;
suma:=0;
writeln ('program liczy sigme od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
suma:=suma+i;
i:=i+1;
end;
writeln(' sigma wynosi ', suma);
readln;
end.
Ćwiczenie. 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 samodzielna. Uczniowie modyfikują program, tak by liczył on funkcję silnia, a nie sigma.
Należy pamiętać o tym, żeby zmienić początkowe wartości i i suma (silnia) na 1. Zostawienie 0 sprawi, że będziemy mnożyć przez 0, co nie zmieni wyniku.
Informacja. Ogólna zasada działania funkcji silnia. Schemat blokowy i opis słowny.
SILNIA
Start -uruchomienie programu
inicjalizacja wstępna zmiennych - i:=1, n:=1, silnia:=1;
wczytaj n - program wczytuje n
i ≤ n - postawienie warunku
Nie - niespełnienie warunku (licznik > n) przejście programu do punktu 8
Tak - spełnienie warunku (licznik ≤ n) dalsza praca programu
silnia jest mnożona przez wartość i.
Operacja zwiększania licznika i o 1 (INKREMENTACJA)
Powrót do sprawdzenia warunku, dwie możliwości
NIE - przejście programu do punktu 8
TAK - kontynuowanie zwiększania silni, aż do niespełnienia warunku
Wyświetlenie wyniku - silnia i zakończenie pracy.
Prezentacja. Przedstawienie schematu programu silnia.
program silnia;
var n,i,suma:integer;
iloczyn:real;
begin
i:=1;
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
iloczyn:=iloczyn*i;
i:=i+1;
end;
writeln(' silnia wynosi ', iloczyn:10:0);
readln;
end.
Ćwiczenie. Modyfikacja programu silnia tak, by używał pętli FOR lub pętli REPEAT.
Informacja. Wzór Stirlinga dla silni dużych liczb.
Ponieważ wynik silni łatwo może wykroczyć poza zakres liczbowy w danym języku programowania, należy zastosować inny wzór na liczenie silni w wypadku dużych liczb. Takim wzorem jest wzór Stirlinga.
Praca samodzielna ucznia. Napisanie programu, który liczy wynik silni ze wzoru Stirlinga.
Informacja. Podejście rekurencyjne i iteracyjne.
Dotychczas stosowaliśmy podejście iteracyjne, które oznaczało cykliczne wykonywanie tych samych instrukcji.
Podejście rekurencyjne oznacza wywoływanie funkcji przez samą siebie, przy zmieniających się argumentach.
Praca samodzielna ucznia. Napisanie programu, który liczy wynik silni korzystając z podejścia rekurencyjnego.
program silnia_rekurencyjna;
var n:integer;
iloczyn:LongInt;
Function sil(n : integer) : LongInt;
Begin
If n=0 Then sil:=1
Else sil:=n*sil(n-1);
End;
begin
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
iloczyn:=sil(n);
writeln(' silnia wynosi ', iloczyn:10);
readln;
end.
Dyskusja. Porównanie efektów działania programów.
Ćwiczenie. Zmiana programu sigma tak, by realizował podejście rekurencyjne.
Zadanie domowe. Narysowanie schematu blokowego programu z podejściem rekurencyjnym.
3) Zajęcia końcowe:
powtórzenie materiału z lekcji:
Podstawowe problemy napotkane przy pisaniu programu.
Definicja pojęć silnia i sigma w języku Pascal.
Sposoby implementacji metod w Pascalu
Interesujące rozwiązania.
Podejście rekurencyjne i iteracyjne
ocena pracy słuchaczy.
program sigma;
var n,i,suma:integer;
begin
i:=0;
suma:=0;
writeln ('program liczy sigme od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
suma:=suma+i;
i:=i+1;
end;
writeln(' sigma wynosi ', suma);
readln;
end.
program sigma;
var n,i,suma:integer;
begin
i:=0;
suma:=0;
writeln ('program liczy sigme od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
suma:=suma+i;
i:=i+1;
end;
writeln(' sigma wynosi ', suma);
readln;
end.
program sigma;
var n,i,suma:integer;
begin
i:=0;
suma:=0;
writeln ('program liczy sigme od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
suma:=suma+i;
i:=i+1;
end;
writeln(' sigma wynosi ', suma);
readln;
end.
program silnia;
var n,i,suma:integer;
iloczyn:real;
begin
i:=1;
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
iloczyn:=iloczyn*i;
i:=i+1;
end;
writeln(' silnia wynosi ', iloczyn:10:0);
readln;
end.
program silnia;
var n,i,suma:integer;
iloczyn:real;
begin
i:=1;
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
iloczyn:=iloczyn*i;
i:=i+1;
end;
writeln(' silnia wynosi ', iloczyn:10:0);
readln;
end.
program silnia;
var n,i,suma:integer;
iloczyn:real;
begin
i:=1;
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
while (i<=n) do
begin
iloczyn:=iloczyn*i;
i:=i+1;
end;
writeln(' silnia wynosi ', iloczyn:10:0);
readln;
end.
program silnia_rekurencyjna;
var n:integer;
iloczyn:LongInt;
Function sil(n : integer) : LongInt;
Begin
If n=0 Then sil:=1
Else sil:=n*sil(n-1);
End;
begin
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
iloczyn:=sil(n);
writeln(' silnia wynosi ', iloczyn:10);
readln;
end.
program silnia_rekurencyjna;
var n:integer;
iloczyn:LongInt;
Function sil(n : integer) : LongInt;
Begin
If n=0 Then sil:=1
Else sil:=n*sil(n-1);
End;
begin
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
iloczyn:=sil(n);
writeln(' silnia wynosi ', iloczyn:10);
readln;
end.
program silnia_rekurencyjna;
var n:integer;
iloczyn:LongInt;
Function sil(n : integer) : LongInt;
Begin
If n=0 Then sil:=1
Else sil:=n*sil(n-1);
End;
begin
iloczyn:=1;
writeln ('program licz silnie od 1 do n');
writeln ('Podaj n: ');
readln(n);
iloczyn:=sil(n);
writeln(' silnia wynosi ', iloczyn:10);
readln;
end.
4
START
i := 0
n := 0
sigma := 0
i := i + 1
Wczytaj n
sigma := sigma + i
STOP
i ≤n
NIE
TAK
Podaj wynik-sigma
Podaj wynik-silnia
TAK
NIE
STOP
silnia := silnia * i
i := i +1
Wczytaj n
i ≤n
i := 1
n := 1
silnia:= 1
START