Добавил 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.