Практическое занятие № 11
Тема: «Создание классов и
модулей на С++»
Цель занятия: получить практические навыки по созданию классов в виде отдельных модулей и их использованию в программах
Ход
работы
1. Пусть имеется
некоторый класс (объект) «сотрудник». Данный класс имеет ряд свойств:
Над классом можно
выполнить ряд действий:
Опишите класс и реализуйте все его методы в виде отдельного заголовочного файла.
2. На основании созданного класса нужно создать ряд подпрограмм, которые также находятся в отдельном заголовочном файле:
3. Создайте главную программу для демонстрации работы созданных подпрограмм. Программа имеет меню пользователя, из которого можно выбрать одно из действий:
Выполнение
работы
1. Для описания класса в отдельном заголовочном файле создайте новый файл и введите код:
#ifndef SOTR_H
#define SOTR_H
#include <iostream.h>
#include <fstream.h>
#include <string.h>
//описываем класс для сотрудника
class sotr
{
public:
//свойство tabnom - табельный номер
int tabnom;
//свойства фамилия, имя, отчество
char fam[15],imya[15],otch[15];
//свойство оклад
float oklad;
//метод ввода данных о сотруднике
void vvod();
//метод вывода данных о сотруднике
void vivod();
//метод-конструктор класса
sotr();
};
//=======================================================
//код метода-конструктора
//предназначен для задания начальных значений полям класса
sotr::sotr()
{
tabnom=10;
strcpy(fam,"Иванов");
strcpy(imya,"Иван");
strcpy(otch,"Иванович");
oklad=2500;
}
//=======================================================
//метод ввода данных о сотруднике
void sotr::vvod()
{
cout<<"-табельный номер: ";
cin>>tabnom;
//очищаем ввод от клавиши Enter (после
ввода числового значения пере вводом текста)
cin.get();
cout<<"-фамилия: ";
cin.getline(fam,15);
cout<<"-имя: ";
cin.getline(imya,15);
cout<<"-отчество: ";
cin.getline(otch,15);
cout<<"-оклад: ";
cin>>oklad;
}
//========================================================
//метод вывода данных о сотруднике на экран
void sotr::vivod()
{
//выводим
границу ячейки, ширину выводимого поля и данные поля
cout<<"║";
cout.width(8);
cout<<tabnom;
cout<<"║";
cout.width(15);
cout<<fam;
cout<<"║";
cout.width(15);
cout<<imya;
cout<<"║";
cout.width(15);
cout<<otch;
cout<<"║";
cout.width(8);
cout<<oklad;
cout<<"║\n";
}
#endif
Сохраните созданный файл под именем sotr.h
2. Для создания подпрограмм для работы с классом и оформления их в отдельный заголовочный файл создайте новый файл и введите код:
#ifndef FUNC_H
#define FUNC_H
//подключаем модуль с описанием класса sotr
#include "sotr.h"
//========================================================
//подпрограмма ввода данных о сотрудниках
void vvod()
{
//переменная для работы с классом
sotr st;
//n - количество сотрудников, i - счетчик цикла
int i,n;
//очизаем экран
system("cls");
//вводим количество сотрудников
cout<<"Введите количество сотрудников для ввода: ";
cin>>n;
//открываем файл для записи
ofstream f1;
f1.open("kadry.dat",ios::binary);
//в цикле вводим данные о сотрудниках
for (i=1;i<=n;i++)
{
cout<<"Введите данные о "<<i<<"-м сотруднике: \n";
//вызываем метод класса для ввода данных класса
st.vvod();
//записываем введенные данные в файл
f1.write((char*) &st, sizeof st);
}
cout<<"Файл создан успешно. Для продолжения нажмите любую клавишу...";
system("pause");
//закрываем файл
f1.close();
}
//========================================================
//подпрограмма вывода содержимого файла на экран
void vivod()
{
//переменная для работы с классом
sotr st;
system("cls");
//открываем файл для чтения
ifstream f1;
f1.open("kadry.dat",ios::in);
//выводим шапку таблицы
cout<<"Список сотрудников\n";
cout<<"╔════════╦═══════════════╦═══════════════╦═══════════════╦════════╗\n";
cout<<"║Таб.ном.║ Фамилия ║ Имя ║ Отчество ║ Оклад ║\n";
cout<<"╠════════╬═══════════════╬═══════════════╬═══════════════╬════════╣\n";
//в цикле читаем данные из файла до тех пор,
//пока не будет достигнут конец файла
while (f1.read((char*) &st, sizeof st))
//вызываем метод класса для вывода класса на экран
st.vivod();
//подчеркиваем полученную таблицу
cout<<"╚════════╩═══════════════╩═══════════════╩═══════════════╩════════╝\n";
cout<<"Для продолжения нажмите любую клавишу...";
system("pause");
//закрываем файл
f1.close();
}
//========================================================
//подпрограмма поиска сотрудника в файле по фамилии
void poisk()
{
//переменная для работы с классом
sotr st;
//переменная для ввода искомой фамилии
char fam[15];
system("cls");
//вводим нужную фамилию для поиска
cout<<"Введите фамилию сотрудника: ";
cin.getline(fam,15);
//открываем файл для чтения
ifstream f1;
f1.open("kadry.dat",ios::in);
//выводим шапку таблицы
cout<<"Список найденных сотрудников\n";
cout<<"╔════════╦═══════════════╦═══════════════╦═══════════════╦════════╗\n";
cout<<"║Таб.ном.║ Фамилия ║ Имя ║ Отчество ║ Оклад ║\n";
cout<<"╠════════╬═══════════════╬═══════════════╬═══════════════╬════════╣\n";
//в цикле читаем данные из файла до тех пор,
//пока не будет достигнут конец файла
while (f1.read((char*) &st, sizeof st))
//если фамилия считанного сотрудника
//совпадает с искомой фамилией
if (strnicmp(st.fam,fam,strlen(fam))==0)
//вызываем метод класса для вывода класса на экран
st.vivod();
//подчеркиваем созданную таблицу
cout<<"╚════════╩═══════════════╩═══════════════╩═══════════════╩════════╝\n";
cout<<"Для продолжения нажмите любую клавишу...";
system("pause");
//закрываем файл
f1.close();
}
#endif
Сохраните созданный файл под именем func.h
3. Для создания главной программы с меню пользователя создайте новый файл и введите код:
//подключаем стандартные модули
#include <iostream.h>
//подключаем пользовательский модуль
#include "func.h"
//========================================================
//главная программа
int main()
{
//переменная k нужна для выбора нужного пункта меню
//переменная b нужна для создания цикла выдачи меню
int k,b;
//запускаем цикл выдачи меню пользователя
//цикл будет повторяться пока b=0
b=0;
while(b==0)
{
//очищаем экран, выдаем меню и предлагаем сделать выбор
system("cls");
cout<<"1 - создание файла\n";
cout<<"2 - просмотр файла\n";
cout<<"3 - поиск по фамилии\n";
cout<<"4 - выход\n";
cout<<"Сделайте выбор: ";
cin>>k; cin.get();
//обрабатываем выбор пользователя
switch (k)
{
//если выбран первый пункт (создание файла)
case 1:
{
//вызываем подпрограмму ввода данных
vvod();
break;
}
//если выбран второй пункт (просмотр файла)
case 2:
{
//вызываем подпрограмму вывода содержимого файла на экран
vivod();
break;
}
//если выбран третий пункт меню (поиск по фамилии)
case 3:
{
//вызываем подпрограмму поиска данных по фамилии
poisk();
break;
}
//если выбран четвертый пункт (выход)
case 4:
{
//переменной b присваиваем значение, отличное от нуля
//в результате цикл выдачи меню заканчивается
b=1;
break;
}
}
}
}
Запустите главную программу и убедитесь, что она работает верно.
Решить самостоятельно:
Добавьте в программу следующие возможности
1) добавления данных в файл
2) удаления из файла данных сотрудника с заданным табельным номером.
Отобразите эти возможности в меню программы, внесите изменения в модуль func.h, добавив соответствующие подпрограммы.