Úvod do programování
Úvod do programování
ing. Miroslav Jílek 2009, SJOP Poděbrady
1
Úvod do programování
Obsah 1) Algoritmus
2
2) Vývojový diagram
4
3) Příklady vývojových diagramů
9
4) Úvod do programování v Pascalu
13
5) Příklady programů s komentářem
17
6) Řešení cyklů For
20
Úvodem Na začátek si vysvětlíme dva pojmy bez jejichž pochopení nelze začít studium programování. Jsou to pojmy proměnná a hodnota proměnné. Proměnná je název vymezeného objektu, do kterého lze vkládat obsah, kterému říkáme hodnota proměnné. Na příklad: Sklenice je proměnná a pivo je obsah proměnné. Obsah proměnné můžeme změnit, například pivo vylijeme a do sklenice místo piva nalijeme mléko. Změnili jsme obsah proměnné, ale proměnná zůstala původní. Stejně tak to funguje v programování – můžeme měnit obsahy proměnných. Proměnná má dvě vlastnosti. První její vlastnost je jméno proměnné a druhá je typ proměnné. Jméno slouží k uchopení (matematickým a logickým operacím) a typ proměnné definuje jakou do proměnné můžeme vložit hodnotu – číselnou, textovou, logickou (true/false). Hodnota proměnné má vlastnost jednu a tou je informace, kterou nese.
2
Úvod do programování
Algoritmus Algoritmus je exaktně definovaný postup řešení problému (úlohy). Řešení se skládá z jednotlivých kroků. Pořadí kroků musí být dodrženo. Záměna pořadí kroků způsobí dosažení chybného výsledku, v extrémním případě nebude výsledek dosažen žádný. Algoritmus pracuje s daty (údaji), které zpracovává podle stanovených kritérií (podmínek). Algoritmus musí vždy poskytnou výsledek. Pozor: výsledkem může být také informace, že úloha nemá řešení! Algoritmus má tři části. První část je sběr dat, druhá zpracování dat a třetí poskytnutí výsledku. Algoritmus může být jednoduchý (proběhne jednou) nebo cyklický (neustále se opakuje a je ukončen splněním nějaké podmínky nebo vnějším zásahem).
Požadavky na algoritmus a) musí poskytovat exaktní výsledek b) musí být stabilní pro všechna možná vstupní data c) měl by být maximálně univerzální, jednoduchý a rychlý Každý počítačový program má svůj algoritmus. Běžné uživatelské programy se samozřejmě skládají z velkého množství jednotlivých algoritmů, které jsou vzájemně propojeny a vzájemně si předávají data. Vytváření počítačových programů je velice komplikovaná činnost, která zahrnuje celou řadu kroků, které musíme provést a respektovat. Kromě vlastního programovaní (psaní kódu) se jedná o zjištění existujících řešení, komunikaci se zákazníky (průzkum potřeb potenciálních uživatelů, reklama a školení), dále nepřetržitý servis a aktualizace produktů. V dnešní době patří právě marketingové otázky programování k těm rozhodujícím. Úspěšný je takový software, který je nejen programátorsky kvalitní, ale který má marketingovou a technickou podporu.
3
Úvod do programování Jednoduchý příklad algoritmu: Jako příklad algoritmu vezměme řešení problému, kdy máme projít dveřmi. Tato úloha se zdá být velice jednoduchá, ale to jen proto, že ji máme zautomatizovanou a v běžném životě nad ní nepřemýšlíme. Řešení úlohy si nyní popíšeme kroky, resp. činnostmi, které musíme provést: 1) Otázka : Jsem u dveří? Pamatujte: Každá otázka (podmínka) použitá v algoritmu musí mít jednoznačnou odpověď Ano nebo Ne ! Nesmí existovat neurčitá odpověď. 2) Odpověď: Ne – pak udělej krok ke dveřím a opakuj bod jedna, Ano – pokračuj bodem tři 3) Otázka: Jsou dveře otevřeny? 4) Odpověď: Ne – pak otevři dveře, Ano – žádná akce 5) Projdi dveřmi Na tomto příkladě vidíme, že nelze zaměnit pořadí jednotlivých kroků. Nelze nejprve projít dveřmi a pak je otevřít. To by skončilo karambolem. Stejně tak je tomu i u programování. Nyní si všimněte bodu dva. Jedná se o cyklus úkonů, kdy děláme kroky ke dveřím, do té doby, než ke dveřím přijdeme. Počet kroků není předem znám a závisí na výchozí pozici – tedy bodu, ze kterého začínáme řešit problém. Zajímavý je také bod čtyři. Zde se algoritmus rozděluje. V případě odpovědi Ne dveře otevřeme, v případě odpovědi Ano nic neděláme. Dále se větve algoritmu spojí a pokračují dalším krokem. Tuto úlohu si zapamatujte. Později, na stránce 9, se k ní ještě vrátíme. Úkol: Promyslete si situaci, kdybychom museli ještě řešit, zda jsou dveře zamčeny, zda máme klíč apod.
4
Úvod do programování
Vývojový diagram Vývojový diagram je grafické znázornění algoritmu. Vývojový diagram usnadňuje vývoj algoritmu. Jeho velkou předností je jeho přehlednost. Druhou možností jak zapsat algoritmus je slovní vyjádření v krocích. Takto jsme znázornili algoritmus v minulém příkladu, kdy jsme procházeli dveřmi. Vývojový diagram se skládá ze značek. Značky jsou grafické symboly, která představují matematické nebo logické operace nebo usnadňují či dokonce umožňují orientaci ve vývojovém diagramu. Jednotlivé značky jsou vzájemně propojeny čarami. Čáry tak znázorňují postup od jednotlivých kroků ke krokům dalším. V algoritmu a tedy i ve vývojovém diagramu je možné, aby se některé kroky opakovaly a některé byly vynechány. O tom, zda se daný krok provede nebo ne rozhoduje konkrétní situace pro konkrétní vstupní údaje.
Značky vývojového diagramu 1) Mezní značka
Mezní značka symbolizuje začátek (Start) a konec algoritmu. Algoritmus musí mít jeden začátek a jeden konec. I u složitých programů je jeden začátek a jeden konec nutností. Při zakončení programů se provádí některé nezbytné softwarové úkony a proto je jeden konec nutný.
5
Úvod do programování 2) Spojovací značka
Spojovací značka slouží ke znázornění spojení jednotlivých částí algoritmu, které bylo nutno z důvodu nedostatku místa na papíře nebo pro zvýšení přehlednosti. Pokud rozdělujeme algoritmus do více částí, pak spojovací značky znázorňují, které čáry budou vzájemně spojeny, tedy kde navazuje algoritmus. Do kolečka značky se zpravidla zapisuje číslo (nebo jiný symbol). Stejná čísla (symboly) pak určují kde bude přerušená čára algoritmu pokračovat. 3) vstupní a výstupní údaje
Tato značka symbolizuje vstup dat do algoritmu nebo výstup výsledků algoritmu.
6
Úvod do programování 4) Zpracování dat
Tato značka představuje krok, při kterém se zpracovávají data. Může to být například matematická operace, operace s textovými řetězci a podobně. 5) Rozhodování – příkaz IF
Příkaz IF rozvětví (rozdělí) chod algoritmu do dvou větví. Rozdělení je provedeno na základě logického vyhodnocení podmínky. Vyhodnocení může mít hodnotu Ano(+)/Ne(-) (True/False). Chod algoritmu pokračuje tou větví, která odpovídá logickému vyhodnocení podmínky. Větev True obsahuje jiné kroky než větev False.
7
Úvod do programování 6) Cyklus FOR
Cyklus FOR se opakuje předem definovaným počtem opakování. „I“ se nazývá řídící proměnná cyklu a nabývá hodnot od 1 do N s krokem 1 (tedy 1,2,3,...N). V našem případě číslo jedna a číslo N nazýváme počáteční a koncová hodnota cyklu. Počáteční a koncovou hodnotu cyklu můžeme definovat libovolně. Také krok může být jiný než plus jedna (např.-1, +5, atd.). Počáteční a koncová hodnota cyklu a hodnota krok (step) MUSÍ být celočíselná (integer, longinteger). Krok cyklu (step) znamená o jakou hodnotu se změní řídící proměnná cyklu po každém opakování. Např. v cyklu od 2 do 9 s krokem +2 se cyklus bude opakovat čtyřikrát. Poslední hodnota proměnné cyklu, při které se vykonají příkazy těla cyklu (smyčky), bude 8. Při každém opakování se provedou úkony (kroky) definované v části smyčka. Pokud chceme tento cyklus předčasně ukončit musíme změnit (nastavit) hodnotu řídící proměnné cyklu na hodnotu za její koncovou hodnotu. Cyklus FOR může být použit vnořeně, tedy může „běžet“ cyklus v cyklu. Pak jednotlivé cykly nazýváme vnitřní a vnější, při vícenásobném použití první vnitřní, druhý vnitřní atd.
8
Úvod do programování 7) Cyklus WHILE
Cyklus WHILE se opakuje tak dlouho, dokud je podmínka platná (True). V takovém případě se při každém cyklu (smyčce, loop) opakují příkazy těla cyklu (na obr. označeno jako tělo (body of cycle)). Jakmile je podmínka neplatná (False) cyklus končí. Pokud je podmínka neplatná od samého počátku cyklu, pak se příkazy těla cyklu nevykonají ani jednou! Toto je nejdůležitější vlastnost cyklu While. Počet opakování cyklu tedy není předem znám a je závislý na vyhodnocení podmínky cyklu. Existují dvě mezní situace: první, že se cyklus, resp. příkazy jeho těla nevykonají ani jednou (podmínka je od samého počátku False) nebo se opakují do nekonečna (podmínka není nikdy True). Těchto vlastností je možno efektivně využít při programování. Podmínkou rozumíme jakýkoli logický nebo matematický výraz, ke kterému existuje pravdivostní hodnota Ano (True) nebo Ne (False). Příkladem podmínek můžou být např. podmínky: A>2, A>=B, A=3 apod. Všimněte si, že v podmínce zpravidla používáme proměnné a testujeme jejich hodnoty.
9
Úvod do programování
Příklady vývojových diagramů 1) Vývojový diagram úlohy Průchod dveřmi
Tento vývojový diagram znázorňuje algoritmus, se kterým jsme se seznámili již v úvodu kapitoly Algoritmy. První co algoritmus řeší je otázka, zda jsme u dveří. Pokud ne, pak uděláme krok ke dveřím. Po příchodu ke dveřím řešíme otázku, zda jsou dveře otevřené. Příkaz Otevřít se v této úloze provede pouze za situace, kdy dveře nejsou otevřené. Všimněte si: nezáleží, jak daleko jsme od dveří ani zda jsou dveře otevřené. Algoritmus je UNIVERZÁLNÍ.
10
Úvod do programování 2) Vývojový diagram úlohy vyhledání největšího čísla z řady N-čísel
V první části diagramu je Vstup N čísel. Použili jsme zjednodušení a neřešíme problém samotného vložení těchto čísel. V praxi bychom museli doplnit ještě nějaký cyklus od jedné do N kdy by se postupně vkládala jednotlivá čísla. Pro řešení této úlohy je zavedeno pole čísel. Jedná se o jednotlivá čísla uložená pod jedním názvem a každé jednotlivé číslo má svůj index. V příkladu jsme použili jako název „Č“ a index v závorce. Jako index mohou být použita přirozená čísla, u některých programovacích nástrojů může být použita i nula. Řešení úlohy spočívá v tom, že jako maximum (Max) vezme první číslo, tedy Max = Č(1), a následně postupně testujeme všechna další čísla. Pokud je některé z čísel větší než momentální maximum je toto číslo, resp. jeho hodnota, vložena do do Max např.: If Č(I) > Max Then Max = Č(I). Úkol: Upravte algoritmus tak, aby čísla testoval od konce k začátku.
11
Úvod do programování 3) Vývojový diagram úlohy řazení čísel podle velikosti
Řazení čísel je jedním z nejdůležitějších základních algoritmů v programování. Existuje mnoho způsobů jak řadit čísla. V naší úloze je využit princip vzájemné výměny sousedních čísel, který se opakuje tak dlouho, až jsou čísla seřazena. Také zde nebudeme řešit způsob zadávání jednotlivých čísel. Soustředíme se na vlastní řazení. Řazení probíhá v cyklu od jedné do N-1. Do N-1 proto, že jsou porovnávána vždy dvě čísla. Poslední porovnávanou dvojicí čísel jsou předposlední a poslední číslo. Pokud bychom cyklus opakovali N-krát došly by chybě, neboť za posledním číslem (n-tým) již další neexistuje. Pokud je první číslo porovnávané dvojice čísel větší než druhé, pak dojde k jejich výměně, resp. k výměně jejich pořadí v řadě čísel a ukazatel (řídící proměnná cyklu) se zmenší o dvě. Pozor! Řídící proměnná cyklu se nesmí dostat pod startovní hodnotu 1 (If I<0 then I=0). Při dalším cyklu se nula zvýší na jedničku a může tak být testováno první číslo! Na konci řazení bude minimum na první pozici (zleva).
12
Úvod do programování Pro záměnu obsahů dvou proměnných potřebujeme použít třetí proměnnou, která se v našem případě nazvali Temp. Princip je znázorněn na obrázku:
Např.: na počátku bude A = 3, B = 5 a dále: 1) Temp=A 2) A=B 3) B=Temp Na konci bude A =5 a B =3. Tento princip výměny je univerzální pro všechny typy proměnných. Pro číselné typy proměnných se obejdeme bez přechodné, tedy třetí proměnné. Můžeme postupovat takto: 1) A = A + B 2) B = A – B 3) A = A – B Např.: na počátku bude A =3, B= 5 a budeme pokračovat: 1) A = 3 + 5 2) B = 8 – 5 3) A = 8 – 3 Na konci tedy bude A =5 a B =3! Vraťme se ještě k našemu algoritmu. Podívejme se jak bude probíhat řazení pro konkrétní řadu čísel: 4,3,2,5,3 : 1.změna 3,4,2,5,3 2.změna 3,2,4,5,3 3.změna 2,3,4,5,3 4.změna 2,3,4,3,5 5.změna 2,3,3,4,5 Všimněte si, čísla se postupně posouvají vlevo. Posouvání končí, kdy jsou čísla v celé řadě čísel vlevo menší než sousední čísla vpravo.
13
Úvod do programování
Úvod do programování v Pascalu V této kapitole se seznámíme s nejelementárnějšími postupy programování v programovacím nástroji Pascal. Po zvládnutí tohoto úvodu do programování nebudete schopni komerčně programovat, ale snadněji a rychleji pochopíte moderní programovací nástroje ve svém dalším studiu. Budeme se zabývat pouze těmi nejdůležitějšími příkazy (commands), které jsou základem pro vytváření algoritmů. 1.Typy proměnných: (budeme se zabývat pouze některými) Integer - celé číslo v rozsahu <– 32768; + 32768> Longint - celé číslo v rozsahu <– 2 mld.; + 2 mld.> Real - reálné číslo Char - jednoznaková proměnná (obsahuje max. 1 znak) String[x] - řetězec, obsahující x znaků Array – pole, množina (set) – tato proměnná má jedno jméno, ale může obsahovat více údajů stejného typu. Např.: Array[1..5] of Integer znamená že proměnná bude obsahovat pět celočíselných údajů. Jednotlivé údaje jsou identifikovány jménem proměnné a indexem 1 až 5. 2.Operandy a matematické operace: +, -, *, /, ^ sčítání, odčítání, násobení, dělení, mocnění <, >, =<, >=, <>, = logické porovnání A^0.5 nebo Sqrt(A) je druhá odmocnina z A Or, And logické spojky := přiřazení (vložení) Příklady použití: A:=A+B příkaz vezme hodnotu z proměnné A a přičte k ní hodnotu proměnné B a výsledek vloží do proměnné A A:=A+1 příkaz zvětší (zvýší) hodnotu proměnné A o jedničku If A<>0 And B>5 Then C:=1; příkaz porovná obsah proměnné A a obsah proměnné B a pouze v případě když je obsah proměnné A různý od nuly a zároveň obsah proměnné B je větší než pět vloží do proměnné C hodnotu jedna.
14
Úvod do programování 3.Příkazy pascalu: (vysvětlíme si pouze ty nejdůležitější z hlediska seznámení se se základy programování v Pascalu) Write, Writeln vypíše obsah proměnné nebo závorky na monitor do pozice kurzoru, např. Příkaz Writeln(A) vypíše hodnotu proměnné A, příkaz Write('Ahoj') vypíše slovo Ahoj, writeln navíc posune kurzor na nový řádek Read, Readln po stisknutí klávesy Enter přečte hodnotu z obrazovky a vloží ji do proměnné v závorce, např. Readln(A) vloží hodnotu do proměnné A, pozor: zadaná hodnota musí odpovídat typu proměnné, ln má stejný význam jako u writeln GoToXY změní pozici kurzoru, např. GoToXY(5,6) umístí kurzor na pátý sloupec šestého řádku obrazovky, obrazovka má 80 sloupců a 24 řádků ClrScr smaže obrazovku If testuje podmínku a na základě výsledku (True/False) pokračuje chod programu určitou cestou Např.: If A>B Then Příkaz1 Else Příkaz2; Pokud bude výsledek podmínky A>B True pak bude vykonán Příkaz1, pokud bude výsledek podmínky roven False pak bude vykonán Příkaz2. Pokud neuvedeme v příkazu If část Else Příkaz2, pak se v případě, že výsledek podmínky bude False nevykoná žádný příkaz. Tento příkaz na základě výsledku vyhodnocení podmínky (v našem případě podmínky A>B) větví chod programu do dvou cest. Pokud bychom chtěli, můžeme na místo Příkaz1 vložit i více příkazů. V takovém případě musí být tyto příkazy ohraničeny příkazem Begin a End While příkaz cyklu. Cyklus se opakuje tak dlouho dokud je podmínka splněna (True). Při každém opakování se vykoná příkaz Příkaz1. Na místo Příkaz1 můžeme vložit i více příkazů. V takovém případě
15
Úvod do programování
Repeat
For
Length
GoTo
musí být tyto příkazy ohraničeny příkazy Begin a End Např.: While Podmínka do Příkaz1; Pokud není podmínka splněna pak se cyklus nevykoná ani jednou příkaz cyklu. Cyklus se opakuje tak dlouho, dokud podmínka není splněna (skončí až když je podmínka True). Příkaz je zakončen klíčovým slovem Until. Např.: Repeat Příkaz1 Until Podmínka; Cyklus se bude vykonávat (včetně příkazu Příkaz1 nebo skupiny příkazů mezi příkazy Repeat a Until tak dlouho, dokud nebude podmínka splněna (dokud bude False). Příkaz(y) se tedy vykoná nejméně jednou! Příkaz cyklu s definovaným počtem opakování. Např.: For A:=1 To 10 Do Příkaz1; Tento cyklus vykoná desetkrát Příkaz1. Na místo Příkaz1 můžeme vložit více příkazů, ale tyto příkazy musí být ohraničeny příkazy Begin a End vrací dynamickou délku řetězce (length of string) Např.: S :='Ahoj studente!'; X:=Length(S); pak X bude mít hodnotu 14, protože řetězec (string) S obsahuje 14 znaků. skok v programu. Tento příkaz přesune chod (zpracování) programu až na řádek, který začíná definovaným návěstím (label) Např.: If A=5 then Goto Skok1; Příkaz1; Příkaz2; Skok1: Příkaz3; Pokud bude A rovno 5, pak se příkazy Příkaz1 a Příkaz2 nevykonají a chod programu bude pokračovat až návěstím Skok1 a tedy příkazem Příkaz3.
16
Úvod do programování 4.Struktura programu Program napsaný v programovacím jazyce Pascal má několik základních pravidel. Tato pravidla umožňují překládat a vykonávat kompilátoru příkazy a umožňují běh celého programu. Na následujícím schématu si tato základní pravidla vysvětlíme (také zde se omezíme na nezbytné minimum informací): Program Jmeno; Uses Crt; Var JménoProměnné: TypProměnné; Begin Příkazy Programu; End. Každý program začíná klíčovým slovem Program, za ním následuje jméno programu. Každý řádek je zakončen středníkem. Tento symbol pro kompilátor znamená konec řádku (příkazu). Výjimku tvoří příkaz začínajícího bloku např. Begin nebo Repeat. Na druhém řádku je uvedeno klíčové slovo Uses a za ním následuje seznam použitých ovladačů. Ovladače jsou moduly, které umožňují práci programu např. s periferním zařízením, s grafickou kartou apod. V našem případě ovladač Crt umožňuje spolupráci programu s monitorem a klávesnicí. Na třetím řádku našeho vzorového schématu je klíčové slovo Var. Tímto klíčovým slovem začíná deklarace v programu použitých proměnných. Proměnné deklarujeme tak, že nejprve zapíšeme jména proměnných od sebe oddělených čárkou, dále zapíšeme dvojtečku a za ní typ proměnné. Z tohoto vyplývá, že všechny takto deklarované proměnné budou pouze jednoho typu. Pokud potřebuje proměnné jiného typu musíme je deklarovat na dalším řádku. Nakonec zapíšeme tělo programu. To začíná příkazem Begin, končí příkazem End a mezi těmito příkazy jsou uvedeny příkazy programu (algoritmus programu). Tečka za posledním End představuje konec programu.
17
Úvod do programování
Příklady programů s komentářem 1) Vyhledání maxima z řady čísel (algoritmus vyhledání Maxima ze str.10, pro zjednodušení budeme pracovat pouze s deseti celými čísly, navíc do programu přidáme ještě načtení deseti čísel) Program Maximum; Uses Crt; Var Max,I: Integer; C:Array[1..10] Of Integer; Begin ClrScr; For I:=1 To 10 Do Begin Write('Zadej ',I,'cislo : '); Readln(C[I]); End; ClrScr; For I:=1 To 10 Do Write(C[I],', '); Writeln; Max:=C[1]; For I:=2 To 10 Do If C[I]>Max Then Max:=C[I]; Write('Maximum je ',Max); Repeat Until (Keypressed) End. V programu použijeme (deklarovali jsme) proměnné Max (hledané maximum), I (řídící proměnná cyklu) a C (proměnná typu Array – umožňuje zadat deset čísel). Všechny proměnné jsou typu Integer. První příkaz těla programu ClrScr smaže obrazovku. Dále následuje cyklus od 1 do 10, který postupně zobrazí deset řádků s výzvou na zapsání hodnoty (čísla). Pokaždé bude uživatel informován o pořadí, které číslo právě zadává. Příkaz Readln(C[I])
18
Úvod do programování bude vkládat údaje z obrazovky monitoru do proměnné C do pozice s indexem I. Po zadání desátého čísla bude monitor smazán a budou zobrazena všechna zadaná čísla v pořadí v jakém byla zadána na jednom řádku. Příkaz Writeln přesune kurzor na nový řádek. Do proměnné Max se vloží první zadané číslo, které v tu chvíli představuje maximum. Vlastní vyhledání maxima proběhne v cyklu od 2 do 10, tedy od druhého do posledního zadaného čísla, kdy bude každé číslo porovnáno s hodnotou proměnné Max a v případě, že právě testované číslo (C[I]) bude větší než právě aktuální maximum bude do proměnné Max vložena hodnota tohoto právě testovaného čísla. Po ukončení cyklu, tedy testování zadaných čísel bude na monitor vypsána věta s informací o hodnotě nalezeného maxima. Příkaz Repeat Until (Keypressed); v praxi bude opakovat cyklus, ve kterém nebude nic vykonáno, až do okamžiku stisknutí libovolné klávesy. Tento řádek tedy umožňuje přerušení chodu programu až do okamžiku, kdy stiskneme libovolnou klávesu. Poslední příkaz End s tečkou končí program. V případě, že bude zadána řada čísel, ve které existuje maximum vícekrát, pak bude jako maximum použito to první. Toto je důležité, pokud chceme znát pozici maxima v řadě. Otázky k přemýšlení: a) Upravte program tak, aby vyhledal minimum. b) Upravte program tak, aby informoval také o pozici, na které je zadáno maximum. c) Upravte program tak, aby vypočítal průměrnou hodnotu zadaných čísel. d) Upravte program tak, aby informoval, kolik zadaných čísel je kladných a kolik záporných e) Upravte program tak, aby umožňoval zadat pouze nezáporná čísla.
19
Úvod do programování 2) Řazení čísel (pro zjednodušení budeme pracovat pouze s deseti celými čísly) Program Razeni; Uses Crt; Var Temp,I: Integer; C:Array[1..10] Of Integer; Begin ClrScr; For I:=1 To 10 Do Begin Write('Zadej ',I,'cislo : '); Readln(C[I]); End; ClrScr; Write('Zadana rada cisel : '); For I:=1 To 10 Do Write(C[I],', '); Writeln; For I:=1 To 9 Do Begin If C[I]>C[I+1] Then Begin Temp:=C[I]; C[I]:=C[I+1]; C[I+1]:=Temp; I:=I-2; If I<0 Then I:=0; End; End; Write('Serazena rada cisel : '); For I:=1 To 10 Do Write(C[I],', '); Repeat Until (Keypressed) End. Vzhledem k tomu, že zápis programu je velice podobný zápisu předešlému vysvětlíme si pouze tu část algoritmu, ve které probíhá řazení. Algoritmus je určen k řazení deseti čísel (N=10). Cyklus, ve kterém budeme porovnávat sousední čísla bude od 1 do 9 (N-1). Jestliže bude testované číslo (index I) větší než číslo
20
Úvod do programování následující (index I+1) pak se tato čísla v pořadí vymění. Výměna proběhne tak, že do přechodné proměnné Temp se vloží první číslo(index I), na pozici prvního čísla (I) se přesune následující číslo (I+1) a na místo následujícího čísla (I+1) se vloží hodnota proměnné Temp (I). Tím dojde k výměně pozic dvou sousedních čísel. Zde máme dvě možnosti: a) posunout ukazatel (řídící proměnná cyklu I) o dvě pozice zpět a dále testovat, zda není třeba číslo dále posunout vlevo. Tento způsob posouvá každé číslo vlevo tak dlouho, dokud není toto číslo na „své“ pozici. Toto řešení je použito v příkladu. b) pokračovat v testování dále až do I=N-1. Tím by se vyměnila všechna sousední čísla, která by byla v opačném pořadí než požadujeme, ale bylo by třeba opakovat celý cyklus tolikrát, dokud by docházelo ke změnám v pořadí čísel, resp. dokud by nebyla všechna čísla definitivně seřazena. Otázky k přemýšlení: a) Upravte algoritmus programu tak, aby řadil čísla sestupně (decrease), tedy od maxima do minima. b) Navrhněte jiný způsob řazení.
Řešení cyklů FOR V následujících příkladech si vysvětlíme proces cyklu for. a) jednoduchý cyklus B:=0; For A:=1 to 10 do begin B:=B + A; B:=2 * B – A; end; Otázka: Jaká bude hodnota proměnné B na konci cyklu?
21
Úvod do programování Tento jednoduchý cyklus provede při každém cyklu (bude jich deset) dva příkazy, resp. dvě matematické operace. Nejprve k obsahu proměnné B připočte (přidá) hodnotu proměnné A. Hodnota proměnné A bude postupně číslo od jedné do desíti. V druhé matematické operaci nejprve vynásobí hodnotu proměnné B dvěma a nakonec od výsledku odečte hodnotu proměnné A (tedy postupně v jednotlivých cyklech jedničku až desítku). Sestavme si nyní tabulku hodnot proměnných použitých v cyklu (jsou dvě, A a B, proměnná A je řídící proměnná cyklu):
A
B (na počátku = 0)
1
0+1=1, 2*1–1=1
2
1+2=3, 2*3-2=4
3
4+3=7, 2*7-3=11
4
11+4=15, 2*15-4=26
5
26+5=31, 2*31-5=57
6
57+6=63, 2*63-6=120
7
120+7=127, 2*127-7=247
8
247+8=255, 2*255-8=502
9
502+9=511, 2*511-9=1013
10
1013+10=1023, 2*1023-10=2036
Výsledná hodnota proměnné B po ukončení cyklu bude 2036.
22
Úvod do programování b) dvojitý (vnořený) cyklus C:=0; For A:=1 to 10 do For B:=A to 10 do C:=C+1; Otázka: Jaká bude hodnota proměnné C na konci cyklu? Tato úloha je složitější. Probíhá zde cyklus v cyklu. Vnější cyklus (řídící proměnná A) proběhne desetkrát a vnitřní cyklus (řídící proměnná B) bude postupně probíhat 10, 9, …., 2 krát a nakonec jednou. Počet opakování vnitřního cyklu se bude postupně snižovat o jedničku. Důvodem je postupně se o jedničku zvyšující počáteční hodnota cyklu. Při každém opakování vnitřního cyklu se hodnota proměnné C zvýší o jedničku. To znamená, že potřebujeme zjistit kolikrát se provede přičtení jedničky k hodnotě proměnné C, resp. kolikrát se provede matematická operace C=C+1. Pro první vnější cyklus, kdy A=1, se provede přičtení 10 krát, pro druhý 9 krát až pro desátý jen jednou. Výsledná hodnota C je tedy součet řady čísel 10+9+8+7+6+5+4+3+2+1=((10+1)/2)*10=55. Pozn.: Součet přirozených čísel od 1 do N vypočítáme podle vzorce: ∑ = N * (1 + N) / 2
23