Практическое занятие № 14
Тема: получить практические навыки по созданию составных классов
Цель работы: получить практические навыки по использованию одних классов внутри других
Ход работы
Пусть имеется класс "Пассажир" со свойствами: фамилия, имя, отчество, год рождения. Для класса создать конструктор по умолчанию, метод ввода данных о пассажире, метод вывода данных о пассажире на экран.
Пусть имеется класс "Самолет" со свойствами: номер рейса, пункт отправления, путь назначения, дата отправления, время отправления, количество мест, количество пассажиров, массив пассажиров. При этом массив пассажиров создается на основе описанного ранее класса.
Для класса создать методы: конструктор по умолчанию, метод ввода параметров самолета, метод ввода списка пассажиров, метод вывода данных о самолете.
В основной программе описать одного пассажира и один самолет и вывести их значения по умолчанию.
Вызвать метод ввода параметров самолета и вывести данные о самолете.
Вызвать метод ввода списка пассажиров и вывести данные о самолете.
Указания:
#include <iostream.h>
#include <string.h>
//модуль для задания ширины вывода
#include <iomanip.h>
//описываем класс "пассажир"
class pass
{
public:
//поля: ФИО и год рождения
char fam[15], imya[15], otch[15];
int godr;
//конструктор со значениями по умолчанию
pass()
{
strcpy(fam,"Иванов");
strcpy(imya,"Иван");
strcpy(otch,"Иванович");
godr=1970;
}
//метод ввода данных о пассажире
void set()
{
cout<<"- фамилия: ";
cin.getline(fam,14);
cout<<"- имя: "; cin.getline(imya,14);
cout<<"- отчество: ";
cin.getline(otch,14);
cout<<"- год рождения: ";
cin>>godr;cin.get();
}
//метод вывода данных о пассажире
void get()
{
cout<<setw(16)<<fam<<setw(16)<<imya<<setw(16)<<otch<<setw(5)<<godr<<"\n";
}
};
//класс "самолет"
class airplan
{
public:
//поля: номер самолета
int nomer;
//откуда, куда, дата и время отправления
char otkuda[20], kuda[20],data[12],
vremya[12];
//количество мест
int mesta;
//количество пассажиров
int n;
//массив пассажиров
pass *p;
//конструктор со значениями по умолчанию
airplan()
{
//поля заполняем произвольными значениями
nomer=123;
strcpy(otkuda,"Луганск");
strcpy(kuda,"Киев");
strcpy(data,"01.01.2013");
strcpy(vremya,"12:00");
mesta=65;
//по умолчанию пассажиров 0
n=0;
//создаем массив по количеству мест
p=new pass[mesta];
}
//деструктор для удаления динамического массива
~airplan
{
delete []p;
}
//прототип метода вывода данных о самолете
//код метода вынесен за класс, так как в
//методе используется оператор цикла for
void get();
//метод ввода данных о параметрах самолета
void set_opt()
{
cout<<"Введите параметры самолета: \n";
cout<<"- номер рейса: ";
cin>>nomer;cin.get();
cout<<"- откуда: ";
cin.getline(otkuda,19);
cout<<"- куда: "; cin.getline(kuda,19);
cout<<"- дата: "; cin.getline(data,12);
cout<<"- время: ";
cin.getline(vremya,11);
cout<<"- количество мест: "; cin>>mesta;
}
//прототип метода ввода данных о пассажирах
//код метода вынесен на класс, так как в
//методе используется оператор цикла for
void set_pass();
};
//код метода вывода данных о самолете
void airplan::get()
{
//выводим параметры самолета
cout<<"Рейс № "<<nomer<<"
"<<otkuda<<"-"<<kuda<<"\n";
cout<<"Отправление: "<<data<<" в "<<vremya<<"\n";
cout<<"Количество мест: "<<mesta<<"\n";
//если количество пассажиров не 0
if (n>0)
{
//в цикле выводим список пассажиров
cout<<"Список пассажиров:\n";
for (int i=0; i<n;
i++)
p[i].get();
cout<<"\n";
}
//иначе выводим текст об отсутствии пассажиров
else
cout<<"Пассажиров нет"<<"\n" ;
}
//код метода ввода списка пассажиров
void airplan::set_pass()
{
int k;
//вначале проверяем есть ли места
//если в самолете нет мест
if (n==mesta)
{
//выдаем сообщение
cout<<"Мест больше нет\n";
//выходим из метода
return;
}
//вводим количество пассажиров
cout<<"Введите количество пассажиров: "; cin>>k; cin.get();
//в цикле начинаем вводить данные
//и записывать в массив
for (int i=0; i<k; i++)
{
cout<<"Данные "<<n+1<<"-го пассажира: \n";
//вызываем метод ввода очередного пассажира в массиве
p[n].set();
//увеличиваем количество пассажиров в массиве на 1
n++;
//после добавления пассажира опять проверим наличие мест
//если в самолете нет мест
if (n==mesta)
{
//выдаем сообщение
cout<<"Мест больше нет\n";
//выходим из метода
return;
}
}
};
int main()
{
system("cls");
//описываем и выводим пассажира по умолчанию
cout<<"Пассажир по умолчанию:\n";
pass p;
p.get();
//описываем и выводим самолет по умолчанию
cout<<"Самолет по умолчанию:\n";
airplan a;
a.get();
cout<<"=============================================\n";
//вызываем метод ввода параметров самолета
a.set_opt();
cout<<"=============================================\n";
//выводим данные о самолете на экран
a.get();
cout<<"=============================================\n";
//вызываем метод ввода списка пассажиров
a.set_pass();
cout<<"=============================================\n";
//выводим данные о самолете на экран
a.get();
system("pause");
}
Пусть имеется класс "ящик" со свойствами: длина, ширина и высота. Для класса описать конструктор со значениями по умолчанию, метод ввода параметров ящика и метод вывода
параметров ящика на экран.
Пусть имеется класс "файл ящиков" с полями: переменная для записи в файл, переменная для чтения из файла, имя файла на диске. Для класса описать конструктор с входным параметром: имя файла на диске, метод создания файла, метод добавления в файл метод вывода данных из файла.
В главной программе описать переменную для работы с файлом ящиков и связать ее с файлом на диске.
Вызовите метод создания файла и метод вывода файла.
Вызовите метод добавления в файл и метод вывода файла.
Указания:
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <string.h>
//класс "ящик"
class box
{
public:
//поля: длина, ширина и высота
int dlina, visota, shirina;
//конструктор со значениями по умолчанию
box() {dlina=1; visota=1; shirina=1;}
//метод вывода данных о ящике
void show()
{
cout<<"|"<<setw(10)<<dlina<<"|"<<setw(10)<<visota<<"|"<<setw(10)<<shirina<<"|"<<"\n";
}
//метод ввода данных о ящике
void set()
{
cout<<"- длина: ";
cin>>dlina;
cout<<"- ширина: ";
cin>>visota;
cout<<"- высота: ";
cin>>shirina;
}
};
//класс "файл ящиков"
class fileBox
{
public:
//поля: переменные для записи и чтения из файла
ofstream fwrite;
ifstream fread;
//имя файла на диске
char fileName[100];
box b;
//конструктор с параметром - имя файла
fileBox(char fN[100])
{
strcpy(fileName,fN);
}
//метод создания файла
void create()
{
int i,n;
//окрываем файл для записи
fwrite.open(fileName,ios::binary);
//вводим количество файлов
cout<<"Введите количество ящиков для записи: ";
cin>>n;
//в цикле вводим ящики и записываем в файл
for (i=1;i<=n;i++)
{
cout<<"Введите данные о "<<i<<"-м ящике:\n";
b.set();
fwrite.write((char*) &b, sizeof b);
}
cout<<"Файл создан успешно...\n";
//закрываем файл
fwrite.close();
fwrite.clear();
}
//метод добавления данных в файл
void add()
{
int i,n;
//открываем файл для добавления
fwrite.open(fileName,ios::app);
//вводим количество ящиков
cout<<"Введите количество ящиков для добавления: ";
cin>>n;
//в цикле вводим ящики и дописываем в файл
for (i=1;i<=n;i++)
{
cout<<"Введите данные о "<<i<<"-м ящике:\n";
b.set();
fwrite.write((char*) &b, sizeof b);
}
cout<<"Данные в файл добавлены успешно...\n";
//закрываем файл
fwrite.close();
fwrite.clear();
}
//метод вывода данных из файла на экран
void show()
{
//открываем файл для чтения
fread.open(fileName,ios::binary);
cout<<"==================================\n";
cout<<"| Длина
"<<"| Ширина
"<<"| Высота
|"<<"\n";
cout<<"==================================\n";
//в цикле читаем из файла дынные и выводим с помощью метода
while (fread.read((char*) &b, sizeof b))
b.show();
cout<<"===================================\n";
//закрываем файл
fread.close();
fread.clear();
}
};
//===========================
//=====Основная программа====
//===========================
int main()
{
system("cls");
//описываем новый класс ящиков
//и связываем с файлом "data.dat"
fileBox fb("data.dat");
//вызываем метод создания файла
fb.create();
//вызываем метод вывода данных из файла
fb.show();
//вызываем метод добавления в файл
fb.add();
//вызываем метод вывода данных из файла
fb.show();
system("pause");
}