Практическое занятие № 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");

}