uzluga.ru
добавить свой файл
1

Разветвляющиеся алгоритмы. Оператор условия If.



До сих пор Вы использовали линейные алгоритмы, т.е. алгоритмы, в которых все этапы решения задачи выполняются строго последовательно. Сегодня Вы познакомитесь с разветвляющимися алгоритмами.

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

Признаком разветвляющегося алгоритма является наличие операций проверки условия. Различают два вида условий - простые и составные.

Простым условием (отношением) называется выражение, составленное из двух арифметических выражений или двух текстовых величин (иначе их еще называют операндами), связанных одним из знаков:

  < - меньше, чем...
  > - больше, чем...
  <= - меньше, чем... или равно
  >= - больше, чем... или равно
  <> - не равно
  = - равно

Например, простыми отношениями являются следующие:

x-y>10; k<=sqr(c)+abs(a+b); 9<>11; ‘мама’<>‘папа’.

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

  • если х=25, у=3, то отношение x-y>10 будет верным, т.к. 25-3>10

  • если х=5, у=30, то отношение x-y>10 будет неверным, т.к. 5-30<10

Проверьте верность второго отношения при подстановке следующих значений:

  1. k=5, a=1, b=-3, c=-8

  2. k=65, a=10, b=-3, c=2

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

Примечание. Название “булевые” произошло от имени математика Джорджа Буля, разработавшего в XIX веке булевую логику и алгебру логики.

Определение. Переменная, которая может принимать одно из двух значений: True (правда) или False (ложь), называется булевой (логической) переменной. Например,

К:=True;
Flag:=False;
Second:=a+sqr(x)>t

Рассмотрим пример.

Задача. Вычислить значение модуля и квадратного корня из выражения (х-у).

Для решения этой задачи нужны уже знакомые нам стандартные функции нахождения квадратного корня - Sqr и модуля - Abs. Поэтому Вы уже можете записать следующие операторы присваивания:

Koren:=Sqrt(x-y);
Modul:=Abs(x-y).

В этом случае программа будет иметь вид:

Program Znachenia;
Uses Crt;
Var
  x, y : integer;
  Koren, Modul : real;
Begin
  ClrScr;
  write (‘Введите значения переменных х и у через пробел ‘);
  readln (x, y);
  Koren:=Sqrt(x-y);
  Modul:=Abs(x-y).
  write (‘Значение квадратного корня из выражения (х-у) равно ‘);
  write (‘Значение модуля выражения (х-у) равно ‘);
  readln;
End.

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

Поэтому наша программа имеет свою допустимую область исходных данных. Найдем эту область. Для этого запишем неравенство х-у>=0 и решив его получим х>=у. Значит, если пользователем нашей программы будут введены такие числа, что при подстановке значение этого неравенства будет равно True, то квадратный корень из выражения (х-у) извлечь можно. А если значение неравенства будет равно False, то выполнение программы закончится аварийно.

Задание. Наберите текст программы. Протестируйте программу со следующими значениями переменных и сделайте вывод.

  1. х=23, у=5;

  2. х=-5, у=15;

  3. х=8, у=8.

Каждая программа, насколько это возможно, должна осуществлять контроль за допустимостью величин, участвующих в вычислениях. Здесь мы сталкиваемся с разветвлением нашего алгоритма в зависимости от условия. Для реализации таких условных переходов в языке Паскаль используют операторы If и Else, а также оператор безусловного перехода Goto.

Рассмотрим оператор If.

Для нашей задачи нужно выполить следующий алгоритм:

если х>=у,
то вычислить значение квадратного корня,
иначе выдать на экран сообщение об ошибочном введении данных.

Запишем его с помощью оператора If. Это будет выглядеть так.

if x>=y
  then
    Koren:=Sqr(x-y)
  else
write (‘Введены недопустимые значения переменных‘);

Теперь в зависимости от введенных значений переменных х и у, условия могут выполняться или не выполняться.

В общем случае полная форма конструкции условного оператора имеет вид:

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

Условный оператор работает по следующему алгоритму.

Сначала вычисляется значение логического выражения, расположенного за служебным словом IF. Если его результат истина, выполняется <оператор 1>, расположенный после слова THEN, а действия после ELSE пропускаются; если результат ложь, то, наоборот, действия после слова THEN пропускаются, а после ELSE выполняется <оператор 2>.

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

Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin ... End называется составным оператором.

if <логическое выражение>
  then
    begin
      оператор 1;
      оператор 2;
      ...
    end
  else
    begin
      оператор 1;
      оператор 2;
      ...
    end;

Определение. Составной оператор - объединение нескольких операторов в одну группу. Группа операторов внутри составного оператора заключается в операторные скобки (begin-end).

begin
  оператор 1;
  оператор 2;
end;

С учетом полученных знаний преобразуем нашу программу.

