Министерство образования Республики Беларусь
Учреждение образования
«Белорусский государственный университет информатики и радиоэлектроники»
Кафедра экономической информатики
Контрольная работа №2
по курсу: «Объектно-ориентированное программирование»
Минск 2009
Задача 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 << объект; ).
-
Задачу реализовать как шаблонный класс;
Блок-схема программы:
Пример выполнения программы:
Листинг программы:
#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++;
}
}
};