Сайт Koder.kz сайт для Delphi программистов.

koder.kz

Web or desctop App Developer

Написать

Добавил admin | Категория Pascal за 12 уроков, перевод | 19 Декабря 2013


В этом уроке мы с вами рассмотрим:

• оператор if

1 If..Then..Else 

2 Вложенные If

• цикл repeat – until

• цикл For

1 Вложенные циклы

• цикл while

Ну вот нам с вами и настало время узнать поближе важные правила программирования: if – условие, если, то, иначе. эта конструкция используется для сравнения, или условия. Конструкция может иметь полный и сокращенный вид.

Полный вид


If a < b then
	{work}
Else
	{worl else}

Сокращенный вид


If a < b then
{work}

Понимания этого оператора очень важно, так как он один из ключевых операторов во всех языках программирования.

Оператор If

Предположим что нам нужно сравнить две переменные, переменную «А» с переменной «В» и если переменная «А» больше переменной «В» сложить эти две переменные в переменную «С»

Код будет такой


If a > b then
	C := a + b ;

Давайте усложним задачу, скажем что если переменная «А» не больше переменной «В» тогда отнять «А» от «В» и получившийся результат сохранить в «С»

Код будет такой


If a > b then
	c := a + b
else
	c := a - b;

то есть, мы проверяем, если «А» больше «В» тогда складываем их, ну а если условие не выполняется (else) тогда отнимаем. 

Еще пример:


Program lesson4_Program1;
Uses Crt;
Label 1;
{this is used with a goto statement}
Var Sel : String;
	N1, N2, Total : Real;
	YN : Char; 
{this is a character variable type,
which holds single characters ONLY}
Begin
	1 : Clrscr;
	Total := 0; 
	{always initialise integer/real variables}
	GotoXy(4,3);
	Writeln('1.Addition');
	GotoXy(4,4);
	Writeln('2.Subtraction');
	GotoXy(4,5);
	Writeln('3.Exit');
	GotoXy(6,8);
	Write('Select: ');
	Sel := Readkey;
	If Sel = '1' {action} then
	Begin 
		{more than one statement}
		ClrScr; 
		Write('Input No.1:');
		Readln(N1); 
		Write('Input No.2:');
		Readln(N2);
		Total := N1 + N2;
		Writeln('Addition: ',N1:2:3,' + ',N2:2:3,' = ',Total:2:3);
		Write('Press any key to continue...');
		Readkey;
		Goto 1;{this leads back to the beginning of the program,
				otherwise the program terminates}
	End; 
	{Closing the if statement(begin)}
	If Sel = '2' then
	{note that the assignment statement
	is not used within an if statement}
	Begin
		ClrScr;
		Write('Input No.1:');
		Readln(N1);
		Write('Input No.2:');
		Readln(N2);
		Total := N1 - N2;
		Write('Subtraction: ');
		Write(N1:2:3,' - ',N2:2:3,' = ',Total:2:3);
		Write('Press any key to continue...');
		Readkey;
		Goto 1;
	End; 
	{Closing the if statement}
	If Sel = '3' then
	Begin
		ClrScr;
		Write('Are you sure?(Y/N)');
		YN := Readkey;
		If YN = 'y' then Halt; {1 action, so no need of Begin..End}
		If YN = 'n' then Goto 1; {the goto statement is not
		recommended for excessive use}
	End;
End.

В приведенном выше примере мы узнали, как можно использовать If. А так же могли заметить, что появился новый оператор – goto. Это оператор «метка», чем то похож на if. Он выполняет безусловный переход. Если рассматривать программу выше то

Если YN = 'n' то нужно перейти на Goto 1;

Программа вернется на If Sel = '3' then и продолжит выполнение с этого участка кода. Вообще не встречал людей, которые бы говорили лестно о goto. Куда не глянь все в один голос твердят, что его не нужно использовать, что его можно заменить циклом или условием, да, в каких то случаях действительно его заменить циклом можно и даже нужно. Но бывают случаи, когда без него просто не обойтись, на моей практики такой случай был всего лишь раз.

Давайте вернемся немного назад к нашем ifам.

Если использовать сокращенную форму оператора то как вы наверное уже догадались условие может и не выполнится. Если использовать полную форму оператора то при невыполнении условия сработает условие по ветки else

Давайте посмотрим на пример ниже


writeln('Who has discovered the land of America?');
Readln(ans);
If (ans = 'Christopher Colombus') then
	score := score + 1{if this is false,}
ELSE
	writeln('sorry, you''ve got it wrong!');{then this is true}

обратите пожалуйста внимание что строчка score := score + 1заканчивается без точки с запятой, это не ошибка. Когда мы используем ветку else мы не ставим у строки выше точки с запятой. Правила Паскаля. 

Вложенные If

В предыдущих листингах мы уже видели вложенные условия, давайте остановимся на них подробней


If Sel = '3' then
Begin
	ClrScr;
	Write('Are you sure?(Y/N)');
	YN := Readkey;
	If YN = 'y' then HALT; {Nested if statement}
	If YN = 'n' then Goto 1;{Another Nested if statement}
End;

Так что же такое вроженное условие? Вложенным оно называется если имеет выполняется внутри другого условия. 


If (this happens) then{if 1}
If (this happens) then {if 2}
(do this) etc...
Else (do this){if 2}
Else (do this) etc... {if 1}

Цикл Repeat-Until

Цикл Repeat-Until используется что бы повторить набор инструкций программы по крайней мере один раз. Его еще называют цикл с пост условием, пост потому что условие идет после набора инструкций цикла (программы). Цикл будет выполняться пока условие верно. Ниже показана модель этого цикла:


Repeat
	..(code)
	..(code)
	..(code)
Until conditional statement;

Ну и конечно пример


