Professional Documents
Culture Documents
Horova
• 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}
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
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).
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.
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
repeat
príkaz_1;
príkaz_2;
.
.
.
príkaz_k
until podmienka;
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}
3
Elearningový kurz – Základy programovania v jazyku Turbo Pascal Gymnázium P. Horova
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.
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.
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.
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.
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,’ ’);
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.
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)
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).
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).