Основы алгоритмизации и языки программирования: Практикум на С++ (Система программирования С++. Процедурное программирование. Объектно-ориентированное программирование), страница 10

Выбор классов определяется экономическими понятиями разрабатываемой системы.  В нашем случае - это акты, расценки, ведомости (классы-понятия akt,  cena, ved). Для создания системы управления базами данных с индексной организацией требуется еще  "служебный" класс  (index).  Класс  ved является производным от классов akt и cena. Класс index является базовым для akt, cena и ved. Для функционирования  нашей системы создадим файл управления,  содержащий главную функцию и меню.

Структура программы  (иерархия классов) будет выглядеть следующим образом:

                            index

                             /     \

                           акт     cena

                             \     /

                               ved

                                |

                         файл управления

Вид главного меню и подменю:

         Акты       Расценки    Ведомости   Выход

Создание     Создание

Просмотр     Просмотр

Удаление      Удаление

Замена          Замена

Выход           Выход

Классы представлены в программе файлом заголовков (определение класса) и файлом кодов (элементы-функции класса).

//первая версия программы (файл управления и интерфейсы классов)

//файл заголовков index.hpp

#ifndef index_hpp

#define index_hpp

#include <conio.h>

#include <iostream.h>

#include <string.h>

#define zaglushka(st) gotoxy(2,23); cprintf("%*s",60," "); \

gotoxy(2,23); cprintf("%s",st); getch();

const int max_mass=100;

const int max_pole=10;

class ind                   //определение базового класса

{

  private:                  //закрытые элементы класса

  struct tip_index          //индексный массив

  {

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

    int nomer;              //номер записи в файле данных

  } index[max_mass];

int kol;                  //кол-во элементов индексного массива

public:                   //открытые элементы класса

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

 int razm_zap;             //размер записи файла данных

 ind(char* im):imf(im) {kol=0;}    //конструктор

 void init_ind(int,char*); //инициализация элемента массива

void init_kol(int);            //инициализация количества элементов

int dob_ind(char*);       //добавление нового элемента

 int poisk_ind(char*,int,int&);//поиск элемента массива

 void cor_ind(int,char*);  //корректировка массива

};

#endif

//файл кодов index.cpp еще не требуется

//файл заголовков akt.hpp

#ifndef akt_hpp

#define akt_hpp

#include <fstream.h>

#include <stdlib.h>

#include <dos.h>

#include "index.hpp"

class akt : public ind  //определение производного класса akt

{                       //простое наследование с атрибутом public

  protected:            //защищенные элементы класса

  char tabn[10];        //табельный номер рабочего

  char fio[30];         //ф.и.о.

  char vid[10];         //вид выполненной работы

  float objem;          //объем выполненной работы

  public:               //открытые элементы класса

  akt(char* im):ind(im) //конструктор

  {

    tabn[0]='\0';

    fio[0]='\0';

    vid[0]='\0';

    objem=0;

  }                     //прототипы элементов-функций класса:

  void init();          //инициализация индексного массива

  void sozdanie();      //ввод новых документов и запись в файл

  void correct(int);    //корректировка (замена, удаление)

  protected:

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

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

  private:              //закрытые элементы-функции класса

  void formecran(char* podmenu);//вывод формы документа

  void vvod();          //ввод содержимого документа

  void vyvod();         //вывод содержимого документа

};

#endif

//файл кодов akt.cpp (с заглушками)

#include "akt.hpp"

fstream p_akt;

//функция init

void akt::init()

{ zaglushka("Вызвана функция akt::init"); }

//функция sozdanie

void akt::sozdanie()

{ zaglushka("Вызвана функция akt::sozdanie"); }

//функция correct

void akt::correct(int x)

{ zaglushka("Вызвана функция akt::correct"); }

//файл заголовков cena.hpp

#ifndef cena_hpp

#define cena_hpp

#include <fstream.h>

#include <stdlib.h>

#include <dos.h>

#include "index.hpp"

class cena : public ind //определение производного класса cena

{                       //простое наследование с атрибутом public

  protected:            //защищенные элементы класса

  char vid[10];         //вид работы

  char naim[30];        //наименование работы

  float rascenka;       //расценка работы

  public:               //открытые элементы класса

  cena(char* im):ind(im)//конструктор

  {

    vid[0]='\0';

    naim[0]='\0';

    rascenka=0;

  }                     //прототипы элементов-функций класса:

  void init();          //инициализация индексного массива

  void sozdanie();      //ввод новых документов и запись в файл

  void correct(int);    //корректировка (замена, удаление)

 protected:

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

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

private:              //закрытые элементы класса

  void formecran(char* podmenu);//вывод формы документа

  void vvod();          //ввод содержимого документа

  void vyvod();         //вывод содержимого документа

};

#endif

//файл кодов cena.cpp (с заглушками)

#include "cena.hpp"

fstream p_cena;

//функция init

void cena::init()

{ zaglushka("Вызвана функция cena::init"); }

//функция sozdanie

void cena::sozdanie()

{ zaglushka("Вызвана функция cena::sozdanie"); }

//функция correct

void cena::correct(int x)

{ zaglushka("Вызвана функция cena::correct"); }

//файл заголовков vedom.hpp

#ifndef vedom_hpp

#define vedom_hpp

#include <fstream.h>

#include <iomanip.h>

#include <stdlib.h>

#include <dos.h>

#include "akt.hpp"

#include "cena.hpp"

class ved : public akt,public cena //определение производного