Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lazarus.pdf
Скачиваний:
527
Добавлен:
09.02.2015
Размер:
4.79 Mб
Скачать

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

176

//Удаление последней цифры числа. M:=M div 10;

/Уменьшение разрядности.

j:=j div 100;

/

end;

 

end;

 

//Основная программа.

 

var X:longint; pr:boolean; begin

//Ввод элемента последовательности. write('X=');readln(X);

//Пусть в последовательности нет палиндромов. pr:=false;

while X<>0 do //Пока не ноль, begin

if palindrom(X,cifra_kol(X)) then begin

pr:=true;

//Найдено число палиндром,

break;

//досрочный выход из цикла.

End;

//Ввод следующего элемента последовательности. write('X=');readln(X);

end;

if pr then writeln('Последовательность содержит число-палиндром.')

else writeln('Последовательность не содержит палиндромов.');

end.

4.5Решение задач с использованием подпрограмм

Вэтом разделе мы рассмотрим задачи с несложными алгоритмами, но больше внимания уделим их интерфейсу в среде Lazarus.

ЗАДАЧА 4.5. Создать программу, которая автоматизирует процесс перевода градусной меры угла в радианную и наоборот, в зависимости от выбора пользователя. То есть пользователь должен выбрать, как он будет вводить угол, в радианах или в градусах. Введет в радианах, ответ получит в градусах и, соответственно, введет в градусах, ответ получит в радианах.

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

177

С точки зрения математика задача не вызывает сложности: •чтобы найти радианную меру какого-нибудь угла по данной гра-

дусной его мере, нужно умножить число градусов на 180 , число

минут - на

 

, число секунд - на

 

и найденные

180 60

180 60 60

произведения сложить; •чтобы найти градусную меру угла по заданной радианной нужно

умножить число радиан на 180 ; если из полученной дроби выде-

лить целую часть, то получим градусы; если из числа полученного умножением оставшейся дробной части на 60, выделить целую часть получим минуты; секунды вычисляются аналогично из дробной части минут.

Для перевода угла из градусной меры в радианную создадим

функцию

function gradus_radian(gradus,minuta,secunda:byte):real;

в которую будем передавать целочисленные значения градусов, минут и секунд. Результат работы функции – вещественное число, величина угла в радианах.

Задачу перевода из радианной меры в градусную решим, создав

процедуру

procedure radian_gradus(radian:real;

var gradus,minuta,secunda:byte);

у которой один входной параметр – радианная мера угла и три выходных – градусы, минуты и секунды.

Разработаем интерфейс будущей программы в среде Lazarus. Создадим новый проект, установим свойства формы так, как показано в табл. 4.1, и разместим на ней компоненты в соответствии с рис. 4.2.

Таблица 4.1. Свойства формы

 

 

 

Свойство

Значение

Описание

 

 

свойства

Caption

Величина угла

Заголовок формы

Height

265

Высота формы

Width

325

Ширина формы

BorderIcons.BiMaximize

false

Кнопка

разверты-

 

 

вания

окна недо-

 

 

ступна

 

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

178

 

 

 

 

Свойство

Значение

Описание

 

 

 

свойства

 

BorderStyle

bdDialog

Стиль рамки – диа-

 

 

логовое окно,

не

 

 

изменяет размеры

Position

poScreenCenter

Окно появится

в

 

 

центре экрана

 

С компонентами Edit, Label

 

 

и Button мы уже хорошо зна-

 

 

комы.

Компонент RadioButton

– это переключатель. Его ис-

 

пользуют для выбора одного из

 

нескольких

взаимоисключаю-

 

щих решений. Обычно на фор-

 

му

помещается,

по меньшей

 

мере, два

таких

компонента.

 

Они могут иметь только два со-

 

стояния, определяемых свой-

Рисунок 4.1: Настройка фор-

ством Checked. Если у одного

мы к задаче 4.5

из

компонентов

это свойство

 

истинно true, то во всех остальных ложно false. В данной задаче используется два компонента RadioButton1 и RadioButton2,

предоставляя пользователю выбор: включен первый компонент – будет осуществлен перевод из градусной меры в радианную, включен второй – наоборот. Двойной щелчок по компоненту RadioButton1

приведет к созданию процедуры TForm1.RadioButton1Click об-

