Konstrukcja alternatywy Program (algorytm) wykorzystuje konstrukcję alternatywy, jeśli określone operacje trzeba wykonywać odmiennie dla różnych danych. W PASCALu mamy cztery różne konstrukcje alternatywy: If then else If then Case of else Case of Mały słownik angielsko-polski If [yf] Then [dzen] Else [els] Case [kejs] Of [of] And [end] Or [or] Not [not] Boolean [bulien] True [tru] False[fols] Jeśli Wtedy W przeciwnym razie Przypadek (czego?) I Lub Nie Bulowski (logiczny) Prawda fałsz
Konstrukcja alternatywy 1 TEST 1 2 NA 3 NA if (TEST) then NA; end {tu bez ;} else NA; end; TEST Test to wyrażenie logiczne: Porównanie dwóch wielkości np.. X> y, a<z, c=d, e<>f (e nierówne f), e>=f, e<=f Połączone spójnikiem logicznym dwa wyrażenia logiczne np.. (a>0) and (b<3), (w<1000) or (w>2000) Negacja wyrażenia logicznego np.. Not (a=3) Stała true (prawda), false (fałsz)
Zadanie Obliczyć wartość bezwzględną liczby ANALIZA Wartość bezwzględna to wartość bez znaku (np.. 7 =7, a -8 =8) Jeśli liczba X jest dodatnia lub zero, to jej wartość bezwzględna równa się X ( 7 =7) Jeśli liczba X jest ujemna, to jej wartość bezwzględna równa się X ( -8 =-(-8)=8) Algorytm w formalizmie PAP 1 Wczytaj(X) X>=0 2 3 WYN:=X 4 WYN:=-X 5 Wypisz(WYN) program wart_bezwz; uses Crt; var X,WYN: real; read(x); {1} if (X >=0) {2} then WYN:=X {3} else WYN:=-X; {4} writeln(win)
Zadanie Czy dana liczba jest podzielna przez drugą ANALIZA X jest podzielne przez Y, jeżeli reszta z dzielenia X przez Y jest zerem. 3 2 Algorytm w formalizmie PAP 1 X mod Y=0 Wypisz( podzieln a ) Wczytaj(X,Y) 4 Wypisz( nie ) program podzielna; uses Crt; var X,Y:integer; read(x,y); {1} if X mod Y = 0 {2} then write( podzielna ) {3} else write( nie ); {4}
Zadanie Podać, czy rok jest przestępny czy zwykły ANALIZA Rok jest przestępny, gdy jego numer dzieli się bez reszty przez 4 (np.. 1984) Wyjątek: Rok nie jest przestępny, gdy jego numer dzieli się bez reszty przez 100 (np.. 1900) Wyjątek: Rok jest przestępny, gdy jego numer dzieli się bez reszty przez 400 (np.. 2000) To znaczy: rok jest przestępny, jeśli spełnione jest wyrażenie logiczne (rok mod 400 =0) lub ((rok mod 100 <> 0) i (rok mod 4 = 0)) 3 Algorytm w formalizmie PAP 1 Wypisz( przestęp ny ) Wczytaj(rok) (rok mod 400 =0) or ((rok mod 100 <> 0) and (rok mod 4 = 0)) 2 4 Wypisz( zwykly ) program rok_przest; uses Crt; var rok:integer; read(rok); {1} if (rok mod 400 =0) or ((rok mod 100 <> 0) and (rok mod 4 = 0)){2} then write( przestepny ) {3} else write( zwykly ); {4}
Konstrukcja alternatywy 2 if (TEST) 1 TEST then 2 NA NA; end; Zadanie Ile miesiąc ma dni ANALIZA 31 dni mają 1,3,5,7,8,10 i 12 30 dni mają 4,6,9,11 Luty ma zwykle 28 dni
Algorytm w formalizmie PAP 1 Wczytaj(mies) (mies=1) or (mies=3) or (mies=7) or (mies=8) or (mies=10) or 3 dni:=31 2 (mies=12) (mies=4) or (mies=6) or (mies=9) or (mies=11) 5 dni:=30 5 mies=2 7 dni:=28 6 8 Wypisz(dni) program dni_mies; uses Crt; var mies,dni:integer; read(mies); {1} if (mies=1) or (mies=3) or (mies=7) or (mies=8) or (mies=10) or (mies=12) {2} then dni:=31;{3} if (mies=4) or (mies=6) or (mies=9) or (mies=11) {4} then dni:=30; {5} if mies=2 {6} then dni:=28; {7} write(dni); {8} Konstrukcja alternatywy 3 WYR= W1 WYR= W2 NA 1 NA 2 NA Case WYR of W1: NA1; W2: NA2; Else NA; End;
Dni miesiąca - program program dni_mies2; uses Crt; var mies,dni:integer; read(mies); case mies of 1,3,5,7,8,10,12: dni:=31; 4,6,9,11: dni:=30; 2: dni:=28; else dni:=-1; end; write(dni); W wypadku błędnego miesiąca liczba dni wyniesie -1 Konstrukcja alternatywy 4 WYR= W1 WYR= W2 NA 1 NA 2 Case WYR of W1: NA1; W2: NA2; End;
Dni miesiąca - program program dni_mies2; uses Crt; var mies,dni:integer; read(mies); case mies of 1,3,5,7,8,10,12: dni:=31; 4,6,9,11: dni:=30; 2: dni:=28; end; write(dni); W wypadku błędnego miesiąca wystąpi błąd wykonania podczas pisania na ekranie Zadanie Rozwiązać równanie A X+B=0zwracając uwagę na warunki brzegowe ANALIZA X = -B/A można tylko wtedy policzyć, gdy A jest nierówne zeru
Równanie AX+B=0 4 3 2 X=-B/A 1 Wypisz(X) A<>0 Wczytaj(A,B) 5 Wypisz(WYN) Wypisz( Brak rozwiązań) program rownanie2; uses Crt; var A,B,X : real; read(a,b); if (A<>0) then X :=-B/A; write(x) end else write( Brak rozwiązania ); Algorytmy cykliczne Pętle (cykle) w algorytmie stosuje się wtedy, gdy pewien ciąg akcji należy powtarzać W PASCALU mamy do czynienia z czterema konstrukcjami pętli: For For downto While Repeat until
Mały słownik angielsko-polski While [łajl] Do [du] Repeat [rypit] Until [antil] For [for] To [tu] Downto [dałntu] Podczas gdy Czyń Powtarzaj Aż nastąpi Dla Do W dół do Konstrukcja cyklu while while(test) do INSTR; end; TEST 1 2 INSTR
N silnia 1 Wczytaj(n) 2 WYN:=1 3 J:=1 J<n 4 5 J:=J+1 7 6 WYN:=WYN*J end; Wypisz(WYN) program silnia; uses Crt; var n,wyn,j :integer; read(n); {1} WYN:=1; {2} J:=1; {3} while J<n do {4} J:=J+1; {5} WYN:=WYN*J {6} write(wyn); {7} End. Konstrukcja cyklu repeat 1 INSTR TEST 2 Repeat INSTR; end until(test);
N silnia 1 Wczytaj(n) 2 WYN:=1 3 J:=0 4 J:=J+1 5 WYN:=WYN*J J>=n 6 7 program silnia2; uses Crt; var n,wyn,j :integer; read(n); {1} WYN:=1; {2} J:=0; {3} repeat J:=J+1; {4} WYN:=WYN*J {5} until J>=n; {6} write(wyn); {7} End. Wypisz(WYN) Konstrukcja cyklu for 1 j:=j0 for j:=j0 to jk do INSTR; end j<=jk 2 3 4 INSTR j:=j+1
N silnia 1 Wczytaj(n) 2 WYN:=1 3 J:=1 J<=n 4 5 WYN:=WYN*J 7 6 J:=J+1 program silnia3; uses Crt; var n,wyn,j:integer; read(n); {1} WYN:=1; {2} for J:=1 to n do {3,4,6} WYN:=WYN*J {5} end; write(wyn); {7} Wypisz(WYN) End. Program w języku Pascal: n! program nsilnia; {nazwa programu} uses Crt; {uz yte biblioteki} var {Deklaracje zmiennych} n,j: Integer; { deklaracja zmiennej cal`kowitoliczbowej n oraz pomocniczej j} wynik:integer;{ zmienna pomocnicza wynik } Ch : Char; { zmienna pomocnicza } { Wlasciwy program} Writeln('Program n!: czes`c`! Podaj n > '); { komputer pozdrawia i prosi o dane } Readln(n); { czeka na Twe dane } wynik:=1; { wynik dla 0! } for j:=1 to n do { konstrukcja pe`tli j biegnie od 1 do n po 1 } wynik:=wynik*j; { j!=(j-1)!*j } Writeln('Moja odpowiedz`: ',n,'! = ',wynik); { komputer pisze wynik } Ch:=ReadKey; { komputer czeka na nacis`nie`cie klawisza, tzn. az zanotujesz sobie wynik }
Konstrukcja cyklu ze zmniejszaniem 1 j:=j0 for j:=j0 downto jk do INSTR; end j>=jk 2 3 4 INSTR j:=j-1 N silnia 1 Wczytaj(n) 2 WYN:=1 3 J:=n J>=1 4 5 WYN:=WYN*J 7 6 J:=J-1 program silnia4; uses Crt; var n,wyn,j:integer; read(n); {1} WYN:=1; {2} for J:=n downto 1 do {3,4,6} WYN:=WYN*J {5} end; write(wyn); {7} Wypisz(WYN) End.
Zadanie Sprawdzić, czy liczba jest liczbą pierwszą ANALIZA Liczba n jest pierwsza, jeśli nie dzieli się bez reszty przez żadną z liczb 2,3,4,...,n-1 To znaczy, że musimy zorganizować pętlę, w której kolejno zbadamy podzielność przez kolejne liczby Zmienna jestpierw przechowuje informację, czy udało nam się zaprzeczyć, że liczba jest pierwsza Liczba pierwsza 1 2 3 Wczytaj(n) Jestpierw:=tak J:=2 6 J<=n-1 4 n mod 5 J=0 Jestpierw:=nie 9 Jestpie 8 rw Wypisz( pierwsza 0 ) Wypisz( nie pierwsza ) 7 J:=J+1
Program w języku Pascal: czy pierwsza program czy_pierwsza; {nazwa programu} uses Crt; {uz yte biblioteki} var {Deklaracje zmiennych} n,j: Integer; { deklaracja zmiennej cal`kowitoliczbowej n oraz pomocniczej j} Jestpierw:boolean;{ zmienna pomocnicza logiczna } Ch : Char; { zmienna pomocnicza } { Wlasciwy program} Writeln( Liczba pierwsza? Podaj n > '); { komputer pozdrawia i prosi o dane } Readln(n); { czeka na Twe dane } Jestpierw:=true; {jest tak} for j:=2 to n-1 do { konstrukcja pe`tli j biegnie od 2 do n-1 po 1 } if n mod j = 0 then Jestpierw:=false; if Jestpierw then writeln( to jest liczba pierwsza ) else writeln( to nie jest liczba pierwsza ) Ch:=ReadKey; { komputer czeka na nacis`nie`cie klawisza, tzn. az zanotujesz sobie wynik } Zadanie Sprawdzić, czy liczba jest liczbą pierwszą jeszcze raz ANALIZA Liczba n jeżeli nie dzieli się przez liczby 2,3,...,j, to na pewno nie dzieli się też przez liczby n div j, n div j + 1,..., n-1 To znaczy, że musimy zorganizowć pętlę, w której warunek zakończenia brzmi: j>n div j
Liczba pierwsza 1 2 3 Wczytaj(n) Jestpierw:=tak J:=2 6 J<=n div J 4 n mod J=0 5 Jestpierw:=nie 9 Jestpierw 8 Wypisz( pierwsza 0 ) Wypisz( nie pierwsza ) 7 J:=J+1 Program w języku Pascal: czy pierwsza program czy_pierwsza2; {nazwa programu} uses Crt; {uz yte biblioteki} var n,j: Integer; Jestpierw:boolean; Ch : Char; { Wlasciwy program} Writeln( Liczba pierwsza? Podaj n > '); { komputer pozdrawia i prosi o dane } Readln(n); { czeka na Twe dane } Jestpierw:=true; {jest tak} j:=2; While j<=n div j do if n mod j = 0 then Jestpierw:=false; j:=j+1 end; if Jestpierw then writeln( to jest liczba pierwsza ) else writeln( to nie jest liczba pierwsza ) Ch:=ReadKey; { komputer czeka na nacis`nie`cie klawisza, tzn. az zanotujesz sobie wynik }
Zadanie Ile podana liczba całkowita ma cyfr? ANALIZA Liczba 1984 ma cztery cyfry dziesiętne. Łatwo to sprawdzić dzieląc ją całkowikoticzbowo przez 10: 1984 div 10 = 198 (pierwszy raz) 198 div 10= 19 (drugi raz) 19 div 10= 1 (trzeci raz) 1 div 10= 0 (czwarty raz) Ile cyfr 1 Wczytaj(n) 2 cyfr:=0 3 n:=n div 10 4 cyfr:=cyfr+1 n=0 5 6 Wypisz(cyfr) program silnia2; uses Crt; var n,cyfr:integer; read(n); {1} cyfr:=0; {2} repeat n:=n div 10; {3} cyfr:=cyfr+1; {4} until n=0; {5} write(cyfr); {6} End.
Zadanie Podać wszystkie czynniki pierwsze danej liczby ANALIZA Zadanie podobne do sprawdzania, czy liczba jest pierwsza czy nie. Jeżeli po drodze okaże się, że nie jest pierwsza, to wypisujemy dzielnik dzielimy ją przez dzielnik i z wynikiem postępujemy tak samo Czynniki pierwsze 1 2 Wczytaj(n) J:=2 5 6 J<=n-1 3 n mod J=0 4 Wypisz(J) n:=n div J 7 J:=J+1
Program w języku Pascal: czy pierwsza program czynniki_pierwsze; {nazwa programu} uses Crt; {uz yte biblioteki} var n,j: Integer; Jestpierw:boolean; Ch : Char; { Wlasciwy program} Writeln( Podaj n > '); { komputer pozdrawia i prosi o dane } Readln(n); { czeka na Twe dane } j:=2; While j<=n -1 do if n mod j = 0 then writeln(j); n := n div j end else j:=j+1 Ch:=ReadKey; { komputer czeka na nacis`nie`cie klawisza, tzn. az zanotujesz sobie wynik } Zadanie Podać wszystkie dzielniki danej liczby ANALIZA Zadanie podobne do sprawdzania, czy liczba jest pierwsza czy nie. Jeżeli po drodze okaże się, że nie jest pierwsza, to wypisujemy dzielnik Pętlę organizujemy od 1 do n (bo jeden i n to dzielniki liczby n)
Dzielniki 1 2 Wczytaj(n) J:=1 5 J<=n 3 n mod J=0 4 Wypisz(J) 6 J:=J+1 Program w języku Pascal: program dzielniki; {nazwa programu} uses Crt; {uz yte biblioteki} var n,j: Integer; Ch : Char; { Wlasciwy program} Writeln( Podaj n > '); { komputer pozdrawia i prosi o dane } Readln(n); { czeka na Twe dane } for j:=1 to n do if n mod j = 0 then writeln(j); Ch:=ReadKey; { komputer czeka na nacis`nie`cie klawisza, tzn. az zanotujesz sobie wynik }
Zadanie Podać liczby pierwsze z zakresu 2-100 ANALIZA Zadanie podobne do sprawdzania, czy to liczba pierwsza. Tyle, że nie czytamy żadnej liczby ale przelatujemy kolejne n od 2 do 100 Liczby pierwsze z zakresu 1 n:=2 3 n<101 2 Sprawdzanie, czy n to liczba pierwsza i jeśli tak, to jej wypisanie 4 N:=n+1
Bardziej szczegółowa rozpiska fragmentu 3 4 Jestpierw:=tak J:=2 3 Sprawdzanie, czy n to liczba pierwsza i jeśli tak, to jej wypisanie 7 J<=n-1 5 n mod 6 J=0 Jestpierw:=nie 10 9 Jestpie rw Wypisz(n) 8 J:=J+1 Liczby pierwsze - szczegółowo 1 n:=2 n<101 2 3 Jestpierw:=tak 4 J:=2 7 J<=n-1 5 n mod 6 J=0 Jestpierw:=nie 10 9 Jestpie rw Wypisz(n) 8 J:=J+1 11 n:=n+1
Program w języku Pascal: program liczby_pierwsze; {nazwa programu} uses Crt; {uz yte biblioteki} var {Deklaracje zmiennych} n,j: Integer; { deklaracja zmiennej cal`kowitoliczbowej n oraz pomocniczej j} Jestpierw:boolean;{ zmienna pomocnicza logiczna } Ch : Char; { zmienna pomocnicza } { Wlasciwy program} for n:=2 to 100 do Jestpierw:=true; {jest tak} for j:=2 to n-1 do { konstrukcja pe`tli j biegnie od 2 do n-1 po 1 } if n mod j = 0 then Jestpierw:=false; if Jestpierw then writeln(n); end; Ch:=ReadKey; { komputer czeka na nacis`nie`cie klawisza, tzn. az zanotujesz sobie wynik }