- •Оглавление
- •1 Основные методы программирования. Лекция №2 5
- •2 Методы объектно-ориентированного программирования. Лекция №6. 15
- •2.4 Вопросы по теме 54
- •3 Объектно-ориентированное проектирование. Лекция №12 55
- •3.4 Вопросы по теме 74
- •Введение. Лекция №1.
- •1Основные методы программирования. Лекция №2
- •1.1Процедурное программирование Методы процедурного программирования
- •Этапы разработки программ. Лекция 3.
- •1.2Объектно-ориентированное программирование Лекция №4
- •Этапы разработки оо программ. Лекция №5
- •Конструкторы и деструкторы. Лекция №7.
- •Друзья класса
- •2.2Наследование. Лекция №8
- •Производный класс
- •Простое наследование
- •Множественное наследование. Лекция №9
- •Виртуальные базовые классы
- •2.3Полиморфизм. Лекция №10
- •Перегрузка операций
- •Преобразования типов, определяемые классом
- •Перегрузка функций.
- •Чистый полиморфизм
- •Виртуальные элементы-функции
- •Абстрактные классы. Лекция №11.
- •Параметрический полиморфизм
- •Шаблоны функций
- •Шаблоны классов
- •2.4Вопросы по теме
- •3Объектно-ориентированное проектирование. Лекция №12
- •3.1Концепция объектно-ориентированного проектирования
- •3.2Проектирование структурной схемы программы Составление начальной иерархии и структуры классов
- •Реорганизация иерархии и структуры классов
- •Организационная структура программы
- •3.3Проектирование файлов интерфейсов классов. Лекция № 13. Файл интерфейса базового класса
- •Файлы интерфейсов производных классов
- •Файл управления
- •3.4Вопросы по теме
- •Общие моменты разработки программы на основе объектно-ориентированного подхода
- •Приложение а
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() //главная функция