работки события «Щелчок мыши по кнопке переключателя». В тексте процедуры следует указать команды, которые будут выполняться, если пользователь включил или выключил компонент.

Нам уже известно, что свойства компонентов могут изменяться как в окне конструирования формы, так и непосредственно в программе. Если дважды щелкнуть по форме, вне размещенных на ней компонентов, то будет создана процедура TForm1.FormCreate об-

работки события открытия формы. На вкладке События инспектора

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

179

объектов это событие носит название OnCreate. В процедуре TForm1.FormCreate можно задать свойства всех компонентов на

момент открытия формы.

Кнопки, расположенные на форме, несут следующую функциональную нагрузку:

Button1 запускает процесс перевода в зависимости от установок переключателей;

Button3 возвращает внешний вид формы в первоначальное со-

стояние (до ввода и вывода данных);

Button2 – завершает процесс выполнения программы.

Текст программы с необходимыми комментариями приведен ниже. Результаты работы программы представлены на рис. 4.4 и рис.

4.5.

unit Unit1; interface uses

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

type

TForm1 = class(TForm) Button1: TButton; Label1: TLabel;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton; Edit1: TEdit;

Button2: TButton;

Label2: TLabel;

Edit2: TEdit;

Edit3: TEdit;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Edit4: TEdit; Button3: TButton;

procedure Button1Click(Sender: TObject); procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure FormCreate(Sender: TObject);

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

180

procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; implementation {$R *.dfm}

//Щелчок по кнопке ВЫЧИСЛИТЬ.

procedure TForm1.Button1Click(Sender: TObject); //Функция перевода данных из градусов //в радианы.

function gradus_radian (gradus,minuta,secunda:byte):real;

begin gradus_radian:=

gradus*pi/180+minuta*pi/180/60+

secunda*pi/180/60/60;

end;

//Процедура перевода из радиан в градусы. procedure radian_gradus(radian:real;

var gradus,minuta,secunda:byte);

begin gradus:=trunc(radian*180/pi);

minuta:= trunc((radian*180/pi-gradus)*60); secunda:=trunc(((radian*180/pi-

gradus)*60-minuta)*60);

end;

var

//Описание переменных.

grad,min,sec:byte;

//Градусная

мера

угла.

rad:real;

//Радианная

мера

угла.

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

181

//Контроль ввода. kod_g,kod_m,kod_s,kod_r:integer; begin

//Если первый переключатель вкл. if RadioButton1.Checked then

begin

//Ввод градусов.

Val(Edit1.Text,grad,kod_g);

Val(Edit2.Text,min,kod_m);

//Ввод

минут.

Val(Edit3.Text,sec,kod_s);

//Ввод

секунд.

//Если ошибки при вводе не было, то

if (kod_g=0) and (kod_m=0) and (kod_s=0) then begin

//сделать видимым компонент Label2 Label2.Visible:=true;

//и вывести туда результат вычислений. //Вызов функции gradus_radian //перевода из градусов в радианы.

Label2.Caption:='Величина угла ' +chr(13)+ FloatToStrF(gradus_radian(grad,min,sec), ffFixed,8,6)+' радиан';

end else

//Иначе выдать сообщение об ошибке при вводе. MessageDlg('Ошибка при вводе данных!',

MtWarning,[mbOk],0);

end;

//Если второй переключатель вкл. if RadioButton2.Checked then begin

//Ввод радианной меры угла. Val(Edit4.Text,rad,kod_r); //Если нет ошибок при вводе, то if (kod_r=0)then

begin

//сделать видимым компонент Label2 Label2.Visible:=true;

//и вывести туда результат вычислений.

//Вызов процедуры перевода из радиан в градусы.

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

182

radian_gradus(rad,grad,min,sec); Label2.Caption:='Величина угла' +chr(13)

+IntToStr(grad)+' г '+IntToStr(min) +' м '+IntToStr(sec)+' с';

end else

//Иначе выдать сообщение об ошибке при вводе. MessageDlg('Ошибка при вводе данных!',

MtWarning,[mbOk],0);

end;

end;

//Щелчок по кнопке ВЫХОД.

procedure TForm1.Button2Click(Sender: TObject); begin

close;

end;

//Щелчок по кнопке ОЧИСТИТЬ.

