Реализация адресной книги

Вид материалаДокументы

Содержание


3.1. Реализация задачи
3.2. Описание используемых структур данных
3.3. Пользовательский интерфейс
Рис. 11 Основные элементы пользовательского интерфейса: 1
3 - Кнопка для добавления введенных данных в память 4
3.4. Описание диалога
3.5. Контроль ошибочных действий пользователя
3.6. Краткое описание алгоритма программы
3.8. Исходный код (листинг) программы
AnsiString inf[9]
Подобный материал:
1   2   3

3. Экспериментальная часть


^ 3.1. Реализация задачи


В курсовой работе в качестве средств реализации адресной книги выбраны линейные двусвязные списки (ЛДС).

В программе предусмотрено выполнение следующих основных функций:
  1. Создание новой адресной книги.
  2. Изменение, удаление, сохранение, загрузка адресных книг, хранящихся на жестком диске.
  3. Изменение, удаление, сохранение, добавление записей к текущей рабочей книге.



^ 3.2. Описание используемых структур данных


Для описания элемента ЛДС выбрана следующая структура:


struct node {

AnsiString inf[9];

node *n;

node *p;

};


Где поле n – указатель на следующий элемент, p – указатель на предыдущий, а inf – информационное поле, представляющее собой массив из 9 элементов AnsiString.


^ 3.3. Пользовательский интерфейс


В программе реализован «дружественный интерфейс», ориентированный на конечного пользователя, и простые инструменты манипуляции данными:

Два пункта Главного меню раскрываются по ниспадающему принципу.

Структура пользовательского экрана и раскрытие его главных элементов показаны на рис. 11.




^ Рис. 11




Основные элементы пользовательского интерфейса:

1 - Список доступных контактов

2 - Кнопка для сохранения введенных данных в память

^ 3 - Кнопка для добавления введенных данных в память

4 - Поля с данными для подробного просмотра записи

5 - Меню





Рис. 11а


Пункт меню «Файл» (рис. 11а) содержит в себе 5 подпунктов: «Новая книга», «Открыть», «Сохранить», «Удалить книгу» и «Выйти».

Подпункт «Новая книга» позволяет создать новую книгу на жестком диске и начать ввод данных.

Подпункт «Открыть» позволяет открыть произвольную адресную книгу из уже имеющихся.

Подпункт «Сохранить» позволяет сохранить рабочую адресную книгу на жесткий диск.

Подпункт «Удалить книгу» позволяет удалить рабочую адресную книгу с жесткого диска.

Подпункт «Выйти» позволяет выйти из программы.





Рис. 11б

Пункт меню «Сервис» (рис. 11б) содержит в себе 5 подпунктов: «Удалить», «Сохранить», «Добавить», «Показать книгу» и «Очистить книгу».

Подпункт «Удалить» позволяет удалить выделенную запись книги из памяти.

Подпункт «Сохранить» аналогичен по своему действию кнопке «Сохранить» и позволяет сохранить введенные данные в памяти.

Подпункт «Добавить» аналогичен по своему действию кнопке «Добавить» и позволяет добавить введенные данные в память.

Подпункт «Показать книгу» позволяет просмотреть все записи книги в удобном табличном виде.

Подпункт «Очистить книгу» позволяет удалить все записи книги.


^ 3.4. Описание диалога


При запуске программы открывается пользовательское окно Windows, изображенное на рисунке 11. Пользователю предоставляется возможность создать новую книгу и начать с ней работу.


Для того чтобы создать новую книгу нужно выбрать в главном меню пункт «Файл» - «Новая книга». Программа выдаст стандартный диалог сохранения файла, где пользователю будет предложено ввести имя новой книги (см. Рис 12).





Рис. 12




После создания новой книги или загрузки уже имеющейся пользователь сможет начать работу с программой.


Пользователь может вносить любые данные в поля, после чего сохранить измененные поля в текущем списке, либо добавить к нему. Для этих целей служат кнопки «Добавить» и «Сохранить».


Так же пользователь может просмотреть все записи книги в удобном табличном виде, выбрав пункт меню «Сервис» - «Показать книгу».


^ 3.5. Контроль ошибочных действий пользователя





