В данной работе содержится технический проект к программе составленной в среде Lazarus.
Вложение | Размер |
---|---|
kvadratnye_uravneniya.rar | 364.6 КБ |
ГОУ СПО «ЗУБОВО-ПОЛЯНСКИЙ ПЕДАГОГИЧЕСКИЙ КОЛЛЕДЖ»
Утверждаю
Руководитель:
___________ Ласкин В.О.
«___» ______________ 2011 г.
ПРОГРАММА РЕШЕНИЯ КВАДРАТНЫХ УРАВНЕНИЙ
Технический проект
Листов 15
Исполнитель, ______________ Пинясов В.
Зубова Поляна, 2011 г.
СОДЕРЖАНИЕ
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К ТЕХНИЧЕСКОМУ ПРОЕКТУ ………….3
Общие положения …………………………………………………………3
Структура входных и выходных данных …………………………………3
Алгоритм решения задачи ………………………………………………..3
Формы данных ……………………………………………………………..6
Листинг программного кода ………………………………………………7
Конфигурация технических средств ……………………………………14
План работ ………………………………………………………………14
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ …………………………15
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К ТЕХНИЧЕСКОМУ ПРОЕКТУ
1. Общие положения
Данный документ является техническим проектом на создание программы решения квадратных уравнений. Цели и назначение программы указаны в техническом задании.
2. Структура входных и выходных данных
Входными данными являются коэффициенты квадратного уравнения вида , где a, b, c могут быть представлены целыми числами, а также десятичными дробями. Программа так же предусматривает ввод коэффициентов в виде обыкновенных дробей, поэтому общий вид квадратного уравнения сводится к следующему:
Выходными данными являются все возможные решения квадратного уравнения:
x, x1, x2, «Данное выражение не является уравнением», «Нет действительных корней» (если не стоит флажок «Комплексные решения»), , (если стоит флажок «Комплексные решения»).
3. Алгоритм решения задачи
Уравнение можно представить в виде
Сделаем подстановку , , .
Получим
Общий алгоритм решения данного уравнения представлен в таблице 1.
№ | a | b | c | Решение |
1 | a=0 | b=0 | c=0 | Данное выражение не является уравнением |
2 | a=0 | b=0 | c<>0 | Данное выражение не является уравнением |
3 | a=0 | b<>0 | c=0 | |
4 | a=0 | b<>0 | c<>0 | |
5 | a<>0 | b=0 | c=0 | |
6 | a<>0 | b=0 | c<>0 | Если то Иначе «Нет действительных корней» или (если стоит флажок «Комплексные решения») |
7 | a<>0 | b<>0 | c=0 | |
8 | a<>0 | b<>0 | c<>0 | Если то Если то Если то «Нет действительных корней» или (если стоит флажок «Комплексные решения») |
Таблица 1. Решения квадратного уравнения в зависимости от введенных коэффициентов
Исходя из этого, общий алгоритм решения можно представить в виде следующей блок-схемы:
Рисунок 1. Алгоритм нахождения корней
При составлении программы большая часть кода направлена на изменение свойств объектов форм. Данный код не представлен в виде блок схем, т.к. он присутствует в листинге кода.
4. Формы данных
В программе представлены две формы: главная и форма ввода данных.
меню MainMenu1
Корни уравнения Label13, Label14
Найти или нет комплексные корни CheckBox1
уравнение
Рисунок 2. Главная форма программы
Уравнение имеет следующую структуру:
Label2
Label8
Label6
Label5
Label3
Label9
Label1
Label10
Label4
Label7
Label12
Label11
Рисунок 3. Структура уравнения
MenuItem1
MenuItem5
Меню состоит из следующих элементов:
MenuItem4
MenuItem2
MenuItem3
Числители и знаменатели дробей
Label3
Label4
Button1
Label6
Label5
Label2
Label1
CheckBox3
CheckBox2
CheckBox1
Указывает целое число или в виде обыкновенной дроби
Рисунок 4. Окно ввода данных
5. Листинг программного кода
Листинг 1.
// Процедура при нажатии на меню файл
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
if (Form1.Label9.Caption<>'') then
begin
Form1.MenuItem3.Enabled:=true;
Form1.CheckBox1.Enabled:=true;
end;
end;
Листинг 2.
// процедура при нажатии на меню новый
procedure TForm1.MenuItem2Click(Sender: TObject);
begin
if (form2.Visible=false) then
Form1.Label1.Caption:='';
Form1.Label1.Font.Style:=[fsUnderline];
Form1.Label5.Caption:='';
Form1.Label5.Font.Style:=[fsUnderline];
Form1.Label8.Caption:='';
Form1.Label8.Font.Style:=[fsUnderline];
Form1.Label2.Caption:='';
Form1.Label3.Caption:='';
Form1.Label4.Caption:='';
Form1.Label6.Caption:='';
Form1.Label7.Caption:='';
Form1.Label9.Caption:='';
Form1.Label10.Caption:='';
Form1.Label11.Caption:='';
Form1.Label12.Caption:='';
Form1.CheckBox1.Checked:=false;
Form1.CheckBox1.Visible:=false;
Form1.Label13.Caption:='';
Form1.Label14.Caption:='';
Form1.MenuItem3.Enabled:=false;
form2.Visible:=true;
end;
Листинг 3.
// процедура при нажатии на меню решить
procedure TForm1.MenuItem3Click(Sender: TObject);
var af, asec, bf, bsec, cf, csec, a, b, c, d: real;
begin
// запись данных
if (Form1.Label1.Caption='') then
af:=0
else af:=StrToFloat(Form1.Label1.Caption);
if (Form1.Label10.Caption='') then
asec:=1
else asec:=StrToFloat(Form1.Label10.Caption);
if (Form1.Label5.Caption='') then
bf:=0
else bf:=StrToFloat(Form1.Label5.Caption);
if (Form1.Label11.Caption='') then
bsec:=1
else bsec:=StrToFloat(Form1.Label11.Caption);
if (Form1.Label8.Caption='') then
cf:=0
else cf:=StrToFloat(Form1.Label8.Caption);
if (Form1.Label12.Caption='') then
csec:=1
else csec:=StrToFloat(Form1.Label12.Caption);
// решение уравнения
a:=af*bsec*csec;
b:=bf*asec*csec;
c:=cf*bsec*asec;
if ((a=0)and(b=0)) then
Form1.Label13.Caption:='Данное выражение не является уравнением'
else if (((a=0)and(b<>0))and(c=0)) then
Form1.Label13.Caption:='x=0'
else if (((a=0)and(b<>0))and(c<>0)) then
Form1.Label13.Caption:='x='+FloatToStr(-c/b)
else
begin
d:=b*b-4*a*c;
if (d=0) then
Form1.Label13.Caption:='x='+FloatToStr(-b/(2*a));
if (d>0) then
begin
Form1.Label13.Caption:='x1='+FloatToStr((-b+sqrt(d))/(2*a));
Form1.Label14.Caption:='x2='+FloatToStr((-b-sqrt(d))/(2*a));
end;
if (d<0) then
begin
if (Form1.CheckBox1.Checked=false) then
Form1.Label13.Caption:='нет действительных корней'
else
begin
Form1.Label13.Caption:='x1='+FloatToStr(-b/(2*a))+'+'+FloatToStr(sqrt(-d)/(2*a))+'i';
Form1.Label14.Caption:='x2='+FloatToStr(-b/(2*a))+'-'+FloatToStr(sqrt(-d)/(2*a))+'i';
end;
end;
end;
end;
Листинг 4.
// Процедура при нажатии на меню выход
procedure TForm1.MenuItem4Click(Sender: TObject);
begin
form1.Close;
form2.Close;
end;
Листинг 5.
// привязка файла справки
// справка должна находится по указанному пути
// Необходимо подключить модуль Windows
procedure TForm1.MenuItem5Click(Sender: TObject);
begin
ShellExecute (Form1.Handle, nil, '.\help.chm', nil, nil, SW_RESTORE);
end;
Листинг 6.
// процедура при щелчке на a - целое
procedure TForm2.CheckBox1Change(Sender: TObject);
begin
if (CheckBox1.Checked=true) then
begin
label2.Visible:=false;
edit2.Visible:=false;
edit2.Text:='1';
label1.Caption:='Введите число:';
end
else
begin
label2.Visible:=true;
edit2.Visible:=true;
edit2.Text:='';
label1.Caption:='Введите числитель:';
end;
end;
Листинг 7.
// процедура при щелчке на b - целое
procedure TForm2.CheckBox2Change(Sender: TObject);
begin
if (CheckBox2.Checked=true) then
begin
label4.Visible:=false;
edit4.Visible:=false;
edit4.Text:='1';
label3.Caption:='Введите число:';
end
else
begin
label4.Visible:=true;
edit4.Visible:=true;
edit4.Text:='';
label3.Caption:='Введите числитель:';
end;
end;
Листинг 8.
// процедура при щелчке на с - целое
procedure TForm2.CheckBox3Change(Sender: TObject);
begin
if (CheckBox3.Checked=true) then
begin
label6.Visible:=false;
edit6.Visible:=false;
edit6.Text:='1';
label5.Caption:='Введите число:';
end
else
begin
label6.Visible:=true;
edit6.Visible:=true;
edit6.Text:='';
label5.Caption:='Введите числитель:';
end;
end;
Листинг 9.
// Процедура при щелчке по кнопке Сохранить
procedure TForm2.Button1Click(Sender: TObject);
var otstup:integer;
begin
// Проверка вводимых данных
If (((Proverka(CheckBox1.Checked, Edit1.Text, Edit2.Text))
and(Proverka(CheckBox2.Checked, Edit3.Text, Edit4.Text)))
and(Proverka(CheckBox3.Checked, Edit5.Text, Edit6.Text)))
then
begin
// заполнение элементов главной формы
// заполнение первой дроби
postroenie(Form2.Edit1, Form2.Edit2, Form1.Label1, Form1.Label10);
// запись х в квадрате
if (Form1.Label1.Caption<>'') then
begin
Form1.Label2.Caption:='x';
Form1.Label3.Caption:='2';
end;
// запись первого плюса
if ((Form2.Edit1.Text<>'0')and((Form2.Edit3.Text<>'0')or
(Form2.Edit5.Text<>'0'))) then
Form1.Label4.Caption:='+';
// заполнение второй дроби
postroenie(Form2.Edit3, Form2.Edit4, Form1.Label5, Form1.Label11);
// запись х после второй дроби
if (Form1.Label5.Caption<>'') then
Form1.Label6.Caption:='x';
// запись второго плюса
if ((Form2.Edit3.Text<>'0')and(Form2.Edit5.Text<>'0')) then
Form1.Label7.Caption:='+';
// заполнение третьей дроби
postroenie(Form2.Edit5, Form2.Edit6, Form1.Label8, Form1.Label12);
if ((Form1.Label1.Caption='')and(Form1.Label5.Caption=''))
and(Form1.Label8.Caption='')) then
begin
Form1.Label8.Caption:='0';
Form1.Label8.Font.Style:=[];
end;
// заполнение правой части уравнения
Form1.Label9.Caption:='=0';
Form1.CheckBox1.Visible:=true;
// установка отступов для элементов главной формы
otstup:=17;
if (Form1.Label1.Caption<>'') then
begin
Form1.Label1.Left:=otstup;
Form1.Label10.Left:=otstup;
otstup:=otstup+postroenie(Form2.Edit1, Form2.Edit2, Form1.Label1,
Form1.Label10);
end;
if (Form1.Label2.Caption<>'') then
begin
Form1.Label2.Left:=otstup;
otstup:=otstup+Form1.Label2.Width;
end;
if (Form1.Label3.Caption<>'') then
begin
Form1.Label3.Left:=otstup;
otstup:=otstup+Form1.Label3.Width;
end;
if (Form1.Label4.Caption<>'') then
begin
Form1.Label4.Left:=otstup;
otstup:=otstup+Form1.Label4.Width;
end;
if (Form1.Label5.Caption<>'') then
begin
Form1.Label5.Left:=otstup;
Form1.Label11.Left:=otstup;
otstup:=otstup+postroenie(Form2.Edit3, Form2.Edit4, Form1.Label5,
Form1.Label11);
end;
if (Form1.Label6.Caption<>'') then
begin
Form1.Label6.Left:=otstup;
otstup:=otstup+Form1.Label6.Width;
end;
if (Form1.Label6.Caption<>'') then
begin
Form1.Label7.Left:=otstup;
otstup:=otstup+Form1.Label7.Width;
end;
if (Form1.Label8.Caption<>'') then
begin
Form1.Label8.Left:=otstup;
Form1.Label12.Left:=otstup;
if (Form1.Label8.Caption='0') then
otstup:=otstup+Form1.Label8.Width
else
otstup:=otstup+postroenie(Form2.Edit5, Form2.Edit6, Form1.Label8,Form1.Label12);
end;
Form1.Label9.Left:=otstup;
Form2.Close;
end
else
messageDlg('Данные введены не корректно', MtInformation, [MbOk], 0 );
end;
Листинг 10.
// функция проверки данных на допустимость вввода
function TForm2.proverka(a:boolean; b, c:string): boolean;
var n: real;
i, k:integer;
begin
if (a=true) then
begin
If (TryStrToFloat(b, n)) then // если первое поле вещественное возвращаем true
result:=true
else result:=false;
end
else
begin
If (((TryStrToInt(b, i))and(TryStrToInt(c, k)))and(k<>0)) then
// если поля целые и второе поле не ноль возвращаем true
result:=true
else result:=false;
end;
end;
Листинг 11.
// функция построения дробей
function TForm2.postroenie(a, b: TEdit; c, d: TLabel): integer;
var s: integer;
begin
if (a.Text='0') Then
begin
c.Caption:='';
d.Caption:='';
result:=c.Width;
end
else
begin
if (b.Text='1') Then
begin
d.Caption:='';
c.Caption:=a.Text;
c.Font.Style:=[];
result:=c.Width;
end
else
begin
c.Caption:=a.Text;
d.Caption:=b.Text;
s:=c.Width;
if (d.Width>s) Then
s:=d.Width;
result:=s;
end;
end;
end;
6. Конфигурация технических средств
Минимальная конфигурация:
• тип процессора. Pentium и выше;
• объем оперативного запоминающего устройства 32 Мб и более;
• объем свободного места на жестком диске 40 Мб.
Рекомендуемая конфигурация:
• тип процессора. Pentium II 400;
• объем оперативного запоминающего устройства 128 Мб;
• объем свободного места на жестком диске 60 Мб.
4.4. Требования к программной совместимости. Программа должна работать под управлением семейства опе рационных систем Win 32 (Windows /XP/Vista/Seven и т. п.).
7. План работ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Интернет ресурсы:
http://freepascal.ru – информационный портал для разработчиков.
http://www.delphisources.ru – статьи по программированию
Зимовье зверей
Кактусы из сада камней
Мороз и заяц
Пейзаж
Рисуем "Ночь в лесу"