Uses Crt;
Var YN : String;
Begin
	Writeln('Y(YES) or N(NO)?');
	Repeat {repeat the code for at least one time}
	YN := Readkey ;
	If YN = 'y' then Halt; {Halt - exit}
	If YN = 'n' then Writeln('Why not? Exiting...');
	Delay(1800); { wait a second plus 800 milliseconds }
	Until (YN = 'y') OR (YN = 'n');
End.

Попробуйте выполнить его, все просто не правда ли? Подробнее об этом естественно ниже.

Цикл For

Цикл For является своего рода, повторение действий от и до. То есть нам заранее известно сколько раз должен выполниться этот цикл. Цикл так же может выполнять набор инструкций, для этого они должны быть заключены в операторные скобки(будет пример). Оригинальная конструкция


for {variable}* := {original value} to/downto {final value} do
	{code...(for one action)}- одно действие
for {variable}* := {original value} to/downto {final value} do 
Begin
	{code...}
	{code...}
End;

Ну и наконец пример (без циклов)


Program lesson4_Program2a;
Uses Crt;
Begin
	Writeln('for loop'); {somewhat boring writing all this!!!}
	Writeln('for loop');
	Writeln('for loop');
	Writeln('for loop');
	Writeln('for loop');
	Writeln('for loop');
	Writeln('for loop');
	Readln;
End.

То же самое в цикле For


Program lesson4_Program2b;
Uses Crt;
Var Counter : Integer; {loop counter declared as integer}
Begin
	For Counter := 1 to 7 do {it's easy and fast!}
		writeln('for loop');
	Readln;
End.

Стоит обратить внимание, что эти две программы выполняют одну и ту же функцию. Но написаны по разному. Естественно писать, так как показано в первом примере большое зло.

Пример для закрепления. Давайте выведем все коды таблицы ASCII без цикла это будет выглядеть так:


Program Program3a_lesson4;
Uses Crt;
Begin
	Gotoxy(25,5);Writeln('+');
	Gotoxy(25,6);Writeln('I');
	GotoXy(25,7);Writeln('I');
	GotoXy(25,8);Writeln('I');
	GotoXy(25,9);Writeln('I');
	GotoXy(25,10);Writeln('I');
	GotoXy(25,11);Writeln('+');
	GotoXy(26,11);Writeln('-');
	GotoXy(27,11);Writeln('-');
	GotoXy(28,11);Writeln('-');
	GotoXy(29,11);Writeln('-');
	GotoXy(30,11);Writeln('-');
	GotoXy(31,11);Writeln('-');
	GotoXy(32,5);Writeln('+');
	Gotoxy(32,6);writeln('I');
	GotoXy(32,7);Writeln('I');
	GotoXy(32,8);Writeln('I');
	GotoXy(32,9);Writeln('I');
	GotoXy(32,10);Writeln('I');
	GotoXy(32,5);Writeln('+');
	GotoXy(26,5);Writeln('-');
	GotoXy(27,5);Writeln('-');
	GotoXy(28,5);Writeln('-');
	GotoXy(29,5);Writeln('-');
	GotoXy(30,5);Writeln('-');
	GotoXy(31,5);Writeln('-');{oh my God!!! Phew!}
	Readln; { wait for user to read }
End.

А с циклом вот так


Program Program3b_lesson4;
Uses Crt;
Var Counter : Integer;{loop counter}
Begin
	For Counter := 1 to 5 do
	Begin
		gotoxy(25, 5 + Counter);
		Writeln('I');
	End;
	For Counter := 5 Downto 1 do
	Begin{an example of 'downto' instead of
		'to', note the 'gotoxy(_,_)'}
		gotoxy(32, 11 - Counter);
		Writeln('I');
	End;
	For Counter := 1 to 6 do
	Begin
		gotoxy(25 + Counter, 11);
		Writeln('-');
	End;
	For Counter := 6 Downto 1 do
	Begin
		gotoxy(32 - Counter, 5);
		Writeln('-');
	End;
{--------------The Corners(+)---------------}
	Gotoxy(25,5);
	Writeln('+');
	GotoXy(25,11);
	Writeln('+');
	GotoXy(32,5);
	Writeln('+');
	GotoXy(32,11);
	Writeln('+');
	GotoXy(45,7);
	Writeln('Just as simple as the for loop!!!');
	Readln;
End.

Они выполняют одни и те же действия, но писать как в первом примере не рекомендуется.

Вложенные циклы

Вложенные циклы мало чем отличаются от других вложенных операторов, к примеру If. Вложенный цикл имеет вид


for {loop counter} := {original value} to {final value} do {Begin-if required}
	{code if any..begin should be included (i.e more than one action)}
	for {loop counter} := {original value} to {final value} do {Begin-if required}
		{code..if more than one action, include begin in the second for loop}
	{End; - if begin is included in the second for loop)}
	{code if any..begin should be included in the first for loop}
	{End; - if begin is included in the first for loop)}

Вложенные циклы используются редко и затрудняют читаемость кода, хотя для работы с многомерными массивами они просто необходимы. В некоторых математических операциях без них тоже не обойтись. 

Цикл While-Do

Цикл выполняется пока условие истинна. Главное отличие его от repeat-until это то что цикл не выполниться ни разу если условие лож. А как мы помним repeat-until выполниться. Работает While-Do следующим образом 


While  do the following:
	instruction 1;
	instruction 2;
	instruction 3;
	etc...
End; {If while-do loop starts with a begin statement}

Ну и конечно пример программы


Program Lesson4_Program4;
Var Ch : Char;
Begin
	Writeln('Press ''q'' to exit...');
	Ch := Readkey;
	While Ch <> 'q' do
	Begin
		Writeln('I told you press ''q'' to exit!!');
		Ch := Readkey;
	End;
End.