Текущий архив: 2005.07.11;
Скачать: CL | DM;
ВнизКвадратные уравнения.Помогите новечку. Найти похожие ветки
← →
Delphi-beginer (2005-06-11 22:14) [0]Я изучаю Delphi, пишу первую программу. Хочу сначала написать что-то несложное,
например, программу для решения квадратных уравнений. Но строка F:=sqrt(D) содержит ошибку (она подсвечивается при нажатии на F9)
Так вот, в чем ошибка? Помогите ученику-ламеру :)
Вот код программы:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, jpeg, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Edit1: TEdit;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
procedure Image1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure Image3Click(Sender: TObject);
procedure Memo1Change(Sender: TObject);
procedure Image4Click(Sender: TObject);
private
{ Private declarations }
A,B,C,D,F: Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Image1Click(Sender: TObject);
begin
A:= StrToInt(edit1.text);
Form1.Image1.hide;
Form1.Image2.show;
Form1.Memo1.Lines.Add("a="+ edit1.text);
Form1.Label1.Caption:="Введите число b:"
end;
procedure TForm1.Image2Click(Sender: TObject);
begin
B := StrToint(Edit1.text);
Form1.Image2.hide;
Form1.Image3.show;
Form1.Memo1.Lines.Add("b="+ edit1.text);
Form1.Label1.Caption:="Введите число с:"
end;
procedure TForm1.Image3Click(Sender: TObject);
begin
C:=StrToint (Edit1.text);
Form1.Image3.hide;
Form1.Image4.show;
Form1.Memo1.Lines.Add("c="+ edit1.text);
Form1.Label1.Caption:="";
Form1.Edit1.Text:="Решить";
end;
procedure TForm1.Memo1Change(Sender: TObject);
begin
Form1.Edit1.text:="";
end;
procedure TForm1.Image4Click(Sender: TObject);
begin
Edit1.text:="Готово!!!";
Form1.Memo1.Lines.Add("D=b^2-4ac="+IntToStr(B*B)+"-"+IntToStr(4*A*C)+"="+IntToStr(B*B-4*A*C));
D:=B*B-4*A*C;
F:=sqrt(D);
with Memo1.Lines do
begin
Add("");
end;
if D>0 then
begin
With Memo1.Lines do
begin
Add("D>0, уравнение имеет два корня");
Add("x=(-B+Корень из D)/2A и x=(-b-Корень из D)/2А");
Add("x="+IntToStr(-B+F)+"/"+IntToStr(2*A)+"="+IntToStr((-B+F)/(2*A));
Add("или");
Add("x="+IntToStr(-B-F)+"/"+IntToStr(2*A)+"="+IntToStr((-B-F)/(2*A));
Add("Ответ: x="+IntToStr((-B+F)/(2*A))+"или"+IntToStr((-B-F)/(2*A));
end;
end;
if D=0 then
begin
With Memo1.Lines do
Begin
Add("D=0, уравнение имеет один корень");
Add("x=(-B+ корень из D)/2A");
Add("x="+IntToStr(-B+F)+"/"+IntToStr(2*A)+"="+IntToStr((-B+F)/(2*A));
Add("Ответ: x="+IntToStr((-B+F)/(2*A))
end;
end;
if D<0 then
begin
with Memo1.Lines do
begin
Add("D<0, уравнение не имеет корней");
Add("Ответ: корней нет");
end;
end;
end;
end.
← →
Kolan © (2005-06-11 22:15) [1]Судя из 6 класса школы дискреминант не должен быть равен 0.
← →
Delphi-beginer (2005-06-11 22:18) [2]Если дискреминант равен нулю,то уравнение имеет один корень.
← →
Kolan © (2005-06-11 22:18) [3]Проверять дискреминант надо до извлечения корня. Те
if D<0 then
begin
{Товй вывод на экран.}
Exit;
end;
← →
Delphi-beginer (2005-06-11 22:20) [4]Попробую, спасибо.
← →
Kolan © (2005-06-11 22:29) [5]Так из любопытсява почему ты используещь картинки?
> Add("x="+IntToStr(-B+F)+"/"+IntToStr(2*A)+"="+IntToStr((-B+F)/(2*A));
> Add("или");
> Add("x="+IntToStr(-B-F)+"/"+IntToStr(2*A)+"="+IntToStr((-B-F)/(2*A));
Вот тут можно использовать ± (177)...
Потом вообще лучище делать отдельные функции.
function FindDiscriminant(A, B, C: Double): Double;
procedure EvaluateSquareRoots(var X1, X2: Double; A, B, C: Double);
← →
Delphi-beginer (2005-06-11 22:45) [6]Картинки, для красоты интерфейса.
Ух-ты,я такого не знал!!!
Но вот что
сделал, все равно ошибка.
Я подставил F:=sqrt(D) Сюда:
if D>0 then
begin
F:=sqrt(D);
With Memo1.Lines do
begin
и сюда:
if D=0 then
begin
F:=sqrt(D);
With Memo1.Lines do
Begin
, но работать не хочет.
← →
Lostcoder (2005-06-11 22:49) [7]F - сделай типа Real или Extended
У тебя же
A,B,C,D,F: Integer;
и
F:=sqrt(D)
А sqrt - возвращает дробный результат. Типы не совпадают.
← →
Delphi-beginer (2005-06-11 22:50) [8]спасибо.
← →
Lostcoder (2005-06-11 22:51) [9]Можно еще и Double использовать. В общем почитай про типы данных.
← →
Kolan © (2005-06-11 23:00) [10]Мож всё переделать? Я помогу...
← →
Delphi-beginer (2005-06-12 13:22) [11]Спасибо, но я хочу сам. Все же первая программа, романтика....
← →
Юрий Зотов © (2005-06-12 15:25) [12]Человек пишет: "строка F:=sqrt(D) содержит ошибку (она подсвечивается при нажатии на F9)".
А ему говорят про отрицательный дискриминант.
Фантастика.
И только в седьмом посте говорится, в чем причина ошибки.
Только в седьмом!
Фантастика.
← →
Petr V. Abramov © (2005-06-12 16:27) [13]А что будет, если
a = 0
ввести? :)
← →
Sergey Masloff (2005-06-12 16:44) [14]Юрий Зотов © (12.06.05 15:25) [12]
>Фантастика.
Зато все это в процессе осваивания среды быстрой разработки промышленных приложений стоимостью 3 тыс. у.е. Правда ее можно купить всего за 70 рублей и научиться сразу. Ну вот правда небольшие трудности с первыми задачами.
А вот нам это объяснили классе действительно в 7 за пару лет до первого подпускания к терминалу и как-то таких трудностей не возникало буквально ни у кого в классе ;-)
Занесло меня в оффтоп но обидно что народ себе мозги навсегда коверкает начиная решать такие задачи с таким инструментом. Когда решать их надо на бумажке или на программируемом калькуляторе. И на всю жизнь принцип понять. А получаем массу народа которые не видев трехколесный велосипед садятся на гоночный мотоцикл. Конечно худо-бедно они его освоят и ездить станут. Правда, не заводя мотор - только ногами отталкиваясь в лучшем случае... :(
Или у меня раннее развитие старческого маразма? Тоже не исключаю но...
← →
Petr V. Abramov © (2005-06-12 16:49) [15]> Sergey Masloff (12.06.05 16:44) [14]
Да Паскаль он есть Паскаль. А в составе какой среды - не все ли равно?
← →
Sergey Masloff (2005-06-12 17:05) [16]Petr V. Abramov © (12.06.05 16:49) [15]
Кто б спорил если б вот этого мусора
>Form1.Memo1.Lines.Add("D
там не было.
А потом появляются целые популяции программистов для которых компиляция = нажатие кнопки с зеленой стрелкой (в лучшем случае F9)
Хотя я повторюсь - может у меня и маразм, полностью исключить не могу.
← →
Petr V. Abramov © (2005-06-12 17:16) [17]> Sergey Masloff (12.06.05 17:05) [16]
> Кто б спорил если б вот этого мусора
> там не было.
С какой-то стороны оно так.
С другой - подобного мусора можно и нам кулькуляторе наделать :)
← →
Eraser © (2005-06-12 17:56) [18]Sergey Masloff (12.06.05 16:44) [14]
Прогресс... много ли народу сейчас разбирается в архитектуре процессоров? К сожалению человеческий мозг ограничен ((
← →
Delphi-beginer (2005-06-12 19:47) [19]Да я ведь для изучения это создаю.
Не решать пытаюсь, а учу программирование.
У вас какая была первая программа? Уж явно не Пакет офисных приложений и не среда визуального программирования.
Да и программу я еще вчера вечером закончил.
Я подставил переменным
A,B,C,D,F:real
и вместо строк IntToStr Вставил FloatToStr и все работает!
А если вместо а подставить ноль, то это уже не квадратное уравнение и выскачет окно с таким текстом
Invalid Floating point operation.
Я в справке прописал как от этого избавиться.
← →
Virgo_Style © (2005-06-12 20:02) [20]Delphi-beginer (12.06.05 19:47) [19]
А если вместо а подставить ноль, то это уже не квадратное уравнение и выскачет окно с таким текстом
Invalid Floating point operation.
Я в справке прописал как от этого избавиться.
Задокументированный баг - это фича %-))
← →
Юрий Зотов © (2005-06-12 20:13) [21]> Delphi-beginer (12.06.05 19:47) [19]
Все нормально, все правильно, все так и должно быть. Речь шла не о Вас, а о том, что только в седьмом (!!!) посте на Ваш вопрос ответили. Хотя должно было быть в первом.
Real Вы поставили напрасно, лучше было бы Single, Double или Extended. Очень советую повнимательнее посмотреть в справке, что все эти типы обозначают - а еше очень советую прочитать на сайте "Королевство Delphi" статью Антона Григорьева "Неочевидные особенности вещественных чисел". Много нового интересного узнаете.
Если A=0, то это уже, конечно, не квадратное, а линейное уравнение. Но оно тоже имеет решение и это решение должно определяться, а не оговариваться в справке.
← →
Delphi-beginer (2005-06-12 20:21) [22]
> Если A=0, то это уже, конечно, не квадратное, а линейное
> уравнение. Но оно тоже имеет решение и это решение должно
> определяться, а не оговариваться в справке.
Над этим я буду работать.
Спасибо за статью, почитаю.
← →
Petr V. Abramov © (2005-06-12 20:22) [23]а если
a = b = c = 0
? :)
← →
Delphi-beginer (2005-06-12 20:25) [24]Юрий Зотов, я не вам говорил про первую программу, а
Sergey"ю Masloff"у,
← →
Delphi-beginer (2005-06-12 20:29) [25]ТО Petr V. Abramov
а что решать-то,если 0=0? Решать нечего!
← →
Petr V. Abramov © (2005-06-12 20:33) [26]> Delphi-beginer (12.06.05 20:29) [25]
> а что решать-то,если 0=0? Решать нечего!
Это Вам решать нечего, а Ваша программа начнет честно решать, и юзер получитInvalid Floating point operation
или че-нить в этом роде.
← →
Sergey Masloff (2005-06-13 12:32) [27]Delphi-beginer (12.06.05 20:25) [24]
Вы не обижайтесь. Совсем не ставил целью Вас задеть. Я про общую тенденцию. Конечно все с чего-то начинали но в силу того что 15 лет назад доступ к машине был труден программы такого уровня мы решали только на бумаге а первой программоц на машине, как правило, было что-то серьезное.
В любом случае совет бывалых - первые программы постараться делать не с GUI а в консольных вариантах, потом будет легче. И разобраться все же с машинным представлением чисел - без этого совсем плохо можно потом натолкнуться на это в совсем других областях.
А так - удачи в изучении.
← →
Delphi-beginer (2005-06-13 13:01) [28]to Sergey Masloff
Спасибо, да я и не обижаюсь.
to Petr V. Abramov & Юрий Зотов
Я закрыл эти два бага.
Поставил условие, если эдит1.текст=0, то тогда выскакивает сообщение, что а не должно быть равно нулю:
if edit1.text=0 then
begin
showMessage("");
end;
else
begin
A:= StrToInt(edit1.text);
Form1.Image1.hide;
Form1.Image2.show;
Form1.Memo1.Lines.Add("a="+ edit1.text);
Form1.Label1.Caption:="Введите число b:"
end;
end;
Вот и все.
Спасибо всем огромное за помощь
Страницы: 1 вся ветка
Текущий архив: 2005.07.11;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.049 c