Тема : Исправление ошибок в простой программе с условными операторами




Скачати 240.13 Kb.
НазваТема : Исправление ошибок в простой программе с условными операторами
Сторінка1/3
Дата конвертації27.10.2013
Розмір240.13 Kb.
ТипДокументы
mir.zavantag.com > Астрономия > Документы
  1   2   3

© К. Поляков, 2009-2010

C1 (повышенный уровень, время – 10 мин)


Тема: Исправление ошибок в простой программе с условными операторами.

Что нужно знать:

  • правила построения программы на Паскале1, Бэйсике или Си

  • правила работы с переменными (объявление, ввод, вывод, оператор присваивания)

  • ветвление – это выбор одного из двух возможных вариантов действий в зависимости от того, выполняется ли некоторое условие;

  • на блок-схеме алгоритма ветвление изображается в виде блока-ромба с одним входом и двумя выходами:



  • если условие, записанное внутри ромба, истинно (ответ «да» на вопрос «a=b?»), выполняются все команды, входящие в блок-1 (ветка «да»), иначе (если условие ложно) выполняются все команды в блоке-2 (ветка «нет»)

  • в неполной форме условного оператора блок-2 пустой (отсутствует); теоретически можно сделать наоборот – так, чтобы блок-1 оказался пустой, но это очень неграмотное решение, поскольку оно осложняет понимание алгоритма, запутывает его

  • одна команда ветвления может находиться внутри другой, например, так:



  • на этой схеме блок-10 выполняется, когда a=b; блок-11 – когда a=b=c, блок-21 – когда a=b, но ac и, наконец, блок-2 – когда ab

  • на этой схеме (Рисунок 3) одна команда ветвления (с условием «a=c») вложена в другую (с условием «a=b»), каждая из них – это ветвление в полной форме; если блок-12 будет пустой (отсутствует), внутреннее ветвление имеет неполную форму; аналогично, если блок-2 пустой, то внешнее ветвление имеет неполную форму

  • условный оператор if–else служит для организации ветвления в программе на языке Паскаль

  • условный оператор может иметь полную или неполную форму; вот фрагменты программы, реализующие ветвления, показанные на рисунках 1 и 2:

полная форма:

неполная форма:

if a = b then begin

{ блок-1 }

end

else begin

{ блок-2 }

end;

if a = b then begin

{ блок-1 }

end;

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

  • обычно при записи программы операторы, находящиеся внутри обоих блоков, сдвигают вправо на 2-3 символа (запись «лесенкой»), это позволяет сразу видеть начало и конец блока (конечно, если «лесенка» сделана правильно)

  • после else не надо (нельзя!) ставить какое-то условие, эта часть выполняется тогда, когда условие после if неверно (частая ошибка – после else пытаются написать условие, обратное тому, которое стоит после соответствующего ему if)

  • в Паскале перед else не ставится точка с запятой, поскольку это ключевое слово обозначает не начало нового оператора, а вторую часть условного оператора if–else

  • слова begin и end (их называют также «операторные скобки») ограничивают блок-1 и блок-2; если внутри блока всего один оператор, эти «скобки» можно не писать, например, допустимы такие операторы

    if a = b then

    c:=1

    else c:=0;

    if a = b then begin

    c:=1;

    end

    else c:=0;

    if a = b then c:=1;

  • а вот такие операторы недопустимы

if a = b then begin

c:=1

else c:=0;

if a = b then

c:=1;

end

else c:=0;

if a = b then

c:=1;

d:=1;

else x:=1;

  • в первом случае есть begin, но забыли про соответствующий ему end;

  • во втором фрагменте наоборот, есть end, а begin отсутствует;


  • if a = b then begin

    c:=1;

    d:=1;

    end

    else x:=1;
    третий случай более сложный: судя по записи «лесенкой», здесь внутри блока-1 находятся 2 оператора, а операторных скобок begin-end нет; в результате получилось, что оператор c:=1 находится внутри блока-1, он выполняется только при условии a=b;
    оператор d:=1 выполняется всегда, после того, как условный оператор закончил работу; а else вообще «висит» непонятно как, тут транслятор выдаст ошибку; исправить эту программу можно так, как показано справа (добавив пару begin-end):

  • условный оператор может находиться внутри другого условного оператора, как в блоке-1, так и в блоке-2; например, схема на Рисунке 3 может быть записана на Паскале так:

    if a = b then begin


    if a = c then begin

    { блок-11 }

    end

    else begin

    { блок-12 }

    end;

    { блок-10 }

    if a = c then begin

    { блок-11 }

    end

    else begin

    { блок-12 }

    end;

    end

    else begin

    { блок-2 }

    end;

  • ключевая тема этого задания ЕГЭ – использование вложенных условных операторов, причем в тексте задания фрагмент программы обычно записан без отступов «лесенкой» или с неправильными отступами, например, так:

if a = b then begin

if a = c then

c:=1;

end

else c:=0;

if a = b then

if a = c then

c:=1

else c:=0;

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

рассмотрим фрагмент слева, в нем перед else стоит end, поэтому для нужно найти соответствующий ему begin; таким образом определяем, что else относится к первому (внешнему) условному оператору

в правом фрагменте перед else нет end, поэтому он относится к ближайшему по тексту внутреннему условному оператору

блок-схемы для двух фрагментов показаны ниже, желтым цветом выделен «переехавший» блок:




  • в условных операторах можно использовать сложные условия, которые строятся из простых отношений (<, <=, >, >=, =, <>) с помощью логических операций not («НЕ», отрицание), and («И», одновременное выполнение двух условий) и or («ИЛИ», выполнение хотя бы одного из двух условий)

  • в сложном условии сначала выполняются действия в скобках, потом – not, затем – and, затем – or и, наконец, отношения;
    операции равного уровня (приоритета) выполняются последовательно слева направо

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

    if (a = b) or (b < c) and (c <> d) then begin

    ...

    end;

  • в приведенном выше примере сначала определяются результаты сравнения (выражения в скобках), затем выполняется операция and («И»), а затем – or («ИЛИ»)
^

Пример задания:


Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно. Вот она:

var x,y: real;

begin

readln(x,y);

if y <= 1 then

if x >= 0 then

if y >= sin(x) then

write('принадлежит')

else write('не принадлежит')

end.

Последовательно выполните следующее: 1) Приведите пример таких чисел x, y, при которых программа неверно решает поставленную задачу. 2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы) .

Решение:

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

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

  • справа от оси , что равносильно условию (с учетом границы здесь и далее получаем нестрогие неравенства)

  • слева от первого максимума функции ; из математики мы знаем, что эта функция достигает максимума при , поэтому получаем второе условие

  1. заштрихованная область ограничена с двух сторон по координате : она находится

  • ниже линии , откуда следует третье условие

  • выше линии , что дает четвертое условие

  1. итак, точка находится в заданной области, если все эти четыре условия выполняются одновременно; можно предположить, что в программе нужно использовать четыре вложенных условных оператора или один условный оператор, в котором четыре простых условия (отношения , , и ) связаны с помощью логической операции and («И», одновременное выполнение всех условий)

  2. теперь смотрим на программу: здесь три (а не четыре!) вложенных условных оператора с простыми отношениями, поэтому явно какое-то условие не учтено; легко найти, что «забыли» условие

  3. оператор write('принадлежит') помещен внутрь всех трех условных операторов, то есть, он выполнится тогда, когда три (а не четыре!) условия истинны;

  4. отметим на рисунке область, где выполняются все нужные условия, кроме (красная зона);

  5. для всех точек, которые находятся в «красной» зоне программа выдаст сообщение «принадлежит», хотя в самом деле эти точки не принадлежит заданной области; одна из таких точек имеет координаты

  6. теперь выясним, когда программа выдает сообщение «не принадлежит»

if y <= 1 then

if x >= 0 then

if y >= sin(x) then

write('принадлежит')

else write('не принадлежит')

  1. судя по записи «лесенкой», else относится к самому первому оператору if, однако в самом деле это не так; перед словом else нет end, поэтому ищем ближайший if: это самый внутренний оператор, правильная запись «лесенкой» выглядит так:

if y <= 1 then

if x >= 0 then

if y >= sin(x) then

write('принадлежит')

