You are on page 1of 9

Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P.

Horova

CYKLUS S PODMIENKOU NA ZAČIATKU A NA


KONCI
V predošlých lekciách sme používali pri úlohách s istým počtom opakovaní daných úkonov
cyklus „For - to“, resp. „For - downto“. V úlohách však často nevieme, koľkokrát sa budú isté
príkazy opakovať, len vieme, za akých podmienok sa ich vykonávanie má skončiť. V takýchto
úlohách budeme používať cykly s podmienkou – buď na začiatku, alebo na konci.

Cyklus s podmienkou na začiatku: while – do

while podmienka do príkaz;

• Pokiaľ podmienka platí (má hodnotu true), vykonáva sa prikaz. Inak sa pokračuje
nasledujúcim príkazom.
• prikaz tvorí telo cyklu.
• Ak chceme vykonať viac príkazov v tele cyklu, vytvoríme z nich zložený príkaz –
uzavrieme ich medzi slová begin a end.
• Ak podmienka neplatí hneď po prvý krát (má hodnotu false), telo cyklu sa nevykoná ani
raz.

Príklady:

1. while c>0 do c:=c div 10; {číslo c sa zmenšuje vždy o poslednú cifru}

2. while a>b do begin


a:=a-1;
b:=b+1;
end; {číslo a sa dekrementuje a číslo b inkrementuje,
pokiaľ hodnota a je väčšia ako b}

3. Q:=true;
while Q do begin
readln(cislo);
if cislo mod 7 = 0 then Q:=false;
end;
{cyklus skončí, ak načíta číslo deliteľné číslom 7}

1
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

Príklad 1 - Euklidov algoritmus:


Euklidov algoritmus je známy postup na nájdenie najväčšieho spoločného deliteľa (NSD)
dvoch celých kladných čísel a svojou jednoduchosťou až prekvapuje. Určite si pamätáte, ako
ste v 7. ročníku čísla rozkladali na prvočísla a zo spoločných prvočísel zostavovali deliteľov.
V Euklidovom algoritme nám stačí čísla od seba odčítavať (menšie od väčšieho), až kým sa
čísla nerovnajú, čím nájdeme NSD.

Napríklad:
NSD(62,40)=NSD(22,40)=NSD(22,18)=NSD(4,18)=NSD(4,14) =NSD(4,10) =NSD(4,6)
=NSD(4,2) =NSD(2,2)=2

Ak NSD(a,b)=1, tak sú čísla nesúdelieľné (ich deliteľom je len jednotka a k tej v najhoršom
prípade určite odčítavaním dôjdeme).

Z postupu príkladu čísel 64 a 44 vyplýva, že sa postup odčítania opakuje, kým sú čísla


nerovnaké (a<>b). Ak sa rovnajú, cyklus končí a my sme našli ich NSD (jedno z nich).

program EUKLID;
var a,b: integer;
begin
writeln(‘Zadajte 2 cele kladne cisla‘);
readln(a,b);
while a<>b do
if a>b then a:=a-b
else b:=b-a;
writeln(‘nsd= ‘, a)
end.

Úloha 1 (Ciferný súčet):


Vypočítajte ciferný súčet (súčet cifier) dlhého celého kladného čísla. Napríklad ciferný
súčet čísla c=362 007 je 18. Na oddeľovanie cifier z čísla použijeme funkciu mod
príkazom cifra := c mod 10; na „vyškrtnutie“ použitej cifiry z čísla použijeme
funkciu div príkazom c := c div 10;

program cif_sucet;
var sucet, cifra: integer;
c: longint;
begin
sucet:=0;
writeln(‘Zadajte dlhe cele kladne cislo‘);
readln(c);
while c>0 do begin
cifra:= c mod 10;
sucet:=sucet + cifra;
c := c div 10
end;
writeln(‘Ciferny sucet je ‘, sucet)
end.

2
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

Cyklus s podmienkou na konci: repeat - until

repeat
príkaz_1;
príkaz_2;
.
.
.
príkaz_k
until podmienka;

• Príkazy prikaz_1 až prikaz_k sa budú opakovať, až kým sa nesplní podmienka


