Метод низпадаючої розробки (згори – вниз) полягає в наступному. Як і в попередньому методі спочатку будується модульна структура програми у виді дерева. Потім по черзі програмуються модулі програми, починаючи з модуля самого верхнього рівня (головного), переходячи до програмування якого-небудь іншого модуля тільки в тому випадку, якщо вже запрограмований модуль, який до нього звертається. Після того, як усі модулі програми запрограмовані, виконується їхнє почергове тестування і налагодження в такому ж низпадаючому) порядку. При цьому першим тестуєтьсяя головний модуль програми. При цьому ті модулі, до яких може звертатися головний, заміняються їхніми імітаторами. Після завершення тестування і налагодження головного і будь-якого наступного модуля виробляється перехід до тестування одного з модулів, що у даний момент представлені імітаторами, якщо такі маються. Для цього імітатор обраного для тестування модуля заміняється самим цим модулем і, крім того, додаються імітатори тих модулів, до яких може звертатися обраний для тестування модуль. При такому порядку розробки програми вся необхідна глобальна інформація формується вчасно, тобто ліквідується дуже неприємне джерело прорахунків при програмуванні модулів. Деяким недоліком низпадаючої розробки, що приводить до певних ускладнень при її застосуванні, є необхідність абстрагуватися від базових можливостей використовуваної мови програмування, видумуючи абстрактні операції, що пізніше потрібно буде реалізувати за допомогою виділених у програмі модулів. Однак здатність до таких абстракцій представляється необхідною умовою розробки великих програмних засобів, тому її потрібно розвивати. Особливістю розглянутих методів висхідної і низпадаючої розробок (які називаються класичними) є вимога, щоб модульна структура програми була розроблена до початку програмування (кодування) модулів. Ця вимога знаходиться в повній відповідності з водоспадним підходом до розробки ПЗ, тому що розробка модульної структури програми і її кодування виконуються на різних етапах розробки ПЗ: перша завершує етап конструювання ПЗ, а друга - відкриває етап кодування.
4. Практичне завдання
З використанням засобів візуального програмування розробити програму для автоматичного розрахунку значень складної функції:
Приклад файлу форми Delphi6 для табулювання функції:
unit Func_tab;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, Menus;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
Label4: TLabel;
ListBox1: TListBox;
Memo1: TMemo;
BitBtn2: TBitBtn;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N3: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
BitBtn3: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit1Exit(Sender: TObject);
procedure Edit2Exit(Sender: TObject);
procedure Edit3Exit(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
X,Xn,Xk,H:real;//Параметритабулювання
fname:String[25];//
f:textfile;
implementation
{$R *.dfm}
// Повідомлення про помилку у завданні інтервалів табулювання
procedure P1;
begin
MessageDlg ('"Xп" неможебутибільшимніж "Хк".' +#13
+'Введітьзначенняправильно.', mtWarning, [mbCancel], 0);
Form1.Edit1.Text:='';
Form1.Edit2.Text:='';
end;
//Повідомлення про помилку у значенні кроку табулювання по відношенню до
// меж табулювання
procedure P2;
begin
MessageDlg ('Крок табулювання "H" не може приймати таких значень.' +#13
+'Введітьзначенняправильно.', mtWarning, [mbCancel], 0);
Form1.Edit3.Text:='';
end;
//Повідомлення про помилку перевищення допустимої розмірності даних
procedure P3;
begin
MessageDlg ('Введене значення знаходться за межами допустимого.' +#13
+'Введіть значення правильно.', mtWarning, [mbCancel], 0);
end;
procedure P4;
begin
MessageDlg ('Треба ввести всі дані.', mtWarning, [mbCancel], 0);
end;
//Процедура очищення даних у формі
procedure P5;
begin
Form1.Edit1.Text:='';
Form1.Edit2.Text:='';
Form1.Edit3.Text:='';
Form1.Edit1.SetFocus;
Form1.Height:=167;
Form1.Position:=poScreenCenter;
Form1.Label4.Visible:=False;
Form1.Label5.Visible:=False;
Form1.Label6.Visible:=False;
Form1.Label7.Visible:=False;
Form1.StringGrid1.Visible:=False;
Form1.ListBox1.Items.Clear;
Form1.Memo1.Lines.Clear;
Form1.ListBox1.Visible:=False;
Form1.Memo1.Visible:=False;
end;
//Контроль введення даних у поля фории
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;
'-': if (pos('-',Edit1.Text)= 0) and (length(Edit1.Text) = 0)
Then Key := '-'
else Key := Chr(0);
',': if pos(',',Edit1.Text)<>0
THen Key := Chr(0);
else Key := Chr(0);
end;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;
'-': if (pos('-',Edit2.Text)= 0) and (length(Edit2.Text) = 0)
Then Key := '-'
else Key := Chr(0);
',': if pos(',',Edit2.Text)<>0
THen Key := Chr(0);
else Key := Chr(0);
end;
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;
',': if pos(',',Edit3.Text)<>0
THen Key := Chr(0);
else Key := Chr(0);
end;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
If Edit1.Text='' Then Exit;
If (Abs(StrToFloat(Edit1.Text))>100000)Then
begin
P3;
Edit1.Text:='';
Edit1.SetFocus;
end;
end;
procedure TForm1.Edit2Exit(Sender: TObject);
begin
If Edit2.Text='' Then Exit;
If (Abs(StrToFloat(Edit2.Text))>100000)Then
begin
P3;
Edit2.Text:='';
Edit2.SetFocus;
end;
end;
procedure TForm1.Edit3Exit(Sender: TObject);
begin
If Edit3.Text='' Then Exit;
If (StrToFloat(Edit3.Text)>10000)Then
begin
P3;
Edit3.Text:='';
Edit3.SetFocus;
end;
end;
//Основнапроцедурапрограми
Procedure TForm1.BitBtn1Click(Sender: TObject);
var
I,K:integer;
Y :array[0..1000] of Real;
label L1;
begin
//Перевірка наявності правильних значень в полях введення і їх взаємної
//коректності, з виведенням відповдних повідомлень і формуванням переходів
IF (Edit1.Text = '') or (Edit2.Text = '') or(Edit3.Text = '') then
begin
P4;
Exit;
end;
IF Edit3.Text = '0' then
begin
MessageDlg ('Требазадатикроктабулювання,'
+ #13 +' якиймаєненульовезначення', mtWarning, [mbCancel], 0);
Edit3.Text := '';
Edit3.SetFocus;
goto l1;
end;
Xn:=StrToFloat(Edit1.Text);
Xk:=StrToFloat(Edit2.Text);
H:=StrToFloat(Edit3.Text);
If Xk<Xn Then
begin
P1;
goto L1;
end;
If (H<=0) Or (H>=Abs(Xk-Xn)) Then
begin
P2;
goto L1;
end;
X:=Xn-H;
K:= Round((Abs((Xk-Xn))/H));
If K>1000 Then
begin
MessageDlg ('Переповненнямасивуданих.'
+#13 +'Требазменшитиінтервалабо'
+#13 +' збільшитикроктабулювання', mtWarning, [mbCancel], 0);
Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
goto l1;
end;
//Фомування компонентів для виведення результатів
StringGrid1.RowCount:= K+2;
Form1.Height:=430;
Form1.Position:=poScreenCenter;
Label4.Visible:=True;
Label5.Visible:=True;
Label6.Visible:=True;
Label7.Visible:=True;
StringGrid1.Visible:=True;
Label7.Caption:='уполі memo';
ListBox1.Items.Clear;
Memo1.Lines.Clear;
ListBox1.Visible:=True;
Memo1.Visible:=True;
StringGrid1.Cells[0,0]:='X';
StringGrid1.Cells[1,0]:='Y';
//Розрахуноківиведеннярезультатів
For I:=0 to K do
begin
Y[I]:=(1+ln(2-Xn+H*I))/(1-Xn+H*I+0.1);
//Наступний рядок забезпечує виведення результату
// з точністю до тисячних
Y[I]:= Round(Y[I]*1000)/1000;
StringGrid1.Cells[0,I+1]:=FloatToStr(Xn+H*I);//Виведенняутаблицю
StringGrid1.Cells[1,I+1]:=FloatToStr(Y[I]);
ListBox1.Items.Add(FloatToStr(Xn+H*I)+' '+FloatToStr(Y[i])); //Виведенняусписок
Memo1.Lines.Add(FloatToStr(Xn+H*I)+' '+FloatToStr(Y[i])); //ВиведенняуполеМемо
end;
l1:;
end;
//Запис результатів у файл
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ListBox1.Items.SaveToFile('result.txt');
end;
//Збереженняуфайлі
procedure TForm1.N4Click(Sender: TObject);
begin
ListBox1.Items.SaveToFile(fname);
end;
//Зчитати з файла і вивести у поле Мемо із скриттям зайвих компонентів
procedure TForm1.N3Click(Sender: TObject);
begin
If FileExists('result.txt')= False Then
Begin
MessageDlg('Файланеіснує', mtWarning, [mbCancel], 0);
Exit;
end;
Label7.Visible:=True;
Label7.Caption := 'Результатизчитуваннязфайлу';
Memo1.Lines.LoadFromFile('result.txt');
Memo1.Visible:=True;
Label4.Visible:=False;
Label5.Visible:=False;
Label6.Visible:=False;
ListBox1.Visible:=False;
StringGrid1.Visible:=False;
Form1.Height:=430;
Memo1.SetFocus;
Form1.Position:=poScreenCenter;
end;
//Створенняфайлузперевіркоюйогоіснування
procedure TForm1.FormActivate(Sender: TObject);
begin
fname:='result.txt';
AssignFile (f, fname);
If FileExists('result.txt')= False Then
begin
rewrite(f);
CloseFile(f);
end;
end;
//Очищенняполіввведення
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
P5;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
P5;
end;
//Вихід з програми
procedure TForm1.N7Click(Sender: TObject);
begin
Close;
end;
//Виведеннядовідки
procedure TForm1.N8Click(Sender: TObject);
begin
ShowMessage(ГорпиничО.О. + #13 + ' студентгрупипзс-504');
end;
procedure TForm1.N9Click(Sender: TObject);
begin
ShowMessage('Навчальнапрограматабулюванняфункції.' + #13 +
' Версія 1.0');
end;
end.
Список використаної літератури
1. В. Турский. «Методология программирования».
2. Б.Іванов “Дискретная математика. Алгоритмы и программы”.
3. Конспект лекцій з предмету.
4. Інтернет мережа..