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

{                       //класса ved, множественное наследование

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

  float stoim;          //стоимость работы

  float itog;           //итоговая стоимость всех работ рабочего

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

  ved(char* im1,char* im2):akt(im1),cena(im2)//конструктор

  {

    stoim=itog=0;

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

  void sozdanie();       //расчет и вывод документов

  private:

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

};

#endif

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

#include "vedom.hpp"

//функция sozdanie

void ved::sozdanie()

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

//файл управления upr.cpp

#include "vedom.hpp"

char imf_akt[13];

char imf_cena[13];

ved obj(imf_akt,imf_cena); //объявление объекта класса ved

//функция podmenu

void podmenu(int n,int x) //n - номер подменю, 0 - акт, 1 - сена

{                                           //x - номер колонки вывода подменю

  char ch;

  char *m[]={ "   Ввод   ",

                        "  Поиск   ",

                        "  Замена  ",

                        " Удаление ",

                        "  Выход   "

                     };

  int pos[5];

  _setcursortype(_NOCURSOR);

  gotoxy(2,23);

  clreol();

  cputs("Выберите пункт меню и нажмите <Enter>");

  for (int k=0;k<5;k++)

  {

    if (k==0)

      textattr(0+(2<<4));

    else

      textattr(0+(7<<4));

    gotoxy(x,3+k);

    pos[k]=wherey();

    cputs(m[k]);

  }

  k=0;

  for (;;)

  {

    ch=getch();

    if (ch==13) break;

    if (ch==0)

    {

      ch=getch();

      switch (ch)

      {

        case 80: if (k==4) continue;

                         gotoxy(x,pos[k]);

                         textattr(0+(7<<4));

                         cputs(m[k]);

                         k++;

                         gotoxy(x,pos[k]);

                         textattr(0+(2<<4));

                         cputs(m[k]);

                         textattr(15+(0<<4));

                         break;

        case 72: if (k==0) continue;

                         gotoxy(x,pos[k]);

                         textattr(0+(7<<4));

                         cputs(m[k]);

                         k--;

                         gotoxy(x,pos[k]);

                         textattr(0+(2<<4));

                         cputs(m[k]);

                         textattr(15+(0<<4));

                         break;

      }

    }

  }

  textattr(15+(0<<4));

  _setcursortype(_NORMALCURSOR);

  switch (k)

  {

    case 0:  if (n==0) obj.akt::sozdanie();

                 if (n==1) obj.cena::sozdanie();

                 break;

    case 1: 

    case 2: 

    case 3:  if (n==0) obj.akt::correct(k);

                 if (n==1) obj.cena::correct(k);

                 break;

    case 4:  break;

  }

  if (k!=4) podmenu(n,x);

  return;

}

//функция menu

void menu()

{

  char ch;

  char *m[]={ "   Акты работ ",

                        " Расценки работ ",

                        " Ведомость ",

                        " Выход "

                     };

  int pos[4];

  clrscr();

  _setcursortype(_NOCURSOR);

  gotoxy(2,23);

  cputs("Выберите пункт меню с помощью (-> и <-) и нажмите <Enter>");

  gotoxy(16,1);

  for (int k=0;k<4;k++)

  {

    if (k==0)

      textattr(0+(2<<4));

    else

      textattr(0+(7<<4));

    pos[k]=wherex();

    cputs(m[k]);

  }

  k=0;

  for (;;)

  {

    ch=getch();

    if (ch==13) break;

    if (ch==0 && kbhit())

    {

      ch=getch();

      switch (ch)

      {

        case 77: if (k==3) continue;

                         gotoxy(pos[k],1);

                         textattr(0+(7<<4));

                         cputs(m[k]);

                         k++;

                         gotoxy(pos[k],1);

                         textattr(0+(2<<4));

                         cputs(m[k]);

                         textattr(15+(0<<4));

                         break;

        case 75: if (k==0) continue;

                         gotoxy(pos[k],1);

                         textattr(0+(7<<4));

                         cputs(m[k]);

                         k--;

                         gotoxy(pos[k],1);

                         textattr(0+(2<<4));

                         cputs(m[k]);

                         textattr(15+(0<<4));

                         break;

      }

    }

  }

  textattr(15+(0<<4));

  _setcursortype(_NORMALCURSOR);

  switch (k)

  {

    case 0:  podmenu(k,pos[k]);

                 break;

    case 1:  podmenu(k,pos[k]);

                 break;

    case 2:  obj.sozdanie();

                 break;

    case 3:  break;

  }

  if (k!=3) menu();

  return;

}

//функция main

main()

{

  clrscr();

  gotoxy(2,23);

  cout<<"Введите имя файла Акты:";

  cin>>imf_akt;

  gotoxy(2,23);

  clreol();

  cout<<"Введите имя файла Расценки:";

  cin>>imf_cena;

  obj.akt::init();

  obj.cena::init();

  menu();

}

Лабораторная работа №6

Отладить и выполнить первую версию программы. Проконтро - лировать работу меню и всех подменю.

3.2. Программирование классов верхнего уровня.

        Простое наследование и полиморфизм

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

Полиморфизм означает способность объекта изменять свои действия (операции,функции) в зависимости от типов данных.

Полиморфизм имеет следующие формы:

- специальный полиморфизм (перегрузка операций и функций);

- чистый полиморфизм (виртуальные функции);

- параметрический полиморфизм (шаблоны функций и классов).

Пример практического занятия №8

В нашем примере рассмотрим базовый класс index и производные классы akt и cena (простое наследование).