Другие языки программирования и технологии

(ax−1)(bx−1) < 0 на паскаль

Напишите программу решения неравества, зависящего от параметров
a и b – заданных вещественных чисел; x – неизвестное: (ax−1)(bx−1) < 0
Вот код, выдающий решение во всех случаях (нули, не нули, a < b, b < a, b = a, выход за границу точности типа real и т.п.):
 program InequalitySolver;
var
a, b, t, ia, ib: real;
begin
write('Введите параметры a и b: ');
readln(a, b);
if a = b then
writeln('Нет решений')
else if (a = 0) or (b = 0) then begin
if (a = 0) then t := b
else t := a;
ia := 1 / t;
if ia < 0 then
writeln('x ∈ (-∞, ', ia : 5 : 16, ')')
else
writeln('x ∈ (', ia : 5 : 16, ', +∞)')
end else begin
ia := 1 / a;
ib := 1 / b;
if ia < ib then begin
t := ia;
ia := ib;
ib := t
end;
if (ia > 0) xor (ib > 0) then
writeln('x ∈ (-∞, ', ib : 5 : 16, ') ∪ (', ia : 5 : 16, ', +∞)')
else
writeln('x ∈ (', ib : 5 : 16, ', ', ia : 5 : 16, ')')
end
end.

Рассматриваемые варианты:
  1. a = b - нет решений (левая часть становится квадратом вещественного числа)
  2. одно из a и b равно нулю (а второе - нет) - линейное неравенство
  3. в остальных случаях - парабола, при этом если знаки a и b одинаковые (ветви вверх), то решение - между корнями, а иначе (ветви вниз) решение - вне интервала между корнями

P.S. Чуть не забыл: говнокод двух предыдущих отвечающих не работает. Первый просто спёр откуда-то кусок кода для решение совершенно другой задачи, и его вряд ли вообще интересует, работает его программа или нет, т.к. он - тролль с КПД 7%, написавший 2 тыс примитивных ответов ради баллов. Второй - аналогичный персонаж, но пока успевший написать только 22 сообщения за 2 часа с момента регистрации. Люди, которые привыкли отвечать обдуманно (а тем более когда надо написать хоть и небольшую, но программу), 20 ответов напишут за день, а не за пару часов.
Василий Голубенков
Василий Голубенков
54 053
Лучший ответ
Роман Рисков поняли, спасибо
 read(a, b);
if a > b then begin {сортировка a и b по возрастанию}
t := a; a := b; b := a
end;
if a = b then {парабола касается оси X сверху, либо оба коэф-та = 0}
writeln('not found')
else if a * b = 0 then {наклонная прямая, один из коэф-тов = 0}
if a + b < 0.0 then {прямая слева вниз направо}
writeln('x > ', 1.0 / (a + b))
else {прямая слева вверх направо}
writeln('x < ', 1.0 / (a + b))
else if a * b < 0.0 then {парабола пересекает ось X, рога вниз}
writeln(' x < ', 1.0 / a, ' or x > ', 1.0 / b)
else {парабола пересекает ось X, рога вверх}
writeln(1.0 / b, ' < x < ', 1.0 / a)
Влад Рустамов
Влад Рустамов
77 690
Роман Примаков abs(a) + abs(b) = 0 только тогда, когда a = b = 0, поэтому условие лишнее.
program Equation;
var
a,b,x:real;
begin
writeln('Введите параметры a и b:');
readln(a,b);
x:=1/((a/b) + 1);
writeln ('Значение переменной х:', x:2:2);
end.
Роман Рисков спс дедпул
program inequality;
var
a, b, x: real;
begin
writeln('Введите параметры a и b');
readln(a, b);
if (a*b > 0) then begin
x := 1 / a;
writeln('x < ', x);
end else begin
x := 1 / b;
writeln('x > ', x);
end;
end.

Похожие вопросы