Program Znachenia;
Uses Crt;
Var x, y : integer;
Koren, Modul : real;
Begin
  ClrScr;
  write (‘Введите значения переменных х и у через пробел ‘);
  read (x, y);
  if x>=y
    then
      begin
        Koren:=Sqr(x-y)
        Modul:=Abs(x-y)
        write (‘Значение квадратного корня из выражения (х-у) равно ‘);
        write (‘Значение модуля выражения (х-у) равно ‘);
      end
    else
      write (‘Введены недопустимые значения переменных‘);
  readln;
End.

Составным оператором является и такой оператор

begin
  S:=0;
end.

Cимвол “;” в данном случае разделяет оператор присваивания S:=0 и пустой оператор.

Пустой оператор не влечет никаких действий и в записи программы никак не обозначается.

Например, составной оператор

begin
end.

включает лишь один пустой оператор.

Если Вы обратили внимание, программа на языке Паскаль всегда содержит один составной оператор - раздел операторов программы.

Внимание! Перед служебным словом Else разделитель (точка с запятой) не ставится.

Отметим, что большинство операторов в программах на языке Паскаль заканчиваются точкой с запятой, но после некоторых операторов точка с запятой не ставится. Сформулируем общие правила употребления точки с запятой:

  1. Каждое описание переменной и определение константы заканчиваются точкой с запятой.

  2. Каждый оператор в теле программы завершается точкой с запятой, если сразу за ним не следуют зарезервированные слова End, Else, Until.

  3. После определенных зарезервированных слов, таких, как Then, Else, Var, Const, Begin, никогда не ставится точка с запятой.

Рассмотрим еще один пример.

Задача. Вывести на экран большее из двух данных чисел.

Program Example1;
Var x, y : integer; {вводимые числа}
Begin
  writeln(‘Введите 2 числа ‘); {вводим два целых числа через пробел}
  readln(x,y);
  if x>y
    then
      writeln (x) {если х больше y, то выводим х}
    else
      writeln (y) {иначе выводим y}
    readln;
End.

Можно также использовать и сокращенную (неполную) форму записи условного оператора. Эта форма используется тогда, когда в случае невыполнения условия ничего делать не надо.

Неполная форма условного оператора имеет следующий вид.

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

Тогда если выражение, расположенное за служебным словом IF. в результате дает истину, выполняются действия после слова THEN, в противном случае эти действия пропускаются.

Задача. Составить программу, которая, если введенное число отрицательное меняет его на противоположное.

Program Chisla;
Var
  x : integer; {вводимое число}
Begin
  writeln(‘Введите число ‘); {вводим целое число}
  readln(x);
  if x<0
    then
      x:=-x;
      writeln (x);
      readln;
End.
^

Выберите из предложенного ниже списка задачи для самостоятельного решения.


  1. Если целое число М делится нацело на целое число N, то вывести на экран частное от деления, в противном случае вывести сообщение М на N нацело не делится.

  2. Запишите условный оператор, в котором значение переменной с вычисляется по формуле a+b, если а - нечетное и a*b, если а - четное.

  3. Написать программу для подсчета суммы только положительных из трех данных чисел.

  4. Даны три числа. Написать программу для подсчета количества чисел, равных нулю.

  5. Напишите программу, упростив следующий фрагмент программы:
      if a>b then c:=1;
      if a>b then d:=2;
      if a<=b then c:=3;
      if a<=b then d:=4.

  6. Каким будет значение переменной а после выполнения операторов:
    a:=3;
    if a<4
      then
        begin
          Inc(a,2);
          Inc(a,3);
        end;

  7. Найти количество положительных (отрицательных) чисел среди четырех целых чисел A, B, C, D.

  8. Составьте программу, которая уменьшает первое введенное число в пять раз, если оно больше второго введенного числа по абсолютной величине.

  9. Для данного значения X вычислить значение функции, которая определяется следующим образом:
    Y=sin(x), если x >=1
    Y=cos(x), если x < 1

  10. Определить является ли введённое число чётным.

  11. Компьютер спрашивает: "Что сегодня нужно всем?" и если получает ответ ЭВМ, то пишет "Ну, конечно ЭВМ!", иначе "Это тоже нужно всем, но нужнее ЭВМ!"

  12. Написать программу, по которой компьютер приветствовал бы только своего хозяина, а при попытке ввести какое-либо другое имя спрашивал бы: "А где (например) Вася?"

  13. Написать программу, определяющую, есть ли в введенном числе дробная часть.

  14. Написать программу, рисующую круг в случае введения пользователем числа 1 и квадрат во всех других случаях.
^

Логический тип данных. Логические операции not, and, or. Нахождение значений логических выражений. Самостоятельная работа.



Переменные логического типа описываются посредством идентификатора ^ Boolean. Они могут принимать только два значения - False (ложь) и True (истина). Описываются они также в разделе описания переменных.

Var
  Flag : Boolean;

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

В языке Турбо Паскаль имеются логические операции, применяемые к переменным логического типа. Это операции not, and, or и хor. В этой теме Вы рассмотрите три логические операции. Обозначения и результаты этих операций приведены в таблице. Рассмотрите ее.

