Использование библиотеки Turbo Vision в C++
В программе использовался алгоритм поиска в линейном двунаправленном списке. Идея алгоритма: просматривается список, начиная с первого элемента, пока не будет найден нужный элемент или список не закончится. Поиск объекта СТУДЕНТ осуществляется по одному из полей данных, которое выбирает пользователь. Также осуществляется поиск следующего элемента: Функция поиска первого элемента заносит результат… Читать ещё >
Использование библиотеки Turbo Vision в C++ (реферат, курсовая, диплом, контрольная)
Пермский Государственный Политехнический Университет
Электротехнический факультет
Контрольная работа
по предмету алгоритмические языки и теория программирования
На тему: «Использование библиотеки Turbo Vision в C++»
Выполнил: Палкин Д. В
Проверил: Ноткин А.М.
Пермь 2013 г.
Содержание
- Постановка задачи
- Алгоритмы
- Проектирование
- Определение классов
- Определение глобальных имен
- Инструкция программисту
- Инструкция пользователю
- Выводы
- Приложение
Постановка задачи
Создать методические указания к лабораторной работе под названием «Turbo Vision C++. Организация диалога», которые должны содержать теоретический материал по данной теме и демонстрационную программу.
Программа выполняет обработку базы данных, элементами которой являются объекты класса Student (студент), и организует пользовательский диалог для ввода информации и просмотра объектов и поиск. Созданный объект заноситься в линейный список. Данные хранятся в файле.
Теоритический материал должен содержать информацию о классах Turbo Vision: TDialog, TInputLine, TButton, TStaticText.
Алгоритмы
В программе использовался алгоритм поиска в линейном двунаправленном списке. Идея алгоритма: просматривается список, начиная с первого элемента, пока не будет найден нужный элемент или список не закончится. Поиск объекта СТУДЕНТ осуществляется по одному из полей данных, которое выбирает пользователь. Также осуществляется поиск следующего элемента: Функция поиска первого элемента заносит результат поиска (указатель на найденный объект) в глобальную переменную, функция же поиска следующего элемента начинает просмотр не сначала, а с элемента на который указывает эта глобальная переменная.
Проектирование
В программе определяется класс TStudentApp производный от TApplication, в котором представлены методы для организации пользовательского интерфейса и работы со списком объектов СТУДЕНТ и работы с файлами. И класс TStudentBase, являющийся объектом СТУДЕНТ, и содержащий поля next (указатель на следующий элемент в списке) prev (указатель на предыдущий элемент в списке) и persone — указатель на структуру данных о студенте TStudent.
При создании списка инициализируется глобальная переменная StudentBase — указатель на текущий элемент, и глобальная переменная first — указатель на первый элемент списка.
При создании рабочего (основного) диалога в программе для удобства не создается класс производный от TDialog, а описывается глобальная переменная TDialog *wd, которая затем инициализируется в компонентной функции класса TStudentApp: WorkDialog (). Данные считываются из диалога и устанавливаются непосредственно в/из поля persone объекта StudentBase.
При поиске в списке объектов организуется диалог, в котором пользователь указывает поле поиска и его значение. Эти данные заносятся в глобальную структуру searchRec, затем функции поиска используют эту структуру в своих целях.
Сохраняются данные в файл в виде структур типа TStudent.
Определение классов
struct TSearchRec //Структура поиска
{
ushort pole; // Поле по которому производится поиск
char val[30]; // Значение поля
};
struct TStudent //Структура информации о студенте
{
char soname[30];
char name[30];
char patron[30];
ushort sex;
char group[12];
char course[3];
ushort contra;
char grant[10];
char studnum[8];
};
class TStudentBase //Класс СТУДЕНТ
{
public:
TStudentBase ();
~TStudentBase ();
void Sets (char*, char*, char*, char*, ushort, char*, char*, char*, ushort);
TStudent *persone; //указатель на TStudent
TStudentBase *prev; //предыдущий элемент в списке
TStudentBase *next; //следующий элемент в списке
};
class TStudentApp: public TApplication
{
public:
TStudentApp ();
virtual void handleEvent (TEvent& event);
static TStatusLine *initStatusLine (TRect);
static TMenuBar *initMenuBar (TRect);
private:
void WorkDialog (); //Функция, создающая рабочий диалог
void SaveBase (char *filename); //Сохранение базы в файл
TStudentBase *ReadBase (char *filename); //Чтение базы из файла
void NewBase (); //Создание новой базы
void changeDir ();
void openBase (); //Открытие базы
void searchDialog (); //Диалог поиска
TStudentBase *Search (TSearchRec *); //Поиск первого элемента
TStudentBase *SAgain (TSearchRec *, TStudentBase *); //Поиск следующего элемента
};
Определение глобальных имен
база пользовательский обработка программист
const cmNewBase=200,
cmOpenBase=201, //Команды управления
cmSaveBase=202,
cmChDir=203,
cmSAgain=204,
cmSearch=205,
cmAddItm=206,
cmDel=207,
cmFwd=208,
cmBck=209,
cmUndoCh=210;
TDialog *wd; //Рабочий диалог
TStudentBase *StudentBase, //Ук-ль на текущий элемент в списке
*firstItm, //Ук-ль на текущий элемент в списке
*tmpS; //Указатель на найденный элемент
TSearchRec *searchRec; //Ук-ль на данные поиска
ushort control;
char *basename; //Имя базы
char *fileName; //Путь и имя файла базы
Инструкция программисту
Требования к ресурсам: процессор не ниже Intel 386.
Память — минимум 1Мб. Дисковое пространство — 1Mb
Видеоадаптер — любой. О/SMs. Dos, Ms Windows 3.1−98
Инструментальные разработки: Программа написана на языке С++, с помощью программной среды Borland C++ ver. 3.0 и библиотеки Turbo Vision. Исходник программы находится в файле KURSOVIK.CPP.
Стандартные библиотеки С++:stdio.h, stdlib. h, string. h
Библиотеки Turbo Vision: tv. h, app. h, objects. h, menus. h, dialog. h, stddlg. h, msgbox.h.
Инструкция пользователю
Если вы решили использовать в своих целях данный программный продукт, запустите файл KURSOVIK. EXE и наслаждайтесь приятной работой которую обеспечит вам данная программа. База данных студентов сохраняется в файле с расширением .sdb.
После запуска программы перед вами появляется окно программы в верхней части которого находится меню. Для создания новой базы войдите в меню File и выберите пункт НОВАЯ БАЗА ДАННЫХ, появится окно в котором нужно ввести название базы не более 8 символов. После этого вы увидите рабочий диалог. Вы сможете перемещаться по базе с помощью кнопок >> и <<, а также добавлять и удалять записи с помощью кнопок Add и Del, при закрытии базы кнопкой Close происходит автосохранение базы. Для поиска элемента используйте пункт ПОИСК меню EDIT или клавишу F7. С помощью пункта ОТМЕНИТЬ ИСПРАВЛЕНИЯ в меню EDIT или клавиши Alt-Q вы можете отменить исправления в данной записи.
Выводы
В результате выполнения работы я полностью освоил организацию и работу с диалоговыми окнами в Turbo Vision C++. Была написана «мощнейшая» база данных, обрабатывающая данные о студентах, способная сохранять данные в файл и считывать из файла в новом стандарте SDB. В программе организован сверх-удобный и вместе с тем несложный пользовательский интерфейс. Данный программный продукт является коммерческим. Копирование и взлом преследуются по закону.
Приложение
Текст программы.
#define Uses_TKeys
#define Uses_TApplication
#define Uses_TInputLine
#define Uses_TRect
#define Uses_TLabel
#define Uses_TMenuBar
#define Uses_TSubMenu
#define Uses_TButton
#define Uses_TMenuItem
#define Uses_TStatusLine
#define Uses_TStatusItem
#define Uses_TStatusDef
#define Uses_TDeskTop
#define Uses_TDialog
#define Uses_TFileDialog
#define Uses_TChDirDialog
#define Uses_TSItem
#define Uses_TRadioButtons
#define Uses_MsgBox
#include
#include
#include
#include
#include
const cmNewBase=200,//
cmOpenBase=201,
cmSaveBase=202,
cmChDir=203,
cmSAgain=204,
cmSearch=205,
cmAddItm=206,//
cmDel=207,//
cmFwd=208, //
cmBck=209, //
cmUndoCh=210;
TDialog *wd;
struct TStudent
{
char soname[30];
char name[30];
char patron[30];
ushort sex;
char group[12];
char course[3];
ushort contra;
char grant[10];
char studnum[8];
};
const blocksize=sizeof (TStudent);
struct TSearchRec
{
ushort pole;
char val[30];
};
class TStudentBase
{
public:
TStudentBase ();
~TStudentBase ();
void Sets (char*, char*, char*, char*, ushort, char*, char*, char*, ushort);
TStudent *persone;
TStudentBase *prev;
TStudentBase *next;
};
TStudentBase *StudentBase, *firstItm, *tmpS;
TSearchRec *searchRec;
ushort control;
char *basename;
char *fileName;
class TStudentApp: public TApplication
{
public:
TStudentApp ();
virtual void handleEvent (TEvent& event);
static TStatusLine *initStatusLine (TRect);
static TMenuBar *initMenuBar (TRect);
private:
void WorkDialog ();
void SaveBase (char *filename);
TStudentBase *ReadBase (char *filename);
void NewBase ();
void changeDir ();
void openBase ();
void searchDialog ();
TStudentBase *Search (TSearchRec *);
TStudentBase *SAgain (TSearchRec *, TStudentBase *);
};
TStudentApp:TStudentApp ():
TProgInit (&TStudentApp:initStatusLine,
&TStudentApp:initMenuBar,
&TStudentApp:initDeskTop)
{
disableCommand (cmSaveBase);
disableCommand (cmSearch);
disableCommand (cmSAgain);
disableCommand (cmUndoCh);
};
TStatusLine *TStudentApp:initStatusLine (TRect r)
{
r.a.y=r.b.y-1;
return new TStatusLine (r,
*new TStatusDef (0,0xFFFF)+
*new TStatusItem («~Alt-X~ Выход», kbAltX, cmQuit)
);
}
TMenuBar *TStudentApp:initMenuBar (TRect r)
{
r.b.y=r.a.y+1;
return new TMenuBar (r,
*new TSubMenu («~F~ile», kbAltF, hcNoContext)+
*new TMenuItem («Новая база данных… ~Alt-N~», cmNewBase, kbAltN)+
*new TMenuItem («Открыть базу… ~F3~», cmOpenBase, kbF3)+
*new TMenuItem («Сохранить базу ~F2~», cmSaveBase, kbF2)+
newLine ()+
*new TMenuItem («Сменить каталог…», cmChDir, hcNoContext)+
newLine ()+
*new TMenuItem («~В~ыход ~Alt-X~», cmQuit, hcNoContext)+
*new TSubMenu («~E~dit», kbAltE, hcNoContext)+
*new TMenuItem («Поиск… ~F7~», cmSearch, kbF7)+
*new TMenuItem («Поиск следующей записи ~Shift-F7~», cmSAgain, kbShiftF7)+
*new TMenuItem («Отменить исправления ~Alt-Q~», cmUndoCh, kbAltQ)
);
};
void TStudentApp: handleEvent (TEvent& event)
{
if (event.what == evCommand)
{
switch (event.message.command)
{
case cmNewBase:
NewBase ();
if (control==cmCancel)break;
StudentBase=new TStudentBase ();
firstItm=StudentBase;
fileName=basename;
WorkDialog ();
clearEvent (event);
break;
case cmAddItm:
wd->getData (StudentBase->persone);
TStudentBase *tmp=new TStudentBase ();
tmp->prev=StudentBase;
tmp->next=StudentBase->next;
StudentBase->next->prev=tmp;
StudentBase->next=tmp;
StudentBase=StudentBase->next;
wd->setData (StudentBase->persone);
clearEvent (event);
break;
case cmDel:
if ((StudentBase->prev≠NULL)||(StudentBase->next≠NULL))
{
if (StudentBase->prev≠NULL)
StudentBase->prev->next=StudentBase->next;
if (StudentBase->next≠NULL)
{StudentBase->next->prev=StudentBase->prev;
StudentBase=StudentBase->next;}
else StudentBase=StudentBase->prev;
}
if (StudentBase≠NULL)wd->setData (StudentBase->persone);
clearEvent (event);
break;
case cmFwd:
wd->getData (StudentBase->persone);
if (StudentBase->next≠NULL)
{
StudentBase=StudentBase->next;
wd->setData (StudentBase->persone);
};
clearEvent (event);
break;
case cmBck:
wd->getData (StudentBase->persone);
if (StudentBase->prev≠NULL)
{
StudentBase=StudentBase->prev;
wd->setData (StudentBase->persone);
};
clearEvent (event);
break;
case cmCancel:
disableCommand (cmSaveBase);
disableCommand (cmSearch);
disableCommand (cmSAgain);
disableCommand (cmUndoCh);
enableCommand (cmOpenBase);
enableCommand (cmNewBase);
wd->getData (StudentBase->persone);
SaveBase (fileName);
destroy (wd);
clearEvent (event);
break;
case cmChDir:
changeDir ();
clearEvent (event);
break;
case cmOpenBase:
openBase ();
if ((control==cmCancel)||StudentBase==NULL)break;
WorkDialog ();
clearEvent (event);
break;
case cmSaveBase:
SaveBase (fileName);
clearEvent (event);
break;
case cmSearch:
searchRec=new TSearchRec;
strcpy (searchRec->val," «);
searchRec->pole=0;
searchDialog ();
if (control==cmCancel)break;
tmpS=Search (searchRec);
clearEvent (event);
break;
case cmSAgain:
tmpS=SAgain (searchRec, tmpS);
clearEvent (event);
break;
case cmUndoCh:
wd->setData (StudentBase->persone);
default:
break;
}
};
TApplication:handleEvent (event);
}
void TStudentApp: NewBase ()
{
TDialog *nb=new TDialog (TRect (20,5,60,15)," Новая База");
TInputLine *bnm=new TInputLine (TRect (3,3,37,4), 9);
TButton *ok=new TButton (TRect (4,6,19,8)," ~O~k", cmOK, bfDefault);
TButton *canc=new TButton (TRect (21,6,36,8)," ~C~ancel", cmCancel, bfNormal);
nb->insert (canc);
nb->insert (ok);
nb->insert (bnm);
control=deskTop->execView (nb);
if (control≠cmCancel)
{
nb->getData (basename);
strcat (basename," .sdb");
}
destroy (nb);
};
void TStudentApp: WorkDialog ()
{
wd=new TDialog (TRect (3,2,77,21), basename);
wd->flags=0×00;
TInputLine *stdn=new TInputLine (TRect (23,2,30,3), 8);
TInputLine *sn=new TInputLine (TRect (12,4,42,5), 30);
TInputLine *nm=new TInputLine (TRect (12,6,42,7), 30);
TInputLine *pt=new TInputLine (TRect (12,8,42,9), 30);
TInputLine *cr=new TInputLine (TRect (37,10,42,11), 3);
TInputLine *gr=new TInputLine (TRect (12,10,26,11), 12);
TInputLine *st=new TInputLine (TRect (14,12,25,13), 10);
TRadioButtons *Sex=new TRadioButtons (TRect (44,4,57,6),
new TSItem («Мужской» ,
new TSItem («Женский», 0
)));
TRadioButtons *Contr=new TRadioButtons (TRect (44,8,57,10),
new TSItem («Да» ,
new TSItem («Нет», 0
)));
wd->insert (new TLabel (TRect (3,12,13,13)," ~С~тепендия", st));
wd->insert (new TLabel (TRect (44,7,60,8)," ~К~онтрактник", Contr));
wd->insert (new TLabel (TRect (31,10,36,11)," ~К~урс", cr));
wd->insert (new TLabel (TRect (3,10,11,11)," ~Г~руппа", gr));
wd->insert (new TLabel (TRect (44,3,57,4)," ~П~ол", Sex));
wd->insert (new TLabel (TRect (3,8,11,9)," ~О~чество", pt));
wd->insert (new TLabel (TRect (3,6,7,7)," ~И~мя", nm));
wd->insert (new TLabel (TRect (3,4,11,5)," ~Ф~амилия", sn));
wd->insert (new TLabel (TRect (3,2,22,3)," ~Н~омер студ. билета", stdn));
wd->insert (sn);
wd->insert (nm);
wd->insert (pt);
wd->insert (Sex);
wd->insert (gr);
wd->insert (cr);
wd->insert (Contr);
wd->insert (st);
wd->insert (new TButton (TRect (60,5,71,7)," ~A~dd", cmAddItm, bfNormal));
wd->insert (new TButton (TRect (60,8,71,10)," ~D~el", cmDel, bfNormal));
wd->insert (new TButton (TRect (60,11,71,13)," ~C~lose", cmCancel, bfDefault));
wd->insert (new TButton (TRect (19,15,35,17)," <<", cmBck, bfNormal));
wd->insert (new TButton (TRect (39,15,55,17)," >>", cmFwd, bfNormal));
wd->insert (stdn);
wd->setData (StudentBase->persone);
enableCommand (cmSaveBase);
enableCommand (cmSearch);
enableCommand (cmSAgain);
enableCommand (cmUndoCh);
disableCommand (cmOpenBase);
disableCommand (cmNewBase);
deskTop->insert (wd);
wd->getData (StudentBase->persone);
}
void TStudentApp: searchDialog ()
{
TDialog *sr=new TDialog (TRect (17,5,63,20)," Поиск");
TInputLine *Val=new TInputLine (TRect (3,3,37,4), 30);
TButton *ok=new TButton (TRect (4,10,19,12)," ~O~k", cmOK, bfDefault);
TButton *canc=new TButton (TRect (21,10,36,12)," ~C~ancel", cmCancel, bfNormal);
TRadioButtons *Pole=new TRadioButtons (TRect (3,5,43,9),
new TSItem («Номер студенческого» ,
new TSItem («Фамилия» ,
new TSItem («Имя» ,
new TSItem («Отчество» ,
new TSItem («Группа» ,
new TSItem («Курс» ,
new TSItem («Степендия», 0
))))))));
sr->insert (canc);
sr->insert (ok);
sr->insert (Pole);
sr->insert (Val);
control=deskTop->execView (sr);
if (control≠cmCancel)
{
sr->getData (searchRec);
}
destroy (sr);
};
TStudentBase *TStudentApp:Search (TSearchRec *srec)
{
TStudentBase *Sb=new TStudentBase ();
Sb=firstItm;
int found;
found=2;
while ((Sb≠NULL)&&(found))
{
switch (srec->pole)
{
case 0: found=strcmp (srec->val, Sb->persone->studnum);break;
case 1: found=strcmp (srec->val, Sb->persone->soname);break;
case 2: found=strcmp (srec->val, Sb->persone->name);break;
case 3: found=strcmp (srec->val, Sb->persone->patron);break;
case 4: found=strcmp (srec->val, Sb->persone->group);break;
case 5: found=strcmp (srec->val, Sb->persone->course);break;
case 6: found=strcmp (srec->val, Sb->persone->grant);break;
}
if (found≠0)Sb=Sb->next;
else {StudentBase=Sb;
wd->setData (StudentBase->persone);
}
};
if (found≠0)
mfError;
messageBox («Запись не найдена!!!», mfOkError);
return NULL;
;
return Sb->next;
};
TStudentBase *TStudentApp:SAgain (TSearchRec *srec, TStudentBase *tmp)
{
int found;
found=2;
while ((tmp≠NULL)&&(found))
{
switch (srec->pole)
{
case 0: found=strcmp (srec->val, tmp->persone->studnum);break;
case 1: found=strcmp (srec->val, tmp->persone->soname);break;
case 2: found=strcmp (srec->val, tmp->persone->name);break;
case 3: found=strcmp (srec->val, tmp->persone->patron);break;
case 4: found=strcmp (srec->val, tmp->persone->group);break;
case 5: found=strcmp (srec->val, tmp->persone->course);break;
case 6: found=strcmp (srec->val, tmp->persone->grant);break;
}
if (found≠0)tmp=tmp->next;
else {StudentBase=tmp;
wd->setData (StudentBase->persone);
}
};
if (found≠0)
const mfOkError=mfOKButton ;
return tmp->next;
};
void TStudentApp: openBase ()
{
TFileDialog *d= (TFileDialog *)validView (
new TFileDialog («*.sdb», «Открыть файл», «~N~ame», fdOpenButton, 100));
control=deskTop->execView (d);
if (d ≠ 0 && control≠cmCancel)
{
d->getFileName (basename);
strcpy (fileName, basename);
do
{
strcpy (basename, strchr (basename,'\')+1);
}while (strchr (basename,'\')≠NULL);
firstItm=ReadBase (fileName);
StudentBase=firstItm;
}
destroy (d);
}
void TStudentApp: changeDir ()
{
TView *d = validView (new TChDirDialog (0, cmChangeDir));
if (d ≠ 0)
{
deskTop->execView (d);
destroy (d);
}
}
TStudentBase:TStudentBase ()
{
persone=new TStudent;
Sets (««,» «,» «,» «, 0,» «,» «,» «, 0);
next=NULL;
prev=NULL;
};
TStudentBase:~TStudentBase ()
{
delete persone;
};
void TStudentBase: Sets (char *stdn, char *sn, char *nm, char *pt,
ushort sx, char *gr, char *cr, char *st, ushort cntr)
{
strcpy (persone->studnum, stdn);
strcpy (persone->soname, sn);
strcpy (persone->name, nm);
strcpy (persone->patron, pt);
strcpy (persone->group, gr);
strcpy (persone->course, cr);
strcpy (persone->grant, st);
persone-> sex=sx;
persone->contra=cntr;
};
long filesize (FILE *f)
{
long curpos, length;
curpos=ftell (f);
fseek (f, 0L, SEEK_END);
length=ftell (f);
fseek (f, curpos, SEEK_SET);
return length;
};
int Eof (FILE *f)
{
long curpos=ftell (f);
TStudent *st;
fread (st, sizeof (TStudent), 1, f);
if (feof (f))
{
fseek (f, curpos, SEEK_SET);
return 1;
};
fseek (f, curpos, SEEK_SET);
return 0;
};
TStudentBase *TStudentApp:ReadBase (char *filename)
{
FILE *baseF;
if (((baseF=fopen (filename," r"))==NULL)||(filesize (baseF)==0))
{
return NULL;
fclose (baseF);
}
TStudentBase *base=new TStudentBase ();
TStudentBase *tmp;
tmp=base;
do
{
fread (tmp->persone, sizeof (TStudent), 1, baseF);
if (Eof (baseF)≠0)break;
tmp->next=new TStudentBase ();
tmp->next->prev=tmp;
tmp->next->next=NULL;
tmp=tmp->next;
}while (!feof (baseF));
fclose (baseF);
return base;
}
void TStudentApp: SaveBase (char *filename)
{
FILE *baseF;
baseF=fopen (filename," w");
TStudentBase *tmp;
tmp=firstItm;
do
{
fwrite (tmp->persone, sizeof (TStudent), 1, baseF);
tmp=tmp->next;
}
while (tmp≠NULL);
fclose (baseF);
};
void main ()
{
basename=new char[100];
fileName=new char[100];
TStudentApp StBase;
StBase.run ();
}