Индивидуальные задания по вариантам

Лабораторная работа № 6

Потоки, обработка исключительных ситуаций в C++

Теоретическое описание.

В С++ ввод-вывод осуществляется через потоки. Потоки являются объектами соответствующих классов. При запуске программы автоматически открываются стандартные потоки cin, cout, cerr, clog. Последние два потока используются для вывода сообщений об ошибках. В файле iostream.h определены классы: ввода – istream, вывода – ostream, ввода-вывода – iostream.

Для реализации файлового ввода-вывода небходимо включить файл fstream.h, содержащий производные от istream и ostream классы ifstream, ofstream и fstream, и объявить соответствующие объекты. Например:


Ifstream in;//ввод ofstream out;//вывод fstream io;//ввод-вывод

После объявления потоков производится открытие файла, связывающее его с потоком с помощью функции open() или с помощью конструктора. Прототип функции open():

void open (char *filename,int mode,int access);

Здесь filename – имя файла, включающее путь; mode – режим открытия файла (ios::in – открытие файла для чтения, ios::out – открытие для записи, ios::binary – открытие файла в двоичном режиме, по умолчанию в текстовом); access: 0 – файл со свободным доступом, 1 – только для чтения, 8 – архивный файл. Файл закрывается с помощью функции close().

Для чтения-записи здесь можно использовать перегружаемые оператор-функции >> и << или использовать методы классов. Для ввода-вывода одного символа используются функции:

istream &get(char &ch); ostream &put(char ch);

Для записи и считывания блоков двоичных данных используются функции считывания-записи n байт в буфер или из буфера:

istream &read(unsigned char *buf, int n); ostream &write(const unsigned char *buf, int n);

Обработка исключительных ситуаций. В программах на С++ следует использовать механизм обработки исключительных ситуаций. Опера- торы программы при обработке исключительных ситуаций распола- гаются в блоке try. Перехватывается и обрабатывается исключитель- ная ситуация в блоке catch. Форма операторов try-catch следующая:

try {/*блок try*/ }

catch(type1 arg){/* блок catch*/}

С блоком try может связываться несколько блоков catch. Выпол- няется тот блок catch, для которого тип аргумента соответствует типу возникшей исключительной ситуации. При этом ее значение присваи- вается аргументу catch. Если ошибка имеет место внутри блока try, она может генерироваться с помощью throw, после чего управление передано блоку catch. В случае необходимости перехвата всех исключительных ситуаций независимо от типа используется

catch(…)

{/*тело*/}

Для функций, вызываемых из блока try, можно указать число типов исключительных ситуаций, которые будет генерировать функция:


Тип имя (список аргументов) throw(список типов)

{/*тело*/}

Пример. Из текстового потока ввести информацию о студентах и записать ее в виде дерева. Отсортировать или по фамилии, или по баллу (вывести тех студентов, у которых балл выше среднего). Использовать потоки ввода-вывода и шаблоны.

#include <iostream.h> #include <conio.h> #include <fstream.h> struct Student{

int num;

char surname[10]; int group;

int balls;

friend ostream &operator<< (ostream &stream, Student stud){

stream << " " << stud.num << " " << stud.surname << " " << stud.group

<< " " << stud.balls; return stream;

}

friend istream &operator>> (istream &stream, Student &stud){

stream >> stud.num >> stud.surname >> stud.group >> stud.balls; return stream;

}

};

struct node{

Student info;

node *nextl, *nextr; node (){

info.num = info.group = info.balls=0; nextl = nextr = 0;

}

node (Student newinfo){ info = newinfo; nextl = nextr = 0;

}

};

template <class T, class T1> class tree{ public:

T *root;

tree() { root = 0; }

void push (T *& wer, T1 dat, int n){ if (wer == 0){

try{

wer = new T; if(!wer) throw 1;

wer->nextl = 0; wer->nextr = 0; wer->info = dat;


}

catch (int mthrow) {cout<<”No memory!”<<endl;return;}

}

else if (n == 1)

if (strcmp(dat.surname,wer->info.surname) < 0) push (wer->nextl, dat, 1); else push (wer->nextr, dat, 1);


else

 

 

}


 

if (dat.balls > wer->info.balls) push (wer->nextl, dat, 2); else push (wer->nextr, dat, 2);


void insert (T1 dat, int n){

if (root == 0) root = new T(dat); else push (root, dat, n);

}

void look (ostream &stream, T *&wer){ if (wer != 0){

look (stream, wer->nextl);

stream << " " << wer->info << endl; look (stream, wer->nextr);

}

}

friend ostream &operator<< (ostream &stream, tree ob)

{ ob.look (stream, ob.root); return stream; }

};

