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) Else write('не принадлежит') - student2.ru этот фрагмент программы соответствует блок-схеме, которая

показана на рисунке справа:

12) по схеме видим, что при Else write('не принадлежит') - student2.ru (первое условие ложно),
а также при Else write('не принадлежит') - student2.ru (второе условие ложно) программа
вообще не выдает никакого сообщения, то есть,
работает неправильно; таким образом, координаты любой точки, для которой Else write('не принадлежит') - student2.ru или Else write('не принадлежит') - student2.ru , могут быть указаны в ответе как пример
набора входных данных, при которых программа работает
неправильно

13) итак, первая часть ответа такова

примеры входных данных, на которых программа работает неверно:
(x=3.14, y=0.5) (неправильно определяет принадлежность точки области)
(x=0, y=2) или (x=-1, y=0)(не выдает вообще никакого сообщения)

14) остается исправить эту программу;
начнем с самого «лобового способа»: добавим в программу четвертый (вложенный) условный оператор, проверяющий условие Else write('не принадлежит') - student2.ru , и еще три блока 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 · проверяйте, все ли необходимые условия учтены в программе, это особенно актуально для немонотонных функций типа синуса или косинуса (немонотонные функции на некоторых участках возрастают при увеличении аргумента, а на некоторых – убывают); например, в этой задаче можно пропустить необходимость выполнения условия Else write('не принадлежит') - student2.ru · не перепутайте, где нужно использовать операцию and («И», одновременное выполнение условий), а где –or («ИЛИ», хотя бы одно условие) · нужно внимательно проверять, всегда ли программа выдает сообщение, если заданное условие не выполняется · часто бывает полезно нарисовать блок-схему алгоритма, которая позволяет увидеть ход выполнения программы при всех возможных вариантах · проверяйте, включает ли заданная область свои границы; если включает – в отношениях будут нестрогие неравенства (<=, >=), если не включает – строгие (<, >) · при оценке работы можно (при абсолютно правильном решении) потерять баллы из-за синтаксических ошибок в программе (скобки, точки с запятой, неправильное написание оператора и т.п.); не забывайте, что o в сложном условии все простые условия (отношения) нужно брать в скобки, так как в Паскале отношения при вычислении логического выражения имеют самый низкий приоритет o перед else точка с запятой никогда не ставится o в конце программы после последнего end ставится точка
За что снимают баллы: · неправильно определены входные данные, при которых исходная программа работает неверно · исправлены не все ошибки в программе, например, легко «просмотреть», что необходимо еще условие Else write('не принадлежит') - student2.ru · программа работает правильно в большем количестве случаев, чем исходная, но не для всех возможных исходных данных · перепутаны знаки < и >, логические операции or и and · неверно расставлены операторные скобки begin-end · синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов); чтобы получить 3 балла, нужно при абсолютно правильном решении сделать не более одной синтаксической ошибки; на 2 балла – до двух ошибок, на 1 балл – до трех ошибок

Задачи для тренировки[2]:

1) Требовалось написать программу, которая решает уравнение « Else write('не принадлежит') - student2.ru » относительно x для любых чисел a и b, введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно:

var a,b,x: real;

Begin

readln(a,b,x);

if a = 0 then

if b = 0 then

Write ('любое число')

Наши рекомендации