procedure TForm1.Button3Click(Sender: TObject); begin

//Установка свойств компонентов //в первоначальное состояние. Edit1.Text:='00'; Edit2.Text:='00'; Edit3.Text:='00'; Edit4.Text:='00.000'; Label1.Caption:='Введите значение'; Label1.Font.Size:=10; Label3.Caption:='Градусы'; Label4.Caption:='Минуты'; Label5.Caption:='Секунды'; Button1.Caption:='ВЫЧИСЛИТЬ'; Button2.Caption:='ВЫХОД'; Button3.Caption:='ОЧИСТИТЬ'; Edit4.Enabled:=false; Label2.Visible:=false; RadioButton1.Checked:=true; RadioButton2.Checked:=false;

end;

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

183

//Обработка события открытие формы. procedure TForm1.FormCreate(Sender: TObject); begin

//Установка свойств компонентов. Edit1.Text:='00'; Edit2.Text:='00'; Edit3.Text:='00'; Edit4.Text:='00.000'; Label1.Caption:='Введите значение'; Label1.Font.Size:=10; Label3.Caption:='Градусы'; Label4.Caption:='Минуты'; Label5.Caption:='Секунды'; Button1.Caption:='ВЫЧИСЛИТЬ'; Button2.Caption:='ВЫХОД'; Button3.Caption:='ОЧИСТИТЬ'; Edit4.Enabled:=false; Label2.Visible:=false; RadioButton1.Checked:=true; RadioButton2.Checked:=false;

end;

//Обработка события щелчок

//по переключателю RadioButton1. procedure Tform1.RadioButton1Click(

Sender: TObject);

begin

if RadioButton1.Checked then begin

Edit1.Enabled:=true;

Edit2.Enabled:=true;

Edit3.Enabled:=true;

Label5.Enabled:=true;

Label3.Enabled:=true;

Label4.Enabled:=true;

Edit4.Enabled:=false;

end;

end;

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

184

Рисунок 4.2: Перевод

Рисунок 4.3: Перевод

значений из градусной меры в

значений из радианной меры

радианную

в градусную

//Обработка события щелчок

//по переключателю RadioButton2. procedure Tform1.RadioButton2Click(

Sender: TObject);

begin

if RadioButton2.Checked then begin

Edit4.Enabled:=true;

Button1.Enabled:=true;

Edit1.Enabled:=false;

Edit2.Enabled:=false;

Edit3.Enabled:=false;

Label3.Enabled:=false;

Label4.Enabled:=false;

Label5.Enabled:=false;

end;

end;

end.

ЗАДАЧА 4.6. Создать программу для решения уравнений: •линейное ax+b=0;

•квадратное ax2+bx+c=0; •кубическое ax3+bx2+cx+d=0.

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

185

Решение линейного уравнения тривиально x=-b/a, алгоритмы решения квадратного и кубического уравнений подробно рассмотрены в задачах

3.4и 3.5.

Создадим новый проект

(рис. 4.4). Свойства формы настроим по табл. 4.1, за исключением свойства Caption,

которому присвоим значение

Решение уравнения.

Рисунок 4.4: Процесс создания формы к задаче 4.6

Обратите внимание, что на форме появились не знакомые нам компоненты. Это CheckBox – флажок и RadioGroup – группа

переключателей.

Компонент флажок CheckBox используется для того, чтобы

пользователь мог включить или выключить значение какого-либо параметра. Установлен флажок или нет, определяет свойство Checked

(true, false). В составе диалогового окна может быть несколько

таких компонентов, причем состояние любого из них не зависит от состояния остальных.

Компонент группа переключателей RadioGroup объединяет в

себе несколько переключателей. Каждый размещенный в нем переключатель помещается в специальный список Items и доступен

по номеру, установленному в свойстве ItemIndex. После размеще-

ния на форме компонент пуст. Чтобы создать в нем хотя бы один переключатель, нужно выделить его, обратиться к инспектору объектов и выбрать свойство Items редактор списка. Строки, набранные

в редакторе, используются как поясняющие надписи справа от переключателей, а их количество определяет количество переключателей в группе. В нашем случае окно редактора списка будет иметь вид, как на рис. 4.5.

