- •Оглавление
- •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Вопросы по теме
- •Общие моменты разработки программы на основе объектно-ориентированного подхода
- •Приложение а
Файл управления
Файл управления 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(); //вызов внешней функции
}