По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Подпрограммы
- линейное
;
- квадратное
;
- кубическое ax^3 + bx^2 + cx + d.
Решение линейного уравнения тривиально: ; алгоритмы решения квадратного и кубического уравнений подробно рассмотрены в задачах 3.4 и 3.5.
Создадим новый проект. Свойства формы настроим по табл. 4.1, за исключением свойства Caption, которому присвоим значение Решение уравнения. Компоненты на форме разместим так, как показано на рис. 4.4.
Обратите внимание, что на форме появились не знакомые нам компоненты. Это CheckBox — флажок и RadioGroup — группа переключателей.
Компонент флажок CheckBox используется для того, чтобы пользователь могут указать свое решение: да или нет. Установлен флажок или нет, определяет свойство Checked (true, false). В составе диалогового окна может быть несколько таких компонентов, причём состояние любого из них не зависит от состояния остальных.
Компонент группа переключателей RadioGroup объединяет в себе несколько переключателей. Каждый размещённый в нём переключатель помещается в специальный список Items и доступен по номеру, установленному в свойстве ItemIndex. После размещения на форме компонент пуст. Чтобы создать в нём хотя бы один переключатель, нужно выделить его, обратиться к инспектору объектов и выбрать свойство Items — редактор списка. Строки, набранные в редакторе, используются как поясняющие надписи справа от переключателей, а их количество определяет количество переключателей в группе. В нашем случае окно редактора списка будет иметь вид, как на рис. 4.5.
После создания компонента группа переключателей, его свойство номер переключателя ItemIndex по умолчанию равно _1. Это означает, что ни один компонент в группе не установлен. Чтобы в момент появления компонента на экране один из переключателей был отмечен, нужно либо на этапе конструирования формы, либо программно присвоить свойству ItemIndex номер одного из элементов списка, учитывая, что нумерация начинается с нуля.
С остальными компонентами, размещёнными на форме, пользователь уже знаком. На рис. 4.6, рис. 4.7, рис. 4.8 видно, как работает программа. Пользователю предоставляется возможность выбрать вид решаемого уравнения, ввести его коэффициенты и указать, какие решения — действительные или комплексные (если это возможно) — он хотел бы получить.
Далее приведён текст программного модуля с комментариями:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, E x t C t r l s; type TForm1 = class (TForm) Label1 : TLabel; Label2 : TLabel; Label3 : TLabel; Label4 : TLabel; Label5 : TLabel; Edit1 : TEdit; Edit2 : TEdit; Edit3 : TEdit; Edit4 : TEdit; CheckBox1 : TCheckBox; CheckBox2 : TCheckBox; Button1 : TButton; Button2 : TButton; RadioGroup1 : TRadioGroup; Button3 : TButton; procedure FormCreate ( Sender : TObject ); procedure Button2Click ( Sender : TObject ); procedure Button3Click ( Sender : TObject ); procedure Button1Click ( Sender : TObject ); procedure RadioGroup1Click ( Sender : TObject ); private { Private declarations } public { Public declarations } end; var Form1 : TForm1; implementation {$R *.dfm} //Щелчок по кнопке НАЙТИ КОРНИ. procedure TForm1. Button1Click ( Sender : TObject ); //Решение линейного уравнения. procedure korni_1 ( a, b : real; var x_ : string ); var x : real; begin x:=-b/a; x_:= FloatToStrF ( x, ffFixed, 5, 2 ); end; //Решение квадратного уравнения. procedure korni_2 ( a, b, c : real; var x1_, x2_ : string; var pr : byte ); var d, x1, x2 : real; begin d:=b * b-4*a*c; if d<0 then begin x1:=-b /(2 * a ); x2:= sqrt ( abs ( d ) ) / ( 2 * a ); x1_:= FloatToStrF ( x1, ffFixed, 5, 2 ) + ’+i * ’+FloatToStrF ( x2, ffFixed, 5, 2 ); x2_:= FloatToStrF ( x1, ffFixed, 5, 2 ) + ’- i * ’+FloatToStrF ( x2, ffFixed, 5, 2 ); pr : = 2; //Комплексные корни. end else begin x1:=(_b+sqrt ( d ) ) / 2 / a; x2:=(_b_sqrt ( d ) ) / ( 2 _ a ); x1_:= FloatToStrF ( x1, ffFixed, 5, 2 ); x2_:= FloatToStrF ( x2, ffFixed, 5, 2 ); pr : = 1; //Действительные корни. end end; //Решение кубического уравнения. procedure korni_3 ( a, b, c, d : real; var x1_, x2_, x3_ : string; var pr : byte ); var r, s, t, p, q, ro, f i, u, v, x1, x2, x3, h, g : real; begin r :=b/a; s := c /a; t :=d/a; p :=(3 * s -r * r ) / 3; q:=2 * r * r * r /27- r * s/3+ t; d :=( p /3) * sqr ( p/3)+ sqr ( q / 2 ); if d<0 then begin ro := sqrt (-p * p * p / 27 ); fi :=-q /(2 * ro ); fi := pi /2-arctan ( fi / sqrt (1 - fi * fi ) ); //Вычисление действительных корней уравнения. x1 :=2 * exp (1/3 * ln ( ro ) ) * cos ( fi /3) - r / 3; x2 :=2 * exp (1/3 * ln ( ro ) ) * cos ( fi /3+2* p i /3) - r / 3; x3 :=2 * exp (1/3 * ln ( ro ) ) * cos ( fi /3+4* p i /3) - r / 3; x1_:= FloatToStrF ( x1, ffFixed, 5, 2 ); x2_:= FloatToStrF ( x2, ffFixed, 5, 2 ); x3_:= FloatToStrF ( x3, ffFixed, 5, 2 ); pr : = 1; //Действительные корни. end else begin if -q/2+ sqrt ( d)>0 then u:=exp (1/3 * ln (-q/2+ sqrt ( d ) ) ) else if -q/2+ sqrt ( d)<0 then u:=-exp (1/3 * ln ( abs(-q/2+ sqrt ( d ) ) ) ) else u : = 0; if -q/2- sqrt ( d)>0 then v:=exp (1/3 * ln (-q/2- sqrt ( d ) ) ) else if -q/2- sqrt ( d)<0 then v:=-exp (1/3 * ln ( abs(-q/2- sqrt ( d ) ) ) ) else v : = 0; x1:=u+v-r / 3; //Вычисление действительного корня. //Вычисление комплексных корней. h:=-(u+v)/2 - r / 3; g :=(u-v )/2 * sqrt ( 3 ); x1_:= FloatToStrF ( x1, ffFixed, 5, 2 ); x2_:= FloatToStrF ( h, ffFixed, 5, 2 ) + ’+i * ’+FloatToStrF ( g, ffFixed, 5, 2 ); x3_:= FloatToStrF ( h, ffFixed, 5, 2 ) + ’- i * ’+FloatToStrF ( g, ffFixed, 5, 2 ); pr : = 2; //Один действительный и два комплексных корня. end end; //Обработка события щелчок по кнопке НАЙТИ КОРНИ. var a_, b_, c_, d_ : real; kod_a, kod_b, kod_c, kod_d : integer; _x, _x1, _x2, _x3 : string; _pr : byte; begin case RadioGroup1. ItemIndex of 0 : //Пользователь выбрал первый переключатель из группы. begin //Ввод исходных данных. val ( Edit1. Text, a_, kod_a ); val ( Edit2. Text, b_, kod_b ); //Ввод прошел успешно. if ( kod_a=0) and ( kod_b=0) then begin if a_<>0 then //Первый коэффициент не ноль. begin //Решение линейного уравнения. korni_1 (a_, b_, _x ); //Вывод найденного значения. MessageDlg ( ’Решение линейного уравнения x= ’ +_x, mtInformation, [ mbOk ], 0 ); end else //Первый коэффициент равен нулю, //вывод соответствующего сообщения. MessageDlg ( ’Нет корней ! ’, mtInformation, [mbOk ], 0 ); end else //Некорректный ввод данных. MessageDlg ( ’Ошибка при вводе коэффициентов ! ’, mtInformation, [ mbOk ], 0 ); end; 1 : //Пользователь выбрал второй переключатель из группы. begin //Ввод исходных данных. val ( Edit1. Text, a_, kod_a ); val ( Edit2. Text, b_, kod_b ); val ( Edit3. Text, c_, kod_c ); //Ввод прошел успешно. if ( kod_a=0) and ( kod_b=0) and ( kod_c=0) then begin if a_<>0 then //Первый коэффициент не ноль. begin //Решение квадратного уравнения. korni_2 (a_, b_, c_, _x1, _x2, _pr ); //В переменной _pr содержится информация //о типе корней: //1 - действительные, 2 - комплексные. //Оба флажка не установлены. if ( CheckBox1. Checked=false ) and ( CheckBox2. Checked=false ) then MessageDlg ( ’Выберите_тип_решения ’, mtInformation, [ mbOk ], 0 ); //Оба флажка установлены. if CheckBox1. Checked and CheckBox2. Checked then MessageDlg ( ’Решение_квадратного_уравнения ’ +chr (13)+ ’ X1= ’+_x1+ ’ X2= ’+_x2, mtInformation, [ mbOk ], 0 ); //Установлен первый флажок, //корни действительные. if CheckBox1. Checked and ( CheckBox2. Checked=false ) and ( _pr=1) then MessageDlg ( ’Дейсивительные корни ’, ’квадратного уравнения ’+ chr (13)+ ’ X1= ’+ _x1+ ’ X2= ’+_x2, mtInformation, [ mbOk ], 0 ); //Установлен второй флажок, //корни действительные. if ( CheckBox1. Checked=false ) and CheckBox2. Checked and ( _pr=1) then MessageDlg ( ’Уравнение имеет только ’, ’действительные корни. ’, mtInformation, [ mbOk ], 0 ); //Установлен первый флажок, корни комплексные. if CheckBox1. Checked and ( CheckBox2. Checked=false ) and ( _pr=2) then MessageDlg ( ’В уравнении действительных ’, ’корней нет ’, mtInformation, [ mbOk ], 0 ); //Установлен второй флажок, корни комплексные. if ( CheckBox1. Checked=false ) and CheckBox2. Checked and ( _pr=2) then MessageDlg ( ’Комплексные корни квадратного ’, ’уравнения ’+ chr (13)+ ’ X1= ’+_x1+ ’ X2= ’+_x2, mtInformation, [ mbOk ], 0 ); end else //Первый коэффициент равен нулю. MessageDlg ( ’Первый коэффициент не должен быть ’, ’нулевым ! ’, mtInformation, [ mbOk ], 0 ); end //Некорректный ввод данных. else MessageDlg ( ’Ошибка при вводе коэффициентов ! ’, mtInformation, [ mbOk ], 0 ); end; 2 : //Пользователь выбрал третий переключатель из группы. begin //Ввод исходных данных. val ( Edit1. Text, a_, kod_a ); val ( Edit2. Text, b_, kod_b ); val ( Edit3. Text, c_, kod_c ); val ( Edit4. Text, d_, kod_d ); //Ввод прошел успешно. if ( kod_a=0) and ( kod_b=0) and ( kod_c=0) and ( kod_d=0) then begin if a_<>0 then //Первый коэффициент не ноль. begin //Решение кубического уравнения. //В переменной _pr содержится информация //о типе корней: //1 - действительные, //2 - один действительный и два комплексных. korni_3 (a_, b_, c_, d_, _x1, _x2, _x3, _pr ); //Оба флажка не установлены. if ( CheckBox1. Checked=false ) and ( CheckBox2. Checked=false ) then MessageDlg ( ’Выберите тип решения ’, mtInformation, [ mbOk ], 0 ); //Оба флажка установлены. if CheckBox1. Checked and CheckBox2. Checked then MessageDlg ( ’Корни кубического ’, ’уравнения ’+ chr (13)+ ’ _X1= ’+_x1+ ’ X2= ’+_x2+ ’ X3= ’+_x3, mtInformation, [ mbOk ], 0 ); //Установлен первый флажок, //корни действительные. if CheckBox1. Checked and ( CheckBox2. Checked=false ) and ( _pr=1) then MessageDlg ( ’Действительные корни ’, ’кубического уравнения ’+chr (13)+ ’ X1= ’+_x1+ ’ X2= ’+_x2+ ’ X3= ’+_x3, mtInformation, [ mbOk ], 0 ); //Установлен первый флажок, корни комплексные. if CheckBox1. Checked and ( CheckBox2. Checked=false ) and ( _pr=2) then MessageDlg ( ’Действительные корни ’, ’кубического_уравнения ’+chr (13)+ ’ X1= ’+_x1, mtInformation, [ mbOk ], 0 ); //Установлен второй флажок, корни комплексные. if ( CheckBox1. Checked=false ) and CheckBox2. Checked and ( _pr=2) then MessageDlg ( ’Комплексные корни кубического_ ’, ’уравнения ’+ chr (13)+ ’ X1= ’+_x2+ ’ X2= ’+_x3, mtInformation, [ mbOk ], 0 ); //Установлен второй флажок, //корни действительные. if ( CheckBox1. Checked=false ) and CheckBox2. Checked and ( _pr=1) then MessageDlg ( ’Уравнение имеет только ’, ’действительные корни. ’, mtInformation, [ mbOk ], 0 ); end else MessageDlg ( ’Первый коэффициент не должен быть ’, ’нулевым ! ’, mtInformation, [ mbOk ], 0 ); end else //Некорректный ввод данных. MessageDlg ( ’Ошибка при вводе коэффициентов ! ’, mtInformation, [ mbOk ], 0 ); end; end; end; //Щелчок по кнопке ОЧИСТИТЬ. procedure TForm1. Button2Click ( Sender : TObject ); begin Label1. Caption := ’Введите коэффициенты ’; Label2. Caption := ’ a= ’; Label3. Caption := ’ b= ’; Label4. Caption := ’ c= ’; Label5. Caption := ’ d= ’; Edit1. Text := ’ 0.00 ’; Edit2. Text := ’ 0.00 ’; Edit3. Text := ’ 0.00 ’; Edit4. Text := ’ 0.00 ’; Button1. Caption := ’НАЙТИ КОРНИ ’; Button2. Caption := ’ОЧИСТИТЬ ’; Button3. Caption := ’ВЫХОД ’; CheckBox1. Caption := ’Действительные корни ’; CheckBox2. Caption := ’Комплексные корни ’; CheckBox1. Checked := true; Label4. Enabled := false; Label5. Enabled := false; Edit3. Enabled := false; Edit4. Enabled := false; CheckBox2. Enabled := false; RadioGroup1. ItemIndex : = 0; end; //Щелчок по кнопке ВЫХОД. procedure TForm1. Button3Click ( Sender : TObject ); begin close; end; //Событие открытие формы. procedure TForm1. FormCreate ( Sender : TObject ); begin Label1. Caption := ’Введите коэффициенты ’; Label2. Caption := ’ a= ’; Label3. Caption := ’ b= ’; Label4. Caption := ’ c= ’; Label5. Caption := ’ d= ’; Edit1. Text := ’ 0.00 ’; Edit2. Text := ’ 0.00 ’; Edit3. Text := ’ 0.00 ’; Edit4. Text := ’ 0.00 ’; Button1. Caption := ’НАЙТИ КОРНИ ’; Button2. Caption := ’ОЧИСТИТЬ ’; Button3. Caption := ’ВЫХОД ’; CheckBox1. Caption := ’Действительные корни ’; CheckBox2. Caption := ’Комплексные корни ’; CheckBox1. Checked := true; Label4. Enabled := false; Label5. Enabled := false; Edit3. Enabled := false; Edit4. Enabled := false; CheckBox2. Enabled := false; RadioGroup1. ItemIndex : = 0; end; //Выбор переключателя из группы. procedure TForm1. RadioGroup1Click ( Sender : TObject ); begin case RadioGroup1. ItemIndex of 0 : //Выбран первый из списка. begin Label2. Enabled := true; Label3. Enabled := true; Edit1. Enabled := true; Edit2. Enabled := true; Label2. Caption := ’ a= ’; Label3. Caption := ’ b= ’; Edit1. Text := ’ 0.00 ’; Edit2. Text := ’ 0.00 ’; Label4. Enabled := false; Label5. Enabled := false; Edit3. Enabled := false; Edit4. Enabled := false; CheckBox2. Enabled := false; end; 1 : //Выбран второй из списка. begin Label2. Enabled := true; Label3. Enabled := true; Label4. Enabled := true; Edit1. Enabled := true; Edit2. Enabled := true; Edit3. Enabled := true; Label2. Caption := ’ a= ’; Label3. Caption := ’ b= ’; Label4. Caption := ’ c= ’; Edit1. Text := ’ 0.00 ’; Edit2. Text := ’ 0.00 ’; Edit3. Text := ’ 0.00 ’; Label5. Enabled := false; Edit4. Enabled := false; CheckBox2. Enabled := true; end; 2 : //Выбран третий из списка. begin Label2. Enabled := true; Label3. Enabled := true; Label4. Enabled := true; Label5. Enabled := true; Edit1. Enabled := true; Edit2. Enabled := true; Edit3. Enabled := true; Edit4. Enabled := true; Label2. Caption := ’ a= ’; Label3. Caption := ’ b= ’; Label4. Caption := ’ c= ’; Label4. Caption := ’ d= ’; Edit1. Text := ’ 0. 0 0 ’; Edit2. Text := ’ 0. 0 0 ’; Edit3. Text := ’ 0. 0 0 ’; Edit4. Text := ’ 0. 0 0 ’; CheckBox2. Enabled := true; end; end; end; end.