Назад Домой! Дальше Лекция 2. Условные операторы: IF, CASE. Составной оператор. Оператор перехода goto


Операторы:
Условный оператор IF IF - сокращенная форма Составной оператор
CASE - оператор выбора из нескольких вариантов goto - оператор перехода Оператор присваивания
Оператор цикла: while Оператор цикла: repeat Оператор цикла: for
Оператор над записями и объектами: with Пустой оператор  

Условный оператор IF

Изучив этот оператор мы сможем усовершенствовать нашу 1-ю программу.
Напомню, что программа не могла работать при отрицательном значении дискриминанта
b2 - 4*a*c.

Синтаксис полного оператора IF:

-------------
if  <выражение логического типа>
  then  <оператор 1> {здесь без ;}
  else  <оператор 2>;
------------
  где <оператор 1> и <оператор 2> - ЛЮБОЙ ОПЕРАТОР 
  но ТОЛЬКО ОДИН. 

Составной оператор

  Если Вам нужно поставить вместо 
  <оператор 1> или <оператор 2> НЕСКОЛЬКО операторов,
  используйте СОСТАВНОЙ оператор, т е 
  begin <оператор>; ... <оператор>; end;
   - который формально считается ОДНИМ оператором!  
------------

Оператор IF выполняется так:

  1. Вычисляется значение логического выражения. Получаем true или false и ничего другого быть не может.
  2. Если получилось true, то выполняется ОПЕРАТОР 1, затем - операторы, расположенные правее точки с запятой, то есть выполнение оператора заканчивается и выполняются следуюшие операторы.
    Вообще, операторы программы выполняются по порядку (слева-направо, сверху вниз - по тексту, пока не встретится оператор вроде IF, goto и т п).
  3. Если получилось false, то выполняется ОПЕРАТОР 2 (оператор 1 не выполняется), затем - операторы, расположенные правее точки с запятой.

Оператор IF может иметь сокращенную форму. Её синтаксис:

-------------
if  <выражение логического типа>
  then  <оператор 1>;
------------

Такой IF выполняется так:
  1. Вычисляется значение логического выражения. Получаем true или false и ничего другого быть не может.
  2. Если получилось true, то выполняется ОПЕРАТОР 1, затем - операторы, расположенные правее точки с запятой, то есть выполнение оператора заканчивается и выполняются следуюшие операторы.
  3. Если получилось false, то выполняются операторы, расположенные правее точки с запятой. (оператор 1 не выполняется)

Теперь можно сделать программу-2, которая тоже решает квадратное уравнение, но вычисляет корни при любых (вещественных) исходных данных. Программа-2 описана здесь: ( используется оператор IF).


Оператор case

- мощное средство выбора альтернатив.Синтаксис оператора:
case <выражение логического типа> of
<мишень1>:<оператор1>;
<мишень2>:<оператор2>;
<мишень3>:<оператор3>;
<мишень4>:<оператор4>;
 . . .
[ else
 <операторы> ]
end; 
(Квадратные скобки обозначают необязательность)
Состоит из выражения (селектора) и списков операторов, каждому из которых предшествует "мишень" того же типа, что и селектор. Это значит, что в данный момент выполняется тот оператор, "мишень" перед которым соответствует текущему значению селектора. Если совпадения значений не происходит, то не выполняется ни один из операторов, входящих в case или же выполняются операторы, стоящие после необязательного слова else, (если они есть).

"Мишень" состоит из любого количества констант или поддиапазонов, разделенных запятыми, за которым следует двоеточие (:), например:

var BSt: char; os,curlens, herons,
    egrets, terns,rr: word;
begin
 write('simv -> ');
 readln(BSt);
case BSt of
'k'..'m': terns:= 21;
'o'..'p','r'..'s': Os := Os + 1;
'C', 'c': Curlens := Curlens + 1;
'H', 'h': Herons := Herons + 1;
'E', 'e': Egrets := Egrets + 1;
'T', 't': Terns := Terns + 1;
  else
  RR := 0;
  RR := RR+1;
  RR := RR + 1;
 readln;
end; {case}
end.

Поддиапазон записывается в виде двух констант, разделенных двумя точками "..". Тип константы должен соответствовать типу селектора. Оператор (только ОДИН! Иначе используйте СОСТАВНОЙ оператор), стоящий после двоеточия (:), выполняется в том случае, если значение селектора совпадает со значением константы или, если его значение попадает в диапазон значений. Если более одной мишени соответствуют значению селектора, выполняется оператор только первой (по порядку)из них.


Оператор goto (пишется слитно)

Оператор goto уже упоминался в лекции 1. Рассмотрим его подробнее.
Оператор goto вызывает передачу управления оператору, которому предшествует метка, указанная в данном операторе goto.

При использовании оператора перехода должны соблюдаться следующие правила:

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

- Переход извне внутрь структурного оператора (например, внутрь оператора case, if, оператора цикла)(то есть переход на более глубокий уровень вложенности) может вызвать непредсказуемые эффекты, хотя компилятор не выдает сообщения об ошибке.

Пример - вводим символы с клавиатуры. Программа подсчитывает - сколько введено заглавных латинских гласных, сколько цифр, сколько двоеточий. goto используется для многократного повторения действий. :

Program Scet_simv;
var sim: char; Sk_glasn, Sk_cifr, sk_dvtc: Integer;
label idi_suda;
begin 
Sk_glasn:=0;  Sk_cifr:=0;  sk_dvtc:=0; 
idi_suda: write('Введите символ (~ -выход)--> ');
readln(sim);
case sim of
'A','E','I','O','U': inc(Sk_glasn);
'0'..'9': inc(Sk_cifr);
':': inc(sk_dvtc);
end;
writeln('Гласных: ',Sk_glasn,' Цифр: ',Sk_cifr,' : ',sk_dvtc);
if sim <> '~' then goto idi_suda;
end.

Примечания:
1.Рекомендуется инициализировать переменные, не надеясь что компьютер это сделает сам.
2.Процедура inc(X) соответствует X:=X+1; а inc(X,N) соответствует X:=X+N;.

Задания по этой теме.

Задания можно найти в справочнике-задачнике. Щелкните "Задания", Задание 2: Ветвящиеся алгоритмы, операторы if и case.

При выполнении имейте в виду следующее:

Пример программы:

Program Lab12_2;
 {Тренируемся использовать оператор case , а также
  прочитывать нажатия клавиш ( без эхо-повтора )}
uses crt; {Чтобы использовать readkey, textattr, sound, nosound,
           delay, clrscr} 
var ch1,ch2: char;
BEGIN ch1 := #0; ch2 := #0;
 { цикл чтения нажатий клавиш до тех пор, пока не нажмут Esc (код 27) }
textattr := $1b; clrscr;
writeln('Программа реагирует на клавиши:');
writeln(' F1   F2   a    s    d  Выход - Esc. ');
writeln(' попробуйте...');

 while ch1 <> #27 do
  begin ch1 := readkey; 
   {Нажатие клавиши прочтено. ( Для спец. клавиш требуется
    прочесть 2 символа, первый из которых = #0 )Cм. об этом в документации
    для программиста, приложение В, расширенные коды клавишей.}

     if ch1 = #0 then
        ch2 := readkey;

    {Теперь можно для любой клавиши задать какое-нибудь действие.
    Для букв a,s,d - зададам звуки частотой 800, 1000, 1200 Гц.
    - по 0,03 сек звучания.}

   case ch1 of
   #0: case ch2 of
       #59{F1}: begin textattr := $1B;clrscr;
               gotoxy(30,12); write('Нажата F1');end;
       #60{F2}: begin textattr := $30;clrscr;
              gotoxy(30,12); write('Нажата F2');end;
       end {case ch2};
   'a': begin sound(800); delay(30); nosound; end;
   's': begin sound(1000); delay(30); nosound; end;
   'd': begin sound(1200); delay(30); nosound; end;
  end {case ch1};
 end {while};
textattr := $70; clrscr;
END {Программы}.

Примечания:
Опробована в Турбо-7, работает, только нет звука (на современных компьютерах. На старых AT286 звук нормальный ). Программа работает во Free Pascal, но издаёт только системный звук beep, то есть высота и длительность не регулируется. В Инете появлялся модуль CRT для Делфи, но я его не пробовал.

Назад Дальше

Rambler's Top100
Hosted by uCoz