Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y — действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). Программист торопился и написал программу неправильно.
| Паскаль | Бейсик |
|---|---|
var x,y: real; begin readln(x,y); if y<=x then if y<=─x then if y>=x*x─2 then write('принадлежит') else write('не принадлежит') end. | INPUT x, y IF y<=x THEN IF y<=-x THEN IF y>=x*x-2 THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF ENDIF ENDIF END | Си++ | Алгоритмический |
int main(void) {float x,y; cin >> x >> y; if (y<=x) if (y<=-x) if (y>=x*x-2) cout << "принадлежит"; else cout << "не принадлежит"; } | алг нач вещ x,y ввод x,y если y<=x то если y<=─x то если y>=x*x─2 то вывод 'принадлежит' иначе вывод 'не принадлежит' все все все кон |
| Python | |
x = float(input()) y = float(input()) if y<=x: if y<=-x: if y>=x*x-2: print("принадлежит") else: print("не принадлежит") | |
Последовательно выполните следующее:
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F, G и H).
Точки, лежащие на границах областей, отдельно не рассматривать. В столбцах условий укажите "да", если условие выполнится, "нет", если условие не выполнится, "—" (прочерк), если условие не будет проверяться, "не изв.", если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите "не изв". В последнем столбце укажите "да" или "нет".
2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
| Область | Условие 1 (y<=x) | Условие 2 (y<=-x) | Условие 3 (y>=x*x-2) | Программа выведет | Область обрабатывается верно |
| A | |||||
| В | |||||
| С | |||||
| D | |||||
| Е | |||||
| F | |||||
| G | |||||
| Н |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысл)
Элементы ответа:
1)
| Область | Условие 1 (y<=x) | Условие 2 (y<=-x) | Условие 3 (y>=x*x-2) | Программа выведет | Область обрабатывается верно |
| A | нет | — | — | — | нет |
| В | нет | — | — | — | нет |
| С | нет | — | — | — | нет |
| D | да | да | да | принадлежит | да |
| Е | да | нет | — | — | нет |
| F | да | нет | — | — | нет |
| G | да | да | нет | не принадлежит | да |
| Н | нет | — | — | — | нет |
2) Возможная доработка (Паскаль, разбиение области на две части прямой x = 0):
if (y>=x*x─2) and ((y<=x) and (x>=0) or (x<=0) and (y<=-x)) then write('принадлежит') else write('не принадлежит')
Возможная доработка (Си, разбиение на две пересекающиеся области):
if (y>=x*x-2 && (y<=x || y<=-x)) cout << "принадлежит"; else cout << "не принадлежит";
Возможная доработка (Бейсик, отбрасывание части от большей области, используются вложенные условия):
IF y>=x*x-2 THEN IF NOT (y>x AND y>-x) THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF ELSE PRINT "не принадлежит" ENDIF
Обратите внимание, что вариантов доработки может быть достаточно много, но обычно правильное описание заштрихованных областей в них представляет собой или объединение двух (или более) возможно пересекающихся областей, или исключение одной области из другой.
При разделении области вдоль какой-либо линии точки, которые лежат на этой линии внутри области, могут быть причислены к одной части, к другой или к обеим (то есть, например, в приведенном решении на языке Паскаль одно из условий (x >= 0) или (x <= 0) может быть строгим).
Могут быть и другие верные способы доработки.


Можно написать вот такое условие "if (y>=x*x-2) and ((y<=x)or(y<=-x))" в TP?
Можно.
если ответить так,ответ будет защитан?
Си:/*Подключим библиотеку math.h*/
if (y >= x*x - 2 && y <= fabs(x)){
printf("принадлежит");
}
Нежелательно, чем низкоуровневей ответ, тем больше баллов за него можно получить.
А если вот так запишу не будет ошибкой?
if ((y>=x*x-2) and (y<=0)) or ((y>=x*x-2) and (y<=x) and (y>=0)) or ((y>=x*x-2) and (y<=-x) and (y>=0))
then
write('принадлежит')
else
write('не принадлежит')
Нет. Не будет, но очень громоздко! Ваше условие можно существенно упростить, например, так
((y>=x*x-2) and ((y<=0) or ((y>=0) and ((y<=x) or (y<=-x)))