3.2 Описание интерфейса классов
Класс DataF несёт ответственность за получение и хранение в своих полях данных, введённых пользователем. Этот класс имеет следующий интерфейс:
class DataF
{
public:
Далее следует описание полей структуры хранящей данные.
Потом объявление функции char GetPole(char *str,int nb,int rzc), которая выполняет работу по занесению данных введённых пользователем в соответствующие члены-данные класса.
В качестве параметров функция принимает указатель на заполняемое поле структуры, количество символов отведённых под это поле и режим работы: новая запись (rzc==0), либо корректировка (rzc==1).
Следующая функция-член класса: void NewZap(int rzc)организует диалог с пользователем и вызывает функцию GetPole(char*,int,int) передавая ей нужные параметры.
В качестве параметров функция NewZap(int) принимает два целых, указывающих на режим работы (как и предыдущая функция).
4. Описание программы
Программа не очень велика, поэтому для удобства чтения и отладки она выполнена в одном модуле. Ряд переменных имеет глобальный характер: это связано с тем, что они используются несколькими подпрограммами и передача их другим способом вызвала бы дополнительны трудности при реализации и привела бы к более запутанному коду.
Программа, после загрузки в память, запрашивает имя пользователя (оно используется для занесения в поля записи). Потом происходит считывание данных из файла в массив объектов (LoadZap()).
Функция DrawMain(intregim) прорисовывает элементы управления выделяя текущий (для этого используется параметр regim).
Перемещаясь по элементам управления с помощью клавиатуры или мыши, пользователь может выбрать один режимов работы. В этом случае вызывается функция EnterHandle(intregim), которая определяет какой из режимов выбран и вызывает соответствующие подпрограммы.
При реализации просмотра, корректировки и удаления используется одна и таже функция View() которая возвращает номер выбранной записи, это заметно облегчило разработку и сделало код более ясным и читабельным.
Перед завершением программа вновь связывается с файлом данных и вносит в него произведенные пользователем изменения и дополнения.
Программа включает в себя инициализацию мыши, сделанную на Assembler. Для работы с мышью используются функции:
MouseStatus(int *x, int *y, int *button); -- проверяетнажатиеклавишимыши.
ShowMouse(); -- показывает курсор мыши.
HideMouse(); -- прячет курсор мыши.
5. Программа и методика испытаний
Над завершённым программным продуктом был проведён ряд испытаний:
А)
1) запущена программа
2) введены новые данные
3) совершен выход из программы
4) программа была вновь открыта : добавленные данные присутствовали.
Вывод : данные были успешно сохранены в файле(при просмотре директории файл присутствовал).
5) испытание было повторено
В)
1) После запуска программы были открыты данные для корректировки и изменены некоторые из них.
2) Потом некоторые записи были удалены.
3) Во время просмотра удалённые записи отсутствовали, а корректировавшиеся были изменены.
4) Был совершен выход из программы и повторный запуск.
5) Все ранее внесённые изменения присутствовали.
Вывод : программа успешно корректирует и удаляет данные, а потом сохраняет изменения в файле.
С)
1) Программа была загружена.
2) В структуру данных внесены изменения.
3) Совершён нестандартный выход.
4) Программа вновь загружена.
При просмотре сделан вывод: нестандартный выход имеющийся файл данных не повредил, однако новые изменения внесены небыли.
Вывод по всем испытаниям:
С возложенной задачей программа успешно справляется, не требуя при этом большого количества ресурсов системы.
6. Описание применения
Написанная мною программа является СУБД и предназначена для хранения данных об поступивших на склад объектах. Она может найти применение на различного рода хранилищах и складах или в процессах использующих те же принципы хранения и обработки информации.
Программа сконфигурирована под MSDOSи установка Windowsей не требуется.
Минимальные требования: CPU—Pentium 100 m, и ОЗУ—8Мв, наличие стандартных устройств ввода-вывода.
Данный программный продукт обладает дружелюбным интерфейсом, и легкость управления работой.
Для упрощения доступа к данным реализован поиск, сходный по применению с поиском в справочной системе компилятора BorlandC++3.0.
Программа проста в использовании и не требует никаких дополнительных программных и технических средств от ЭВМ, и специальной квалификации от пользователя.
Её системные требования довольно низкие, поэтому программу можно использовать даже на старых моделях компьютеров.
Заключение
Поставленная задача выполнена на уровне моих представлений о потребностях склада, поэтому возможен некоторый отрыв от реальности (но, так как программа может быть модифицирована, это легко исправить).
В связи с тем, что программа не получит коммерческого распространения и новые её версии разрабатываться не будут, я не использовал многие возможности предлагаемые объектно-ориентированным подходом в программировании, чтобы не увеличивать время разработки программы и не ухудшать её читабельность.
Литература
1. Гилберт Шилдт "BorlandC++"
2. Гради Буч "Объектно-ориентированный анализ и проектирование".
Приложение А
Листинг программы
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <iostream.h>
#include <dir.h>
#include <PROCESS.H>
#include <IO.h>
#include <dos.h>
#include <time.h>
#include <FSTREAM.H>
void append();
void Mousebut(int *cbb,int *xx,int *yy);
void HideMouse();
void ShowMouse();
char Conv(int);
void Correct(void);
int Find();
void DrawMain(int);
void Timeout();
int nzap=0,regim;
int exitp;
char userprg[15]=" ";
time_t lt;
char *mch;
class DataF {
public:
char datep[10];
char name[20];
char col_vo[10];
char ed_ism[5];
char inform[200];
char user[15];
char GetPole(char *str,int nb,int rzc)
{
int i;
if(rzc==0)
for(i=0;i<nb;i++)
{
str[i]=' ';
};
int ic;
char chr;
int nb1=nb,nb2=nb;
if(rzc!=0){if(nb>100)nb2=30; for(i=0;i<nb2-2;i++)cout<<str[i];nb1=nb1-2; cout<<"_"; };
for(i=((rzc!=0)?nb1:0);i<nb-1;i++)
{
ic=getch();
if(ic==13)break;
if(ic==27){nzap--;i=nb;};
if(ic==8){str[i-1]=' ';i=i-2;gotoxy(wherex()-2, wherey()); cout<<"_"; cout<<" "; gotoxy(wherex()-1,wherey());}
else{
chr=Conv(ic);
str[i]=chr;
gotoxy(wherex()-1,wherey());
cout<<chr;
cout<<"_"; };
};
gotoxy(wherex()-1,wherey());
cout<<" ";
str[nb-1]='\0';
};
void NewZap(int rzc) //rzc: 0-new 1-correct
{
HideMouse();
cleardevice();
if(rzc!=0){gotoxy(20,9); cout<<"корректировка:";};
gotoxy(20,10);
cout<<"наименование : ";
GetPole(&name[0],20,rzc);
gotoxy(20,11);
cout<<"единицы измерений : ";
GetPole(&ed_ism[0],5,rzc);
gotoxy(20,12);
cout<<"количество : ";
GetPole(&col_vo[0],10,rzc);
gotoxy(20,13);
cout<<"дата поступления : ";
GetPole(&datep[0],10,rzc);
gotoxy(20,14);
cout<<"дополнительные данные: ";
GetPole(&inform[0],200,rzc);
for(int i=0; i<15; i++) user[i]=userprg[i];
};
};
DataF Zap[125];
void LoadZap()
{
clrscr();
gotoxy(10,10);
cout<<" введитесвоёимя: ";
cin>>userprg;
FILE *f;
f=fopen("ttt.cfg","r");
nzap=1;
while (!feof(f))
{
fread(&Zap[nzap],sizeof(DataF),1,f);
nzap++;
};
nzap--;
fclose(f);
};
void SaveZap()
{
FILE *f;
f=fopen("ttt.cfg","w");
for (int i=1;i<nzap;i++) fwrite(&Zap[i],sizeof(DataF),1,f);
fclose(f);
};
void append()
{
FILE *f;
f=fopen("ttt.cfg","a");
fwrite(&Zap[nzap],sizeof(DataF),1,f);
fclose(f);
};
void MouseStatus(int *x,int *y,int *button)
{
int bb,xx,yy;
asm {
mov ax,03;
int 33h;
mov bb,bx;
mov xx,cx;
mov yy,dx;
};
*button=bb;
*x=xx;
*y=yy;
};
void Information()
{
HideMouse();
char ch;
int exitInf=0;
cleardevice();
gotoxy(18,9);
cout<<"разработано Можайко А.С.";
ch=getch();
DrawMain(regim);
ShowMouse();
};
void DrawMain(int regim)
{
cleardevice();
const char MenuItem[6][16]={" ",
" „добавить ",
" просмотр ",
" корректировка ",
" удалить ",
" выход "};
setcolor(1);
setbkcolor(1);
for (int i=1;i<=5;i++)
{
setfillstyle(1,i==regim?9:10);
fillellipse(300,55+i*60,90,20);
outtextxy(238,50+i*60,MenuItem[i]);
}; Timeout(); ShowMouse();
};
void ShowMouse(void)
{
asm { mov ax,01h
int 33h
}
};
void HideMouse(void)
{
asm{
mov ax,02
int 33h
}
};
void Nadpis(int n1,int coln)
{
setbkcolor(3);
struct viewporttype SaveWin;
getviewsettings(&SaveWin);
setviewport(9,9,631,260,SaveWin.clip);
clearviewport();
setviewport(9,279,598,434,SaveWin.clip);
clearviewport();
setviewport(SaveWin.left,SaveWin.top,SaveWin.right,SaveWin.bottom,SaveWin.clip);
char *st,*st1,*st2,*st3,*st4,*st5,stm[100],stm2[100];
int i;
if((n1)<125)
for (i=1;i<9;i++)
{
if(i==coln) setcolor(1);
else setcolor(4);
gotoxy(3,2*i);
cout<<n1+i-1;
st=Zap[n1+i-1].datep;
outtextxy(40,i*32-12,st);
st1=Zap[n1+i-1].name;
outtextxy(150,i*32-12,st1);
st2=Zap[n1+i-1].col_vo;
outtextxy(380,i*32-12,st2);
st3=Zap[n1+i-1].ed_ism;
outtextxy(500,i*32-12,st3);
setcolor(4);
if(i!=8)line(8,i*32+5,632,i*32+5);
};
st4=Zap[n1+coln-1].inform;
outtextxy(50,320,st4);
st5=Zap[n1+coln-1].user;
outtextxy(550,420,st5);
};
int Find()
{
char ch,rf,*zapm,word[20];
int mflag[125];
for(int f=1;f<nzap;f++)
mflag[f]=1;
setbkcolor(5);
bar(100,100,500,250);
rf=getch();
int k=-1,ret,fpk;
ch=getch();
while(3)
{
k++;
fpk=0;
for(int i=1;i<nzap-1;i++)
{
if(mflag[i]!=0){
if(rf==50){
if(ch==Zap[i].name[k]){ mflag[i]=1;fpk=1;};
if(ch!=Zap[i].name[k]) mflag[i]=0;
};
if(rf==49){
if(ch!=Zap[i].datep[k]) mflag[i]=0;
if(ch==Zap[i].datep[k]){ mflag[i]=1;fpk=1;};
};
};
};
if(fpk==0){ ch=getch(); fpk=7; };
do {
for(i=1;i<nzap-1;i++)
if(mflag[i]==1)
{
Nadpis(i,1);
ret=i;
ch=getch();
if((ch!=9)) i=nzap;
};
if(ch==9)ch=getch();}
while(ch==9);