void main(){ int m;

do{

cout << "1. Sort with names\n"; cout << "2. Sort with balls\n"; cout << "3. Exit\n";

cin >> m; switch (m){

case 1: {

tree<node, Student> q; node *n;

ifstream infile("stud.txt"); while(!infile.eof()){

Student c; infile >> c; q.insert(c, 1);

}

infile.close(); cout<<q; break;

}

case 2: {

tree<node, Student> q; node *n;


ifstream infile("stud.txt"); Student *c;

c = new Student; int i = 1;

float s = 0; while(!infile.eof()){

infile >> c[i]; s+=c[i].balls; i++;

}

for (int j=1; j<=i; j++) if (c[j].balls > s/i)

q.insert(c[j], 2); infile.close();

cprintf(" Miide ball is %1.3f",s/i); cout<<'\n' << q;

break;

}

case 3: {return;}

default: {cout<<"Error! Try again\n"; break;}

}

getch();

clrscr(); }

while(m != 3); return;}

 


Общие задания

1. Для класса Student предусмотреть ввод данных из файла. Полученные при выполнении лаб. работы № 1 списки студентов вывести в файл.

Student: Фамилия, Имя, Отчество, Дата рождения, Адрес, Телефон, Факультет, Курс. Создать массив объектов. Вывести:

а) список студентов заданного факультета;

б) списки студентов для каждого факультета и курса;

в) список студентов, родившихся после заданного года.

2. При выполнении задания предусмотреть формирование массива объектов путем считывания комплексных чисел из файла. Результат также вывести в файл.

«Комплексное число» – Complex. Класс должен содержать несколько конструкторов и операции для сложения, вычитания, умножения, деления, присваивания. Создать два вектора размерности n из комплексных координат. Передать их в функцию, которая выполняет сложение комплексных векторов.

 

Индивидуальные задания по вариантам

При выполнении приводимых ниже заданий можно осуществлять контроль состояния потоков. В случае возникновения ошибок потоков генерировать и обрабатывать исключительные ситуации. Для соответствующих классов перегрузить операции вставки в поток и извлечения из потока. При динамическом выделении памяти предусмотреть обработку исключения, возникающего при нехватке памяти.

1-15. Для класса предусмотреть ввод данных из файла. Полученные при выполнении списки студентов вывести в файл.

1.  Customer: Фамилия, Имя, Отчество, Адрес, Телефон, Номер кредитной карточки, Номер банковского счета. Создать массив объектов. Вывести:

а) список покупателей в алфавитном порядке;

б) список покупателей, номер кредитной карточки которых находится в заданном интервале.

в) список покупателей, живущих на заданной улице

2. File: Имя файла, Размер, Дата создания, Количество обращений. Создать массив объектов. Вывести:

а) список файлов, упорядоченный в алфавитном порядке;

б) список файлов, размер которых превышает заданный;

в) список файлов, число обращений к которым превышает заданное.

3. Word: Слово, Номера страниц, на которых слово встречается

(от 1 до 10), Число страниц. Создать массив объектов. Вывести:

а) слова, которые встречаются более чем на N страницах;

б) слова в алфавитном порядке;

в) для заданного слова номера страниц, на которых оно встречается.

4. House: Адрес, Этаж, Количество комнат, Площадь. Создать массив объектов. Вывести:

а) список квартир, имеющих заданное число комнат;

б) список квартир, имеющих заданное число комнат и расположенных на этаже, который находится в определенном промежутке;

в) список квартир, имеющих площадь, превосходящую заданную.

5. Phone: Фамилия, Имя, Отчество, Адрес, Номер, Время внутригородских разговоров, Время междугородних разговоров. Создать массив объектов. Вывести:

а) сведения об абонентах, время внутригородских разговоров которых превышает заданное;

б) сведения об абонентах, воспользовавшихся междугородней связью;

