Ответы на задачи 24 (С1)
Скачать 1.99 Mb.
|
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.
Далее замечаем, что в программе 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.
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.
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('не принадлежит');
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('не принадлежит');
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('не принадлежит');
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('не принадлежит');
|