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

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

Файл управления upr.cpp содержит функции main, menu и podmenu. Главная функция main вызывает элементы-функции init классов akt и cena, а затем функцию menu. Функция menu вызывает функцию podmenu и элемент-функцию sozdanie класса ved. Функция podmenu реализует две формы подменю и вызов элементов-функций sozdanie и correct классов akt и cena. Она имеет два формальных параметра, принимающие соответственно местоположение формы подменю и номер подменю, обеспечивающий вызов элементов-функций класса (akt или cena).

При доступе к элементам-функциям через объект производного класса ved возникает неоднозначность множественного наследования, связанная с тем, что в базовых классах akt и cena имеются элементы с одинаковыми именами (sozdanie, correct). Для разрешения неоднозначности используем имена базовых классов с операцией разрешения видимости (например, obj.akt::init(); ).

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

#include "vedom.hpp"

char imf_akt[13]; //для хранения имени файла данных Акты

char imf_cena[13]; //для хранения имени файла данных Расценки

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

void podmenu(int n,int x) //функция подменю

{ //n – номер подменю (0-akt,1-cena), 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(); //вызов функ. кл. akt

if (n==1) obj.cena::sozdanie();//вызов функ. кл.cena

break;

case 1:

case 2:

case 3: if (n==0) obj.akt::correct(k); //вызов функ. кл. akt

if (n==1) obj.cena::correct(k);//вызов функ. кл.cena

break;

case 4: break;

}

if (k!=4) podmenu(n,x); //рекурсивный вызов функции

}

void menu() // функция 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:

case 1: podmenu(k,pos[k]);//вызов внешней функции

break;

case 2: obj.sozdanie(); //вызов элемент-функции класса ved

break; //операция (::) не требуется

case 3: break;

}

if (k!=3) menu();

}

main() //функция main

{ clrscr();

gotoxy(2,23);

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

cin>>imf_akt;

gotoxy(2,23);

clreol();

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

cin>>imf_cena;

obj.akt::init(); //вызов элемент-функции класса akt

obj.cena::init(); //вызов элемент-функции класса cena

menu(); //вызов внешней функции

}