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

Что не так с кодом pascal/delphi

procedure TForm1.btn1Click(Sender: TObject);
var a,b,c,d,x1,x2:real;
begin
a:=StrToFloat(edt1.text);
b:=StrToFloat(edt2.text);
c:=StrToFloat(edt3.text);
d:=Sqr(b)-4*a*c;
if d < 0 then lbl5.Caption:='Êîðíåé íåò' else
x1:=(-b-sqrt(d))/(2*a);
x2:=(-b+sqrt(d))/(2*a);
lbl5.caption:=FloatToStr(x1);
lbl5.Caption:=FloatToStr(x2);
end;

end.
Sherzod Irmatov
Sherzod Irmatov
604
Проблема в данном коде заключается в том, что если дискриминант меньше нуля, то переменные x1 и x2 не будут проинициализированы, но в блоке кода после этого они используются в вызовах функций FloatToStr. Это может привести к ошибке выполнения программы.

Чтобы решить эту проблему, нужно добавить условие, которое проверяет, является ли дискриминант меньше нуля, и если это так, то выводить соответствующее сообщение об ошибке. Вот исправленный код на Pascal/Delphi:

procedure TForm1.btn1Click(Sender: TObject);
var
a, b, c, d, x1, x2: real;
begin
a := StrToFloat(edt1.text);
b := StrToFloat(edt2.text);
c := StrToFloat(edt3.text);
d := Sqr(b) - 4 * a * c;
if d < 0 then
begin
lbl5.Caption := 'Корней нет';
end
else
begin
x1 := (-b - sqrt(d)) / (2 * a);
x2 := (-b + sqrt(d)) / (2 * a);
lbl5.caption := FloatToStr(x1);
lbl6.Caption := FloatToStr(x2);
end;
end;

end.

В этом коде добавлен блок кода с условием, который проверяет, является ли дискриминант меньше нуля. Если это так, то программа выводит сообщение об ошибке. Если дискриминант больше или равен нулю, то программа вычисляет корни и выводит их значения.
Вячеслав Власенко
Вячеслав Власенко
2 746
Лучший ответ
В коде Pascal/Delphi, который вы предоставили, есть две проблемы:

Если дискриминант (переменная d) меньше нуля, то программа пытается вывести значение переменной x1 в метке lbl5.Caption. Это приведет к ошибке, поскольку x1 не инициализирована. Вместо этого нужно вывести сообщение о том, что уравнение не имеет действительных корней.

После вычисления значения для lbl5.Caption для переменной x1, значение переменной x2 перезаписывается, поскольку дважды присваивается значение метке lbl5.Caption. Вместо этого значение переменной x2 должно быть выведено в другую метку.

Исправленный код выглядит так:

 procedure TForm1.btn1Click(Sender: TObject); 
var
a, b, c, d, x1, x2: Real;
begin
a := StrToFloat(edt1.Text);
b := StrToFloat(edt2.Text);
c := StrToFloat(edt3.Text);
d := Sqr(b) - 4 * a * c;
if d < 0 then
lbl5.Caption := 'Уравнение не имеет действительных корней'
else
begin
x1 := (-b - Sqrt(d)) / (2 * a);
x2 := (-b + Sqrt(d)) / (2 * a);
lbl5.Caption := FloatToStr(x1);
lbl6.Caption := FloatToStr(x2);
end;
end;
Этот код вычисляет значения корней квадратного уравнения ax^2 + bx + c = 0 для введенных значений a, b и c, используя формулу дискриминанта. Если дискриминант отрицательный, то выводится сообщение о том, что уравнение не имеет действительных корней. Если дискриминант положительный или равен нулю, то вычисляются значения корней и выводятся в метки lbl5.Caption и lbl6.Caption.
__
_______ _________)
1 068