C1 — основные конструкции языка программирования. Система

advertisement
Блок «Языки программирования»
C1 — поиск ошибок в программе со сложным условием
Пример задания
Требовалось написать программу, при
выполнении которой с клавиатуры
считываются координаты точки на
плоскости (x,y – действительные числа) и
определяется принадлежность этой точки
заданной закрашенной области (включая
границы).
Программист торопился и написал
программу неправильно.
ПРОГРАММА НА ПАСКАЛЕ
Var x,y:real;
Begin
Readln (x/y);
If y>=-1 then
If y<=x then
If y<=-x then
If y>=-cos(x) then
Write (‘принадлежит’)
Else
Write (‘не принадлежит’)
End.
Последовательно выполните следующее:
1) Приведите пример таких чисел x, y, при которых программа неверно решает
поставленную задачу.
2) Укажите, как нужно доработать программу, чтобы не было случаев ее
неправильной работы. (Это можно сделать несколькими способами, достаточно указать
любой способ доработки исходной программы).
Решение: Проблема во вложенных условиях, по коду торопящегося ученика
сложно определить к какому из «if» относится единственный «else».
Поэтому лучше сначала самому обозначить условие, которому должны отвечать
точки, попавшие в выделенную область
Рассмотрим рисунок, закрашенная область
зажата прямыми у=х и у=-х. Разделим
закрашенную область на 2 части по оси У:
1)
(x<=0) and (y<=x) and (y>=-1);
2)
(x>0) and (y>=-cos(x)) and (y<=-x);
Таким образом, точка должна принадлежать
хотя бы одной из двух частей закрашенной
области.
Вернемся к программе ученика. Сравним с
условиями данными в программе:
В программе «выпала» область значит, для
точки с координатами х=-1, у=-1, программа
выдаст «не принадлежит»;
Допущена ошибка и в логике алгоритма.
Составим по ошибочному коду блок-схему
да
нет
y >= -1
да
да
да
y<=-x
y>=-cos(x)
принадлежит
y<=x
нет
нет
нет
не принадлежит
If y>=-1 then
If y<=x then
If y<=-x then
If y>=-cos(x) then
Write (‘принадлежит’)
Else
Write (‘не принадлежит’)
Значит,
будет выдано сообщение
«не принадлежит» только в
случае если ложно y>=-cos(x). В случае если
ложно любое из трех остальных условий
программа не выдаст никакого сообщения.
Ответ : 1) х=-1,у=-1программа неверно решает поставленную задачу
2) пример доработки программы
If ((y>=-1)and(y<=x)and(x<=0)) or((y<=-x)and(y>=-cos(x))and(x>0))then
Write (‘принадлежит’)
Else
Write (‘не принадлежит’);
Самостоятельно разберите и приготовьте к обсуждению следующий вариант
доработки программы:
If ((y<=-x) and (y<=x) and (y>=-1)) and ((y>=-cos(x)) or (x<=0)) then
Write (‘принадлежит’)
Else
Write (‘не принадлежит’);
Допущенные ошибки:
 Ошибки при определении области допустимых значений, области
определения, составлении уравнений прямой по приведенному графику и
т.д.
 Ошибки в выборе знаков «<» и «>», логических операций or и and
 Ошибки в логике алгоритма;
Для поиска ошибок
в представленном коде лучше составить блок-схему
программы. Создание блок-схемы позволяет абстрагироваться от конкретного языка
программирования и сосредоточиться на анализе алгоритма. Также необходимо, чтобы
обучающиеся усвоили правило: если перед else нет слова end, нужно искать ближайший
сверху условный оператор if; если перед else стоит end (конец блока), нужно искать
парный ему begin (начало блока) и соответствующий условный оператор if ... then begin.
Задания С1 за последние три года ориентированы на применение данного правила.
Тренировочные задания в формате ЕГЭ:
Последовательно выполните следующее:
1) Приведите пример таких чисел x, y, при которых программа неправильно решает
поставленную задачу.
2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной
работы. (Это можно сделать несколькими способами, поэтому можно указать любой
правильный способ доработки исходной
программы).
1. Требовалось написать программу, при
выполнении которой с клавиатуры
считываются координаты точки на плоскости
(x, y – действительные числа) и определяется
принадлежность этой точки заданной
заштрихованной области (включая границы).
Область ограничена осями координат и
прямыми y = 3 – 2x и x = 3 – 2y. Программист
торопился и написал программу неправильно.
var x,y: real;
begin
readln(x,y);
if x>=0 then
if y>=0 then
if y<=3-2*x then
if x<=3-2*y then
write('принадлежит')
else
write('не принадлежит')
end.
2. Требовалось написать программу, при
выполнении которой с клавиатуры
считываются координаты точки на плоскости
(x,y – действительные числа) и определяется
принадлежность этой точки заданной
заштрихованной области (включая границы).
Область ограничена осью абсцисс, прямыми y
= 1 и x = π, и графиком функции y = sin x.
Программист торопился и написал программу
неправильно.
var x,y: real;
begin
readln(x,y);
if y>=0 then
if y<=1 then
if x>=0 then
if x<=3.14 then
if y<=sin(x) then
write('принадлежит')
else
write('не принадлежит')
end.
3. Требовалось написать программу, при
выполнении которой с клавиатуры
считываются координаты точки на плоскости
(x,y – действительные числа) и определяется
принадлежность этой точки заданной
закрашенной области (включая границы).
Область ограничена гиперболой xy = –1 и
прямыми x = 2 и y = –2.
Программист торопился и написал программу
неправильно:
var x,y: real;
begin
readln(x,у);
if x*y<=-1 then
if x<=2 then
if y>=-2 then
write('принадлежит')
else
write('не принадлежит')
end.
Download