Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2011, 22:04   #1
ilushka2306
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 48
По умолчанию Решение квадратных уравнений

Помогите пожалуйста исправить ошибку.
Не правильно находит x2,
и не хочет считать при вводе отрицательных значений.


Код:
unit korni;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  a,b,c,d,sd,x1,x2,a2:real;
  Text:string;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
memo1.Clear;
  d:=(Sqr(b))-(4*((a)*(c)));
    if d < 0 then
    showmessage('Корней нет')
    else
  sd := Sqrt(d);
  a2 := 2*a;
  x1 := ((-b)+(sd)) / a2;
  x2 := ((-b)-(sd)) / a2;
memo1.Lines.Add('Дискриминант = '+FloatToStr(d));
begin
  if a = 0 then
    memo1.Lines.Add(FloatToStr(b)+'x+'+FloatToStr(c)+'=0;');
  if b = 0 then
    memo1.Lines.Add(FloatToStr(a)+'x^2+'+FloatToStr(c)+'=0;');
  if c = 0 then
    memo1.Lines.Add(FloatToStr(a)+'x^2+'+FloatToStr(b)+'x+'+'=0;')
  else
    memo1.Lines.Add(FloatToStr(a)+'x^2+'+FloatToStr(b)+'x+'+FloatToStr(c)+'=0;');
end;
memo1.Lines.Add('Корни уравнения:');
memo1.Lines.Add('x1 = '+ FloatToStr(x1));
memo1.Lines.Add('x2 = '+ FloatToStr(x2));
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
application.Terminate;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Memo1.Clear;
end;

procedure TForm2.Edit1Change(Sender: TObject);
begin
Text:=edit1.Text;
  if  Length(Text) >0 then
    a:=StrToFloat(edit1.Text)
  else
    a:=0;
end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
Text:=edit1.Text;
  case key of
  #8,'0'..'9','-':;
end;
end;

procedure TForm2.Edit2Change(Sender: TObject);
begin
Text:=edit2.Text;
  if  Length(Text) >0 then
    b:=StrToFloat(edit2.Text)
  else
    b:=0;
end;

procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
Text:=Edit2.Text;
  case key of
  #8,'0'..'9','-':;
end;
end;

procedure TForm2.Edit3Change(Sender: TObject);
begin
Text:=edit3.Text;
  if  Length(Text) >0 then
      c:=StrToFloat(edit3.Text)
  else
    c:=0;
end;

procedure TForm2.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
Text:=Edit3.Text;
  case key of
  #8,'0'..'9','-':;
end;
end;

end.
ilushka2306 вне форума Ответить с цитированием
Старый 05.03.2011, 11:42   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Так ?

у тебя не было проверки на дискриминант=0

отрицательные числа не работали, потому что ты сам так задал программе, посмотри, как я сделал (особенно удели внимание переносу работы ввода числа в память из Tedit.OnChange в Tedit.OnExit )

ну и такая мелочь - у тебя 3 обработчика одного и того же - проверки символа на правильность для 3 разных эдитов, такое надо в 1 обработчике хранить, а всем нуждающимся компонентам назначать его.

Более того, твой onChange (и мой OnExit) можно тоже сделать 1 обработчиком , а не 3, а какой эдит конкретно вызвал событие , обычно определяется самим программистом с помощью задания компонентам разного Tag

Ах да, ещё убрал непонятные для меня Text := editX.text; отовсюду, а то они заголовок формы постоянно меняют (ибо в данном scope , где ты их используешь они относятся к форме, хотя, видимо , ты считал, что просто сохраняешь в локальную переменную)
Вложения
Тип файла: rar squaequa.rar (1.4 Кб, 4 просмотров)

Последний раз редактировалось phomm; 05.03.2011 в 11:57.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос для решения квадратных уравнений (перемещено из раздела Excel) sashkkk Помощь студентам 3 22.09.2010 23:06
Qu 1.0 - программа для решения квадратных уравнений DM_bite Софт 5 20.03.2010 22:37
программ решения квадратных уравнений (C++) Ready Помощь студентам 7 09.06.2009 18:00
Три квадратных уравнения. Найти минимальное значение среди действительных корней этих уравнений. Паскаль. GE076 Помощь студентам 2 17.12.2007 20:41