Смекни!
smekni.com

Конструирование программ и языки программирования (стр. 2 из 3)

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]='&bsol;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);