Главная страница

Ответы на задачи 24 (С1)


Скачать 1.99 Mb.
НазваниеОтветы на задачи 24 (С1)
Дата21.04.2018
Размер1.99 Mb.
Формат файлаdoc
Имя файлаansw24-C1.doc
ТипПрограмма
#41783
страница4 из 18
1   2   3   4   5   6   7   8   9   ...   18

var x, y: real;

begin

readln(x, y);

if (y <= x*x) and (y <= x+2) and (y <= 2-x) and (y >=0)
then


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

else

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

end.


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

Далее замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x*y >= 1 then

if x <= 2 then

if y <= 2 then

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

else

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

Это значит, что, например, при невыполнении первого условия (x*y >= 1) (или при выполнении первого и невыполнении второго) вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else-блок, не срабатывает. Таким образом, для точки (0,0), например, программа работает неправильно – не выводит ответ вообще.

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

Для исправления этих ошибок нужно добавить условие x > 0 и объединить все 4 условия с помощью операции И (в паскале – and) в одно сложное условие в одном условном операторе:

var x, y: real;

begin

readln(x, y);

if (x*y >= 1) and (x <= 2) and (y <= 2) and (x > 0) then

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

else

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

end.

  1. Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if y >= 0 then

if y <= 1 then

if x >= 0 then

if x <= pi then

if y <= sin(x) then

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

else

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

Это значит, что, например, при невыполнении первого, второго или третьего условий вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else-блок, не срабатывает. Таким образом, для точки (-1,0), например, программа работает неправильно – не выводит ответ вообще.

Кроме того, в программе есть и другая ошибка. Легко видеть, что первые 4 условия определяют прямоугольник, в котором заключена нужная нам область – это правильно. В то же время пятое условие (y <= sin(x)) «отсекает» область, обозначенную желтым цветом, это неправильно. Таким образом, например, для точки (3;0,8), находящейся в «желтой» области, программы выдает неправильный ответ: «не принадлежит».

Поэтому нужно в пятом условии к области y <= sin(x) добавить еще область
x >= pi/2 (с учетом первых четырех условий, добавляется прямоугольник, показанный на рисунке красной рамкой). Объединение областей выполняется с помощью логической операции ИЛИ (в Паскале – or). Таким образом, вместо пятого условия нужно использовать сложное условие

( y <= sin(x)) or (x >= pi/2)

Кроме того, полученные 5 условий нужно объединить в одно сложное с помощью операции И (в Паскале – and):

var x, y: real;

begin

readln(x, y);

if (y >= 0) and (y <= 1) and (x >= 0) and (x <= pi) and

((y <= sin(x)) or (x >= pi/2)) then

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

else

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

end.




  1. Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x <= 1 then

if y <= 1 then

if x*x + y*y <= 1 then

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

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

Программа выводит сообщение «принадлежит» только тогда, когда выполняются все три условия, то есть, для всех точек внутри круга (синяя область), тогда как для «угла», который остался серым, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (0,9;0,9) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (0,9;0,9) находится в выделенной области. Для нее выполняются условия x <= 1 и y <= 1, но не выполняется условие x*x + y*y <= 1. В этом случае приведенная программа выдает неверный ответ «не принадлежит».

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

Для точки (1,5;1,5) не выполняется условие x <= 1. В этом случае приведенная программа работает неправильно – не выдает вообще никакого ответа.

Для исправления программы лучше всего составить новое сложное условие. Выделенная область может быть получена как объединение двух областей: круга x*x + y*y <= 1 и квадрата с единичной стороной, левый нижний угол которого находится в начале координат:

if (x*x + y*y <= 1) { круг }

or

((x >= 0) and (x <= 1) and { квадрат}

(y >= 0) and (y <= 1))

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

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




  1. Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if y >= 0 then

if x <= 1 then

if y >= x*x then



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

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

Программа выводит сообщение «принадлежит» только тогда, когда выполняются все три условия, то есть, для всех точек внутри синей области, тогда как для «угла», который остался серым, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (0,9;0,1) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (0,9;0,1) находится в выделенной области. Для нее выполняются условия y >= 0 и x <= 1, но не выполняется условие y >= x*x. В этом случае приведенная программа выдает неверный ответ «не принадлежит».

Кроме того, для точек, для которых не выполняется любое из первых двух условий, вообще никакого сообщения не выдается. Поэтому в качестве примера неверной работы программы можно указать, например, точку (0;-1). Тогда на первый вопрос можно ответить и так:

Для точки (0;-1) не выполняется условие y >= 0. В этом случае приведенная программа работает неправильно – не выдает вообще никакого ответа.

Для исправления программы лучше всего составить новое сложное условие. Выделенная область может быть получена как объединение двух областей: области выше параболы y >= x*x и квадрата с единичной стороной, левый нижний угол которого находится в начале координат:

if ((y >= x*x) and (x <= 1)) { над параболой }

or

((x >= 0) and (x <= 1) and { квадрат}

(y >= 0) and (y <= 1))

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

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

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

if ((y >= x*x) and (x <= 1)) { над параболой }

or

((x >= 0) and (x <= 1) and (y >= 0))

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

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




  1. Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x <= 1 then

if y >= 1-x then

if y >= x*x then

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

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

Программа выводит сообщение «принадлежит» только тогда, когда выполняются все три условия, то есть, для всех точек внутри синей области, тогда как для «угла», который остался серым, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (0,9;0,5) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (0,9;0,5) находится в выделенной области. Для нее выполняются условия x <= 1 и y >= 1-x, но не выполняется условие y >= x*x. В этом случае приведенная программа выдает неверный ответ «не принадлежит».

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

Для точки (2;0) не выполняется условие x <= 1. В этом случае приведенная программа работает неправильно – не выдает вообще никакого ответа.

Для исправления программы лучше всего составить новое сложное условие. Выделенная область может быть получена как объединение двух областей: синей области выше параболы y >= x*x и линии y = 1-x и (одновременно) слева от прямой x = 1, и верхней части полосы 0<=x<=1, которая снизу ограничена линией y = 1-x:

if ((y >= x*x) and (y >= 1-x) and (x <= 1))

{ синяя область над параболой и прямой }

or

((x >= 0) and (x <= 1) and (y >= 1-x)) { полоса над прямой }

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

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

Это условие можно немного упростить, заметив, что условия y >= 1-x и x <= 1 встречаются в условиях для обеих областей:
if (y >= 1-x) and { над прямой }

(x <= 1) and { слева от прямой x = 1}

((y >= x*x) or { выше параболы }

(x >= 0)) { справа от прямой x = 0 }

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

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

  1. Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x >= 0 then

if y <= 1 then

if (x*x + y*y <= 1) and (y >= x-1)

then

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

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

Программа выводит сообщение «принадлежит» только для всех точек внутри синей области, в которой одновременно выполняются все 4 условия. Для «угла» и части круга, которые показаны серым цветом, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (1;0,75) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (1;0,75) находится в выделенной области. Для нее выполняются условия x>=0 и y<=1, но не выполняется условие (x*x + y*y <= 1) and (y >= x-1).

В этом случае приведенная программа выдает неверный ответ «не принадлежит».

Кроме того, для точек, для которых не выполняется любое из первых двух условий, вообще никакого сообщения не выдается. Поэтому в качестве примера неверной работы программы можно указать, например, точку (-1;0). Тогда на первый вопрос можно ответить и так:

Для точки (-1;0) не выполняется условие x >= 0. В этом случае приведенная программа работает неправильно – не выдает вообще никакого ответа.

Для исправления программы лучше всего составить новое сложное условие. Выделенная область может быть получена как объединение двух областей: полукруга

(x >= 0) and (x*x + y*y <= 1)

и треугольника

(x >= 0) and (y <= 1) and (y >= x-1)

Получаем:

if ((x >= 0) and (x*x + y*y <= 1)) { полукруг }

or

((x >= 0) and (y <= 1) and (y >= x-1)) { треугольник }

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

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

Это условие можно немного упростить, заметив, что условие x >= 0 встречается в условиях для обеих областей:

if (x >= 0) and

((x*x + y*y <= 1) or

((y <= 1) and (y >= x-1)))

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

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


  1. Начнем с заполнения таблицы. Обратите внимание, что второе условие проверяется в приведенной программе только тогда, когда истинно первое, а третье – только тогда, когда истинны первые два. В остальных ячейках (если условие не проверяется) нужно ставить прочерк:

Обл.

y<=2-x?

y>=0?

y>=x*x?

вывод

верно?

A

да

да

нет







B

нет











C

да

да

да







D

да

да

нет







E

нет











F

нет











G

да

нет









H

нет










1   2   3   4   5   6   7   8   9   ...   18


написать администратору сайта