- •1 Средства разработки программ на языке Free Pascal
- •1.1 Процесс разработки программы
- •1.2 Среда программирования Free Pascal
- •1.2.1 Работа в текстовом редакторе Free Pascal
- •1.2.2 Запуск программы в среде Free Pascal и просмотр результатов
- •1.3 Текстовый редактор Geany
- •1.4 Среда визуального программирования Lazarus
- •1.4.1 Установка Lazarus в ОС Linux
- •1.4.2 Установка Lazarus под управлением ОС Windows
- •1.4.3 Среда Lazarus
- •1.4.4 Главное меню Lazarus
- •1.4.5 Окно формы
- •1.4.6 Окно редактора Lazarus
- •1.4.7 Панель компонентов
- •1.4.8 Инспектор объектов
- •1.4.9 Первая программа в Lazarus
- •1.4.10 Полезная программа
- •1.4.11 Консольное приложение среды Lazarus
- •1.4.12 Операторы ввода - вывода данных
- •2 Общие сведения о языке программирования Free Pascal
- •2.1 Структура проекта Lazarus
- •2.2 Структура консольного приложения
- •2.3 Элементы языка
- •2.4 Данные в языке Free Pascal
- •2.4.1 Символьный тип данных
- •2.4.2 Целочисленный тип данных
- •2.4.3 Вещественный тип данных
- •2.4.4 Тип дата-время
- •2.4.5 Логический тип данных
- •2.4.6 Создание новых типов данных
- •2.4.7 Перечислимый тип данных
- •2.4.8 Интервальный тип
- •2.4.9 Структурированные типы
- •2.4.10 Указатели
- •2.5 Операции и выражения
- •2.5.1 Арифметические операции
- •2.5.2 Операции отношения
- •2.5.3 Логические операции
- •2.5.4 Операции над указателями
- •2.6 Стандартные функции
- •2.7 Задачи для самостоятельного решения
- •3 Операторы управления
- •3.1 Основные конструкции алгоритма
- •3.2 Оператор присваивания
- •3.3 Составной оператор
- •3.4 Условные операторы
- •3.4.1 Условный оператор if…then…else
- •3.4.2 Оператор варианта case
- •3.5 Обработка ошибок. Вывод сообщений в среде Lazarus
- •3.6 Операторы цикла
- •3.6.1 Оператор цикла с предусловием while .. do
- •3.6.2 Оператор цикла с постусловием repeat … until
- •3.6.3 Оператор цикла for … do
- •3.7 Операторы передачи управления
- •3.8 Решение задач с использованием циклов
- •3.9 Ввод данных из диалогового окна в среде Lazarus
- •3.10 Задачи для самостоятельного решения
- •3.10.1 Разветвляющийся процесс
- •3.10.2 Циклический процесс
- •4 Подпрограммы
- •4.2 Формальные и фактические параметры. Передача параметров в подпрограмму
- •4.3 Процедуры
- •4.4 Функции
- •4.5 Решение задач с использованием подпрограмм
- •4.6 Рекурсивные функции
- •4.7 Особенности работы с подпрограммами
- •4.7.1 Параметры-константы
- •4.7.2 Процедурные типы
- •4.8 Разработка модулей
- •4.9 Задачи для самостоятельного решения
- •5 Использование языка Free Pascal для обработки массивов
- •5.1 Общие сведения о массивах
- •5.2 Описание массивов
- •5.3 Операции над массивами
- •5.4 Ввод-вывод элементов массива
- •5.4.2 Ввод-вывод данных в визуальных приложениях
- •5.5 Вычисление суммы и произведения элементов массива
- •5.6 Поиск максимального элемента в массиве и его номера
- •5.7 Сортировка элементов в массиве
- •5.7.1 Сортировка методом «пузырька»
- •5.7.2 Сортировка выбором
- •5.8 Удаление элемента из массива
- •5.9 Вставка элемента в массив
- •5.10 Использование подпрограмм для работы с массивами
- •5.11 Использование указателей для работы с динамическими массивами
- •5.11.1 Работа с динамическими переменными и указателями
- •5.11.2 Работа с динамическими массивами с помощью процедур getmem и freemem
- •5.12 Примеры программ
- •5.13 Задачи для самостоятельного решения
- •6 Обработка матриц во Free Pascal
- •6.1 Ввод-вывод матриц
- •6.2 Алгоритмы и программы работы с матрицами
- •6.3 Динамические матрицы
- •6.4 Задачи для самостоятельного решения
- •7 Обработка файлов средствами Free Pascal
- •7.1 Типы файлов
- •7.2 Работа с типизированными файлами
- •7.2.1 Процедура AssignFile
- •7.2.2 Процедуры reset, rewrite
- •7.2.3 Процедура СloseFile
- •7.2.4 Процедура rename
- •7.2.5 Процедура erase
- •7.2.6 Функция eof
- •7.2.7 Чтение и запись данных в файл
- •7.3 Бестиповые файлы в языке Free Pascal
- •7.4 Обработка текстовых файлов в языке Free Pascal
- •7.5 Задачи для самостоятельного решения
- •8 Работа со строками и записями
- •8. 1 Обработка текста
- •8.2 Работа с записями
- •8.3 Задачи для самостоятельного решения по теме «Строки»
- •8.4 Задачи для самостоятельного решения по теме «Записи»
- •9.1 Основные понятия
- •9.2 Инкапсуляция
- •9.3 Наследование и полиформизм
- •9.4 Перегрузка операций
- •9.5 Задачи для самостоятельного решения
- •10 Графика во Free Pascal
- •10.1 Средства рисования в Lazarus
- •10.2 Построение графиков
- •10.3 Задачи для самостоятельного решения
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на 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
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на 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.