begin
Write ('Podaj liczbę: '); Readln (N);
Silnia 1; for I 1 to N do Silnia Silnia * I;
Writeln (N, '! — ‘, Silnia);
Readln; end.
No dobrze. A czemu nie sprawdzamy, czy N nie jest równe 0 i nie wypisujemy wtedy osobno wyniku? Prześledźmy program: ustalamy, że pierwsza wartość silni to 1. Zmieniamy ją w pętli, mnożąc przez kolejne liczby. Ile razy wykona się pętla dla N = 0? Ani razu — będzie to pętla „w górę” od 1 do 0 — żadna liczba nie należy do takiego przedziału, więc instrukcje w pętli się nie wykonają. Pozostanie nam wynik Silnia = 1, który jest dla 0 prawdziwy. (W rzeczywistości ponieważ l! jest też równe 1, można by w pętli liczbę początkową ustalić na 2, a nie 1, i program też działałby poprawnie!).
Uwaga tycząca się zakresu przytoczona w poprzednim ćwiczeniu ma też zastosowanie tu. Funkcja rośnie bardzo szybko i dla niewielkich wartości przekroczy zakres zmiennej Silnia (pomimo że jest ona zadeklarowana jako Longint).
• I C Z E N I E
3.38
program cw3_38;
{ Program sprawdza, czy liczba N jest pierwsza. } { Katalog r3_08 : 3_38.pas }
var
N, I : Longint;
Pierwsza : Boolean;
begin
Write ('Podaj liczbę: '); Readln (N); if (N<1) then
Writeln ('To pojecie nie ma zastosowania dla', N, '.') else
if (N-l) then
Writeln ('Liczba 1 nie jest ani pierwsza, ani zlozona.') else begin
Pierwsza True; for I :- 2 to N-l do
if Pierwsza then
if (N mod I-O) then Pierwsza :- False; if Pierwsza then
Writeln ('Liczba ’, N, ' jest pierwsza.') else
Writeln ('Liczba ', N, ' nie jest pierwsza.')
end;
Readln; end.
Kilka słów wyjaśnienia. Dla niskich wartości program działa poprawnie. Jeżeli jednak chcesz sprawdzić na przykład liczbę 9-cyfrową, to... przerwać działanie programu możesz, wciskając kombinację Ctrl+Break. Program w najprostszej wersji sprawdza podzielność