Практическое занятие № 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, добавив соответствующие подпрограммы.