|
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 балл – до трех ошибок
|
[1] Далее при разборе задачи используется язык Паскаль, который наиболее распространен в школах России.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|