- •Технічне завдання
- •1.1. Призначення та обґрунтування доцільності розробки програмного продукту
- •1.2. Функціональні вимоги до програмного продукту
- •1.3. Кваліфікаційні вимоги до програмного продукту
- •1.4. Вимоги до безпеки функціонування програмного продукту
- •1.5. Вимоги до середовища функціонування програмного продукту
- •2. Техно-робочий проект
- •2.1. Інформаційне забезпечення програмного продукту
- •2.2 Структура програмного продутку
- •2.3. Інтерфейс програмного засобу
- •2.4. Тестування програмного засобу
- •Висновки
- •Перелік використаних джерел та літератури
- •Програмний код
Перелік використаних джерел та літератури
Вендров А.М. Проектирование програмного обеспечения экономических информационных систем. – М., Финансы и статистика, 2000. – С.347.
Глинський Я.М., Анохін В.Є., Ряжська В.А. Паскаль. Turbo Pascal & Delphi/ Навчальний посібник. Львів – 2003. – С.141.
Митчелл К.Керман. Программирование и отладка в Delphi. Учебный курс. Москва – Санкт-Петербург – Киев - 2003. – С.669.
Міжнародний стандарт ISO/IEC 12207: 1995-08-01.
Орлов С.А.. Технологии разработки программного обеспечения. Учебник для ВУЗов. Москва-… 2002, - 463с.
Пономаренко В.С. Проектування інформаційних систем. – К., ВЦ «Академія», 2002. – С.498.
Пономаренко В.С. Інформаційні системи і технології в економіці. – К., ВЦ «Академія», 2002. – С.542.
ДОДАТОК
Програмний код
unit UM;
{Автоматизація обчислень в таблицях}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Menus, XPMan;
type
TFM = class(TForm)
StringGrid1: TStringGrid;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N31: TMenuItem;
N32: TMenuItem;
N23: TMenuItem;
N33: TMenuItem;
N41: TMenuItem;
N42: TMenuItem;
N43: TMenuItem;
N44: TMenuItem;
N45: TMenuItem;
N5: TMenuItem;
XPManifest1: TXPManifest;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N24: TMenuItem;
N34: TMenuItem;
N46: TMenuItem;
procedure LoFromFile(filename: string);
procedure SaToFile(filename: string);
procedure calk_col;
procedure calk_row;
procedure FormActivate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure N11Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure N14Click(Sender: TObject);
procedure N21Click(Sender: TObject);
procedure N22Click(Sender: TObject);
procedure N23Click(Sender: TObject);
procedure N24Click(Sender: TObject);
procedure N31Click(Sender: TObject);
procedure N32Click(Sender: TObject);
procedure N33Click(Sender: TObject);
procedure N34Click(Sender: TObject);
procedure N41Click(Sender: TObject);
procedure N42Click(Sender: TObject);
procedure N44Click(Sender: TObject);
procedure N45Click(Sender: TObject);
procedure N46Click(Sender: TObject);
end;
TTab=record
col: integer;
row: integer;
val: string[100];
end;
function rozdil: char;
var
FM: TFM;
rz: char; //Розділювач між цілою та дробовою частиною дійсного числа
ft: file of TTab;
Tab: TTab;
implementation
{$R *.dfm}
//Функція, що повертає символ розділювача
//між цілою та дробовою частиною дійсного числа
//працює лише при виконанні exe-файлу проекту
function rozdil: char;
begin
rozdil:='.';
try
strtofloat('1.1');
except
rozdil:=',';
end;
end;
//Процедура читання даних з файлів
procedure TFM.LoFromFile(filename: string);
var rc,rw: integer;
begin
assignfile(ft,filename);
reset(ft);
rc:=0;
rw:=0;
while not eof(ft) do
begin
read(ft, Tab);
if Tab.col>rc then rc:=Tab.col;
if Tab.row>rw then rw:=Tab.row;
StringGrid1.Cells[Tab.col,Tab.row]:=Tab.val;
end;
closefile(ft);
if (rc>2) and (rw>2)
then begin
StringGrid1.ColCount:=rc+1;
StringGrid1.RowCount:=rw+1;
end
else begin
showmessage('Помилка в даних файлу');
FM.FormActivate(self);
end;
end;
//Процедура запису даних у файл
procedure TFM.SaToFile(filename: string);
var i,j: integer;
begin
assignfile(ft,filename);
rewrite(ft);
for i:=0 to StringGrid1.ColCount-1 do
for j:=0 to StringGrid1.RowCount-1 do
begin
Tab.col:=i;
Tab.row:=j;
Tab.val:=StringGrid1.Cells[i,j];
write(ft, tab);
end;
closefile(ft);
end;
//Обчислення сум по стовпцях
procedure TFM.calk_col;
var i,j: integer; sum: real;
begin
for i:=1 to StringGrid1.ColCount-2 do
begin
sum:=0;
for j:=1 to StringGrid1.RowCount-2 do
if StringGrid1.Cells[i,j]<>''
then sum:=sum+strtofloat(StringGrid1.Cells[i,j]);
StringGrid1.Cells[i,StringGrid1.RowCount-1]:=floattostr(sum);
end;
end;
//Обчислення сум по рядках
procedure TFM.calk_row;
var i,j: integer; sum: real;
begin
for i:=1 to StringGrid1.RowCount-2 do
begin
sum:=0;
for j:=1 to StringGrid1.ColCount-2 do
if StringGrid1.Cells[j,i]<>''
then sum:=sum+strtofloat(StringGrid1.Cells[j,i]);
StringGrid1.Cells[StringGrid1.ColCount-1,i]:=floattostr(sum);
end;
end;
//Визначення символу розділювача між цілою та дробовою частиною дійсного числа
//під час завантаження проекту на виконання
procedure TFM.FormActivate(Sender: TObject);
begin
{rz:=rozdil; }
rz:=',';
//Початкові заголовки та розміри таблиці
StringGrid1.Cells[1,0]:='Стовпець 1';
StringGrid1.Cells[2,0]:='Стовпець 2';
StringGrid1.Cells[3,0]:=' Суми по рядках';
StringGrid1.Cells[0,1]:='Рядок 1';
StringGrid1.Cells[0,2]:='Рядок 2';
StringGrid1.Cells[0,3]:='Суми по стовпцях';
StringGrid1.ColCount:=4;
StringGrid1.RowCount:=4;
end;
//Встановлення кольору останнього стовпця та рядку
procedure TFM.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (ACol=StringGrid1.ColCount-1) or (ARow=StringGrid1.RowCount-1) then
begin
StringGrid1.Canvas.Brush.Color:=$008282FF;
StringGrid1.Canvas.Font.Color:=clWhite ;
StringGrid1.Canvas.Font.Size:=8;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left+3,Rect.Top+5,StringGrid1.Cells[ACol,ARow]);
end;
end;
//Заборона виділення підсумкових комірок
procedure TFM.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if (ACol=StringGrid1.ColCount-1) or (ARow=StringGrid1.RowCount-1) then
CanSelect:=false;
end;
//Керування дозволом введення символів для зображення дійсних чисел
procedure TFM.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
'0'..'9':;
'-': if length(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>0 then key:=#0;
'.': if rz<>'.' then key:=#0 else
if pos('.',StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>0
then key:=#0;
',': if rz<>',' then key:=#0 else
if pos(',',StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>0
then key:=#0;
else key:=#0;
end;
end;
//Завантаження даних з файлу
procedure TFM.N11Click(Sender: TObject);
begin
if opendialog1.Execute then
LoFromFile(opendialog1.FileName);
end;
//Збереження даних у файлі
procedure TFM.N12Click(Sender: TObject);
begin
if savedialog1.Execute then
SaToFile(savedialog1.FileName);
end;
//Завершення роботи проекту
procedure TFM.N14Click(Sender: TObject);
begin
if fileexists('Dan.tmp')
then deletefile('Dan.tmp');
close;
end;
//Додавання стовпця
procedure TFM.N21Click(Sender: TObject);
var zagcol, zagrow: string;
begin
zagcol:=Stringgrid1.Cells[Stringgrid1.ColCount-1,0];
zagrow:=Stringgrid1.Cells[0,Stringgrid1.RowCount-1];
Stringgrid1.cols[Stringgrid1.ColCount-1].Clear;
Stringgrid1.rows[Stringgrid1.RowCount-1].Clear;
Stringgrid1.ColCount:=Stringgrid1.ColCount+1;
Stringgrid1.Cells[Stringgrid1.ColCount-1,0]:=zagcol;
Stringgrid1.Cells[0,Stringgrid1.RowCount-1]:=zagrow;
FM.Width:=FM.Width+Stringgrid1.ColWidths[Stringgrid1.ColCount-2];
end;
//Видалення стовпця
procedure TFM.N22Click(Sender: TObject);
var i,w: integer; zagcol, zagrow: string;
begin
zagcol:=Stringgrid1.Cells[Stringgrid1.ColCount-1,0];
zagrow:=Stringgrid1.Cells[0,Stringgrid1.RowCount-1];
Stringgrid1.cols[Stringgrid1.ColCount-1].Clear;
Stringgrid1.rows[Stringgrid1.RowCount-1].Clear;
Stringgrid1.Cells[Stringgrid1.ColCount-1,0]:=zagcol;
Stringgrid1.Cells[0,Stringgrid1.RowCount-1]:=zagrow;
if Stringgrid1.ColCount>4 then
begin
w:=Stringgrid1.ColWidths[Stringgrid1.col];
for i:=Stringgrid1.Col to Stringgrid1.ColCount-1 do
Stringgrid1.Cols[i]:=Stringgrid1.Cols[i+1];
Stringgrid1.ColCount:=Stringgrid1.ColCount-1;
FM.Width:=FM.Width-w;
end;
end;
//Зміна заголовку поточного стовпця
procedure TFM.N23Click(Sender: TObject);
var zag: string;
begin
zag:=stringgrid1.Cells[stringgrid1.Col,0];
if InputQuery('','',zag) then stringgrid1.Cells[stringgrid1.Col,0]:=zag;
end;
//Змінити заголовок підсумкового стовпця
procedure TFM.N24Click(Sender: TObject);
var zag: string;
begin
zag:=stringgrid1.Cells[stringgrid1.ColCount-1,0];
if InputQuery('','',zag) then stringgrid1.Cells[stringgrid1.ColCount-1,0]:=zag;
end;
//Додавання рядку
procedure TFM.N31Click(Sender: TObject);
var zagcol, zagrow: string;
begin
zagcol:=Stringgrid1.Cells[Stringgrid1.ColCount-1,0];
zagrow:=Stringgrid1.Cells[0,Stringgrid1.RowCount-1];
Stringgrid1.cols[Stringgrid1.ColCount-1].Clear;
Stringgrid1.rows[Stringgrid1.RowCount-1].Clear;
Stringgrid1.RowCount:=Stringgrid1.RowCount+1;
Stringgrid1.Cells[Stringgrid1.ColCount-1,0]:=zagcol;
Stringgrid1.Cells[0,Stringgrid1.RowCount-1]:=zagrow;
FM.Height:=FM.Height+Stringgrid1.RowHeights[Stringgrid1.rowCount-2];
end;
//Видалення рядку
procedure TFM.N32Click(Sender: TObject);
var i,h: integer; zagcol, zagrow: string;
begin
zagcol:=Stringgrid1.Cells[Stringgrid1.ColCount-1,0];
zagrow:=Stringgrid1.Cells[0,Stringgrid1.RowCount-1];
Stringgrid1.cols[Stringgrid1.ColCount-1].Clear;
Stringgrid1.rows[Stringgrid1.RowCount-1].Clear;
Stringgrid1.Cells[Stringgrid1.ColCount-1,0]:=zagcol;
Stringgrid1.Cells[0,Stringgrid1.RowCount-1]:=zagrow;
if Stringgrid1.RowCount>4 then
begin
h:=Stringgrid1.RowHeights[Stringgrid1.row];
for i:=Stringgrid1.Row to Stringgrid1.RowCount-1 do
Stringgrid1.Rows[i]:=Stringgrid1.Rows[i+1];
Stringgrid1.RowCount:=Stringgrid1.RowCount-1;
FM.Height:=FM.Height-h;
end;
end;
//Зміна заголовку поточного рядку
procedure TFM.N33Click(Sender: TObject);
var zag: string;
begin
zag:=stringgrid1.Cells[0,stringgrid1.Row];
if InputQuery('','',zag) then stringgrid1.Cells[0,stringgrid1.Row]:=zag;
end;
//Зміна заголовок підсумкового рядку
procedure TFM.N34Click(Sender: TObject);
var zag: string;
begin
zag:=stringgrid1.Cells[0,stringgrid1.RowCount-1];
if InputQuery('','',zag) then stringgrid1.Cells[0,stringgrid1.RowCount-1]:=zag;
end;
//Обчислення підсумки по рядках
procedure TFM.N41Click(Sender: TObject);
begin
calk_row;
end;
//Обчислення підсумки по стовпцях
procedure TFM.N42Click(Sender: TObject);
begin
calk_col;
end;
//Сортування за спаданням в підсумковому стовпці
procedure TFM.N44Click(Sender: TObject);
var sorted: boolean; i: integer;
begin
SaTofile('Dan.tmp');
try
repeat
sorted:= true;
for i:=1 to StringGrid1.RowCount-3 do
begin
if strtofloat(StringGrid1.Cells[StringGrid1.colcount-1,i]) <
strtofloat(StringGrid1.Cells[StringGrid1.colcount-1,i+1])
then
begin
StringGrid1.Rows[StringGrid1.RowCount]:=StringGrid1.Rows[i];
StringGrid1.Rows[i]:=StringGrid1.Rows[i+1];
StringGrid1.Rows[i+1]:=StringGrid1.Rows[StringGrid1.RowCount];
sorted:=false;
end;
end;
StringGrid1.Rows[StringGrid1.RowCount].Clear;
until sorted;
n44.Enabled:=false;
n45.Enabled:=false;
n46.Enabled:=true;
except
showmessage('Невідповідність типів даних')
end;
end;
//Сортування за зростанням в підсумковому стовпці
procedure TFM.N45Click(Sender: TObject);
var sorted: boolean; i: integer;
begin
SaTofile('Dan.tmp');
try
repeat
sorted:= true;
for i:=1 to StringGrid1.RowCount-3 do
begin
if strtofloat(StringGrid1.Cells[StringGrid1.colcount-1,i]) >
strtofloat(StringGrid1.Cells[StringGrid1.colcount-1,i+1])
then
begin
StringGrid1.Rows[StringGrid1.RowCount]:=StringGrid1.Rows[i];
StringGrid1.Rows[i]:=StringGrid1.Rows[i+1];
StringGrid1.Rows[i+1]:=StringGrid1.Rows[StringGrid1.RowCount];
sorted:=false;
end;
end;
StringGrid1.Rows[StringGrid1.RowCount].Clear;
n44.Enabled:=false;
n45.Enabled:=false;
n46.Enabled:=true;
until sorted;
except
showmessage('Невідповідність типів даних')
end;
end;
//Відновлення порядку розташування рядків
procedure TFM.N46Click(Sender: TObject);
begin
if fileexists('Dan.tmp') then
begin
LoFromFile('Dan.tmp');
DeleteFile('Dan.tmp');
n44.Enabled:=true;
n45.Enabled:=true;
n46.Enabled:=false;
end;
end;
end.