Операция not (не) имеет один операнд и образует его логическое отрицание. Результат операции not есть False, если операнд истинен, и True, если операнд имеет значение ложь. Так,

not True False (неправда есть ложь)

not False True (неложь есть правда)

Результат операции and (и) есть истина, только если оба ее операнда истинны, и ложь во всех других случаях.

Результат операции or (или) есть истина, если какой-либо из ее операндов истинен, и ложен только тогда, когда оба операнда ложны.

Задание. Попробуйте определить значение булевых операций для высказываний:

  1. Школьник на зимних каникулах остается дома или уезжает куда-либо отдыхать.

  2. Филипп Киркоров является певцом и комбайнером.

  3. Школьниками являются мальчики и девочки..

Логические операции, операции отношения и арифметические операции часто встречаются в одном выражении. При этом отношения, стоящие слева и справа от знака логической операции, должны быть заключены в скобки, поскольку логические операции имеют более высокий приоритет. Вообще принят следующий приоритет операций:

  • not

  • and, *, /, div, mod

  • or, +, -

  • операции отношения..

. Логическую операцию and еще называют логическим умножением, а логическую операцию or - логическим сложением.

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

A or B and not (A or B)

Сначала выполняется заключенная в скобки операция or, а затем операции not, and, or. Если подставить вместо переменных А и В значения True и False, то, используя уже рассмотренный порядок действий, получим значение всего выражения равное True.

Задание. Запишите в тетрадь и вычислите значения выражений при a=10, b=20, c=true, d=false:

  • (a>5) and (b>5) and (a<20) and (b<30);

  • not (a<15) or not (b<30);

  • c or d and (b=20);

Внимание! В языке Паскаль нет возможности ввода логических данных с помощью оператора read. Однако предусмотрен вывод значений переменных логического типа с помощью оператора write.

Например, после выполнения оператора write (5>2) на экран будет выведено True.
^

Самостоятельная работа


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

  1. Вычислите значения выражения:

а) sqr(x)+sqr(y)<=4 при x=0.3, y=-1.6;

б) k mod 7 = k div5-1 при k=15;

в) odd(trunc(10*p)) при p=0.182;

г) not odd(n) при n=0;

д) t and (p mod 3=0) при t=true, p=101010;

е) (x*y<>0) and (y>x) при x=2, y=1;

ж) (x*y<>0) or (y>x) при x=2, y=1;

з) a or (not b) при a=False, b=True;

  1. Записать на Паскале отношение, истинное при выполнении указанного условия и ложное в противном случае:

а) целое k делится на 7;

б) точка (х, у) лежит вне круга радиуса R с центром в точке (1,0);

в) натуральное число N является квадратом натурального числа;

г) 0
д) x=max(x,y,z);

е) хотя бы одна из логических переменных а и b имеет значение True;

ж) обе логические переменные а и b имеют значение True.

  1. Указать порядок выполнения операций при вычислении выражений:

а) a and b or not c and d;

б) (x>=0) or not c and d.

  1. Вычислить следующие выражения при a=True, b=False:

а) a or b and not a;

б) (a or b) and not a;

в) not a and b;

г) not (a and b)

  1. Записать на Паскале выражение, истинное при выполнении указанного условия и ложное в противном случае:

а) х принадлежит отрезку [0, 1];

б) х лежит вне отрезка [0, 1];

в)* х принадлежит отрезку [2, 5] или [-1, 1];

г)* х лежит вне отрезков [2, 5] и [-1, 1];

д) каждое из чисел х, у, z положительно;

ж) ни одно из чисел х, у, z не является положительным;

з) только одно из чисел х, у, z положительно;

и) логическая переменная а имеет значение True, логическая переменная b имеет значение False;

к)* год с порядковым номером у является високосным (год високосный, если его номер кратен 4, однако из кратных 100 високосными являются лишь кратные 400, например, 1700, 1800 и 1900 - невисокосные годы, 2000 - високосный).

  1. Нарисовать на плоскости (х,у) область, в которой и только в которой истинно указанное выражение:

а)* (y>=x) and (y+x>=0) and (y<=1);

б) (sqr(x)+sqr(y)<1) or (y>0) and (abs(x)<=1);

в) (trunc(y)=0 and (round(x)=0);

г)* (abs(x)<=1)>(abs(y)>=1);

д) (sqr(x)+sqr(y)<=4)=(y<=x).

  1. Имеется условный оператор:
    if d<>10
      then
        writeln (‘ура!’)
      else
        writeln (‘плохо...’);

Можно ли заменить его следующими операторами:

а) if d=10
      then
        writeln (‘ура!’)
      else
        writeln (‘плохо...’);

б) if not (d=10)
      then
        writeln (‘ура!’)
      else
        writeln (‘плохо...’);

 

 

в) if not (d=10)
      then
        writeln (‘плохо...’)
      else
        writeln (‘ура!’);

