Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.54 MB
Время: 0.037 c
1-1118653916
KeHra
2005-06-13 13:11
2005.07.11
MDI формы


3-1117009791
SlavaNV
2005-05-25 12:29
2005.07.11
Вопрос про SQL и ADO. Ошибка при добавлении записи.


3-1116933473
JaVa73
2005-05-24 15:17
2005.07.11
Просмотр данных из базы mysql


1-1119362054
dfkghasdlkgjh
2005-06-21 17:54
2005.07.11
событе на открытие/закрытие проги.


14-1118159003
Андрей Жук
2005-06-07 19:43
2005.07.11
Сравнение ogty-сорсных СУБД