Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольнаая ООП.doc
Скачиваний:
20
Добавлен:
01.04.2014
Размер:
424.96 Кб
Скачать

Министерство образования Республики Беларусь

Учреждение образования

«Белорусский государственный университет информатики и радиоэлектроники»

Кафедра экономической информатики

Контрольная работа №2

по курсу: «Объектно-ориентированное программирование»

Минск 2009

Задача 1

Разработать программу добавления информации в произвольное место

бинарного файла.

Алгоритм программы по шагам:

  1. Открытие библиотек iostream, fstream, подключение класса пользовательских ошибок myExceptions.cpp.

  • Библиотека iostream – для доступа к функциям ввода-вывода на экран.

  • Библиотека fstream – для доступа к функциям ввода-вывода в файл.

  • Класс пользовательских ошибок myExceptions.cpp.

  • Описание класса Animal:

    • Закрытые поля:

      • Weight - хранит в себе вес животного;

      • itsNumberDaysAlive - хранит число прожитых животным дней;

    • Конструктор без параметров – инициализирует поля нолями;

    • Конструктор с параметрами – инициализирует поля полученными значениями;

    • Деструктор;

    • Методы доступа:

      • GetWeight возвращает текущее значение переменной Weight;

      • SetWeight устанавливает новое значение переменной Weight;

      • GetDaysAlive возвращает текущее значение переменной DaysAlive;

      • SetDaysAlive устанавливает новое значение переменной DaysAlive;

  • Описание работы метода main():

    • После запуска программы ввести имя файла. Если файла с таким названием не существовало, появится ошибка открытия файла для чтения и программа продолжит работу. В обратном случае файл откроется, его содержимое выведется на экран и параллельно скопируется в массив, файл закроется.

    • Далее указанный файл откроется для записи (при этом если файла не было, то он создастся, а если он был, то его содержимое сотрется). После этого в файл записываются данные из массива (мы его как раз и создали, чтоб не потерялись старые данные), а затем идет цикл ввода данных с клавиатуры. Пользователь вводит значения переменных Weight и DaysAlive, затем вызывается конструктор Animal с параметрами – данными, создается объект и записывается в файл. В случае, если пользователь вводит не число, а символ – выводится сообщение об ошибке и цикл ввода запускается заново. Цикл прекращается, если пользователь введет отрицательное число.

    • Далее файл снова открывается для чтения, его содержимое выводится на экран и файл закрывается (Если при первом открытии файла для чтения была вызвана ошибка, то при открытии файла для записи он был создан, а затем в него добавили данные – только они и будут содержаться в файле).

    Пример выполнения программы:

    Пример исключительной ситуации:

    Листинг программы:

    #include "stdafx.h"

    #include <iostream.h>

    #include <fstream.h>

    #include <stdlib.h>

    #include "myExceptions.cpp"

    //using namespace std;

    //Вспомогательный класс животных, его объекты будут храниться в бинарном файле

    class Animal

    {

    public:

    //Конструкторы

    Animal():itsWeight(0), itsNumberDaysAlive(0) {}

    Animal(int weight, long days):itsWeight(weight), itsNumberDaysAlive(days) {}

    //Деструктор

    ~Animal(){}

    //Методы доступа к переменной itsWeight

    int GetWeight() const {return itsWeight;}

    void SetWeight(int weight) {itsWeight = weight;}

    //Методы доступа к переменной itsNumberDaysAlive

    long GetDaysAlive() const {return itsNumberDaysAlive;}

    void SetDaysAlive(long days) {itsNumberDaysAlive = days;}

    private:

    //Поля

    int itsWeight;//Хранит в себе вес животного

    long itsNumberDaysAlive;//Хранит число прожитых животным дней

    };

    void main()

    {

    //Вводится имя файла для хранения объектов

    char fileName[80];

    cout<<"Please enter the file name: ";

    cin>>fileName;

    Animal* masAn =new Animal [100];

    Animal Anim(1,1);

    int i=0;

    //Блок открытия указанного пользователем файла для чтения(просмотр старого содержимого)

    //(Заодно мы копируем содержимое файла в массив, чтоб оно не потерялось последующем

    //открытии его для записи)

    try

    {

    ifstream fin(fileName);

    if(!fin) throw myExceptions::xNotOpenedForReading();

    //Блок для вывода текущего содержимого указанного файла

    cout <<"\n***Current file contents:***\n\n";

    while (fin.read((char *) & Anim, sizeof Anim))

    {

    masAn[i].SetWeight(Anim.GetWeight());

    masAn[i].SetDaysAlive(Anim.GetDaysAlive());

    i++;

    cout<<"Animal weight: "<<Anim.GetWeight()<<endl;

    cout<<"Animal days: "<<Anim.GetDaysAlive()<<endl;

    cout<<endl;

    }

    cout << "\n***End of file contents.***\n";

    fin.close();

    }

    //Перехватит ошибку, если файл не может быть открыт для чтения

    catch (myExceptions::xNotOpenedForReading notOp)

    {

    notOp.Print();

    }

    //Переменные

    int weight = 0;//Хранит вес нового животного

    long numberDaysAlive = 0;//Хранит количество дней жизни нового животного

    //Блок открытия указанного пользователем файла для записи в него объектов.

    //Вначале в файл будут записаны объекты из массива (те, что ранее в файле и были),

    //а затем - созданные из введенных пользователем значений

    cout << "\nOpening "<<fileName << " to writing...\n";

    try

    {

    ofstream fout(fileName, ios::binary);

    if (!fout) throw myExceptions::xNotOpenedForWriting();

    for (unsigned short j=0;j<i;j++)

    {

    Animal AnimNew =Animal(masAn[j].GetWeight(),masAn[j].GetDaysAlive());

    fout.write((char*) & AnimNew, sizeof AnimNew);

    }

    //Блок для ввода данных (ввод будет продолжаться, пока пользователь не введет число <0)

    cout<<"Enter some data (enter number below zero to exit):\n";

    char buffer[32];

    cin.ignore();

    while(1)

    {

    //Блок для обработки введенного массива символов (является ли он числом)для переменной weight

    try

    {

    cout << "Please enter the integer weight: ";

    cin.getline(buffer,32);

    cheker::isIntegerNumber(buffer);

    weight = atoi(buffer);

    if (weight >=0 )

    {

    //Блок для обработки введенного массива символов (является ли он числом)для переменной numberDaysAlive

    cout<<"Please enter the long numberDaysAlive: ";

    cin.getline(buffer,32);

    cheker::isIntegerNumber(buffer);

    numberDaysAlive = atoi(buffer);

    if (numberDaysAlive >=0)

    {

    Animal AnimNew(weight,numberDaysAlive);

    fout.write((char*) & AnimNew, sizeof AnimNew);

    }

    else

    break;

    }

    else

    break;

    }

    //Перехватит ошибку, если ввели не число

    catch (myExceptions::xNotANumber notNum)

    {

    notNum.Print();

    }

    }

    fout.close();

    }

    //Перехватит ошибку, если файл не может быть открыт для записи

    catch (myExceptions::xNotOpenedForWriting notOp)

    {

    notOp.Print();

    }

    //Блок открытия указанного пользователем файла для чтения(просмотр нового содержимого)

    try

    {

    ifstream fin2(fileName);

    if(!fin2) throw myExceptions::xNotOpenedForReading();

    //Блок для вывода текущего содержимого указанного файла

    cout <<"\n***Current file contents:***\n\n";

    while (fin2.read((char *) & Anim, sizeof Anim))

    {

    cout<<"Animal weight: "<<Anim.GetWeight()<<endl;

    cout<<"Animal days: "<<Anim.GetDaysAlive()<<endl;

    cout<<endl;

    }

    cout << "\n***End of file contents.***\n";

    fin2.close();

    }

    //Перехватит ошибку, если файл не может быть открыт для чтения

    catch (myExceptions::xNotOpenedForReading notOp)

    {

    notOp.Print();

    }

    }

    Листинг класса пользовательских ошибок

    #include <iostream.h>

    //using namespace std;

    //Класс пользовательских ошибок

    class myExceptions

    {

    public:

    //Класс ошибки распределения памяти

    class xMemoryAllocationError

    {

    public:

    void Print()

    {

    cout <<"!!!--->Error: Memory Allocation!<---!!!\n";

    }

    };

    //Класс ошибки открытия файла для чтения

    class xNotOpenedForReading

    {

    public:

    void Print()

    {

    cout <<"!!!--->Cannot open a file for reading!<---!!!\n";

    }

    };

    //Класс ошибки открытия файла для записи

    class xNotOpenedForWriting

    {

    public:

    void Print()

    {

    cout <<"!!!--->Cannot open a file for writing!<---!!!\n";

    }

    };

    //Класс ошибки ввода числа

    class xNotANumber

    {

    public:

    void Print()

    {

    cout <<"!!!--->Is not a number!<---!!!\n";

    }

    };

    //Класс ошибки чтения данных из файла (прочтенное имеет не подходящий формат)

    class xNotAnAnimal

    {

    public:

    void Print()

    {

    cout <<"!!!--->Is not an animal! ERROR of reading file!<---!!!\n";

    }

    };

    //Класс ошибки выхода за границы массива

    class xOutOfRange

    {

    public:

    void Print()

    {

    cout <<"!!!--->Index of Array is Out Of Range!<---!!!\n";

    }

    };

    };

    //Класс проверочный - содержит методы для проверки условия

    class cheker

    {

    public:

    //Вспомогательная функция, осуществляет проверку правильности ввода пользователем целого числа

    static void isIntegerNumber(char* _Buf)

    {

    char* Buf = _Buf;

    while(*Buf)

    {

    if(!(((*Buf) >= '0' && (*Buf) <= '9') || (*Buf) == '-'))

    throw myExceptions::xNotANumber();

    Buf++;

    }

    }

    //Вспомогательная функция, осуществляет проверку правильности ввода пользователем вещественного числа

    static void isDoubleNumber(char* _Buf)

    {

    char* Buf = _Buf;

    while(*Buf)

    {

    if(!(((*Buf) >= '0' && (*Buf) <= '9') || (*Buf) == '-'||(*Buf) == '.'))

    throw myExceptions::xNotANumber();

    Buf++;

    }

    }

    };

    Задача 2

    Реализовать шаблон класса vector, реализующий динамический массив. Используя локальную функцию класса выполнить удаление из массива наибольшего элемента. Содержимое объекта (объектов) после этого вывести на экран ( используя cout << объект; ).

    1. Задачу реализовать как шаблонный класс;

    Блок-схема программы:

    Пример выполнения программы:

    Листинг программы:

    #include <iostream.h>

    //using namespace std;

    //Класс пользовательских ошибок

    class myExceptions

    {

    public:

    //Класс ошибки распределения памяти

    class xMemoryAllocationError

    {

    public:

    void Print()

    {

    cout <<"!!!--->Error: Memory Allocation!<---!!!\n";

    }

    };

    //Класс ошибки открытия файла для чтения

    class xNotOpenedForReading

    {

    public:

    void Print()

    {

    cout <<"!!!--->Cannot open a file for reading!<---!!!\n";

    }

    };

    //Класс ошибки открытия файла для записи

    class xNotOpenedForWriting

    {

    public:

    void Print()

    {

    cout <<"!!!--->Cannot open a file for writing!<---!!!\n";

    }

    };

    //Класс ошибки ввода числа

    class xNotANumber

    {

    public:

    void Print()

    {

    cout <<"!!!--->Is not a number!<---!!!\n";

    }

    };

    //Класс ошибки чтения данных из файла (прочтенное имеет не подходящий формат)

    class xNotAnAnimal

    {

    public:

    void Print()

    {

    cout <<"!!!--->Is not an animal! ERROR of reading file!<---!!!\n";

    }

    };

    //Класс ошибки выхода за границы массива

    class xOutOfRange

    {

    public:

    void Print()

    {

    cout <<"!!!--->Index of Array is Out Of Range!<---!!!\n";

    }

    };

    };

    //Класс проверочный - содержит методы для проверки условия

    class cheker

    {

    public:

    //Вспомогательная функция, осуществляет проверку правильности ввода пользователем целого числа

    static void isIntegerNumber(char* _Buf)

    {

    char* Buf = _Buf;

    while(*Buf)

    {

    if(!(((*Buf) >= '0' && (*Buf) <= '9') || (*Buf) == '-'))

    throw myExceptions::xNotANumber();

    Buf++;

    }

    }

    //Вспомогательная функция, осуществляет проверку правильности ввода пользователем вещественного числа

    static void isDoubleNumber(char* _Buf)

    {

    char* Buf = _Buf;

    while(*Buf)

    {

    if(!(((*Buf) >= '0' && (*Buf) <= '9') || (*Buf) == '-'||(*Buf) == '.'))

    throw myExceptions::xNotANumber();

    Buf++;

    }

    }

    };