г) if not (d<>10)
      then
        writeln (‘плохо...’)
      else
        writeln (‘ура!’);

  1. Какими будут значения переменных j, k после выполнения условного оператора:
    if j>k
      then
        j:=k-2
      else
        dec (k,2);
    если исходные значения переменных равны:
      а) j=3, k=5;
      b) j=3, k=3;
      c) j=3, k=2.

Примечание. В результате выполнения оператора dec (k,2) значение переменной k уменьшается на 2.
^

Вложенные условные операторы. Решение задач.


При решении задач часто приходится рассматривать не два, а большее количество вариантов. Это можно реализовать, используя несколько условных операторов. В этом случае после служебных слов Then и Else записывается новый условный оператор. Рассмотрим пример.

Задача. Вычислить значение функции:



Для решения этой задачи рассмотрим координатную прямую, на которой отметим промежутки, на которые разбиваются все значения переменной х.



Начнем записывать условный оператор:

если х>0
  то
    вычислить у по формуле у=х-12
  иначе

Что же должно выполниться в случае иначе? На эту ветку оператора попадают все не положительные значения х. Если бы для этих чисел нужно было бы выполнить один и тот же оператор (или группу операторов), то проблемы бы не стояло. Но нам нужно этот промежуток разделить еще на две части (отрицательные и ноль), и для части выполнить свой оператор. Поэтому ветка Иначе будет содержать еще один условный оператор и наш вложенный условный оператор будет иметь вид:

если х>0
  то
    у вычислить по формуле у=х-12
  иначе
    если х=0
      то
        у вычислить по формуле у=5
      иначе
        у вычислить по формуле у=sqr(x);

Тогда фрагмент программы для решения этой задачи будет выглядеть так:

if х>0
  then
    у := х-12
  else
    if х=0
      then
        у := 5
      else
        у := sqr(x);

Итак, когда оператор if появляется внутри другого оператора if, они считаются вложенными. Такое вложение используется для уменьшения числа необходимых проверок. Этот метод часто обеспечивает большую эффективность, однако одновременно он уменьшает наглядность программы. Не рекомендуется использовать более одного-двух уровней вложения if. За вторым уровнем вложения становится трудно восстановить последовательность проверки условий каждым условным оператором.

Если часть else используется во вложенных if, то каждое else соответствует тому if, которое ему непосредственно предшествует. Таким образом, при определении последовательности выполнения фрагментов нет двусмысленности.

Рассмотрите еще один пример.

Задача. Даны целые числа a, b, c. Если a ≤ b ≤ c, то все числа заменить их квадратами, усли a>b>c, то каждое число заменить наибольшим из них, в противном случае сменить знак каждого числа.

Для решения этой задачи перепишем условие задачи следующим образом:

a:=a2, b:=b2, c:=c2, если a ≤ b ≤ c

b:=a, c:=a, если a>b>c

a:=-a, b:=-b, c:=-c, в остальных случаях

Программа для решения этой задачи представлена ниже.

Program Example3;
Var a, b, c : integer;
Begin
  writeln(‘Введите числа a, b, c’);
  readln(a,b,c);
  if (a<=b) and (b<=c)
    then
      begin
        a:=sqr(a);
        b:=sqr(b);
        c:=sqr(c);
      end
    else
      if (a>b) and (b>c)
        then
          begin
            b:=a;
             c:=a;
          end
        else
          begin
            a:=-a;
            b:=-b;
            c:=-c;
          end
  writeln(a,b,c);
  readln;
End.

Задание. Найдите в этой программе (если есть) условный оператор, вложенный условный оператор, составной оператор, булево условие.

Внимание! Подчеркнем еще раз один тонкий момент: поскольку каждый из операторов может быть оператором любого типа (в том числе и условным), и в то же время не каждый из "вложенных" условных операторов может иметь часть else, то возникает неоднозначность трактовки условий. Turbo-Pascal решает эту проблему таким радикальным способом: любая встретившаяся часть else соответствует ближайшей к ней части then.
^

I Выберите с учителем задачи для самостоятельного решения из предложенного списка:


  1. Найти наибольшее из трех данных чисел.

  2. Вывести на экран номер четверти, которой принадлежит точка с координатами (x,y), при условии, что (x<>0) и (y<>0).

  3. Даны три различных числа, найти среднее из них. Средним назовем число, которое больше наименьшего из данных чисел, но меньше наибольшего.

  4. Составьте программу нахождения произведения двух наибольших из трех введенных с клавиатуры чисел.

  5. Запросить стороны треугольника и определить, является ли он разносторонним, равнобедренным или равносторонним. Учесть условие : третья сторона не должна превышать сумму двух других, иначе треугольник не существует.

  6. Составьте программу для вычисления выражения

а) max (x+y+z,xyz)+3;
b) min (x2+y2,y2+z2)-4;

Значения переменных x, y, z вводятся с клавиатуры.

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

  2. Даны действительные числа a, b, c. Вычислить корни уравнения


  3. Найти минимальное из трёх чисел.

  4. Составить программу вычисления функции



  1. Предложите пользователю ввести число с клавиатуры. Если число равно нулю, выведите слово “ноль”; если число положительное, выведите слово “положительное”; если число отрицательное, выведите слово “отрицательное”.

  2. Напечатать программу вывода дней недели по номеру.
