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

Где ошибка в коде Delphi/pascal

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;
if d > 0 then
begin
lbl5.Caption:='Äèñêðèìèíàíò èìååò äâà êîðíÿ'
end
else;
if d = 0 then
begin
lbl5.caption:='Äèñêðèìèíàíò èìååò îäèí êîðåíü'
end
else;
x1:=(-b-sqrt(d))/(2*a);
x2:=(-b+sqrt(d))/(2*a);
lbl5.caption:=FloatToStr(x1);
lbl5.Caption:=FloatToStr(x2);
end;


end.
В данном коде есть несколько ошибок:

1) Синтаксическая ошибка в конце условных операторов if-then-else: после ключевого слова else нельзя ставить точку с запятой. Например, вместо такого кода:
 if d < 0 then 
begin
lbl5.Caption := 'Êîðíåé íåò';
end
else;
нужно написать так:
 if d < 0 then 
begin
lbl5.Caption := 'Êîðíåé íåò';
end
else
begin
// код, который выполнится, если d >= 0
end;
2) Проблема в блоке else-выражениях. Если d < 0, то будет выполнено выражение в первом блоке if, и затем программа продолжит исполнение, выполняя все последующие блоки if, также как если бы d было больше нуля или равно ему. Это приведет к тому, что lbl5.caption будет перезаписано несколько раз, и в итоге на нем будет отображаться только значение x2. Чтобы исправить эту ошибку, нужно поместить все блоки if-then-else в один блок begin-end, например, так:
 if d < 0 then 
begin
lbl5.Caption := 'Êîðíåé íåò';
end
else
begin
if d > 0 then
begin
lbl5.Caption := 'Äèñêðèìèíàíò èìååò äâà êîðíÿ';
end
else
begin
lbl5.Caption := 'Äèñêðèìèíàíò èìååò îäèí êîðåíü';
end;
x1 := (-b - sqrt(d)) / (2 * a);
x2 := (-b + sqrt(d)) / (2 * a);
lbl6.Caption := FloatToStr(x1);
lbl7.Caption := FloatToStr(x2);
end;
3) Нет проверки на нулевое значение a. Если a равно нулю, то при вычислении x1 и x2 произойдет деление на ноль, что приведет к ошибке. Для исправления этой ошибки можно добавить проверку на нулевое значение a перед вычислением значений x1 и x2, например, так:
 if a = 0 then 
begin
lbl5.Caption := 'Êîðíåé íåò';
end
else
begin
d := Sqr(b) - 4 * a * c;
// блоки if-then-else как в примере выше
x1 := (-b - sqrt(d)) / (2 * a);
x2 := (-b + sqrt(d)) / (2 * a);
lbl6.Caption := FloatToStr(x1);
lbl7.Caption := FloatToStr(x2);
end;
4) Вывод значений x1 и x2. В текущей реализации значения x1 и x2 выводятся на одном и том же метке lbl5.Caption, что может вызвать путаницу. Чтобы исправить эту ошибку, нужно использовать две разные метки для вывода x1 и x2, например, так:
 if a = 0 then 
begin
lbl5.Caption := 'Êîðíåé íåò';
end
else
begin
d := Sqr(b) - 4 * a * c;
// блоки if-then-else как в примере выше
x1 := (-b - sqrt(d)) / (2 * a);
x2 := (-b + sqrt(d)) / (2 * a);
lbl6.Caption := FloatToStr(x1);
lbl7.Caption := FloatToStr(x2);
end;
5) Округление значений x1 и x2. В текущей реализации значения x1 и x2 могут выводиться слишком длинными, что не всегда удобно для пользователя. Чтобы округлить значения x1 и x2 до определенного количества знаков после запятой, можно использовать функцию RoundTo из модуля Math, например, так:
 if a = 0 then 
begin
lbl5.Caption := 'Êîðíåé íåò';
end
else
begin
d := Sqr(b) - 4 * a * c;
// блоки if-then-else как в примере выше
x1 := (-b - sqrt(d)) / (2 * a);
x2 := (-b + sqrt(d)) / (2 * a);
lbl6.Caption := FloatToStr(RoundTo(x1, -2));
lbl7.Caption := FloatToStr(RoundTo(x2, -2));
end;
Этот код округлит значения x1 и x2 до двух знаков после запятой.
Иван Тюрин
Иван Тюрин
56 728
Лучший ответ
Виталий Антоненко А можете пожалуйста целым кодом скинуть
Ошибка в коде связана с неправильным использованием оператора if-else. В данном случае, после каждого оператора else не указан блок кода, который должен быть выполнен в случае, если условие не выполняется. Вместо этого, после оператора else стоит пустой оператор (;), что приводит к некорректной работе программы.


Чтобы исправить ошибку, необходимо удалить (;) после каждого оператора else.