МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівськийполітехнічний коледж
КОНТРОЛЬНАРОБОТА
здисципліни “Технологія розробки програмного забезпечення”
Виконав: студентгрупи ПЗС-504
ГорпиничО.О.
Перевірив: викладач
ТростянськийБ.Г.
м.Бердичів
2007р
/>Зміст
1. Поняття якості програмних засобів.
2. Основні поняття і принципи відладки татестування програм.
3. Особливості об’єктного підходу на етапіконструювання програмних засобів.
4. Практичне завдання.
Список використаноїлітератури.
/>
1.Поняття якості програмних засобів
Кожний ПЗповинний виконувати визначені функції, тобто робити те, що задумано. Гарний ПЗповинен мати набір властивостей, які дозволяють успішно його використовувативпродовж тривалого періоду, тобто мати визначену якість. Якість ПЗ — цесукупність його властивостей і характеристик, що впливають на його здатністьзадовольняти задані потреби користувачів. Але забезпечення якості ПЗ можевикликати певні протиріччя. Так наприклад, підвищення якості ПЗ по одній звластивостей часто може бути досягнуто лише ціною зміни вартості, термінівзавершення розробки і зниження якості цього ПЗ по інших його властивостях. Вданому випадку мова не йде про розробку ідеального з точки зору показників якостіПЗ (досягнути цього скоріш всього взагалі неможливо), а про розробку ПЗ іззадовільною якістю. Якість ПЗ є задовільною, коли він має визначені властивостів такий степені, яка гарантує успішне його використання
Сукупністьвластивостей ПЗ, що забезпечує задовільну для користувача якість ПЗ, залежитьвід умов і характеру експлуатації цього ПЗ. Тому при опису якості ПЗ,насамперед, повинні бути визначені критерії оцінки якості ПЗ. В даний час критеріямиякості ПЗ прийнято вважати:
— функціональність,
·- надійність,
·- легкістьзастосування,
— ефективність,
·- супровід,
— мобільність.
Функціональність — це здатність ПЗ виконуватинабір функцій, які задовольняють потреби користувачів. Набір зазначених функційвизначається в зовнішньому описі ПЗ.
Надійність– це здатність ПЗ безвідмовновиконувати визначені функції при заданих умовах протягом заданого періоду часуз досить великою імовірністю .
Легкістьзастосування — це характеристики ПЗ, що дозволяють мінімізувати зусилля користувача попідготовці вхідних даних, застосуванню ПЗ і оцінці отриманих результатів.
Ефективність — це відношення рівняпослуг, які надає ПЗ користувачу при заданих умовах, до обсягу використовуванихресурсів.
Супровід — це характеристики ПЗ, щодозволяють мінімізувати зусилля по внесенню змін для усунення в ньому помилок іпо його модифікації відповідно до потреб користувачів.
Мобільність — це здатність ПЗ бутиперенесеним з одного середовища (оточення) в іншу, зокрема, з одного комп'ютерана іншій.
Функціональністьі надійність є обов'язковими критеріями якості ПЗ, причому забезпеченнянадійності червоною ниткою проходить по всім етапам і процесам розробки ПЗ. Іншікритерії використовуються в залежності від потреб користувачів у відповідностіз вимогами, що пред’являються до ПЗ.
/>2. Основні поняття і принципи відладки та тестування програм
Успіхналагодження ПЗ у значній мірі визначає раціональна організація тестування. Приналагодженні ПЗ відшукуються й усуваються, в основному, ті помилки, наявністьяких у ПЗ установлюється при тестуванні. Як було уже відзначене, тестування неможе довести правильність ПЗ, у кращому випадку воно може продемонструватинаявність у ньому помилки. Іншими словами, не можна гарантувати, що тестуваннямПЗ практично здійсненним набором тестів можна установити наявність кожноїнаявної в ПЗ помилки. Тому виникає дві задачі. Перша задача: підготувати такийнабір тестів і застосувати до них ПЗ, щоб знайти в ньому по можливості більшечисло помилок. Однак чим довше продовжується процес тестування (і налагодженняв цілому), тим більшої стає вартість ПЗ. Звідси друга задача: визначити моментзакінчення налагодження ПЗ (чи окремого його компонента). Ознакою можливості закінченняналагодження є повнота охоплення пропущеними через ПЗ тестами (тобто тестами,до яких застосоване ПЗ) безлічі різних ситуацій, що виникають при виконанніпрограм ПЗ, і відносно рідкий прояв помилок у ПЗ на останньому відрізку процесутестування. Останнє визначається відповідно до необхідного ступеня надійностіПЗ, зазначеної в специфікації його якості. Для оптимізації набору тестів, тобтодля підготовки такого набору тестів, що дозволяв би при заданому їхньому числі(чи при заданому інтервалі часу, відведеному на тестування) виявляти більшечисло помилок у ПЗ, необхідно, по-перше, заздалегідь планувати цей набір і,по-друге, використовувати раціональну стратегію планування тестів. Проектуваннятестів можна починати відразу ж після завершення етапу зовнішнього опису ПЗ.Можливі різні підходи до вироблення стратегії проектування тестів, який можнаумовно графічно розмістити (див. мал. 9.1) між наступними двома крайнімипідходами. Лівий крайній підхід полягає в тім, що тести проектуються тільки напідставі вивчення специфікацій ПЗ (зовнішнього опису, опису архітектури іспецифікації модулів). Будівля модулів при цьому ніяк не враховується, тобтовони розглядаються як чорні ящики. Фактично такий підхід вимагає повногоперебору всіх наборів вхідних даних, тому що в противному випадку деякі частинипрограм ПЗ можуть не працювати при пропуску будь-якого тесту, а це значить, щопомилки, що містяться в них, не будуть виявлятися. Однак тестування ПЗ повноюбезліччю наборів вхідних даних практично нездійсненно. Правий крайній підхідполягає в тім, що тести проектуються на підставі вивчення текстів програм зметою протестувати всі шляхи виконання кожної програм ПЗ. Якщо узяти до увагинаявність у програмах циклів з перемінним числом повторень, то різних шляхіввиконання програм ПЗ може виявитися також надзвичайно багато, так що їхнєтестування також буде практично нездійсненно. Оптимальна стратегія проектуваннятестів розташована усередині інтервалу між цими крайніми підходами, але ближчедо лівого краю. Вона включає проектування значної частини тестів поспецифікаціях, але вона вимагає також проектування деяких тестів і по текстахпрограм. При цьому в першому випадку ця стратегія базується на принципах:
· накожну використовувану функцію — хоча б один тест,
· накожну область і на кожну границю зміни якої-небудь вхідної величини — хоча бодин тест,
· накожну особливу (виняткову) ситуацію, зазначену в специфікаціях, — хоча б одинтест.
В другому випадкуця стратегія базується на принципі: кожна команда кожної програми ПЗ повиннабути перевірена хоча б на одному тесті. Оптимальну стратегію проектуваннятестів можна конкретизувати на підставі наступного принципу: для кожногопрограмного документа (включаючи тексти програм), що входить до складу ПЗ,повинні проектуватися свої тести з метою виявлення в ньому помилок. У всякомуразі, цей принцип необхідно дотримувати відповідно до визначення ПЗ і змістомпоняття технології програмування як технології розробки надійних ПЗ.Розрізняються два основних види налагодження (включаючи тестування): автономнеі комплексне налагодження ПЗ. Автономне налагодження ПЗ означає послідовнероздільне тестування різних частин програм, що входять у ПЗ, з пошуком івиправленням у них фіксуємих при тестуванні помилок. Воно фактично включає налагодженнякожного програмного модуля і налагодження сполучення модулів. Комплексненалагодження означає тестування ПЗ у цілому з пошуком і виправленням притестуванні помилок у всіх документах (включаючи тексти програм ПЗ), щовідносяться до ПЗ у цілому. До таких документів відносяться визначення вимог доПЗ, специфікація якості ПЗ, функціональна специфікація ПЗ, опис архітектури ПЗі тексти програм ПЗ.
/>
3. Особливості об’єктного підходу наетапі конструювання програмних засобів
У якостімодульної структури програми прийнято використовувати деревоподібну структуру,яка відображує принцип низпадаючого проектування. У вузлах такого дереварозміщаються програмні модулі, а спрямовані дуги (стрілки) показують статичнупідпорядкованість модулів, тобто кожна дуга показує, що в тексті модуля, зякого вона виходить, мається посилання на модуль, у який вона входить. Іншимисловами, кожен модуль може звертатися до підлеглих йому модулів, тобтовиражається через ці модулі. При цьому модульна структура програми, у кінцевомурахунку, повинна включати і сукупність специфікацій модулів, що утворять цюпрограму. Специфікація програмного модуля містить:
·- синтаксичнуспецифікацію його входів, що дозволяє побудувати використовуваною мовоюпрограмування синтаксично правильне звертання до нього (до будь-якого йоговходу),
·- функціональнуспецифікацію модуля (опис функцій, виконуваних цим модулем по кожному з йоговходів).
Функціональна специфікаціямодуля будується так само, як і функціональна специфікація ПЗ.
У процесі розробки програмиїї модульна структура може по-різному формуватися і використовуватися длявизначення порядку програмування і налагодження модулів, зазначених у ційструктурі. Найчастіше використовуються два методи: метод висхідної розробки інизпадаючої розробки.
Метод висхідноїрозробки (знизу – вгору) полягає в наступному. Спочатку будуєтьсямодульна структура програми у виді дерева. Потім по черзі програмуються модуліпрограми, починаючи з модулів самого нижнього рівня (листи дерева модульноїструктури програми), у такому порядку, щоб для кожного програмного модуля буливже запрограмовані всі модулі, до яких він може звертатися. Після того, як усімодулі програми запрограмовані, виконується їхнє почергове тестування іналагодження у такому ж (висхідному) порядку, у якому велося їхнєпрограмування. Такий порядок розробки програми на перший погляд здається цілкомприродним: кожен модуль при програмуванні виражається через уже запрограмованібезпосередньо підлеглі модулі, а при тестуванні використовує вже налагодженімодулі. Однак, сучасна технологія не рекомендує такий порядок розробкипрограми. По-перше, для програмування якого-небудь модуля зовсім не потрібнонаявності текстів використовуваних їм модулів ( для цього досить, щоб коженвикористовуваний модуль був лише описаний в мірі, яка дозволяє побудуватиправильне звертання до нього), а для тестування його можливо використовуванімодулі заміняти їх імітаторами (заглушками). По-друге, кожна програма в якомусьступені підкоряється деяким внутрішнім для неї, але глобальним для її модулівпринципам реалізації, припущенням, структурам даних і т.п., що визначає їїконцептуальну цілісність і формується в процесі її розробки. При висхіднійрозробці ця глобальна інформація для модулів нижніх рівнів ще не ясна в повномуобсязі, тому дуже часто приходиться їх перепрограмувати, коли при програмуванніінших модулів виробляється істотне уточнення цієї глобальної інформації (наприклад,змінюється глобальна структура даних). По-третє, при висхідному тестуванні длякожного модуля (крім головного) приходиться створювати ведучу програму, якаповинна підготувати для модуля, який проходить тестування, необхідний станінформаційного середовища і зробити необхідне звертання до нього. Це приводитьдо великого обсягу «відладочного» програмування й у той же час не дає ніякоїгарантії, що тестування модулів виконується саме в тих умовах, у яких воно будевиконуватися в робочій програмі.
Метод низпадаючоїрозробки (згори – вниз) полягає в наступному. Як і в попередньому методіспочатку будується модульна структура програми у виді дерева. Потім по черзіпрограмуються модулі програми, починаючи з модуля самого верхнього рівня(головного), переходячи до програмування якого-небудь іншого модуля тільки втому випадку, якщо вже запрограмований модуль, який до нього звертається. Післятого, як усі модулі програми запрограмовані, виконується їхнє почерговетестування і налагодження в такому ж низпадаючому) порядку. При цьому першимтестуєтьсяя головний модуль програми. При цьому ті модулі, до яких можезвертатися головний, заміняються їхніми імітаторами. Після завершеннятестування і налагодження головного і будь-якого наступного модуля виробляєтьсяперехід до тестування одного з модулів, що у даний момент представленіімітаторами, якщо такі маються. Для цього імітатор обраного для тестуваннямодуля заміняється самим цим модулем і, крім того, додаються імітатори тихмодулів, до яких може звертатися обраний для тестування модуль. При такомупорядку розробки програми вся необхідна глобальна інформація формується вчасно,тобто ліквідується дуже неприємне джерело прорахунків при програмуваннімодулів. Деяким недоліком низпадаючої розробки, що приводить до певнихускладнень при її застосуванні, є необхідність абстрагуватися від базовихможливостей використовуваної мови програмування, видумуючи абстрактні операції,що пізніше потрібно буде реалізувати за допомогою виділених у програмі модулів.Однак здатність до таких абстракцій представляється необхідною умовою розробкивеликих програмних засобів, тому її потрібно розвивати. Особливістю розглянутихметодів висхідної і низпадаючої розробок (які називаються класичними) є вимога,щоб модульна структура програми була розроблена до початку програмування(кодування) модулів. Ця вимога знаходиться в повній відповідності з водоспаднимпідходом до розробки ПЗ, тому що розробка модульної структури програми і їїкодування виконуються на різних етапах розробки ПЗ: перша завершує етапконструювання ПЗ, а друга — відкриває етап кодування./>
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;
procedureBitBtn1Click(Sender: TObject);
procedureEdit1KeyPress(Sender: TObject; var Key: Char);
procedureEdit2KeyPress(Sender: TObject; var Key: Char);
procedureEdit3KeyPress(Sender: TObject; var Key: Char);
procedureEdit1Exit(Sender: TObject);
procedureEdit2Exit(Sender: TObject);
procedureEdit3Exit(Sender: TObject);
procedureBitBtn2Click(Sender: TObject);
procedureN4Click(Sender: TObject);
procedureN3Click(Sender: TObject);
procedureFormActivate(Sender: TObject);
procedureBitBtn3Click(Sender: TObject);
procedureN5Click(Sender: TObject);
procedureN7Click(Sender: TObject);
procedureN8Click(Sender: TObject);
procedureN9Click(Sender: TObject);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
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;
//Контроль введення даниху поля фории
procedureTForm1.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);
',': ifpos(',',Edit1.Text)0
THen Key :=Chr(0);
else Key :=Chr(0);
end;
end;
procedureTForm1.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);
',': ifpos(',',Edit2.Text)0
THen Key :=Chr(0);
else Key :=Chr(0);
end;
end;
procedureTForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;
',': ifpos(',',Edit3.Text)0
THen Key :=Chr(0);
else Key :=Chr(0);
end;
end;
procedureTForm1.Edit1Exit(Sender: TObject);
begin
IfEdit1.Text='' Then Exit;
If(Abs(StrToFloat(Edit1.Text))>100000)Then
begin
P3;
Edit1.Text:='';
Edit1.SetFocus;
end;
end;
procedureTForm1.Edit2Exit(Sender: TObject);
begin
IfEdit2.Text='' Then Exit;
If(Abs(StrToFloat(Edit2.Text))>100000)Then
begin
P3;
Edit2.Text:='';
Edit2.SetFocus;
end;
end;
procedureTForm1.Edit3Exit(Sender: TObject);
begin
IfEdit3.Text='' Then Exit;
If(StrToFloat(Edit3.Text)>10000)Then
begin
P3;
Edit3.Text:='';
Edit3.SetFocus;
end;
end;
//Основна процедура програми
ProcedureTForm1.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
begin
P1;
goto L1;
end;
If (H=Abs(Xk-Xn)) Then
begin
P2;
goto L1;
end;
X:=Xn-H;
K:=Round((Abs((Xk-Xn))/H));
If K>1000Then
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 Kdo
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;
//Запис результатів уфайл
procedureTForm1.BitBtn2Click(Sender: TObject);
begin
ListBox1.Items.SaveToFile('result.txt');
end;
//Збереження у файлі
procedureTForm1.N4Click(Sender: TObject);
begin
ListBox1.Items.SaveToFile(fname);
end;
//Зчитати з файла івивести у поле Мемо із скриттям зайвих компонентів
procedureTForm1.N3Click(Sender: TObject);
begin
IfFileExists('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;
//Створення файлу з перевіркою його існування
procedureTForm1.FormActivate(Sender: TObject);
begin
fname:='result.txt';
AssignFile (f,fname);
If FileExists('result.txt')=False Then
begin
rewrite(f);
CloseFile(f);
end;
end;
//Очищення полів введення
procedureTForm1.BitBtn3Click(Sender: TObject);
begin
P5;
end;
procedureTForm1.N5Click(Sender: TObject);
begin
P5;
end;
//Вихід з програми
procedureTForm1.N7Click(Sender: TObject);
begin
Close;
end;
//Виведення довідки
procedureTForm1.N8Click(Sender: TObject);
begin
ShowMessage(Горпинич О.О. + #13 + ' студент групи пзс-504');
end;
procedureTForm1.N9Click(Sender: TObject);
begin
ShowMessage('Навчальна програма табулювання функції.' + #13 +
' Версія 1.0');
end;
end.
/>
Списоквикористаної літератури
1. В.Турский. «Методология программирования».
2. Б.Іванов “Дискретнаяматематика. Алгоритмы и программы”.
3. Конспект лекцій зпредмету.
4. Інтернет мережа..