^

II Выберите с учителем задачи для самостоятельного решения из предложенного списка:


  1. Определить, попадает ли точка "A" с координатами (х,у) внутрь круга радиуса R. Центр круга совпадает с началом координат.

  2. Напишите программу "Угадай число". Компьютер "загадывает" число, а пользователь его отгадывает. ( random и постепенное угадывание)

  3. Найти сумму положительных чисел, больших 20, меньших 100 и кратных 3.

  4. Составьте программу для упорядочения трёх чисел a, b, c по возрастанию таким образом, чтобы имени а соответствовало наименьшее число, имени b- среднее, имени с - наибольшее.

  5. Запрограммируйте шуточный тест "Проверь свои возможности". Пользователю предлагается ответить на 7 вопросов:

1) Профессор лёг спать в 8 часов, а встал в 9 часов. Сколько часов проспал профессор? (1)
2) На двух руках 10 пальцев. Сколько пальцев на 10?(50)
3) Сколько цифр в дюжине?(2)
4) Сколько нужно сделать запилов, чтобы распилить бревно на 12 частей? (11)
5) Врач сделал три укола в интервале 30 минут. Сколько времени он затратил? (30)
6) Сколько цифр 9 в интервале 1 100? (1)
7) У пастуха было 30 овец. Все кроме одной разбежались. Сколько овец осталось? (1)
 Оценка ответов пользователя:
- если 7 правильных, то печатается "Гений";
- если 6 правильных, то печатается "Эрудит";
- если 5 правильных, то печатается "Нормальный";
- если 4 правильных, то печатается "Способности средние";
- если 3 правильных, то печатается "Способности ниже среднего";
- если <2 правильных, то печатается "Вам надо отдохнуть!".

  1. Cоставить программу для вычисления значения функции
    Z=x3/y, где y=Sin(nx)+0.5.

  2. Составьте программу для упорядочения трех чисел a, b,c по возрастанию таким образом, чтобы имени а соответствовало наименьшее число, имени b - среднее, имени c - наибольшее.

  3. Составить программу, которая запрашивает пароль и выводит сообщение правильно ли он введен.

  4. Напишите программу, которая преобразовывает римские числа в натуральные числа.
    Примечание. Римские числа могут состоять только из символов "X", "V" и "I". Наибольшее число которое может воспринять программа, – это XXXIX, т.е. 39.

  5. Дано действительное число а. Вычислить f(a), если

а) f(a)=х2 при -2<=х<2,
f(a)=4 в противном случае;
б) f(a)=х2+4х+5 при х<=2
f(a)=1/(х2+4х+5) в противном случае;
в) f(a)=0 при х<=0,
f(a)=х при 0<х<=1,
f(a)=х4 в остальных случаях;
г) f(a)=0 при х<=0,
f(a)=х2-х при 0<х<=1,

f(a)=х2-sinПх2 в остальных случаях.

  1. Даны действительные положительные числа a, b, c, d. Выяснить, можно ли прямоугольник со сторонами a и b уместить внутри прямоугольника со сторонами c и d так, чтобы каждая из сторон одного прямоугольника была

а) параллельна каждой стороне второго прямоугольника;

б) перпендикулярна каждой стороне второго прямоугольника.

  1. Даны действительные положительные числа a, b, c, х, у. Выяснить, пройдет ли кирпич с ребрами a, b, c в прямоугольное отверстие со сторонами х, у. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.

  2. Дано действительное число а. Для функций f(x), графики которых представлены на рисунках, вычислить f(a)








^

Оператор выбора CASE. Решение задач.


Ранее Вы познакомились с условным оператором If, который позволяет программе выполнять переходы на ту или иную ветвь по значению булева условия. Используя несколько операторов If, можно производить ветвление по последовательности условий. В приведенном фрагменте показано, как при помощи ряда операторов If можно преобразовать целое число (в диапазоне 0-9) к его словесному представлению:

if Ziphra = 0
  then
    write (‘Нуль‘);
      if Ziphra = 1
        then
          write (‘Единица‘);
            if Ziphra = 2
              then
               write (‘Два‘);

и т.д.

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

Оператор выбора позволяет выбрать одно из нескольких возможных продолжений программы. Параметром, по которому осуществляется выбор, служит так называемый ключ выбора (или селектор) - выражение любого типа (кроме типов REAL и STRING).

Общая форма записи следующая:

case выражение of
значение1 : оператор (группа операторов);
значение2 : оператор (группа операторов);
. . . . . . . . . . . . . . . . . . . . . .
значениеN : оператор (группа операторов)
else оператор (группа операторов);
end;

Оператор выбора работает следующим образом. Сначала вычисляется значение выражения, стоящее после зарезервированного слова case, а затем выполняется оператор (или составной оператор), соответствующий результату вычисления выражения.