(nadobudne hodnotu true), vtedy sa opakovanie skončí a pokračuje sa nasledujúcim
príkazom.
• prikaz_1 až prikaz_k tvoria telo cyklu.
• Telo cyklu sa vykoná aspoň raz, aj keď podmienka platí hneď po prvý krát (má hodnotu
true).

Príklady (tie isté ako pri cykle while):

1. repeat
c:=c div 10
until c=0; {číslo c sa zmenšuje vždy o poslednú cifru, až kým
nemá žiadnu cifru}
2. repeat
a:=a-1;
b:=b+1;
until a<=b; {číslo a sa dekrementuje a číslo b inkrementuje,
ak hodnota a je menšia alebo rovná b, cyklus končí}

3. Q:=true;
repeat
readln(cislo);
if cislo mod 7 = 0 then Q:=false;
until not Q;
{cyklus skončí, ak načíta číslo deliteľné číslom 7}

Rozdiel medzi cyklami: „while – do“ a „repeat – until“


• Cyklus while má podmienku na začiatku, repeat má podmienku na konci
• Cyklus while vykonáva svoje telo, ak podmienka platí (má hodnotu true), cyklus repeat
vykonáva svoje telo, ak ak podmienka neplatí (má hodnotu false).
• Cyklus while sa nemusí vykonať ani raz, cyklus repeat sa určite vykoná aspoň raz.

3
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

Príklad 2 - Fibbonacci po druhé:

V 2. lekcii sme hľadali n-tého čísla Fibonacciho postupnosti - FP (1, 1, 2, 3, 5, 8, 13, 21, 34,...)
Zostavme program na výpočet toho člena FP, ktorý prvý prekročí hodnotu 5000 a zistíme jeho
poradie. Keďže nepoznáme jeho poradie, nevieme, koľko medzičlenov FP budeme musieť
spočítať (a teda nemôžeme použiť cyklus for ), ale vieme, že ich výpočet ukončíme hneď pri
člene nad 5000. Takže použijeme cyklus repeat:

program Fibonacci2;
var a, b, c, i: integer;
begin
a:= 1;
b:= 1;
i:= 2;
repeat
c:= a + b;
inc(i);
a:= b;
b:=c;
until c>5000;
writeln ('Prvy clen, ktory prekrocil 5000 - ', c);
writeln ('Jeho poradove cislo - ', i);
end.

Poznámka. Analogicky by sme mohli použiť aj cyklus while, len výpočet člena „c“ by sme
museli napísať 2x – raz pred cyklom a raz v tele cyklu.

Úloha 2 (Počet výskytov cifry):


Zistite, koľkokrát sa istá cifra vyskytuje v zápise dlhého celého čísla. Použite cyklus
repeat. Podobne ako v úlohe 1 posekáme číslo na jednotlivé cifry pomocou funkcií
mod a div.

program vyskyt_cifry;
var pocet, cifra, hlcifra: integer;
c: longint;
begin
pocet:=0;
writeln(‘Zadajte dlhe cele kladne cislo‘);
readln(c);
writeln(‘Zadajte jednu cifru‘);
readln(hlcifra);
repeat
cifra:= c mod 10;
if cifra = hlcifra then inc(pocet);
c := c div 10
until c=0;
writeln(‘Hladana cifra sa vyskytuje ‘,pocet, ‘ krat‘)
end.

4
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

Príklad 3 - Výťah:
Zostavíme program, ktorý simuluje nástup do výťahu s istou nosnosťou. Pred výťahom stojí
určitý počet ľudí. Zistite, či sa všetci vmestia do výťahu, resp. koľko iba koľko z nich voje do
výťahu, aby neprekročili jeho nosnosť.

program výťah;
var nosnost, pocet, tiaz, suma, i: integer;
begin
writeln ('Zadaj pocet osob pred vytahom');
readln (pocet);
writeln ('Zadaj nosnost vytahu');
readln (nosnost);
i:=0;
repeat
inc(i);
writeln ('Zadaj tiaz ', i, '. osoby');
readln (tiaz);
suma := suma + tiaz
until (suma>nosnost) or (i=pocet);
if suma>nosnost then
writeln ('Do vytahu sa vmesti len ',i-1, 'osob')
else
writeln ('Do vytahu sa vmestia vsetky osoby');
end.