В программе предусмотрен контроль отдельных ошибочных действий пользователя программы, при возникновении которых на экран выводится соответствующие сообщения. В этих сообщениях указан характер ошибки:










^ 3.6. Краткое описание алгоритма программы


Программа решает задачи по управлению адресными книгами. Пользователи программы могут создавать, удалять и редактировать адресные книги. Данные в программе формируются в виде линейного двусвязного списка. Каждая запись, состоящая из 9 полей, является элементом этого списка.

Схематичная структура списка представлена на следующем рисунке:




Рис. 13


Добавление данных в книгу можно осуществить, заполнив поля записи и нажав кнопку «Добавить» или выбрать пункт меню «Сервис» - «Добавить».

Сохранение измененных данных происходит аналогично добавлению (см. раздел «Пользовательский экран»).

Удалить элемент можно выбрав его в списке и нажав пункт меню «Сервис» - «Удалить».

Просмотреть всю книгу в виде таблицы можно выбрав пункт меню «Сервис» - «Показать книгу».

    1. Состав программы


3.7.1. Программа содержит следующие нижеперечисленные функции.


void __fastcall EditKeyPress(TObject *Sender, char &Key);

Функция содержит обработчик нажатий на клавиши, в случае если это не 1-9 или backspace запрещает ввод. Назначение – предотвращение ошибочного ввода данных.

void __fastcall Open1Click(TObject *Sender);

Функция содержит алгоритм загрузки данных из адресной книги, назодящейся на жестком диске. Назначение – загрузка данных.


void __fastcall Exit1Click(TObject *Sender);

Функция для закрытия формы. Назначение – выход из программы.

void __fastcall MenuClick(TObject *Sender);

Функция содержит обработчик нажатий на элементы адресной книги. Назначение – загрузка данных в информационные поля.

void __fastcall FormCanResize(TObject *Sender, int &NewWidth, int &NewHeight,

bool &Resize);

Функция содержит обработчик на изменение размеров формы.

Назначение – не дать сжать форму менее определенных, заданных размеров.

void __fastcall N5Click(TObject *Sender);

Функция содержит алгоритм создания новой адресной книги. Назначение – создание файла адресной книги на жестком диске.


void __fastcall Save1Click(TObject *Sender);

Функция содержит алгоритм сохранения адресной книги на жесткий диск.

void __fastcall Button2Click(TObject *Sender);

Функция содержит обработчик нажатий на клавишу “Добавить”. Назначение – добавление элементов к адресной книге.

void __fastcall Button1Click(TObject *Sender);

Функция содержит обработчик нажатий на клавишу “Сохранение”. Назначение – сохранение изменений, произведенных с элементом адресной книги.

void __fastcall N3Click(TObject *Sender);

Функция содержит алгоритм удаления элемента из адресной книги.

void __fastcall MenuKeyPress(TObject *Sender, char &Key);

Функция содержит обработчик нажатий на клавиши. Назначение – “поймать” нажатие клавиши Delete.

void __fastcall N8Click(TObject *Sender);

Функция содержит алгоритм очистки книги.

void __fastcall N1Click(TObject *Sender);

Функция содержит алгоритм удаления книги.


void __fastcall TFr::N10Click(TObject *Sender)

Функция содержит алгоритм загрузки данных в элемент TListView, находящийся на форме Fr2.


void __fastcall TFr::EvMinimize(TObject *Sender)

Функция содержит обработчик, который срабатывает, когда происходит нажатие на кнопке «свернуть» первой формы.


void __fastcall TFr::TrClick(TObject *Sender)

Функция содержит обработчик клика левой клавишей мыши на значок в трее.


3.7.2. Для работы с ЛДС в программе предусмотрен соответствующий класс LDS.


class LDS

{

void Add(AnsiString inf[]);

Функция содержит алгоритм добавления элемента к ЛДС.


node *GetEl(int a);

Функция содержит алгоритм получения элемента ЛДС.


int DelEl(int a);

Функция содержит универсальный алгоритм удаления элемента ЛДС. Может быть использована для удаления любых элементов ЛДС.


void Clear();

Функция содержит алгоритм очистки ЛДС.

}