в) сведения об абонентах, выведенные в алфавитном порядке.

6. Person: Фамилия, Имя, Отчество, Адрес, Пол, Образование, Год рождения. Создать массив объектов. Вывести:

а) список граждан, возраст которых превышает заданный;

б) список граждан с высшим образованием;

в) список граждан мужского пола.

7. Abiturient: Фамилия, Имя, Отчество, Адрес, Оценки. Создать массив объектов. Вывести:

а) список абитуриентов, имеющих неудовлетворительные оценки;

б) список абитуриентов, сумма баллов у которых не меньше заданной;

в) выбрать N абитуриентов, имеющих самую высокую сумму баллов, и список абитуриентов, имеющих полупроходной балл.

8. Aeroflot: Пункт назначения, Номер рейса, Тип самолета, Время вылета, Дни недели. Создать массив объектов. Вывести:

а) список рейсов для заданного пункта назначения;

б) список рейсов для заданного дня недели;

в) список рейсов для заданного дня недели, время вылета для которых больше заданного.

9. Book: Автор, Название, Издательство, Год, Количество страниц. Создать массив объектов. Вывести:

а) список книг заданного автора;

б) список книг, выпущенных заданным издательством;

в) список книг, выпущенных после заданного года.

10. Worker: Фамилия и инициалы, Должность, Год поступления на работу, Зарплата. Создать массив объектов. Вывести:

а) список работников, стаж работы которых на данном предприятии превышает заданное число лет;

б) список работников, зарплата которых больше заданной;

в) список работников, занимающих заданную должность.

11. Train: Пункт назначения, Номер поезда, Время отправления, Число общих мест, Купейных, Плацкартных. Создать массив объектов. Вывести:

а) список поездов, следующих до заданного пункта назначения;

б) список поездов, следующих до заданного пункта назначения и отправляющихся после заданного часа;

в) список поездов, отправляющихся до заданного пункта назначения и имеющих общие места.

12. Product: Наименование, Производитель, Цена, Срок хранения, Количество. Создать массив объектов. Вывести:

а) список товаров для заданного наименования;

б) список товаров для заданного наименования, цена которых не превышает указанной;

в) список товаров, срок хранения которых больше заданного.

13. Patient: Фамилия, Имя, Отчество, Адрес, Номер медицинской карты, Диагноз. Создать массив объектов. Вывести:

а) список пациентов, имеющих данный диагноз;

б) список пациентов, номер медицинской карты которых больше заданного числа.

в) список пациентов, имеющих данный диагноз и номер медицинской карты которых находится в заданном интервале список пациентов, номер медицинской карты которых находится в заданном интервале.

14. Bus: Фамилия и инициалы водителя, Номер автобуса, Номер маршрута, Марка, Год начала эксплуатации, Пробег. Создать массив объектов. Вывести:

а) список автобусов для заданного номера маршрута;

б) список автобусов, которые эксплуатируются больше 10 лет;

в) список автобусов, пробег у которых больше 10 000 км.

15. Phone: Фамилия, Имя, Отчество, Адрес, Номер, Время внутригородских разговоров, Время междугородних разговоров. Создать массив объектов. Вывести:

а) сведения об абонентах, время междугородних разговоров которых превышает заданное;

б) сведения об абонентах, воспользовавшихся внутригородской связью;

в) сведения об абонентах, выведенные в обратном алфавитном порядке (от Я до А).

16-30. При выполнении задания предусмотреть формирование массива объектов путем считывания комплексных чисел из файла. Результат также вывести в файл.

16. Разработать класс «Множество (целых чисел, символов, строк и т. д.)» – Set мощности n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для определения принадлежности заданного элемента множеству, пересечения, объединения, разности двух множеств. Перегрузить операции сложения, вычитания, умножения (пересечения), индексирования, присваивания. Создать массив объектов и передавать пары объектов в функцию, которая строит множество, состоящее из элементов, входящих только в одно из заданных множеств, т. е. ( A È B) \ ( A Ç B), и возвращает его в головную программу.