Príklad 4 - Kedy budem milionár?:

Do banky na istú úrokovú sadzbu vložíme jednorázovo istý vklad - sumu peňazí. A už budeme
len čakať, kedy nám banka oznámi, že sme milionári. Zostavte program, ktorý zistí, koľko
rokov si musíme na túto skutočnosť počkať.

program milionar;
var vklad, urok, suma, r: integer;
banka: real;
begin
writeln ('Zadaj tvoj vklad a urok v percentach');
readln (vklad, urok);
r:=1;
banka:=vklad*(1+urok/100);
repeat
inc(r);
banka:= banka*(1+urok/100);
until banka>1000000;
writeln ('Milionarom budes po ',r, 'rokoch!')
end.

Úloha 3 (Milionár trocha inak):

Zmeňte časť zdrojového kódu programu príkladu 4 tak, aby ste použili cyklus
while namiesto cyklu repeat. Zadanie úlohy je nezmenené.

5
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

program milionar_2;
var vklad, urok, suma, r: integer;
banka: real
begin
writeln ('Zadaj tvoj vklad a urok v percentach');
readln (vklad, urok);
r:=1;
banka:=vklad*(1+urok/100);
while banka<=1000000 do begin
inc(r);
banka:= banka*(1+urok/100);
end;
writeln ('Milionarom budes po ',r, 'rokoch!')
end.

Úloha 4 (Trojciferné čísla s ciferným súčtom):

Ktoré trojciferné čísla majú daný ciferný súčet cif?

Všetky trojciferné čísla môžeme vytvoriť po jednotlivých cifrách s použitím cyklov for, ale
taktiež môžeme každé jedno takéto číslo podeliť na cifry a zistiť, či nám vyhovuje. V riešení
uvádzame fragmenty oboch riešení.

1. riešenie

readln(cif);
for i:=1 to 9 do
for j:=0 to 9 do
for k:=0 to 9 do
if i+j+k=cif then write (i*100+j*10+k,’ ’)

2. riešenie

readln(cif);
for c:=100 to 999 do
begin
cc:=c; suc:=0;
repeat
suc:=suc+cc mod 10;
cc:=cc div 10
until cc=0;
if suc = cif then write (c,’ ’);

Úloha 5 (Armstrongove čísla):


V zadaní 3. lekcie sme vytvárali trojciferné Armstrongove čísla pomocou troch
cyklov. Chceme nájsť však viaceré Armstrongove čísla, nielen trojciferné
(Napríklad od 1 do 10000). Otestujeme teda každé číslo, či spĺňa podmienku (Súčet tretích
mocnín cifier čísla sa musí rovnať danému číslu). Vypíšeme len Armstrongove čísla.

6
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

program Armstrong;
var pocet, cif, c, cc: integer;
begin
for c:= 1 to 10000 do
begin
sucet:=0;
cc:=c;
repeat
cif:= c mod 10;
sucet := sucet + cif*cif*cif;
c := c div 10
until c=0;
if cif = cc then writeln(cc)
end;
end.

Úloha 6 (Symetrické číslo):


Symetrické číslo takzvaný palindrom má vlastnosť osovej súmernosti – napr. číslo
2345432 je symetrické. Sú známe slová s touto vlastnosťou, ktoré sa čítajú rovnako
odzadu ako odpredu (napr. ťahať, madam, kobylamamalybok,...)

Akým spôsobom môžeme otestovať symetriu? Keďže nevieme počet cifier, vytvoríme z cifier
číslo otočené a porovnáme pôvodné a otočené. Napr. z čísla c=1234 postupne odoberieme
cifry - najprv 4, potom 3 (vytvoríme z nich číslo 43 – 4*10+3), potom 2 (vytvoríme z nich
číslo 432 – 43*10+2) a napokon 1 (vytvoríme z nich 4321 – 432*10+1) Samozrejme, že toto
číslo nie je symetrické, keďže sa 1234 nerovná 4321.

