Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Квадратные уравнения.Помогите новечку.   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.042 c
6-1112888304
Egorr
2005-04-07 19:38
2005.07.11
Шифрование траффика-TIdMappedPortTCP


14-1118759928
Lucifer
2005-06-14 18:38
2005.07.11
Помогите выбрать сканер!


4-1116235680
СМА
2005-05-16 13:28
2005.07.11
СОМ порт под WIN_XP


14-1118061842
Bronco
2005-06-06 16:44
2005.07.11
Опять шуточки от MS Word ?


14-1118085760
Gero
2005-06-06 23:22
2005.07.11
Ищу ветку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский