Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие-ООП - копия.doc
Скачиваний:
20
Добавлен:
17.08.2019
Размер:
907.78 Кб
Скачать

3.2Проектирование структурной схемы программы Составление начальной иерархии и структуры классов

Выберем в качестве имен классов входящие в условие задачи наименования документов, циркулирующие в разрабатываемой системе. В нашем случае - это акты, расценки, ведомости, и, следовательно, классы - это akt, cena, ved.

Класс ved является производным классов akt и cena.

Рис. 3.1. Иерархия классов для задачи учета выполнения работ

Определим для каждого класса совокупность элементов-данных и элементов-функций для их обработки.

Во-первых, каждый класс содержит реквизиты документа:

класс akt - char tabn[10], char fio[30], char vid[10], float objem,

класс cena - char vid[10], char naim[30], float rascenka,

класс ved -char tabn[10], char fio[30], char vid[10], float objem, char naim[30], float stoim, float itog.

Во-вторых, по условию задачи требуется хранить исходные документы (Акты и Расценки) в базе данных с индексной организацией. Следовательно, необходимо иметь в классах akt и cena структуры индексных массивов (struct tip_index) и элементы-функции для их обработки: init_ind (инициализация элемента), init_kol (инициализация количества элементов), dob_ind (добавление элемента), poisk_ind (поиск элемента), cor_ind (корректировка элемента), sort_ind (сортировка массива). Необходимы также функции открытия файлов данных и инициализации (создания) индексных массивов при запуске программы (init).

В-третьих, необходимо выполнять с помощью подменю следующие операции над исходными документами ("Акт", "Расценка"): ввод документов; поиск документов; замена содержимого документов; удаление документов. Ввиду того, что алгоритмы операций поиска, замены и удаления достаточно близки, используем для их реализации одну функцию с параметром, который определяет вид операции correct(int). Итак, для классов akt и cena необходимы функции sozdanie - для ввода нового документа в базу данных и correct(int) для корректировки базы данных, а также дополнительные функции zapis_zap(int) и chtenie_zap(int) для записи/чтения документов из базы данных. Для класса ved необходима функция sozdanie, создающая в результате расчета стоимостную ведомость.

В-четвертых, необходимы также для классов akt и cena еще функции пользовательского интерфейса: вывод формы документа с именем опции меню formecran(char*), ввод содержимого документа с клавиатуры vvod() и вывод содержимого документа vyvod(). Для класса ved также необходима функция formecran(char*).

Поскольку управление задачей осуществляется с помощью меню, файл управления, не являющийся классом, будет содержать главную функцию main, функции menu, podmenu, и объявление объектов классов, с помощью которых будут вызываться соответствующие элементы-функции классов.

В файле управления будем вводить с клавиатуры имена файлов базы данных, поэтому необходимы еще переменные imf_akt и imf_cena. Функция podmenu(int,int) имеет два параметра для определения местоположения формы подменю на экране и вызова функций классов akt и cena.

Реорганизация иерархии и структуры классов

Реорганизация иерархии классов заключается либо в выделении общих элементов нескольких классов в новый класс, либо в разделении класса на несколько новых. Анализ структуры классов akt и cena позволяет выделить их общую часть, относящуюся к индексному массиву, в новый базовый класс ind. Этот класс не является классом-понятием данной прикладной области, он предложен программистом и определяет специфику организации базы данных. Таким образом, в иерархии классов появляются так называемые системные классы.

Класс ved, являясь производным от классов akt и cena, наследует элементы-данные этих классов. Поэтому, удалим из класса ved элементы-данные char tabn[10], char fio[30], char vid[10], float objem, char naim[30].

Реорганизуем исходную иерархию классов (рис. 3.2).

Рис. 3.2. Структура исходной иерархии классов

Программная реализация реорганизованной структуры классов будет иметь следующий вид:

Класс ind:

struct tip_index //index[100]-индексный массив,

{ //массив структур типа tip_index

char kluch[max_pole];//ключ записи

int nomer; //номер записи

} index[100]; //100-макс. кол. элем. массива

int kol; //кол. элем. массива

char* imf; //имя файла данных

init_ind() //функция инициализ. элемента

init_kol() //функция инициализ кол. элем.

dob_ind() //функция добавления элемента

poisk_ind() //функция поиска элемента

cor_ind() //функция коррект. элемента

//конструкторы...

Класс akt: Класс cena:

char tabn[10]; char vid[10];

char fio[30]; char naim[30];

char vid[10]; float rascenka;

float objem;

void zapis_zap(int); void zapis_zap(int); //запись в файл

void chtenie_zap(int); void chtenie_zap(int); //чтение из файла

void init(); void init(); //инициализация инд.массива

void sozdanie(); void sozdanie(); //создание документа

void correct(int); void correct(int); //корректир.документа

void formecran(char*); void formecran(char*);//вывод формы док.

void vvod(); void vvod(); //ввод документа

void vyvod(); void vyvod(); //вывод документа

//конструкторы... //конструкторы...

Класс ved: Файл управления:

float stoim char imf_akt[13];

float itog; char imf_cena[13];

void sozdanie; ved obj(imf_akt,imf_cena); //объект

void formecran(char*); void podmenu(int,int){...} //подменю

//конструктор... menu(){...} //меню

main() //главная функция