Else write('не принадлежит')
10) судя по записи «лесенкой», else относится к самому первому оператору if, однако в самом деле это не так; перед словом else нет end, поэтому ищем ближайший if: это самый внутренний оператор, правильная запись «лесенкой» выглядит так:
if y <= 1 then
if x >= 0 then
if y >= sin(x) then
Write('принадлежит')
Else write('не принадлежит')
11) этот фрагмент программы соответствует блок-схеме, которая
показана на рисунке справа:
12) по схеме видим, что при (первое условие ложно),
а также при (второе условие ложно) программа
вообще не выдает никакого сообщения, то есть,
работает неправильно; таким образом, координаты любой точки, для которой или , могут быть указаны в ответе как пример
набора входных данных, при которых программа работает
неправильно
13) итак, первая часть ответа такова
примеры входных данных, на которых программа работает неверно:
(x=3.14, y=0.5) (неправильно определяет принадлежность точки области)
(x=0, y=2) или (x=-1, y=0)(не выдает вообще никакого сообщения)
14) остается исправить эту программу;
начнем с самого «лобового способа»: добавим в программу четвертый (вложенный) условный оператор, проверяющий условие , и еще три блока else, чтобы выводить строку «не принадлежит» в том случае, когда хотя бы один из них не сработал:
if x <= pi/2 then
if y <= 1 then
if x >= 0 then
if y >= sin(x) then
Write('принадлежит')
Else write('не принадлежит')
Else write('не принадлежит')
Else write('не принадлежит')
else write('не принадлежит');
обратите внимание, что точка с запятой есть только после самого последнего оператора write, так как остальные стоят перед ключевым словом else, перед которым точка с запятой не ставится
15) хотя приведенный выше метод дает работоспособную программу, она получается слишком длинная и некрасивая для такой простой задачи; достаточно сказать, что оператор
write('не принадлежит')повторяется в тексте 4 раза
16) более элегантное решение формулируется на словах так: «точка принадлежит области, если выполняются одновременно 4 приведенных выше условия, а иначе – не принадлежит»; а вот реализация на Паскале (приведем программу-ответ целиком):
var x,y: real;
Begin
readln(x,y);
if (x >= 0) and (x <= pi/2) and
(y <= 1) and (y >= sin(x)) then
Write('принадлежит')
else write('не принадлежит');
End.
здесь использовано сложное условие, в котором 4 отношения связаны операциями and («И», требуется одновременное выполнение всех условий)
Возможные проблемы: · как правило, в этой задаче требуется использовать знания из курса математики (решение уравнений, графики функций, область допустимых значений, составление уравнений прямой по приведенному графику) · как показывает анализ опубликованных задач этого типа, нужно уметь, прежде всего, разбираться в серии вложенных условных операторов в полной и неполной форме · неправильная «лесенка» в записи сбивает с толку и подталкивает к неверному решению; чтобы разобраться в программе, лучше на черновике построить блок-схему алгоритма и правильную «лесенку» · чтобы не запутаться, к какому оператору относится else, используйте следующее правило: o если перед else нет слова end, нужно искать ближайший сверху условный оператор if o если перед else стоит end (конец блока), нужно искать парный ему begin (начало блока) и соответствующий условный оператор if ... then begin · проверяйте, все ли необходимые условия учтены в программе, это особенно актуально для немонотонных функций типа синуса или косинуса (немонотонные функции на некоторых участках возрастают при увеличении аргумента, а на некоторых – убывают); например, в этой задаче можно пропустить необходимость выполнения условия · не перепутайте, где нужно использовать операцию and («И», одновременное выполнение условий), а где –or («ИЛИ», хотя бы одно условие) · нужно внимательно проверять, всегда ли программа выдает сообщение, если заданное условие не выполняется · часто бывает полезно нарисовать блок-схему алгоритма, которая позволяет увидеть ход выполнения программы при всех возможных вариантах · проверяйте, включает ли заданная область свои границы; если включает – в отношениях будут нестрогие неравенства (<=, >=), если не включает – строгие (<, >) · при оценке работы можно (при абсолютно правильном решении) потерять баллы из-за синтаксических ошибок в программе (скобки, точки с запятой, неправильное написание оператора и т.п.); не забывайте, что o в сложном условии все простые условия (отношения) нужно брать в скобки, так как в Паскале отношения при вычислении логического выражения имеют самый низкий приоритет o перед else точка с запятой никогда не ставится o в конце программы после последнего end ставится точка |
За что снимают баллы: · неправильно определены входные данные, при которых исходная программа работает неверно · исправлены не все ошибки в программе, например, легко «просмотреть», что необходимо еще условие · программа работает правильно в большем количестве случаев, чем исходная, но не для всех возможных исходных данных · перепутаны знаки < и >, логические операции or и and · неверно расставлены операторные скобки begin-end · синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов); чтобы получить 3 балла, нужно при абсолютно правильном решении сделать не более одной синтаксической ошибки; на 2 балла – до двух ошибок, на 1 балл – до трех ошибок |
Задачи для тренировки[2]:
1) Требовалось написать программу, которая решает уравнение « » относительно x для любых чисел a и b, введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно:
var a,b,x: real;
Begin
readln(a,b,x);
if a = 0 then
if b = 0 then
Write ('любое число')