Требовалось написать программу, при выполнении которой с клавиатуры считывается координата точки на прямой (x — действительное число) и определяется принадлежность этой точки одному из выделенных отрезков В и D (включая границы). Программист торопился и написал программу неправильно.
| Бейсик | Паскаль |
|---|---|
INPUT x IF x>=-3 THEN IF x<=9 THEN IF x>1 THEN PRINT "не принадлежит" ELSE PRINT "принадлежит" ENDIF ENDIF ENDIF END | var x: real; begin readln(x); if x>=-3 then if x<=9 then if x>1 then write('не принадлежит') else write('принадлежит') end. |
| Си++ | Алгоритмический язык |
#include <iostream> using namespace std; int main(void) { float x; cin >> x; if(x>=-3) if(x<=9) if(x>1) cout << "не принадлежит"; else cout << "принадлежит"; } | алг нач вещ x ввод x если x>=-3 то если x<=9 то если x>1 то вывод 'не принадлежит' иначе вывод 'принадлежит' все все все кон |
| Python | |
x = float(input()) if x >= -3: if x <= 9: if x > 1: print("не принадлежит") else: print("принадлежит")
| |
Последовательно выполните следующее.
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D и E). Границы (точки –3, 1, 5 и 9) принадлежат заштрихованным областям (B и D соответственно).
В столбцах условий укажите «Да», если условие выполнится; «Нет», если условие не выполнится; «—» (прочерк), если условие не будет проверяться; «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв.». В последнем столбце укажите «Да» или «Нет».
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
| Область | Условие 1 (x >= –3) | Условие 2 (x <= 9) | Условие 3 (x > 1) | Программа выведет | Область обрабатывается верно |
| A | |||||
| B | |||||
| C | |||||
| D | |||||
| E | |||||
Элементы ответа:
1.
| Область | Условие 1 (x >= –3) | Условие 2 (x <= 9) | Условие 3 (x > 1) | Программа выведет | Область обрабатывается верно |
| A | Нет | - | - | - | Нет |
| B | Да | Да | Нет | Принадлежит | Да |
| C | Да | Да | Да | Не принадлежит | Да |
| D | Да | Да | Да | Не принадлежит | Нет |
| E | Да | Нет | - | - | Нет |
2. Возможная доработка (Паскаль):
if (x>=-3) and (x<=1) or (x>=5) and (x<=9) then
write('принадлежит')
else
write('не принадлежит')
Возможны и другие способы доработки.
Например:
if x>=-3 then
if x<=1 then
write('принадлежит')
else
if x>=5 then
if x<=9 then
write('принадлежит')
else
write('не принадлежит')
else
write('не принадлежит')
else
write('не принадлежит')
Другой пример:
if abs(abs(x-3)-4)<=2 then
write('принадлежит')
else
write('не принадлежит')
Обратите внимание! В задаче требуется выполнить три действия.
1. Заполнить таблицу.
2. Исправить ошибку в условном операторе.
3. Исправить ошибку, связанную с неправильным набором условий.
Баллы за данное задание начисляются как сумма баллов за верное выполнение каждого действия. Рассмотрим отдельно каждое действие.
1. Действие по заполнению таблицы считается выполненным, если в таблице нет ошибок или ошибки присутствуют только в одной строке.
2. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи ELSE). Исправлением этой ошибки может быть либо добавление случая ELSE к каждому условию IF, либо объединение всех условий IF в одно при помощи конъюнкции.
В сложных случаях это действие считается выполненным, если программа выдает одно из двух сообщений: «принадлежит» или «не принадлежит» – для любых чисел x, при этом программа не стала работать хуже, чем раньше, т. е. для всех точек, для которых программа ранее выдавала верный ответ, доработанная программа также должна выдавать верный ответ.
3. Приведённых трёх ограничений недостаточно для описания двух областей (потеряно условие x>=5). Кроме того, необходимо учесть, что области не соединены. Исправлением этой ошибки может быть разбиение области на две части и использование дизъюнкции, либо использование сложной (для выведения) математической конструкции (||x–3|–4|≤2), либо использование сложной комбинации каскадных условий.
В сложных случаях это действие считается выполненным, если верно определены заштрихованные области, т. е. программа выводит сообщение «принадлежит» для всех точек закрашенных областей, и только для них, для точек вне заштрихованных областей программа выводит «не принадлежит» или не выводит ничего. В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения.