Может случиться, что в списке выбора не окажется константы равной вычисленному значению ключа. В этом случае управление передается оператору, стоящему за словом ELSE.

Например,

case NUMBER mod 2 of
  0 : writeln (NUMBER, ‘- число четное‘)
else : writeln (NUMBER, ‘- число нечетное‘);
end;

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

case MONTH of
  1, 2, 3 : writeln (‘Первый квартал‘);
  4, 5, 6 : writeln (‘Второй квартал‘);
  7, 8, 9 : writeln (‘Третий квартал‘);
  10, 11, 12 : writeln (‘Четвёртый квартал‘);
end;

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

case CODE of
  1 : for i := 1 to 5 do
         writeln (‘*******‘);
  2 : begin {составной оператор}
         x:=sqr(y-1);
         writeln (x);
       end;
  3 : {пустой оператор}
       end;

Любому заданному значению селектора соответствует лишь один вход в списке операторов. Константы должны принадлежать тому же типу, что и селектор. Если селектор принимает значение, которому не соответствует ни один вход, то будет выполняться оператор, следующий за словом else. Если же этого оператора нет, то никакие альтернативы не будут выполняться.

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

case Chislo of
  0..9 : write (‘Это число является цифрой‘);

Посмотрите, в каких вариантах еще можно использовать оператор выбора при решении задачи.

Задача. Написать программу преобразования цифр в слова.

Program Number1;
Var
  a, b, c : integer;
Begin
  writeln(‘Введите цифру ‘);
  readln(a);
  if (a<0) or (a>9)
    then
      writeln (‘Это число не является цифрой‘)
    else
      case a of
        0 : writeln (‘ноль‘);
        1 : writeln (‘один‘);
        2 : writeln (‘два‘);
        3 : writeln (‘три‘);
        4 : writeln (‘четыре‘);
        5 : writeln (‘пять‘);
        6 : writeln (‘шесть‘);
        7 : writeln (‘семь‘);
        8 : writeln (‘восемь‘);
        9 : writeln (‘девять‘);
      end;
  readln;
End.




Program Number2;
Var
  a, b, c : integer;
Begin
  writeln(‘Введите цифру ‘);
  readln(a);
  case a of
    0 : writeln (‘ноль‘);
    1 : writeln (‘один‘);
    2 : writeln (‘два‘);
    3 : writeln (‘три‘);
    4 : writeln (‘четыре‘);
    5 : writeln (‘пять‘);
    6 : writeln (‘шесть‘);
    7 : writeln (‘семь‘);
    8 : writeln (‘восемь‘);
    9 : writeln (‘девять‘)
  else writeln (‘Это число не является цифрой‘);
  end;
  readln;
End.
^

Выберите с учителем задачи для самостоятельного решения.


  1. Написать алгоритм, позволяющий получить словесное наименование школьных оценок.

  2. Написать алгортм, классифицирующий треугольники (остроугольные, прямоугольные, тупоугольные), если даны углы.

  3. Написать алгоритм, который по номеру дня недели - целому числу от 1 до 7 выдавать в качестве результата количество уроков в классе в соответствующий день.

  4. Написать алгоритм нахождения числа дней в месяце, если даны: Номер месяца n - целое число а, равное 1 для високосного года и равное 0 в противном случае.

  5. По номеру дня недели вывести его название.

  6. В зависимости от того введена ли открытая скобка или закрытая, напечатать "открытая круглая скобка" или "закрытая фигурная скобка". (Учитывать круглые, квадратные, фигурные скобки).

  7. В зависимости от введённого символа L, S, V программа должна вычислять длину окружности; площадь круга; объём цилиндра.

  8. По введенному числу от 0 до 15 вывести название цвета, соответствующего этому коду.

  9. Определить, является ли введенная буква русского алфавита гласной.

  10. Написать программу, которая бы предлагала меню для вывода графических объектов, и рисовала бы соответствующий выбору.

  11. Придумайте шуточный тест с выдачей шуточных результатов.

  12. Напишите программу, которая по введенному числу из промежутка 0..24, определяет время суток.

  13. Напишите программу, которая по введенному номеру месяца високосного или невисокосного года, выводит количество дней в месяце.

  14. Вычислить значение функции по одной из формул:


  15. Придумайте программу на использование оператора выбора сase.
^

Оператор безусловного перехода GOTO. Решение задач.


В языке принят естественный порядок выполнения программы: последовательный. Рассмотренные выше операторы if и case осуществляют переход к выполнению соответствующего оператора в зависимости от выполнения условия или предложенного выбора. Однако в практике программирования задач возникает необходимость безусловного перехода для выполнения нужной последовательности операторов. Например, необходимо обойти участок программы, а вернуться к нему позже. Для этого предназначен оператор безусловного перехода, который имеет следующую форму записи:

  goto метка;

Метка представляет собою число без знака в диапазоне 1-9999 либо последовательность латинских букв и цифр.

Перед использованием метка должна быть объявлена в разделе описания меток, который срузу следует за разделом описания используемых модулей:

Uses
  Crt, Graph;
Label
  Metka1,
  Metka2;
Const
  P=3.14;
Var
  x : integer;

После описания метки ее можно использовать в программе. Метка записывается перед помечаемым оператором и отделяется от него двоеточием. А оператор goto должен помещен в то место программы, откуда выполняется переход. Оператор goto передает управление на оператор с заданной меткой. Оператор goto можно вставлять в любое место программы, где могут располагаться операторы языка. Например,

Begin
. . .
if Alpha = 360
  then
    goto Metka1
  else
    writeln (‘Эта фигура - не окружность‘);
. . .
  Metka1 : Arc(X,Y,0,Alpha,R);
. . .
End.

Приведём пример уже знакомой Вам программы, применив в ней оператор безусловного перехода.

Program Number2;
Label
  Metka;
Var
  a, b, c : integer;
Begin
  Metka : writeln(‘Введите цифру ‘);
  readln(a);
  case a of
    0 : writeln (‘ноль‘);
    1 : writeln (‘один‘);
    2 : writeln (‘два‘);
    3 : writeln (‘три‘);
    4 : writeln (‘четыре‘);
    5 : writeln (‘пять‘);
    6 : writeln (‘шесть‘);
    7 : writeln (‘семь‘);
    8 : writeln (‘восемь‘);
    9 : writeln (‘девять‘)
  else
    begin
      writeln (‘Это число не является цифрой‘);
      goto Metka;
    end;
  end;
  readln;
End.

Теперь в этой программе мы заставляем пользователя правильно ввести цифру. Сколько бы раз пользователь ни вводил числа не из промежутка 0..9, программа будет выдавать сообщение об ошибочном вводе и снова просить ввести цифру.

Задание. Наберите программу и протестируйте ее.

В простых программах этот оператор не вызывает затруднений. При написании сложных и объёмных программ могут быть затруднения, поэтому программисты стараются не использовать этот оператор. Возникает вопрос: где должен использоваться безусловный переход? На этот вопрос следует ответить - “нигде”. Любая программа, написанная с goto, может быть запрограммирована без этого оператора.

Следует ли вообще использовать оператор перехода? Ответить трудно. В основном применение оператора безусловного перехода оправдано в двух случаях: при преждевременном завершении цикла или программы. Но даже в этих случаях можно обойтись некоторой стандартной управляющей структурой.

Не будет ничего удивительного в том, что в Ваших программах не будет применяться безусловный переход. В общем случае рекомендуется избегать использования этого оператора для обеспечения лучшего понимания работы программы. Бесконтрольное применение оператора goto может усложнить программу настолько, что разобраться в ней будет невозможно. Поэтому программисты считают применение оператора безусловного перехода плохим стилем программирования.

Задание. Выберите произвольно из решенных Вами задач две и дополните их решение использованием оператора безусловного перехода goto.

^

Контрольная работа.


  1. Есть ли в следующих текстах пустые операторы? (Если есть, то отметьте в тетради под какими буквами.)

а) if x>0 then x:=2 else; y:=x+1;
б) if odd(k) then else k:=0;
в) begin x:=2; y:=5; end;
г) begin a:=true; ; b:=b or a end;
д) begin if x=0 then goto 1; y:=x; 1:end

  1. Если n=3, то какое значение будет иметь переменная f после выполнения следующего составного оператора? Запишите в тетрадь.

begin f:=1; i:=2;
1: if i>n then goto 9;
f:=f*i; i:=i+1; goto 1;
9: end

  1. 3) Найдите ошибки в программе, записав уже исправленную программу в тетрадь:
    Program Errors;
    Const L=18;
    Label 18,8;
    Var x, y:integer;
    Begin y:=0;
      8: read(x); if x<0 then goto L;
      y:=y+x; goto 18;
      L:writeln(y)
    End.

  2. Найти ошибки в следующих операторах, запишите исправленные операторы в тетрадь:

а) begin 77: if |x|<1 then goto 5
    begin x:=x/2; goto 77; 5: y:=sin(x) end
    end;
б) 34:if 0    then if y<1 then goto 34 else goto 15
    else 15: y:=sqr(y)
в) if 1    then
      x:=x+1; y:=0;
    else
      x:=0; y:=y+1;
г) if 1    then begin x:=x+1; y:=0 end;
    else begin x:=0; y:=y+1 end

  1. Запишите в тетрадь, какое значение будет иметь переменная z после выполнения операторов

z:=0
if x>0 then if y>0 then z:=1 else z:=2
при следующих значениях переменных х и у:
а) х=у=1; б) х=1, у=-1; в) х=-1, у=1.


Сдайте свою тетрадь на проверку учителю.

Творческое задание. Придумайте и решите задачу с применением графического режима, предлагая для выбора пользователю некоторое меню.
^

Для любознательных


Рассмотрим решение таких задач, в которых требуется выполнить группу операторов определенное количество раз.

Задача. Дано 10 вещественных чисел. Найти величину наибольшего из них.