После создания компонента группа переключателей его свойство номер переключателя ItemIndex по умолчанию равно –1. Это озна-

чает, что ни один компонент в группе не установлен.

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

186

 

Чтобы в момент появле-

 

ния компонента на экране

 

один из переключателей был

 

отмечен, нужно либо на эта-

 

пе конструирования формы,

 

либо программно присвоить

 

свойству ItemIndex номер

 

одного из элементов списка,

 

учитывая, что нумерация на-

Рисунок 4.5: Окно редактора списка

чинается с нуля.

 

 

 

С остальными компонентами, размещенными на форме, пользователь уже знаком. На рис. 4.6 - 4.8 видно, как работает программа. Пользователю предоставляется возможность выбрать вид решаемого уравнения, ввести его коэффициенты и указать, какие решения — действительные или комплексные (если это возможно) — он хотел бы получить. Далее приведен текст программного модуля с комментария-

ми:

unit Unit1; interface uses

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

ExtCtrls;

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;

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

187

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); //Решение линейного уравнения.

//Параметры процедуры korni_1: //a,b — вещественные переменные, //коэффициенты уравнения;

//x_ - строковая переменная,

//решение уравнения в символьном виде. procedure korni_1(a,b:real;var x_:string);

//x - решение уравнения в численном виде var x:real;

begin x:=-b/a;

x_:=FloatToStrF(x,ffFixed,5,2); end;

//Решение квадратного уравнения. //Параметры процедуры korni_2: //a,b,c — вещественные переменные, //коэффициенты уравнения; //x1_,x2_ - строковые переменные,

//решение уравнения в символьном виде;

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

188

//pr — целочисленная переменная, //принимает значение, равное 1, если //уравнение имеет действительные корни, //и значение, равное 2, если корни мнимые. procedure korni_2(a,b,c:real;

var x1_,x2_:string;var pr:byte); //x1,x2 - решение уравнения в численном виде, //d — дискриминант.

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;

//Решение кубического уравнения. //Параметры процедуры korni_3: //a,b,c,d — вещественные переменные, //коэффициенты уравнения; //x1_,x2_,x3_ - строковые переменные, //решение уравнения в символьном виде; //pr — целочисленная переменная, //принимает значение, равное 1, если

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

189

//уравнение имеет действительные корни, //и значение, равное 2, если в уравнении //один корень действительный и два мнимых. procedure korni_3(a,b,c,d:real;

var x1_,x2_,x3_:string;var pr:byte); //x1,x2,x3 - решения в численном виде. var r,s,t,p,q,ro,fi,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*pi/3)-r/3; x3:=2*exp(1/3*ln(ro))*cos(fi/3+4*pi/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

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

190

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; //1 действительный и

//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: //Пользователь выбрал 1-й переключатель. Begin //Решение линейного уравнения.

//Ввод исходных данных. val(Edit1.Text,a_,kod_a); val(Edit2.Text,b_,kod_b); //Ввод прошел успешно.

if (kod_a=0) and (kod_b=0) then begin

//1-й коэффициент не ноль. if a_<>0 then

begin

//Решение линейного уравнения. korni_1(a_,b_,_x);

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

191

//Вывод найденного значения. MessageDlg('Решение линейного уравнения x='+

_x,mtInformation,[mbOk],0);

end

//1-й коэффициент равен нулю, else

//вывод соответствующего сообщения. MessageDlg('Нет корней!',

mtInformation,[mbOk],0);

end

else //Некорректный ввод данных. MessageDlg('Ошибка при вводе!',

mtInformation,[mbOk],0);

end;

1: //Пользователь выбрал 2-й переключатель. 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

end else

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

192

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('Первый коэффициент не равен 0!',

mtInformation,[mbOk],0); //Некорректный ввод данных.

MessageDlg('Ошибка при вводе коэффициентов!',

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

193

mtInformation,[mbOk],0);

end;

2: //Пользователь выбрал 3-й переключатель. 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('Действительные корни уравнения'+

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

194

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('Первый коэффициент не равен 0!', 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=';

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

195

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:='ВЫХОД';

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

196

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;

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

197

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.00';

Edit2.Text:='0.00';

Edit3.Text:='0.00';

Edit4.Text:='0.00';

CheckBox2.Enabled:=true;

end;

end;

end;end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]