3.7.3. Для работы с пользователем, а так же для разнообразных вспомогательных функций в прогармме используется класс ALL.


class ALL

{

char CharSwitch(char &K);

Фунция содержит обработчик нажатий на клавиши.


void Error(int cd, bool t=true);

Функция содержит алгоритм выдачи сообщений пользователю.


bool Load();

Функция содержит алгоритм загрузки информации в поля.


bool WriteToFile() ;

Функция содержит алгоритм сохранения данных в файл.


bool CwriteToFile();

Функция содержит алгоритм создания новой адресной книги.

}


^ 3.8. Исходный код (листинг) программы


#include

#include

#include

#include

#include "Unit1.h"

#include "Unit2.h"

#pragma hdrstop

#pragma package(smart_init)

#pragma resource "*.dfm"

using namespace std;

TFr *Fr;

__fastcall TFr::TFr(TComponent* Owner): TForm(Owner) {}


//-------------------------------------------------//

//############## Переменные и классы ##############//

//-------------------------------------------------//

int i,j,l,k,c;

int conf_k[] = {8,48,49,50,51,52,53,54,55,56,57}; //Разрешенные для ввода клавиши

struct node {//Структура ЛДС

^ AnsiString inf[9];

node *n;

node *p;

};

AnsiString t,s,m,_fl="";

node *f=NULL, *e=NULL, *tmp, *z;

bool first;


//---------------------------------------------------------------------------


