Pascal/Цикли

From Wikiversity
Информатика

Уроци
Урок 1 :Въведение
Урок 2 :Променливи и типове
Урок 3 :Условия
Урок 4 :Цикли
Урок 5 :Масиви
Урок 6 :Константи
Урок 7 :Процедури и функции
Упражнение
Упражнение :Упражнения І


Тема на този урок е как да накараме програмата си да повтаря дадена част от програмния си код, т.нар. цикъл. В Паскал, както и в други програмни езици съществуват два основни вида цикли: цикли, при които е предварително зададено колко повторения да направи цикъла, и такива, при които прекъсването на цикъла зависи от изпълнението на дадено условие. Първият вид цикли в Паскал се обозначава с думата for, а втория вид с repeat и until (повтаряй докато) или с while (докато). Върху разликата между последните два вида ще се спрем по-късно в този урок. Първо да разгледаме for циклите.

for[edit]

For циклите най-често се употребяват с променливи от тип integer, като в програмирането е станало трядиционно използването на променливи с имената i и j за такива цикли, но и всякакви други имена са допустими. Синтаксисът на тези цикли е както седва: for i:=1 to 10 do, тоест "за случаите, в които и си присвоява стойности от едно до десет направи".

Следната програма демонстрира как действа един for цикъл, като изписва числата от едно до 10:

var i:integer;
begin
 for i:=1 to 10 do writeln(i);
 readln;
end.

Параметрите от колко до колко трябва да се изпълнява цикъла могат да се зададат и от потребителя по време на изпълнението на програмата. Ако числото, от което ззапочва цикъла е по-голямо от това, с което завършва цикъла, то думата to се замества с downto. В следната примерна програма потребителят въвежда парамтър до колко да се върти цикъла, при което на всяко испълнение на цикъла се изписва съобщението: "Vavedete chislo:" и след въвеждането на зададения брой числа програмата отпечатва съмата на всички числа.

var i, n, sum, x:integer;
begin
 write('Kolko pati da se izpalni cikala:');
 readln(n);
 sum:=0;
 for i:=1 to n do 
  begin
   write('Vavedete chislo:');
   readln(x);
   sum:=sum+x;
  end;
 write('Sumata e ', sum);
 readln;
end.

Цикли без предварително зададен брой повторения[edit]

За разлика от for цикъла while и reapeat циклите не изискват предварително да се знае точно колко пъти трябва да се повтори цикъла. Това позволява например да се въвеждат данни от клавитурата до въвеждането на дадена дума или цифра, която прекратява цикъла.

repeat until[edit]

Repeat цикъла има следния синтаксис:

repeat
 <КОМАНДА>
until (<УСЛОВИЕ>);

Командите и условията между думите repeat (повтори) и until (докато) се повтарят докато условието след думата until на стане вярно. В следната програма ще дадем пример за програма, която избира едно произволно число между 1 и 10 и не прекратява действието си докато потребителя не познае, кое е числото. За да се направи такава програма е нужно да се използват командите randomize; и random(<ЧИСЛО>);, първата от които генерира произволни числа, а втората позволява да се присвои на дадена променлива произволно число, за което важи 0 <= X < ЧИСЛО и числото във скобите.

var chislo, opit:integer;
begin
 randomize;
 chislo:=random(10)+1;
 writeln('Za da izlezete ot programata natisnete 0!');
 writeln('Namislil sam si edno chislo mezhdu 1 i 10. Poznai koe!');
 repeat
  readln(opit);
  if (chislo=opit) then writeln('Pozna!')
  else writeln('Ne pozna! Opitai pak!');
 until ((chislo=opit) or (opit=0));
 writeln('Chao!');
 readln;
end.

while[edit]

Разликата между while и repeat циклите е, че при while цикъла той се изпълнява докато условието е изпълнено, а при repeat, докато то не се изпълни. За да се демонстрира този принцип следната програма е със същото условие като предходната, но е използван while цикъл. Забележете, че на променливата opit се задава стойност различна от тази на chislo, така че цикъла да се изпълни поне един път.

var chislo, opit:integer;
begin
 randomize;
 chislo:=random(10)+1;
 opit:=-1;
 writeln('Za da izlezete ot programata natisnete 0!');
 writeln('Namislil sam si edno chislo mezhdu 1 i 10. Poznai koe!');
 while not((chislo=opit) or (opit=0)) do
  begin
   readln(opit);
   if (chislo=opit) then writeln('Pozna!')
   else writeln('Ne pozna! Opitai pak!');
  end;
 writeln('Chao!');
 readln;
end.