else write('не принадлежит')

  1. этот фрагмент программы соответствует блок-схеме, которая

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

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

  3. итак, первая часть ответа такова

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

  1. остается исправить эту программу;
    начнем с самого «лобового способа»: добавим в программу четвертый (вложенный) условный оператор, проверяющий условие , и еще три блока 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, перед которым точка с запятой не ставится

  1. хотя приведенный выше метод дает работоспособную программу, она получается слишком длинная и некрасивая для такой простой задачи; достаточно сказать, что оператор
    write('не принадлежит') повторяется в тексте 4 раза

  2. более элегантное решение формулируется на словах так: «точка принадлежит области, если выполняются одновременно 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, используйте следующее правило:

  • если перед else нет слова end, нужно искать ближайший сверху условный оператор if

  • если перед else стоит end (конец блока), нужно искать парный ему begin (начало блока) и соответствующий условный оператор if ... then begin

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

    • не перепутайте, где нужно использовать операцию and («И», одновременное выполнение условий), а где – or («ИЛИ», хотя бы одно условие)

    • нужно внимательно проверять, всегда ли программа выдает сообщение, если заданное условие не выполняется

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

    • проверяйте, включает ли заданная область свои границы; если включает – в отношениях будут нестрогие неравенства (<=, >=), если не включает – строгие (<, >)

    • при оценке работы можно (при абсолютно правильном решении) потерять баллы из-за синтаксических ошибок в программе (скобки, точки с запятой, неправильное написание оператора и т.п.); не забывайте, что

  • в сложном условии все простые условия (отношения) нужно брать в скобки, так как в Паскале отношения при вычислении логического выражения имеют самый низкий приоритет

  • перед else точка с запятой никогда не ставится

  • в конце программы после последнего end ставится точка




За что снимают баллы:

    • неправильно определены входные данные, при которых исходная программа работает неверно

    • исправлены не все ошибки в программе, например, легко «просмотреть», что необходимо еще условие

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

    • перепутаны знаки < и >, логические операции or и and

    • неверно расставлены операторные скобки begin-end

    • синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов); чтобы получить 3 балла, нужно при абсолютно правильном решении сделать не более одной синтаксической ошибки; на 2 балла – до двух ошибок, на 1 балл – до трех ошибок
  1   2   3

Схожі:

Тема : Исправление ошибок в простой программе с условными операторами iconОлдос Хаксли знаменитый писатель, классик английской литературы XX...
«О дивный новый мир», созданный Олдосом Хаксли в 1932 году и по праву занимающий место в одном ряду с такими литературными шедеврами...
Тема : Исправление ошибок в простой программе с условными операторами iconСекреты уверенности в себе
Разметка + чистка (с) Jagget; 6 9 редактирование структуры, исправление найденных ошибок, добавлены аннотация и обложка, скрипт "Генеральная...
Тема : Исправление ошибок в простой программе с условными операторами icon1. 1 — создание fb2-файла: Peter Blood, 2005 2 — генеральная уборка,...
Кристофер Прист — молодой английский писатель-фантаст, впервые издающийся на русском языке
Тема : Исправление ошибок в простой программе с условными операторами icon1. 1 исправление ошибок форматирования (naulik)
Предпринимателю часто сложно понять, как расставить приоритеты, каких привлекать клиентов, как нанимать правильных сотрудников. В...
Тема : Исправление ошибок в простой программе с условными операторами iconV 0 V 0 – исправление мелких ошибок – NickNem
Расследовать преступление берется детектив Рой Грейс, который подобные исчезновения принимает как личный вызов – когда-то при невыясненных...
Тема : Исправление ошибок в простой программе с условными операторами icon1 вычитка, исправление ошибок, добавление новых notes (Consul)
Св. Софией в Константинополе. О терроризме и сопротивлении, о гетто и катакомбной католической Церкви повествует роман, который может...
Тема : Исправление ошибок в простой программе с условными операторами iconДжон Ирвинг Мир глазами Гарпа
Сам автор точнее всего определил отношение будущих читателей к книге: «Она, возможно, вызовет порой улыбку даже у самого мрачного...
Тема : Исправление ошибок в простой программе с условными операторами iconЛекция источники ошибок в программных средствах
Понятия о простых и сложных системах, о малых и больших системах. Неправильный перевод информации из одного представления в другое...
Тема : Исправление ошибок в простой программе с условными операторами iconЛабораторная работа № (excel-1) Тема
Тема: Работа с редактором Microsoft Excel. Ввод данных в программе ms excel. Типы данных и работа с ячейками таблицы. Создание и...
Тема : Исправление ошибок в простой программе с условными операторами iconСценарий собственных ошибок Все романы, созданные Роем до недавнего...
«Сценарий собственных ошибок» – совсем другая история. Она – о цене, которую человек должен заплатить за то, что неправильно воспользовался...
Додайте кнопку на своєму сайті:
Школьные материалы


База даних захищена авторським правом © 2013
звернутися до адміністрації
mir.zavantag.com
Головна сторінка