class LDS {//Класс для работы с ЛДС

public:


void Add(AnsiString inf[]) {

//Процедура добавления

node *x;

x = new node;

for(i=0; i<9; i++) x->inf[i] = inf[i];

x->n = NULL;

x->p = e;

if(e != NULL) e->n = x;

else f = x;

e = x;

}


node *GetEl(int a) {

//Процедура получения элемента из ЛДС по номеру

tmp=f;

for(i=0; in;

return tmp;

}


int DelEl(int a) {

//Универсальная процедура удаления любого элемента ЛДС

if(a == 1) {

if(f->n != NULL) {

tmp = f->n;

delete(f);

f = tmp;

} else {

delete(f);

f = NULL;

e = NULL;

}

} else {

tmp = this->GetEl(a-1);

if(tmp == e) {

z = e->p;

z->n = NULL;

delete(e);

e = z;

} else {

z = tmp->p;

z->n = tmp->n;

tmp->n->p = z;

delete(tmp);

}

}

}


void Clear() {

//Очистка ЛДС

z = f;

while(z != NULL) {

tmp = z->n;

delete(z);

z = tmp;

}

f = NULL;

e = NULL;

}

};


//---------------------------------------------------------------------------


class ALL {//Класс для функций общего назначения и обработчиков

public:


char CharSwitch(char &K) {

//Обработчик ввода

int Kcode, Count = sizeof(conf_k)/sizeof(conf_k[0]);

char tmp = K;

Kcode = K;

K = NULL;

for(i=0; i

if(Kcode == conf_k[i]) {

K = tmp;

break;

}

}

}


void Error(int cd, bool t=true, AnsiString st="", AnsiString st2="") {

//Процедура для обратной связи с юзером

AnsiString text;

switch(cd) {

case 1: text="Файл не существует"; break;

case 2: text="Строка " + st + " файла " + st2 + " имеет неверный формат\nКнига не может быть загружена"; break;

case 3: text="Файл " + st + " уже существует"; break;

case 4: text="Файл не может быть создан"; break;

case 5: text="Не выбран элемент для удаления"; break;

case 6: text="Книга пуста"; break;

case 7: text="Книга очищена"; break;

case 8: text="Книга не существует"; break;

case 9: text="Успешно сохранено"; break;

case 10: text="Книга создана"; break;

}

if(t) MessageBox(0, text.c_str(), "Ошибка", MB_ICONEXCLAMATION);

else MessageBox(0, text.c_str(), "Уведомление", MB_ICONEXCLAMATION);

}


bool Load() {

//Загрузка ЛДС в информационные поля

int num = Fr->Menu->ItemIndex+1;

if(num < 1) return false;

for(z=f,i=1; i<=num,z != NULL; i++,z=z->n) {

if(i == num) {

for(i=0; i<9; i++) {

TEdit *edit = (TEdit*)Fr->FindComponent("Edit"+AnsiString(i));

edit->Text = z->inf[i];

}

}

}

return true;

}


bool WriteToFile() {

//Процедура записи данных в файл

if(FileExists(_fl)) {

FILE *fl;

fl = fopen(_fl.c_str(),"w");

for(node *z = f; z != NULL; z=z->n) {

for(i=0; i<9; i++) {

if(i != 8) fputs((z->inf[i]+";").c_str(),fl);

else {

if(z->n != NULL) fputs((z->inf[i] + "\n").c_str(),fl);

else fputs(z->inf[i].c_str(),fl);

}

}

}

fclose(fl);

return true;

}

return false;

}


bool CWriteToFile() {

//Процедура создания файла

Fr->Save->Filter = "Адресные книги (*.csv)|*.csv|";

if(Fr->Save->Execute()) {

if(FileExists(Fr->Save->FileName)) this->Error(3,true, Fr->Save->FileName);

else {

int a = FileCreate(Fr->Save->FileName);

if(a > 0) {

FileClose(a);

_fl = Fr->Save->FileName;

return true;

}

else this->Error(4);

}

}

return false;

}

};


//Создаем обьекты классов

ALL fx;

LDS lds;


//-------------------------------------------------//

//############## Основные процедуры ##############//

//-------------------------------------------------//


void __fastcall TFr::Open1Click(TObject *Sender) {

//Процедура загрузки книги

Open->Filter = "Адрессные книги (*.csv)|*.csv|";

if(Open->Execute()) {

lds.Clear();

Menu->Clear();

for(i=0; i<9; i++) {

TEdit *edit = (TEdit*)Fr->FindComponent("Edit"+AnsiString(i));

edit->Clear();

}

t = Open->FileName;

if(FileExists(t)) {

_fl = t;

char buf[6000];

bool first = true, flag = true;

ifstream b(t.c_str());

j = 1;

while(!b.eof() && flag) {

b.getline(buf,6000);

s = buf;

c = 0;

for(i=1; i <= s.Length(); i++) if(s[i] == ';') c++;

if(c != 8) {

fx.Error(2,true,IntToStr(j), _fl);

flag = false;

break;

}

c = 1;

l = 0;

AnsiString inf[9];

for(i=1; i <= s.Length(); i++) {

if(s[i] == ';' || i == s.Length()) {

if(i == s.Length()) inf[l] = s.SubString(c,i-c+1);

else inf[l] = s.SubString(c,i-c);

c = i+1;

l++;

}

}

lds.Add(inf);

j++;

}

if(flag) {

tmp = f;

while(tmp != NULL) {

Menu->Items->Add(tmp->inf[0]);

tmp = tmp->n;

}

}

} else fx.Error(1);

}

}


//---------------------------------------------------------------------------


void __fastcall TFr::EditKeyPress(TObject *Sender, char &Key)

{

fx.CharSwitch(Key);

}


//---------------------------------------------------------------------------


void __fastcall TFr::Exit1Click(TObject *Sender)

{

Fr->Close();

}


//---------------------------------------------------------------------------


void __fastcall TFr::MenuClick(TObject *Sender)

{

fx.Load();

}

//---------------------------------------------------------------------------


void __fastcall TFr::FormCanResize(TObject *Sender, int &NewWidth,

int &NewHeight, bool &Resize)

{

if(NewWidth<626) NewWidth = 626;

if(NewHeight<561) NewHeight = 561;

}

//---------------------------------------------------------------------------


void __fastcall TFr::N5Click(TObject *Sender)

{

if(fx.CWriteToFile()) {

lds.Clear();

Menu->Clear();

fx.Error(10,false);

}

}

//---------------------------------------------------------------------------


void __fastcall TFr::Save1Click(TObject *Sender)

{

if(_fl != "" && fx.WriteToFile()) fx.Error(9,false);

else if(fx.CWriteToFile() && fx.WriteToFile()) fx.Error(9,false);

}

//---------------------------------------------------------------------------