program Symetricke_cislo;
var pocet, cif: integer;
c, cc, kopia: longint;
begin
writeln(‘Zadajte cele kladne cislo‘);
readln(c);
kopia := c;
cc:=0;
repeat
cif:= c mod 10;
cc := cc*10 + cif;
c := c div 10
until c=0;
if kopia = cc then writeln(‘Cislo je symetricke‘)
else writeln(‘Cislo nie je symetricke ‘);
end.

7
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

Neriešené úlohy:

1. Zostavte program, ktorý zistí počet mrazivých (pod nulou) a nemrazivých dní (nad
nulou). Postupnosť kladných a záporných teplôt je ukončená nulou. Vypíšte, ktorých
dní bolo viac – mrazivých či nemrazivých.

2. Upravte program na hru „Hádaj číslo“ bez obmedzenia pokusov hádania, program po
uhádnutí čísla vypíše aj počet pokusov hádajúceho.

3. Zostavte program na výpočet toho člena FP, ktorý je posledný menší ako 2000, ďalší
člen už túto hodnotu prekročí a zistíte jeho poradie v postupnosti.

4. Nájdite najmenší spoločný násobok (ďalej nsn) dvoch celých čísel pomocou výpočtu
NSD Euklidovým algoritmom, pričom paltí, že nsn(a,b)=a*b / NDS(a,b). (Ak súčin
čísel vydelíme najväčším spoločným deliteľom týchto čísel)

5. Pre aký počiatočný vklad V vložený na úrok U budem milionárom po 10 rokoch?

6. Knihovníčka sa snaží poukladať knihy do poličky. Zistite, či sa jej do poličky zmestia


všetky knihy, ak každá kniha môže mať rôznu šírku a výšku (Program načíta: počet
kníh, šírku a výšku každej knihy, dĺžku a výšku poličky; Program vypíše: áno – vmestia
sa resp. nie – nevmestia sa).

7. Z klávesnice budeme zadávať celé kladné čísla ukončené nejakým záporným číslom.
Zistite dĺžku najdlhšieho rastúceho úseku v tejto postupnosti. (Riešte pomocou dvoch
vnorených cyklov s podmienkou).

8. Určte výslednú hodnotu premennej k:

program co_dava;
var k,i:integer;
begin
k:=1;
for i:=1 to 20 do
if k<20 then k:=k+i;
write(k);
end.

8
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova

ZADANIE 5.1:
Problém 2 ruksakov (malý problém dvoch ruksakov). Dvaja turisti majú veľa vecí, pričom
každá má istú hmotnosť H, každá vec má inú hmotnosť, posledná fiktívna vec má hmotnosť
nula, tá slúži na ukončenie zadávania hmotností. Zostavte program, ktorý bude postupne
rovnomerne deliť veci do dvoch rovnakých ruksakov podľa doterajšej hmotnosti v istom
ruksaku, čiže ďalšiu vec o hmotnosti Hj dám do toho ruksaka, ktorý je ľahší. Nakoniec
pravdepodobnejšie bude jeden ruksak ťažší, ako druhý, vo výnimočnom prípade rovnako
ťažký. Zostavte program, ktorý zistí, o koľko má jeden turista ťažší ruksak ako druhý a o koľko
vecí má jeden turista viac ako ten druhý, alebo majú obaja v ruksaku rovnaký počet vecí.

Poznámka: Naozajstný problém dvoch ruksakov pojednáva o tom, či existuje také delenie vecí,
aby boli hmotnosti oboch ruksakov rovnaké, ale to by sme museli vedieť ich hmotnosti všetky
naraz, nie zadávať postupne. To si ukážeme pri jednorozmerných poliach.

ZADANIE 5.2:
Z klávesnice budeme zadávať celé kladné čísla ukončené nejakým záporným číslom, ktorý do
postupnosti nepatrí. Zistite, či je táto postupnosť neklesajúca (nasledujúci člen je väčší, alebo je
rovnako veľký ako predošlý člen).

You might also like