Program Maximum;
Uses
  Crt;
Label
  Metka1;
Var
  Kolich : integer;
  Max,
  x : real;
Begin
  ClrScr;
  Kolich:=0;
  Max:=-32768;
  Metka1 : write (‘Введите число ‘);
  readln (x);
  if x>Max
    then
      Max:=x;
      Kolich:=Kolich+1;
      if Kolich<10
        then
        goto Metka1;
  writeln (‘Наибольшее число равно ‘,x);
  readln;
End.

Рассмотрим подробнее действие операторов. После очистки экрана (ClrScr) мы присвоим переменной Kolich, которая определена для подсчета введенных чисел, первоначальное значение равное нулю. Переменной Мах мы будем присваивать наибольшее значение из вводимых чисел. Так как переменная Мах типа integer, то присвоим ей первоначальное значение равное наименьшему из диапазона этого типа, т. е. числу -32768. Далее выделен целый блок. Он будет повторяться при запуске программы 10 раз, т.е. столько сколько чисел нам нужно запросить у пользователя и исследовать их. Просмотрим действие этого блока.

Сначала мы запрашиваем у пользователя первое число и считываем его в переменную х. Затем идет анализ этого числа. Если введенное число х оказалось больше числа, находящегося в переменной Мах, то происходит пере присваивание: переменной Мах присваиваем значение х. Итак, считано одно число, поэтому счетчик введенных чисел (Kolich) увеличиваем на 1. Проверяем условным оператором, может быть уже достаточно введено и проанализировано чисел? Если Kolich меньше 10, то еще недостаточно, а значит надо вернуться для того чтобы снова запросить и проанализировать следующее число, что и выполнено с помощью оператора goto.

Этот оператор не пропустит нас дальше выполнять программу пока не выполниться условие, при котором переменная Kolich будет равна 10. А такой момент обязательно наступит, потому что в результате выполнения блока переменная Kolich увеличивается на 1. В результате выделенный блок повториться 10 раз, будет запрошено 10 чисел и среди них постоянным сравнением с предыдущим числом будет выявлено наибольшее, которое будет содержаться в переменной Мах. После выхода из блока останется только вывести это число на экран.

Задание. Решите подобную задачу с использованием выше описанного метода.

  1. Дано n вещественных чисел. Определить, сколько среди них отрицательных.

  2. Дано n вещественных чисел. Определить, сколько среди них положительных чисел.

  3. Дано n вещественных чисел. Найти их сумму.

  4. Дано n вещественных чисел. Найти их среднее арифметическое.

  5. Дано n вещественных чисел. Определить сумму чисел, стоящих на четных местах в этой последовательности.

  6. Дано n вещественных чисел. Определить сумму положительных чисел.

  7. Дано n вещественных чисел. Определить сумму отрицательных чисел.

  8. * Дано целое k от 1 до 180. Определить, какая цифра находится в k-ой позиции последовательности 10111213...9899, в которой выписаны подряд все двузначные числа.

  9. * Дано натуральное k. Определить k-ую цифру в последовательности 110100100010000..., в которой выписаны подряд степени 10.

  10. * Вычислить с - наибольший общий делитель натуральных чисел а и b.

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

Дополнительно


Выберите с учителем задачу для решения.

  1. Написать программу для решения указанной задачи: для заданного числа а найти корень уравнения f(x)=0, где



  1. Дано число х. Напечатать в порядке возрастания числа x, 1+|x| и (1+х2).

  2. Даны числа a1, b1, c1, a2, b2, c2. Напечатать координаты точки пересечения прямых, описываемых уравнениями a1х+b1у=c1 и a2х+b2у=c2, либо сообщить, что прямые совпадают, не пересекаются или вовсе не существуют.

  3. Даны числа a, b и с (а≠0). Найти вещественные корни уравнения ах4+bx2+c=0. Если корней нет, сообщить об этом.

  4. Даны произвольные числа a, b и с. Если нельзя построить треугольник с такими длинами сторон, то напечатать 0, иначе напечатать соответствующее сообщение в зависимости от того, равносторонний это треугольник, равнобедренный или какой-либо иной.
^

Контрольные вопросы.


  1. Какой алгоритм называется разветвляющимся?

  2. Что такое ветвь алгоритма?

  3. Какое условие называется составным?

  4. Верно ли, что в качестве метки можно использовать любое положительное целое число?

  5. Обязательно ли описывать все метки, которыми помечены операторы программы?

  6. Верно ли, что в разделе меток все описываемые метки должны быть перечислены по возрастанию?

  7. Допустимы ли в Паскале следующие составные операторы?

  а) begin end;
  б) begin x:=0 end;
  в) begin; end

  1. Какое выражение называется булевым? Почему?

  2. Какая форма условного оператора называется полной? Краткой?

  3. Какие условные операторы называются вложенными? Как они применяются?

  4. Как применяется оператор выбора? Когда он особенно необходим?

  5. Для чего нужен оператор безусловного перехода? Почему он так называется?