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

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

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

у=

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

x
x=0
x<0
x>0

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

если х>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 вводятся с клавиатуры.

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

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

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

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

(Sin(x), если х<=a;

z= (Cos(x), если a<x<b;

(Tg(x), если x>=b.

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

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

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 правильных, то печатается "Вам надо отдохнуть!".

12. Cоставить программу для вычисления значения функции

Z=x3/y, где y=Sin(nx)+0.5.

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

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

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

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

9. Дано действительное число а. Вычислить 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в остальных случаях.

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

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

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

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

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

б)

г)
в)

Занятие 4. Оператор выбора 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: