290 likes | 422 Views
3. Příkazy. Příkazy dělíme na jednoduché a strukturované . Jednoduché příkazy - žádnou jejich dílčí částí neni příkaz - přiřazovací, vstupu a výstupu, skoku, procedury, prázdný
E N D
3. Příkazy • Příkazy dělíme na jednoduché a strukturované. • Jednoduché příkazy - žádnou jejich dílčí částí neni příkaz - přiřazovací, vstupu a výstupu, skoku, procedury, prázdný • Strukturované příkazy - skládají se z dílčích příkazů, předepisuje se jimi postupné, podmíněné a opakované provádění dílčích příkazů - složený, podmíněný (if, case), cyklu (repeat-until, while-do, for), with
3.1 Jednoduché příkazy • Přiřazovací příkaz Definuje hodnotu proměnné (spolu s příkazem vstupu), proměnná na levé straně musí být stejného typu jako výraz na pravé straně (případně výraz může být typu integer pro proměnnou typu real - dojde k automatické konverzi). Výraz musí být základního typu (integer, real, char, boolean), v TP může být ještě typu řetězec. Přiřazovacím příkazem je možno také kopírovat strukturovanou proměnnou (pole, záznam) do jiné proměnné totožného (pojmenovaného) typu.
3.1 Jednoduché příkazy • Příkaz vstupu • Většina programů provádí zpracování vstupních dat a vytváří výstupní data. Pro komunikaci mezi počítačem a uživatelem slouží data, která mají formu posloupnosti znaků, členěné na řádky - data textového typu. Kromě nich se používají ještě data, která odsahují údaje ve vnitřní reprezentaci a která slouží pro komunikaci mezi programy nebo částmi programů. • Standardnímu vstupnímu textovému souboru input je v každé implementaci přiřazeno určité vstupní zařízení, které umožňuje vstup posloupnosti znaků, členěné na řádky - klávesnice, dříve štítky, děrná páska. Tento vstupní soubor se otevírá automaticky. Údaje se ze vstupního souboru čtou příkazem: • read(input, seznam proměnných);
3.1 Jednoduché příkazy Příkaz vstupu Identifikátor input je v TP možno vynechat, způsob čtení je dán typem proměnné: typ char - přečte se jeden znak, je-li to oddělovač řádků,uloží se mezera (v TP se oddělovač řádků čte jako dvojice znaků #13#10) typ integer - čte se posloupnost znaků, tvořící dekadický zápis pčísla; číslu může předcházet libovolný počet mezer a oddělovačů řádků, ale nesmí žádný jiný znak typ real - podobně jako u typu integer se čte desetinné číslo případně v exponenciálním tvaru - 1.234, 3e-2; čtení končí posledním znakem, který patří číslu, následující znak se čte při příštím čtení. • Př.: 25 -34.5<┘var i,j : integer; +93 –27B <┘x,y : real; zn1,zn2 : char; read(i); {i=25} read(j);{j=-27} read(x);{x=-34.5}read(zn1);{zn1='b'} read(zn1,zn2);{y=93.0}read(zn2);{zn2=' '} nebo read(i,x,y,j,zn1,zn2); - lze jediným příkazem.
3.1 Jednoduché příkazy • Příkaz readlnpřeskočí zbývající znaky do konce řádku, následující příkaz čtení bude číst ze začátku dalšího řádku. Příkaz je možno použít samostatně nebo se seznamem proměnných. • Při čtení se rozeznávají dva stavy - konec řádku a konec souboru. Konec řádku je stav po přečtení posledního znaku na řádku. Příkaz read čte v tomto stavu mezeru odpovídající konci řádku (do prom. typu char). Konec souboru je stav po přečtení posledního znaku - obvykle je to znak konce řádku. Čtení v tomto stavu způsobí chybu. Pro indikaci těchto stavů existují standardní funkce eoln a eof. Eoln - logická funkce, ve stavu konec řádku vrací hodnotu true, jinak false. Eof - logická funkce, ve stavu konec souboru vrací hodnotu true, jinak false. • Př.:zneolneof ab <┘read(zn)'a'ff c * 'b'tf '_'ff 'c'tf '_'ft
3.1 Jednoduché příkazy • Místo mezery při čtení konce řádku se čtou skutečné oddělovače řádku - znaky #13, #10. Konec řádku je vhodné přeskočit příkazem readln. • Konec vstupu (souboru) se z klávesnice zadává znakem ctrl_z. Při použití unitu crt musí být v programu uveden příkaz checkeof := true, za ctrl_z neni třeba mačkat enter, ctrl_z se nezobrazuje. • Vstupní řádek, odeslaný z klávesnice klávesou ENTER se ukládá do vstupního bufferu. Příkaz readln způsobí vyprázdnění tohoto bufferu. Je-li buffer prázdný, příkaz eoln nebo eof vyvolá načtení dalšího řadku. Příznak konce řádku nebo souboru musí být v bufferu první, mají-li funkce eof, eoln vrátit hodnotu true.
3.1 Jednoduché příkazy • Příkaz výstupu • Standardnímu textovému souboru output je v každé implementaci přiřazeno určité výstupní zařízení, které umožňuje výstup posloupnosti znaků, členěné na řádky - tiskárna, displej. Tento výstupní soubor se otevírá automaticky. Údaje se do výstupního souboru čtou příkazem: • write(output, seznam proměnných); Identifikátor output je v TP možno vynechat
3.1 Jednoduché příkazy • Příkaz výstupu Kromě vystupující hodnoty může být předepsán celkový počet vystupujících znaků a u desetinných čísel také počet desetinných míst. Je-li v parametru určen větší počet znaků než je nutné, doplní se vystupující hodnota zleva mezerami, je-li počet menší než je nutné, vystoupí v případě čísel minimální nutný počet znaků, u typu řetězec pouze zadaný počet znaků. Je-li u hodnoty typu real v parametru určen počet desetinných míst, vystoupí číslo v desetinném tvaru, jinak v exponenciálním. Logické hodnoty vystupují jako řetězce true a false. Vytvářený řádek se ukončí příkazem writeln případně s parametry.
Příkaz výstupu Př.: var i:integer;write(i:4);-253 r:real;write(abs(i):5); ~~253 z:char;write(i:2);-253 b;boolean; write(r:8:3);~345.670 write(r:5:2);345.67 i:=-253; write(r:12);~~3.4567e+02 r:=345.67; write(r:9);~3.46e+02 z:='a'; write(z); a b:=true; write(z:5); ~~~~a write(b:5);~true write(not (b):1);f write('abcd');abcd write('abcd':6); ~~abcd write('abcd':2);ab U kladného čísla se místo znaménka nechává mezera. Specifikátor délky může být konstanta nebo proměnná.
Př.: program tabelace; const radek='*****************************';{29x} var dm,hm,kr,x,y : real; pocet : integer; begin writeln('program tabelace funkce'); writeln('zadej dm,hm,krok'); readln(dm,hm,kr); writeln; writeln(radek); writeln('* tabulka funkce *'); writeln('* y=sqrt(abs(sin(x))) *'); writeln(radek); writeln('* x * y *'); writeln(radek); x:=dm; pocet:=0; while x<=hm do begin pocet:=pocet + 1; y:=sqrt(abs(sin(x))); writeln('*',x:10:2,' *',y:10:2,' *'); if pocet mod 5 = 0 then writeln(radek); x:=x + kr; end; if pocet mod 5 <> 0 then writeln(radek); readln; end.
3.1 Jednoduché příkazy • Prázdný příkaz - př.: if a>0 then ; • Příkaz procedury - volá se jinde definovaná činnost • Příkaz skoku - způsob předání řízení v programu, v pascalu se používá jen ojediněle.
3.2 Strukturované příkazy • Skládají se z dílčích příkazů, předepisuje se jimi postupné, podmíněné nebo opakované provádění těchto dílčích příkazů. Složený příkaz Nemá předepsán závazný formát: begin re := -b/(2*a); begin p:=x; x:=y; y:=p end; disc := sqr(b)-4*a*c; im := sqrt(abs(discr))/(2*a); end; • Za posledním příkazem (před end) by neměl být středník. Je-li tam, znamená to prázdný příkaz. • Používá se v podmíněném příkazu, v příkazu cyklu - tělo cyklu, procedura, celý program.
3.2.1 Podmíněné příkazy příkaz if Příkaz if se provede tak, že se nejprve vyhodnotí podmínka - logický výraz a má-li hodnotu true, provede se příkaz za then. Má-li výraz hodnotu false, provede se příkaz za else, není-li else, neprovede se nic.
příkaz if if a < b then a := b; b := 0; if a<b then begin a := b; b := 0; end; if x > max then begin max := x; p := 1; end else p := p + 1;
příkaz if Příkaz else se vztahuje k nejbližšímu předchozímu if: if podm1 then if podm1 then begin if podm2 then prik1if podm2 thenprik1 else prik2 else prik2 end; if podm1 then begin if podm2 then prik1 end else prik2 Klíčovému slovu else nesmí předcháze středník !!!
Příkaz case Větvení výpočtu do několika alternativ v závislosti na hodnotě výrazu ordinálního typu: var znak : char; case znak of '+ ': v := x + y; '- ': v := x - y; '* ': v := x * y; '/ ': v := x / y; end;' Pokud je pro více hodnot stejný příkaz, oddělují se čárkou.
Př.: Výpočet jízdného v závislosti na vzdálenosti. program vypocet_ jizdne; var pocetkm, jizdne, sazba : real; desitkykm : integer; begin readln(pocetkm); desitkykm := trunc(pocetkm) div 10; if desitkykm >= 6 then sazba := 2.2 else case desitkykm of 0,1 : sazba := 3; 2 : sazba := 2.5; 3,4,5 : sazba := 2.3; end; jizdne := pocetkm * sazba; writeln('jizdne za',pocetkm:6:1,' km je',jizdne:7:1,' kc'); end.
Př.: Výpočet jízdného v závislosti na vzdálenosti. program vypocet_ jizdne; var pocetkm, jizdne, sazba : real; desitkykm : integer; begin readln(pocetkm); desitkykm := trunc(pocetkm) div 10; case desitkykm of 0,1 : sazba := 3; 2 : sazba := 2.5; 3,4,5 : sazba := 2.3; else sazba := 2.2; end; jizdne := pocetkm * sazba; writeln('jizdne za',pocetkm:6:1,' km je',jizdne:7:1,' kc'); end.
3.3.2 Příkazy cyklu Postupně se provedou všechny příkazy, vyhodnotí se podmínka a je-li hodnota log. výrazu false, činnost se opakuje. Provádění cyklu končí, když výraz má log. hodnotu true. Tělo tohoto cyklu se provede vždy alespoň jednou. Předepisují opakované provádění příkazu nebo posloupnosti příkazů Příkaz repeat until
Příkaz repeat until Př.: Program pro výpočet částečného součtu řady sn = 1 + x + x^2/2! + x^3/3! + ... + x^n/n!, kde n je nejmenší takové, že xn/n! <eps. program soucet_rady; var soucet, clen, x, eps : real; i : integer; begin read(x,eps); i := 0; clen := 1; soucet := clen; repeat i := i + 1; clen := clen * x / i; soucet := soucet + clen; until abs(clen) < eps; writeln('soucet = ', soucet); end.
Příkaz while-do Nejprve se vyhodnotí logický výraz, dávající podmínku opakování, a je-li jeho hodnota true, provede se příkaz za do a tato činnost se znovu opakuje. Opakování končí, když má váraz hodnotu false. Je-li hodnota výrazu false už na začátku, příkaz se neprovede ani jednou.
Příkaz while-do Př.: Výpočet faktoriálu program faktorial; var k,n : integer; f : real; begin read(n); k := 1; f := 1; while k <> n do begin k := k + 1; f := f * k; end; writeln('n! = ',f:16:0); end.
Eukleidův algoritmus - výpočet největšího společného dělitele dvou čísel • Věta: Největší společný dělitel dvou čísel je roven největšímu společnému děliteli menšího čísla a zbytku při dělení většího čísla menším číslem. (60,36) (36,24) (24,12) (12, 0)
Eukleidův algoritmus program eukleiduv_algoritmus; var x,y,a,b,c : integer; begin read(x,y) ; if x<y then begin a:=y; b:=x end else begin a:=x; b:=y end; repeat c:=a mod b; a:=b; b:=c; until c=0; writeln('nsd(',x:5,',',y:5,')=',a:3); end.
Eukleidův algoritmus program eukleiduv_algoritmus; var x,y,a,b : integer; begin read(a,b) ; x:= a; y:=b; while x<>y do if x>y then x:=x-y else y:=y-x; writeln('nsd(',a:5,',',b:5,')=',x:3); end.
Příkaz for for rp := vyraz1 to vyraz2 do příkaz; Řídící proměnná cyklu for je ordinálního typu, v proceduře to musí být lokální proměnná.Výrazy musí být stejného typu jako řídící proměnná.
Příkaz for Cyklus for provádí tuto činnost: begin pom1:= vyraz1; pom2 := vyraz2; if pom1 <= pom2 then begin rp := pom1; prikaz; while rp <> pom2 do begin rp := succ(rp); prikaz; end end end; Proměnné pom1, pom2 jsou pomocné, vytváří je překladač. Mezní hodnoty cyklu nemohou být uvnitř cyklu měněny. Nelze měnit ani hodnotu řídící proměnné. Po skončení cyklu není hodnota řídící proměnné definována.
Příkaz for program kody_znaku; var zn : char; begin writeln('cislice vzestupne:'); for zn := '0' to '9' do write(zn,' kod ',ord(zn),'; '); writeln; writeln('dale - enter'); readln; writeln('velka abeceda sestupne:'); for zn :='z' downto 'a' do write(zn,' kod ',ord(zn),'; '); writeln; writeln('konec - enter'); readln; end.
Příkaz for program faktorial; var k,n : integer; f : real; {pro integer do 13, pro int64 do 20} begin write('zadej n: '); readln(n); f := 1; for k := 2 to n do f := f * k; writeln(n,'! je ',f:12:0); writeln('konec - enter'); readln; end.