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


А разве условие не должно выглядеть вот так:((х>=10) and (х<=20)) or ((х>=30) and (х<=40))?
Можно поставить скобки, но в данном случае они избыточны, поскольку у операции логического «И» больший приоритет, чем у операции логического «ИЛИ».