Помощь в написании студенческих работ
Антистрессовый сервис

Использование библиотеки 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 ();

}

Показать весь текст
Заполнить форму текущей работой