17. Разработать класс для массива строк. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для поэлементной конкатенации двух массивов, упорядочения строк в лексикографическом порядке, слияния двух массивов с удалением повторяющихся строк, а также для вывода на экран всего массива и заданной строки. Перегрузить операции сложения, умножения, индексирования, присваивания для данного класса. Создать массив объектов и передавать объекты в функцию, которая выполняет слияние объектов и для полученного объекта-результата производит лексикографическое упорядочения строк.

18. Составить описания класса, обеспечивающего представление матрицы заданного размера n ´ m и любого минора в ней. Память для матрицы выделять динамически. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для отображения на экране как матрицы в целом, так и заданного минора, а также для изменения минора; сложения, вычитания, умножения миноров. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса. Создать массив объектов данного класса и передать его в функцию, которая изменяет для i -й матрицы ее минор путем умножения на константу.

19. Определить класс «Дробь» – Fraction в виде пары (m, n). Класс

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

20. Разработать класс «Вектор» – Vector размерности n. Определить несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения, вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, являются ли они коллинеарными или ортогональными.

21. Определить класс «Квадратная матрица» – Matrix. Класс должен содержать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для сложения, вычитания, умножения матриц; вычисления нормы матрицы. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса. Создать массив объектов класса Matrix и передать его в функцию, кото- рая изменяет i -ю матрицу путем возведения ее в квадрат. В головной программе вывести результат.

22. Разработать класс «Многочлен» – Polynom степени n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления значения полинома; сложения, вычитания и умножения полиномов. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания. Создать массив объектов класса. Передать его в функцию, вычисляющую сумму полиномов массива и возвращающую полином-результат, который выводится на экран в головной программе.

23. Определить класс «Стек» – Stack. Элементы стека хранятся в массиве. Если массив имеет фиксированную размерность, то предусмотреть контроль выхода за пределы массива. Если память выделяется динамически и ее не хватает, то увеличить размер выделенной памяти. Включение элементов в стек и их извлечение реализовать как в виде методов, так и с помощью перегруженных операций. Создать массив объектов класса Stack. Передавать объекты в функцию, которая удаляет из стека первый (сверху), третий, пятый и т. д. элементы.

24. Построить классы для описания плоских фигур: круг, квадрат, прямоугольник. Включить методы для изменения объектов, перемещения на плоскости, вращения. Перегрузить операции, реализующие те же действия. Выполнить тестирование класса, создав массив объектов.

25. Определить класс «Строка» – String длины n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для выполнения конкатенации строк, извлечения символа из заданной позиции, сравнения строк. Перегрузить операции сложения, индексирования, отношения, добавления (+ =) , присваивания для данного класса. Создать массив объектов и передать его в функцию, которая выполняет сортировку строк.

26. Определить класс «Дробь» – Fraction в виде пары (m, n). Класс должен содержать несколько конструкторов. Реализовать методы для сложения, вычитания, умножения и деления дробей. Перегрузить операции сложения, вычитания, умножения, деления, присваивания и операции отношения. Создать массив объектов и передать его в функцию, которая изменяет каждый элемент массива с нечетным индексом путем добавления следующего за ним элемента массива.

27. Разработать класс «Вектор» – Vector размерности n. Определить несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения, вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, являются ли они коллинеарными или ортогональными.

28. Определить класс «Квадратная матрица» – Matrix. Класс должен содержать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для сложения, вычитания, умножения матриц; вычисления нормы матрицы. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса. Создать массив объектов класса Matrix и передать его в функцию, которая изменяет i -ю матрицу путем возведения ее в квадрат. В головной программе вывести результат.

29. Разработать класс «Многочлен» – Polynom степени n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления значения полинома; сложения, вычитания и умножения полиномов. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания. Создать массив объектов класса. Передать его в функцию, вычисляющую сумму полиномов массива и возвращающую полином-результат, который выводится на экран в головной программе.

30. Определить класс «Стек» – Stack. Элементы стека хранятся в массиве. Если массив имеет фиксированную размерность, то предусмотреть контроль выхода за пределы массива. Если память выделяется динамически и ее не хватает, то увеличить размер выделенной памяти. Включение элементов в стек и их извлечение реализовать как в виде методов, так и с помощью перегруженных операций. Создать массив объектов класса Stack. Передавать объекты в функцию, которая удаляет из стека первый (сверху), третий, пятый и т. д.

 

 


Дата добавления: 2020-11-27; просмотров: 1327; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!