Файл: Лабораторная работа 3 Лабораторная работа 6 Лабораторная работа 11 Лабораторная работа 13 Лабораторная работа 3.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 124

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Федеральное агентство по образованию Пермский государственный технический университетЛабораторные работы на языке программирования СИ++Выполнил студент:Группы АСУзу-09-1Дускаева Айгуль ХалиловнаПроверила:Викентьева Ольга ЛеонидовнаПермь 2010СодержаниеЛабораторная работа №3Лабораторная работа №6Лабораторная работа №11Лабораторная работа №13Лабораторная работа №31. Постановка задачи. Создать класс Money для работы с денежными суммами. Число должно быть представлено двумя нолями: типа long для рублей и типа inl для копеек. Дробная часть числа при выводе на экран должна быть отделена от целой части запятой. Определить в классе следующие конструкторы: без параметров, с параметрами, копирования. Определить в классе деструктор. Определить в классе компоненты-функции для просмотра и установки полей данных (селекторы и модификаторы). Перегрузить операцию присваивания. Перегрузить операции ввода и вывода объектов с помощью потоков. Перегрузить операции вычитания секунд и сравнение временных интервалов. Написать программу, в которой продемонстрировать создание объектов и работу всех перегруженных функций. 2. Описание классаclass Money{ long rub; int kop;public: Money() {rub=0L;kop=0;} //конструктор без параметров Money(int a) {rub=a; kop=0;} //конструктор с одним параметром типа int Money(long a,int b) {rub=a; kop=b;} //конструктор с двумя параметром типа long и типа int Money (Money& Money1) {rub=Money1.rub; kop=Money1.kop;} //конструктор с параметром типа Money Money() {} //деструкторint getrub() {return rub;} //получение количества рублей int getkop() {return kop;} //получение количества копеек void setrub(long a) {rub=a;} //установка количества рублей void setkop(int a) {kop=a;} //установка количества копеек Money& operator = (Money& ); //перегрузка оператора присваивания Money operator + (Money& Money1); //перегрузка оператора "+" Money operator - (Money& Money1); //перегрузка оператора "-"friend istream& operator>>(istream& in, Money& Money1); //дружественный внешний оператор вводаfriend ostream& operator<<(ostream& out, Money Money1); //дружественный внешний оператор вывода};3. Определение компонентных функций.Money& Money::operator =(Money& Money1){rub=Money1.rub; kop=Money1.kop; return *this;}Money Money::operator + (Money& Money1){ Money Money2;Money2.rub=rub+Money1.rub+(kop+Money1.kop)/100;Money2.kop=(kop+Money1.kop)%100; return Money2;}Money Money::operator - (Money& Money1){ Money Money2;Money2.rub=rub-Money1.rub+(100+kop-Money1.kop)/100+1;Money2.kop=(100+kop-Money1.kop)%100; return Money2;}4. Определение глобальных функций.istream &operator >>(istream& in, Money& Money1){ cout<<"input rubli\n";in>>Money1.rub; cout<<"input kopejki\n";in>>Money1.kop; return in;}ostream &operator <<(ostream& out,Money Money1){ out< return out;}5. Функция main()void main(){ char ch; long r; int k; Money a; //конструктор по умолчанию Money b(1000L); //конструктор с одним параметром типа int Money c(130L,10); //конструктор с двумя параметрами типа long и типа int Money d(c); //конструктор с одним параметром типа Money cout< cin>>a; //ввод переменной a cin>>b; //ввод переменной b cout< r=a.getrub(); //получение количества минут из переменной a k=a.getkop(); //получение количества секунд из переменной a cout< b.setrub(120L); //установка количества рублей в переменную b b.setkop(34); //установка количества копеек в переменную b cout<a=c+d;cout<a=a+d-b; cout<cin>>ch;}6. Результаты работы программы0,001000,00130,10130,10input rubli12input kopejki45input rubli2000input kopejki0012,452000,00130,10130,1012 45120,34260,20271,967. Дружественные функции и классы используются для обращения функций – не членов класса к закрытым членам класса. Дружественная функция объявляется внутри класса. Перед описанием добавляется ключевое слово friend. Дружественная функция не является функцией-членом класса, в котором объявляется, однако имеет доступ к закрытым членам этого класса. Дружественная функция может быть членом другого класса. Префиксный унарный оператор можно перегрузить либо как функцию-член класса, не имеющую параметров, либо как глобальную дружественную функцию с одним параметром имеющим тип класса, для которого она перегружается.Постфиксный унарный оператор, в отличие от префиксного имеет дополнительный параметр типа int, который не нужен лишь для отличия в описании перегруженных операторов. Унарный оператор, определяемый внутри класса, не имеет операндов кроме случаев постфиксных операторов инкремента и декремента. Унарный оператор, определяемый вне класса должен иметь один операнд данного класса. Бинарный оператор, определяемый внутри класса, будет иметь один операнд. Бинарный оператор, определяемый вне класса, будет иметь два операнда. Операция присваивания возвращает ссылку на переменную, которой было присвоено значение. Операция присваивания перегружается как бинарная функция-член класса, получающая в качестве параметра переменную этого же класса и возвращающая ссылку на переменную, которой было присвоено значение. Операция присваивания возвращает ссылку на переменную, которой было присвоено значение. Операции ввода-вывода перегружаются созданием дружественных функций – членов классов, определяющих потоки ввода-вывода. Компилятор будет воспринимать вызов оператора как вызов функции-члена класса Student, имеющую 1 параметр – ссылку на тип Student, и возвращающую ссылку на тип Student. Компилятор будет воспринимать вызов оператора как вызов дружественной для класса Student функции, имеющую 1 параметр – ссылку на тип Student, и возвращающую ссылку на тип Student. Компилятор будет воспринимать вызов оператора как вызов функции-члена класса Student, имеющую 2 параметра – ссылки на тип Student, и возвращающую значение типа bool. Компилятор будет воспринимать вызов оператора как вызов дружественной для класса Student функции, имеющую 2 параметра – ссылки на тип Student, и возвращающую значение типа bool. Лабораторная работа №61. Постановка задачи:1) Определить класс-контейнер МНОЖЕСТВО с элементами типа int.2) Реализовать конструкторы, деструктор, операции ввода-вывода, операцию присваивания.3) Реализовать следующие перегруженные операции: [] – доступа по индексу; int() – определение размеров множества; + - объединение множеств; ++ – переход вправо к следующему элементу (с помощью класса-итератора). 4) Реализовать класс-итератор. Реализовать с его помощью операции последовательного доступа.5)Написать тестирующую программу, иллюстрирующую выполнение операций.2. Описание класса-контейнера.class My_Set{ int size; //размер множества int *data; //указатель на массив значений элементов множества Iterator begin; //указатель на первый элемент множества Iterator end; //указатель на элемент, следующий за последнимpublic: My_Set(); //Конструктор - пустое множество My_Set(int n); //Конструктор с параметром типа int My_Set(My_Set& set1); //конструктор с параметром типа My_Set My_Set(); //деструктор My_Set& operator=(My_Set & set1); //перегруженный оператор присваивания int operator[](int n); //перегруженный оператор обращения к элементу множества int operator() (); //размер множества My_Set operator+ (My_Set& set1); //перегруженный оператор объединения множеств friend istream& operator >>(istream& input,My_Set& set1); //перегруженный оператор ввода friend ostream& operator <<(ostream& output,My_Set& set1); //перегруженный оператор вывода Iterator first() {return begin;} //извлекает указатель на первый элемент Iterator last() {return end;} //извлекает указатель на элемент, следующий за последним};3) Описание компонентных и дружественных функций.//Конструктор пустого множестваMy_Set::My_Set(){size=0;data=0; //установление указателей на первый и последний элементы begin.element=&data[0]; end.element=&data[size];}//конструктор с параметром типа intMy_Set::My_Set(int n){size=n; data=new int[size]; for(int i=0;i data[i]=i; //установление указателей на первый и последний элементы begin.element=&data[0];end.element=&data[size];}My_Set::My_Set(My_Set& set1) //конструктор с параметром типа My_Set{size=set1.size; data=new int[size]; for(int i=0;idata[i]=set1.data[i]; //установление указателей на первый и последний элементы begin.element=&data[0]; end.element=&data[size];}My_Set::

Лабораторная работа №111. Постановка задачи.Задача 1. Создать последовательный контейнер – вектор. Заполнить его элементами типа double. Найти в векторе максимальный элемент и вставить его в начало вектора. Удалить из вектора минимальный элемент. Добавить к каждому элементу среднее арифметическое всех элементов вектора. Выполнение заданий оформить в виде глобальных функций. Задача 2. Создать последовательный контейнер – вектор Заполнить его элементами типа Money. Найти в векторе максимальный элемент и вставить его в начало вектора. Удалить из вектора минимальный элемент. Добавить к каждому элементу среднее арифметическое всех элементов вектора. Выполнение заданий оформить в виде глобальных функций. Задача 3. Создать параметризованный класс, используя в качестве контейнера множество Заполнить его элементами типа Money. Найти в множестве максимальный элемент и вставить его в начало вектора. Удалить из множества минимальный элемент. Добавить к каждому элементу среднее арифметическое всех элементов множества. Выполнение заданий оформить в виде методов параметризованного класса. Задача 4. Создать адаптер контейнера – стек. Заполнить его элементами типа Money, для которого перегрузить необходимые операции. Найти в стеке максимальный элемент и вставить его в начало вектора. Удалить из стека минимальный элемент. Добавить к каждому элементу среднее арифметическое всех элементов стека. Выполнение заданий оформить в виде глобальных функций. Задача 5. Создать параметризованный класс, используя в качестве контейнера адаптер контейнера – стек. Найти в стеке максимальный элемент и вставить его в начало вектора. Удалить из стека минимальный элемент. Добавить к каждому элементу среднее арифметическое всех элементов стека. Выполнение заданий оформить в виде методов параметризованного класса. Задача 1.2. Функции для выполнения заданийtypedef vector My_vector;My_vector Create_vector(int n)//создание списка, заполенного случайными данными{ My_vector vector1; for (int i=0;i{ double a=(rand()%10000)/100.0-50.0; vector1.push_back(a);} return vector1;}void print_vector(My_vector& vector1)//вывод элементов вектора{My_vector::iterator it1,itend;itend=vector1.end();it1=vector1.begin(); while (it1!=itend) cout<<*(it1++)<<" ";cout<}double min_el(My_vector &vector1)//поиск минимального элемента{My_vector::iterator it1,itmin,itend;it1=itmin=vector1.begin();itend=vector1.end(); while (it1!=itend){ if (*it1 <* itmin) itmin=it1;it1++;} return *itmin;}void ins(My_vector& vector1,double a,int n) //добавление элемента a на позицию n{My_vector::iterator it1; if (n>vector1.size()+1) cout<<"No such position"< else{it1=vector1.begin(); for (int i=0;iit1++;vector1.insert(it1,a);}}double Avg(My_vector& vector1)//нахождение среднего арифметического{My_vector::iterator it1,itend; double a;a=0;it1=vector1.begin();itend=vector1.end(); while (it1!=itend)a+=*(it1++);a/=vector1.size(); return a;}void Del_m(My_vector& vector1,double a) //удаление элементов, равных a из вектора{My_vector::iterator it1;it1=vector1.begin(); while (it1!=vector1.end()){ if (*it1==a)it1=vector1.erase(it1); else if (it1!=vector1.end())it1++;}}double max_el(My_vector &vector1)//поиск минимального элемента{My_vector::iterator it1,itmax,itend;it1=itmax=vector1.begin();itend=vector1.end(); while (it1!=itend){ if (*it1 >* itmax)itmax=it1;it1++;} return *itmax;}void add(My_vector &vector1,double a)//увеличение всех элементов вектора на число a{ for (int i=0;i vector1[i]+=a;}3. Функция main().void main(){ char ch; try{ vector vector1; int n; cout<<"Input the size of the vector"<cin>>n; vector1=Create_vector(n);print_vector(vector1); cout<<"After inserting max element"<ins(vector1,max_el(vector1),1);print_vector(vector1); cout<<"After deleting min element"<Del_m(vector1,min_el(vector1));print_vector(vector1); cout<<"With average added"<add(vector1,Avg(vector1));print_vector(vector1);} catch(int){ cout<<"Error";}cin>>ch;}4. Результаты работы программы:Input the size of the vector7-49.59 34.67 13.34 15 41.69 7.24 -35.22After inserting max element41.69 -49.59 34.67 13.34 15 41.69 7.24 -35.22After deleting min element41.69 34.67 13.34 15 41.69 7.24 -35.22With average added58.6057 51.5857 30.2557 31.9157 58.6057 24.1557 -18.3043Задача 2.5. Описание классаclass Money{ long rub; int kop;public: Money() {rub=0L;kop=0;} //конструктор без параметров Money(long a) {rub=a; kop=0;} //конструктор с одним параметром типа int Money(long a,int b) {rub=a; kop=b;} //конструктор с двумя параметром типа long и типа int Money (const Money& Money1) {rub=Money1.rub; kop=Money1.kop;} //конструктор с параметром типа Money Money() {} //деструктор int getrub() {return rub;} //получение количества рублей int getkop() {return kop;} //получение количества копеек void setrub(long a) {rub=a;} //установка количества рублей void setkop(int a) {kop=a;} //установка количества копеек Money& operator = (const Money& ); //перегрузка оператора присваивания Money operator + (const Money& Money1) const; //перегрузка оператора "+" Money operator - (const Money& Money1) const; //перегрузка оператора "-" Money operator /(int k); //перегрузка оператора "/" Money& operator +=(Money Money1); //перегрузка оператора "+=" Money& operator /=(int k); //перегрузка оператора "/=" bool operator ==(Money Money1) const; //перегрузка оператора "равно" bool operator !=(Money Money1) const; //перегрузка оператора "не равно" bool operator >(Money Money1) const; //перегрузка оператора "больше" bool operator <(Money Money1) const; //перегрузка оператора "меньше"friend istream& operator>>(istream& in, Money& Money1); //дружественный внешний оператор вводаfriend ostream& operator<<(ostream& out, Money Money1); //дружественный внешний оператор вывода};6. Определение компонентных функций и глобальных дружественных функций класса.//Определение компонентных функций.Money& Money::operator =(const Money& Money1){rub=Money1.rub;kop=Money1.kop; return *this;}Money Money::operator + (const Money& Money1) const{ Money Money2;Money2.rub=rub+Money1.rub+(kop+Money1.kop)/100;Money2.kop=(kop+Money1.kop)%100; return Money2;}Money Money::operator - (const Money& Money1) const{ Money Money2;Money2.rub=rub-Money1.rub+(100+kop-Money1.kop)/100+1;Money2.kop=(100+kop-Money1.kop)%100; return Money2;}Money Money::operator / (int k){ Money time2; long t=(100*rub+kop)/k;time2.rub=t/100;time2.kop=t%100; return time2;}Money& Money::operator += (Money Money1){ long t;t=100*(rub+Money1.rub)+kop+Money1.kop;rub=t/100;kop=t%100; return *this;}Money& Money::operator /= (int k){ long t=(100*rub+kop)/k; rub=t/100;kop=t%100; return *this;}bool Money::operator ==(Money Money1) const{ if ((rub*100+kop)==(Money1.rub*100+Money1.kop)) return true; else return false;}bool Money::operator !=(Money Money1) const{ if ((rub*100+kop)!=(Money1.rub*100+Money1.kop)) return true; else return false;}bool Money::operator >(Money Money1) const{ if ((rub*100+kop)>(Money1.rub*100+Money1.kop)) return true; else return false;}bool Money::operator <(Money Money1) const{ if ((rub*100+kop)<(Money1.rub*100+Money1.kop)) return true; else return false;}// Определение глобальных функций.istream &operator >>(istream& in, Money& Money1){ cout<<"input rubli\n";in>>Money1.rub;cout<<"input kopejki\n";in>>Money1.kop; return in;}ostream &operator <<(ostream& out,Money Money1){ out< return out;}7. Глобальные функции для выполнения заданий.typedef vector My_vector;My_vector Create_vector(int n)//создание списка, заполенного случайными данными{ My_vector vector1;Money a; long t; for (int i=0;i{t=rand()%10000;a.setrub(t/100);a.setkop(t%100);vector1.push_back(a);} return vector1;}void print_vector(My_vector& vector1)//вывод элементов вектора{My_vector::iterator it1,itend;itend=vector1.end(); it1=vector1.begin(); while (it1!=itend) cout<<*(it1++)<<" ";cout<}Money min_el(My_vector &vector1)//поиск минимального элемента{My_vector::iterator it1,itmin,itend;it1=itmin=vector1.begin();itend=vector1.end(); while (it1!=itend){ if (*it1 <* itmin)itmin=it1;it1++;} return *itmin;}void ins(My_vector& vector1,Money a,int n) //добавление элемента a на позицию n{My_vector::iterator it1; if (n>vector1.size()+1) cout<<"No such position"< else{it1=vector1.begin(); for (int i=0;iit1++;vector1.insert(it1,a);}}Money Avg(My_vector& vector1)//нахождение среднего арифметического{My_vector::iterator it1,itend;Money a;a=0;it1=vector1.begin();itend=vector1.end(); while (it1!=itend) a+=*(it1++);a/=vector1.size(); return a;}void Del_m(My_vector& vector1,Money a) //удаление элементов, равных a из вектора{My_vector::iterator it1;it1=vector1.begin(); while (it1!=vector1.end()){ if (*it1==a) it1=vector1.erase(it1); else if (it1!=vector1.end())it1++;}}Money max_el(My_vector &vector1)//поиск минимального элемента{My_vector::iterator it1,itmax,itend;it1=itmax=vector1.begin();itend=vector1.end(); while (it1!=itend){ if (*it1 >* itmax)itmax=it1; it1++;} return *itmax;}void add(My_vector &vector1,Money a)//увеличение всех элементов вектора на число a{ for (int i=0;i vector1[i]+=a;}8. Функция main()void main(){ char ch; try{vector vector1; int n; cout<<"Input the size of the vector"<cin>>n;vector1=Create_vector(n);print_vector(vector1); cout<<"After inserting max element"<ins(vector1,max_el(vector1),1);print_vector(vector1); cout<<"After deleting min element"<Del_m(vector1,min_el(vector1));print_vector(vector1); cout<<"With average added"<add(vector1,Avg(vector1));print_vector(vector1);} catch(int){ cout<<"Error";}cin>>ch;}9. Результаты работы программыInput the size of the vector100,41 84,67 63,34 65,00 91,69 57,24 14,78 93,58 69,62 44,64After inserting max element93,58 0,41 84,67 63,34 65,00 91,69 57,24 14,78 93,58 69,62 44,64After deleting min element93,58 84,67 63,34 65,00 91,69 57,24 14,78 93,58 69,62 44,64With average added161,39 152,48 131,15 132,81 159,50 125,05 82,59 161,39 137,43 112,45Задача 3.10. Описание параметризованного класса.template class My_Set{ int len; //длина контейнера set c_set; //контейнер элементов множестваpublic: My_Set(); //Конструктор - пустое множество My_Set(int n); //Конструктор с параметром типа int My_Set(); //деструктор void prn(); //печать элементов контейнера T min_el(); //величина минимального элемента T max_el(); //величина максимального элемента T Avg(); //среднее арифметическое элементов контейнера void Del_m(T a); //удаление элементов,равных a void ins(T a); //вставка элемента a void add(T a); //увеличение всех элементов контейнера на величину a};template My_Set::My_Set() {len=0;}template My_Set::My_Set(int s){T a;len=s; for(int i=0;i {cin>>a;c_set.insert(a);}}template My_Set::

Задача 4.14. Глобальные функции для выполнения заданий:typedef stack My_stack;My_stack Create_stack(int n)//создание стека, заполенного случайными данными{ My_stack stack1; int t;Money a; for (int i=0;i{t=rand()%10000;a.setrub(t/100); a.setkop(t%100);stack1.push(a);} return stack1;}void print_stack(My_stack stack1)//вывод элементов стека{ while (!stack1.empty()){ cout<stack1.pop();}cout<}Money min_el(My_stack stack1)//поиск минимального элемента{Money t1,trub=stack1.top(); while (!stack1.empty()){t1=stack1.top(); if (t1 trub=t1;stack1.pop();} return trub;}void ins(My_stack& stack1,Money a,int n) //добавление элемента a на позицию n{vector temp;vector::reverse_iterator it1; int i=1; if (n>stack1.size()+1) cout<<"No such position"< else{ while (!stack1.empty()){ if (i++==n)temp.push_back(a);temp.push_back(stack1.top());stack1.pop();} if ((i==n))temp.push_back(a); for(it1=temp.rbegin();it1!=temp.rend();it1++)stack1.push(*it1);}}Money Avg(My_stack stack1)//нахождение среднего арифметического{Money a(0,0); int s=stack1.size(); while (!stack1.empty()){a+=stack1.top();stack1.pop();}a/=s; return a;}void Del_m(My_stack& stack1,Money& a) //удаление элементов, равных a из списка{vector temp;vector::reverse_iterator it1; while (!stack1.empty()){ if (!(stack1.top()==a))temp.push_back(stack1.top());stack1.pop();} for(it1=temp.rbegin();it1!=temp.rend();it1++)stack1.push(*it1);}Money max_el(My_stack stack1)//поиск максимального элемента{Money t1,tmax=stack1.top(); while (!stack1.empty()){t1=stack1.top(); if (t1 >tmax)tmax=t1;stack1.pop();} return tmax;}void add(My_stack &stack1,Money a)//увеличение всех элементов стека на сумму a{vector temp;vector::reverse_iterator it1; while (!stack1.empty()){temp.push_back(stack1.top()+a);stack1.pop();} for(it1=temp.rbegin();it1!=temp.rend();it1++) stack1.push(*it1);}15. Функция main()void main(){ char ch; try{stack stack1; int n; cout<<"Input the size of the stack"<cin>>n;stack1=Create_stack(n);print_stack(stack1);ins(stack1,max_el(stack1),1); cout<<"After inserting max element"<print_stack(stack1);Del_m(stack1,min_el(stack1)); cout<<"After deleting min element"<print_stack(stack1);add(stack1,max_el(stack1)); cout<<"Added by average"<print_stack(stack1);} catch(int) { cout<<"Error";}cin>>ch;}16. Результаты работы программы:Input the size of the stack969,62 93,58 14,78 57,24 91,69 65,00 63,34 84,67 0,41After inserting max element93,58 69,62 93,58 14,78 57,24 91,69 65,00 63,34 84,67 0,41After deleting min element93,58 69,62 93,58 14,78 57,24 91,69 65,00 63,34 84,67Added by average187,16 163,20 187,16 108,36 150,82 185,27 158,58 156,92 178,25Задача 5.17. Описание параметризованного класса.class My_Set{ int len; //длина контейнера stack c_stack; //контейнер элементов множестваpublic: My_Set(); //Конструктор - пустое множество My_Set(int n); //Конструктор с параметром типа int My_Set(); //деструктор void prn(); //печать элементов контейнера T min_el(); //величина минимального элемента T max_el(); //величина максимального элемента T Avg(); //среднее арифметическое элементов контейнера void Del_m(T a); //удаление элементов,равных a void ins(T a); //вставка элемента a void add(T a); //увеличение всех элементов контейнера на величину a};18. Реализация функций параметризованного класса.template My_Set::My_Set() {len=0;}template My_Set::My_Set(int s){set temp;T a; for(int i=0;i{cin>>a;temp.insert(a);}set::reverse_iterator it1=temp.rbegin(); len=0; for (;it1!=temp.rend();it1++){ len++;c_stack.push(*it1);}}template My_Set::

Задача 2. Создать адаптер контейнера – стек. Заполнить его элементами типа Money, для которого перегрузить необходимые операции. Найти в стеке максимальный элемент и вставить его в начало вектора. Удалить из стека минимальный элемент. Отсортировать стек по убыванию и по возрастанию. Найти в стеке элемент с заданным количеством рублей. Добавить к каждому элементу среднее арифметическое всех элементов вектора. Для выполнения всех заданий использовать стандартные алгоритмы библиотеки STL. Задача 3. Создать ассоциативный контейнер – множество с дубликатами. Заполнить его элементами типа Money, для которого перегрузить необходимые операции. Найти во множестве максимальный элемент и вставить его в начало множества. Удалить из множества минимальный элемент. Отсортировать множество по убыванию и по возрастанию. Найти в списке элемент с заданным количеством рублей. Добавить к каждому элементу среднее арифметическое всех элементов вектора. Для выполнения всех заданий использовать стандартные алгоритмы библиотеки STL. 2. Описание классаclass Money{ long rub; int kop;public: Money() {rub=0L;kop=0;} //конструктор без параметров Money(long a) {rub=a; kop=0;} //конструктор с одним параметром типа int Money(long a,int b) {rub=a; kop=b;} //конструктор с двумя параметром типа long и типа int Money (const Money& Money1) {rub=Money1.rub; kop=Money1.kop;} //конструктор с параметром типа Money



{

c_set.clear();

}

template

void My_Set::prn()

{

set::iterator it1;

it1=c_set.begin();

for (;it1!=c_set.end();it1++)

cout<<*it1<<" ";

cout<
}

template

T My_Set::min_el()

//поиск минимального элемента

{

set::iterator it1,min;

it1=min=c_set.begin();

for (;it1!=c_set.end();it1++)

{

if (*it1<*min)

min=it1;

}

return *min;

}

template

T My_Set::max_el()

//поиск максимального элемента

{

set::iterator it1,max;

it1=max=c_set.begin();

for (;it1!=c_set.end();it1++)

{

if (*it1>*max)

max=it1;

}

return *max;

}

template

T My_Set::Avg()

//нахождение среднего арифметического

{

set::iterator it1=c_set.begin();

T a;

for (;it1!=c_set.end();it1++)

a+=*it1;

a/=len;

return a;

}

template

void My_Set::Del_m(T a)

//удаление элементов, равных a из контейнера

{

set::iterator it1;

it1=c_set.begin();

while (it1!=c_set.end())

{

if (*it1==a)

{

it1=c_set.erase(it1);

len--;

}

else

if (it1!=c_set.end())

it1++;

}

}

template

void My_Set::ins(T a)

//добавление элемента a

{

c_set.insert(a);

len=c_set.size();

}

template

void My_Set::add(T a)

{

vector vec;

set::iterator it1=c_set.begin();

while (it1!=c_set.end())

vec.push_back(*(it1++));

c_set.clear();

for (int i=0;i
c_set.insert(a+vec[i]);

}

11. Глобальные функции для выполнения заданий отсутствуют.

12. Функция main()

void main()

{

char ch;

try

{

int n;

cout<<"Input the size of the set"<
cin>>n;

My_Set set1(n);

set1.prn();

cout<<"After inserting max element"<
set1.ins(set1.max_el());

set1.prn();

cout<<"After deleting min element"<
set1.Del_m(set1.min_el());

set1.prn();

cout<<"With average added"<
set1.add(set1.Avg());

set1.prn();

}

catch(int)

{

cout<<"Error";

}

cin>>ch;

}

13. Результаты работы программы

Input the size of the set

6

input rubli

45

input kopejki

12

input rubli

35

input kopejki

65

input rubli

10

input kopejki

00

input rubli

42

input kopejki

89

input rubli

43

input kopejki

21

input rubli

53

input kopejki

64

10,00 35,65 42,89 43,21 45,12 53,64

After inserting max element

10,00 35,65 42,89 43,21 45,12 53,64

After deleting min element

35,65 42,89 43,21 45,12 53,64

With average added

79,75 86,99 87,31 89,22 97,74


Задача 4.

14. Глобальные функции для выполнения заданий:

typedef stack My_stack;

My_stack Create_stack(int n)

//создание стека, заполенного случайными данными

{

My_stack stack1;

int t;

Money a;

for (int i=0;i
{

t=rand()%10000;

a.setrub(t/100);

a.setkop(t%100);

stack1.push(a);

}

return stack1;

}

void print_stack(My_stack stack1)

//вывод элементов стека

{

while (!stack1.empty())

{

cout<
stack1.pop();

}

cout<
}

Money min_el(My_stack stack1)

//поиск минимального элемента

{

Money t1,trub=stack1.top();

while (!stack1.empty())

{

t1=stack1.top();

if (t1
trub=t1;

stack1.pop();

}

return trub;

}

void ins(My_stack& stack1,Money a,int n)

//добавление элемента a на позицию n

{

vector temp;

vector::reverse_iterator it1;

int i=1;

if (n>stack1.size()+1)

cout<<"No such position"<
else

{

while (!stack1.empty())

{

if (i++==n)

temp.push_back(a);

temp.push_back(stack1.top());

stack1.pop();

}

if ((i==n))

temp.push_back(a);

for(it1=temp.rbegin();it1!=temp.rend();it1++)

stack1.push(*it1);

}

}

Money Avg(My_stack stack1)

//нахождение среднего арифметического

{

Money a(0,0);

int s=stack1.size();

while (!stack1.empty())

{

a+=stack1.top();

stack1.pop();

}

a/=s;

return a;

}

void Del_m(My_stack& stack1,Money& a)

//удаление элементов, равных a из списка

{

vector temp;

vector::reverse_iterator it1;

while (!stack1.empty())

{

if (!(stack1.top()==a))

temp.push_back(stack1.top());

stack1.pop();

}

for(it1=temp.rbegin();it1!=temp.rend();it1++)

stack1.push(*it1);

}

Money max_el(My_stack stack1)

//поиск максимального элемента

{

Money t1,tmax=stack1.top();

while (!stack1.empty())

{

t1=stack1.top();

if (t1 >tmax)

tmax=t1;

stack1.pop();

}

return tmax;

}

void add(My_stack &stack1,Money a)

//увеличение всех элементов стека на сумму a

{

vector temp;

vector::reverse_iterator it1;

while (!stack1.empty())

{

temp.push_back(stack1.top()+a);

stack1.pop();

}

for(it1=temp.rbegin();it1!=temp.rend();it1++)

stack1.push(*it1);

}

15. Функция main()

void main()

{

char ch;

try

{

stack stack1;

int n;

cout<<"Input the size of the stack"<
cin>>n;

stack1=Create_stack(n);

print_stack(stack1);

ins(stack1,max_el(stack1),1);

cout<<"After inserting max element"<
print_stack(stack1);

Del_m(stack1,min_el(stack1));

cout<<"After deleting min element"<
print_stack(stack1);

add(stack1,max_el(stack1));

cout<<"Added by average"<
print_stack(stack1);

}

catch(int)

{

cout<<"Error";

}

cin>>ch;

}

16. Результаты работы программы:

Input the size of the stack

9

69,62 93,58 14,78 57,24 91,69 65,00 63,34 84,67 0,41

After inserting max element

93,58 69,62 93,58 14,78 57,24 91,69 65,00 63,34 84,67 0,41

After deleting min element

93,58 69,62 93,58 14,78 57,24 91,69 65,00 63,34 84,67

Added by average

187,16 163,20 187,16 108,36 150,82 185,27 158,58 156,92 178,25

Задача 5.

17. Описание параметризованного класса.

class My_Set

{

int len; //длина контейнера

stack c_stack; //контейнер элементов множества

public:

My_Set(); //Конструктор - пустое множество

My_Set(int n); //Конструктор с параметром типа int

My_Set(); //деструктор

void prn(); //печать элементов контейнера

T min_el(); //величина минимального элемента

T max_el(); //величина максимального элемента

T Avg(); //среднее арифметическое элементов контейнера

void Del_m(T a); //удаление элементов,равных a

void ins(T a); //вставка элемента a

void add(T a); //увеличение всех элементов контейнера на величину a

};

18. Реализация функций параметризованного класса.

template

My_Set::My_Set() {len=0;}

template

My_Set::My_Set(int s)

{

set temp;

T a;

for(int i=0;i
{

cin>>a;

temp.insert(a);

}

set::reverse_iterator it1=temp.rbegin();

len=0;

for (;it1!=temp.rend();it1++)

{

len++;

c_stack.push(*it1);

}

}

template

My_Set::
My_Set() //деструктор



{

while (!(c_stack.empty()))

{

c_stack.pop();

}

}

template

void My_Set::prn()

{

stack copy=c_stack;

while (!(copy.empty()))

{

cout<
copy.pop();

}

cout<
}

template

T My_Set::min_el()

//поиск минимального элемента

{

T min=c_stack.top();

stack copy=c_stack;

while (!(copy.empty()))

{

if (copy.top()
min=copy.top();

copy.pop();

}

cout<
return min;

}

template

T My_Set::max_el()

//поиск максимального элемента

{

T max=c_stack.top();

stack copy=c_stack;

while (!(copy.empty()))

{

if (copy.top()>max)

max=copy.top();

copy.pop();

}

cout<
return max;

}

template

T My_Set::Avg()

//нахождение среднего арифметического

{

Money a;

stack copy=c_stack;

while (!(copy.empty()))

{

a+=copy.top();

copy.pop();

}

a/=len;

return a;

}

template

void My_Set::Del_m(T a)

//удаление элементов, равных a из контейнера

{

set temp;

set::reverse_iterator it1;

while (!c_stack.empty())

{

if (!(c_stack.top()==a))

temp.insert(c_stack.top());

else len--;

c_stack.pop();

}

for(it1=temp.rbegin();it1!=temp.rend();it1++)

c_stack.push(*it1);

}

template

void My_Set::ins(T a)

//добавление элемента a

{

set temp;

set::reverse_iterator it1;

while (!c_stack.empty())

{

temp.insert(c_stack.top());

c_stack.pop();

}

len=temp.size();

for(it1=temp.rbegin();it1!=temp.rend();it1++)

c_stack.push(*it1);

}

template

void My_Set::add(T a)

{

vector temp;

vector::reverse_iterator it1;

while (!c_stack.empty())

{

temp.push_back(c_stack.top()+a);

c_stack.pop();

}

for(it1=temp.rbegin();it1!=temp.rend();it1++)

c_stack.push(*it1);

}

19. Функция main()

void main()

{

char ch;

try

{

int n;

cout<<"Input the size of the set"<
cin>>n;

My_Set set1(n);

set1.prn();

cout<<"After inserting max element"<
set1.ins(set1.max_el());

set1.prn();

cout<<"After deleting min element"<
set1.Del_m(set1.min_el());

set1.prn();

cout<<"With average added"<
set1.add(set1.Avg());

set1.prn();

}

catch(int)

{

cout<<"Error";

}

cin>>ch;

}

20. Результаты работы программы:

Input the size of the set

6

input rubli

12

input kopejki

30

input rubli

54

input kopejki

96

input rubli

45

input kopejki

31

input rubli

12

input kopejki

64

input rubli

3

input kopejki

12

input rubli

28

input kopejki

37

3,12 12,30 12,64 28,37 45,31 54,96

After inserting max element

3,12 12,30 12,64 28,37 45,31 54,96

After deleting min element

12,30 12,64 28,37 45,31 54,96

With average added

43,01 43,35 59,08 76,02 85,67

21.

  1. Библиотека STL состоит из набора контейнерных классов и набора обобщённых алгоритмов.

  2. Контейнеры, существующие в STL: вектор: список, двунаправленная очередь (основные последовательные), стек, очередь, очередь с приоритетами (последовательные адаптеры), словари, множества, словари с дубликатами, множества с дубликатами (ассоциативные).

  3. Для использования контейнера STL необходимо подключить заголовочный файл, содержащий описание данного контейнера.

  4. Итератор – это объект (класс), используемый для доступа к элементам контейнера.

  5. Основные операции с итераторами:

    1. разыменование;

    2. присваивание одного итератора другому;

    3. сравнение итераторов на равенство и неравенство;

    4. сдвиг на соседний элемент с помощью операции инкремента(декремента).

  6. Цикл для перебора контейнера с использованием итератора.

container cont1;

container::iterator it1;

it1=cont1.begin();

while (it1!=cont1.end())

{



it1++;

}

  1. Типы итераторов в STL: входные, выходные, прямые, двунаправленные, итераторы произвольного доступа.

  2. Функции-члены, общие для всех контейнеров:

    1. операторы равенства (==)и неравенства (!=);

    2. оператор присваивания (=);

    3. удаление всех элементов (clear);

    4. добавление элемента или диапазона элементов на заданную позицию (insert);

    5. удаление элемента или диапазона элементов (erase);

    6. число элементов в контейнере (size);

    7. максимально допустимый размер контейнера (max_size);

    8. проверка на пустоту контейнера (empty);

    9. итератор на начало контейнера (begin);

    10. итератор на конец контейнера (end);

    11. реверсивный итератор на конец контейнера;

    12. реверсивный итератор на начало контейнера.

  3. Для контейнера vector эффективными являются операции доступа к произвольному элементу, добавление элемента в конец, удаление элемента с конца, т. к. ячейки памяти, выделенные под элементы будут иметь подряд идущие адреса.

  4. Для контейнера list эффективными будут операции вставки и удаления в произвольной позиции, т. к. для этого нужно только поменять значения 4-х указателей, не перемещая элементы контейнера в памяти.

  5. Для контейнера deque эффективными будут те же операции, что и для контейнера vector, а также вставка и удаление первого элемента.

  6. Функции-члены последовательного контейнера vector:

    1. push_back(T& key) добавление в конец;

    2. pop_back() удаление с конца;

    3. insert вставка в произвольное место;

    4. erase удаление из произвольного места;

    5. [] доступ к произвольному элементу;

    6. swap обмен векторов;

    7. clear очистка вектора;

  7. Функции-члены последовательного контейнера list:

    1. push_back(T& key) добавление в конец;

    2. pop_back() удаление с конца;

    3. push_front(T& key) добавление в начало;

    4. pop_front() удаление из начала;

    5. insert вставка в произвольное место;

    6. erase удаление из произвольного места;

    7. swap обмен списков;

    8. clear очистка списка;

    9. splice сцепка списков.

  8. Функции-члены последовательного контейнера deque:

    1. push_back(T& key) добавление в конец;

    2. pop_back() удаление с конца;

    3. insert вставка в произвольное место;

    4. erase удаление из произвольного места;

    5. push_front(T& key) добавление в начало;

    6. pop_front() удаление из начала;

    7. [] доступ к произвольному элементу;

  9. Удаление из вектора элементов со 2 по 5:

v.erase(v.begin()+1,v.begin()+4);

  1. Удаление из вектора последнего элемента:

v.pop_back();

  1. Удаление из списка элементов со 2 по 5:

My_list lst;

My_list::iterator it2,it5;

it2=it5=lst.begin();

it2++;

for(int i=0;i<4;i++)

it5++;

lst.erase(it2,it5);

  1. Удаление из списка последнего элемента:

lst.pop_back();

  1. Удаление из очереди элементов со 2 по 5:

dq.erase(dq.begin()+1,dq.begin()+4);

  1. Удаление из очереди последнего элемента:

dq.pop_back();

  1. Печать последовательного контейнера

template

void print(T &cont1)

{

T::iterator p;

p=cont1.begin();

if (cont1.empty())

cout<<”Empty”<
else

{

for(;p!=cont1.end;p++)

cout<<*p<<” “;

cout<
}

}

  1. Адаптер контейнера – это контейнер, созданный на основе базового и реализующий часть его операций, необходимых для функционирования адаптера.

  2. stack - стек по умолчанию, реализованный на базе двусторонней очереди, stack > – стек на базе списка.

  3. Методы контейнера stack:

    1. push() добавление в конец;

    2. pop() удаление с конца;

    3. top() – получение последнего элемента;

    4. empty() – проверка, является ли стек пустым;

    5. size() – размер стека.

  4. Методы контейнера queue:

    1. push() добавление в конец;

    2. pop() удаление из начала;

    3. front() – получение первого элемента очереди;

    4. back() – получение последнего элемента очереди;

    5. empty() – проверка, является ли очередь пустой;

    6. size() – размер очереди.

  5. Из очереди с приоритетом (priority_queue) для извлечения выбирается максимальный среди хранимых элементов,

  6. Непосредственно удалить из стека элемент с заданным номером нельзя. Для этого нужно последовательно извлечь все элементы до заданного, а затем добавить в обратном порядке все кроме него.

  7. Непосредственно удалить из очереди элемент с заданным номером нельзя. Для этого нужно последовательно извлечь все элементы очереди, а затем добавить в том же порядке все кроме заданного.

  8. Печать содержимого стека

template

void print_stack(stack &st)

{

while (!st.empty())

{

cout<
st.pop();

}

cout<
}

  1. Печать содержимого очереди

template

void print_queue (stack &q)

{

while (!q.empty())

{

cout<
q.pop();

}

cout<
}

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

1. Постановка задачи.

Задача 1.

  1. Создать последовательный контейнер – вектор.

  2. Заполнить его элементами типа Money, для которого перегрузить необходимые операции.

  3. Найти в векторе максимальный элемент и вставить его в начало вектора.

  4. Удалить из вектора минимальный элемент.

  5. Отсортировать вектор по убыванию и по возрастанию.

  6. Найти в векторе элемент с заданным количеством рублей.

  7. Добавить к каждому элементу среднее арифметическое всех элементов вектора.

  8. Для выполнения всех заданий использовать стандартные алгоритмы библиотеки STL.


Задача 2.

  1. Создать адаптер контейнера – стек.

  2. Заполнить его элементами типа Money, для которого перегрузить необходимые операции.

  3. Найти в стеке максимальный элемент и вставить его в начало вектора.

  4. Удалить из стека минимальный элемент.

  5. Отсортировать стек по убыванию и по возрастанию.

  6. Найти в стеке элемент с заданным количеством рублей.

  7. Добавить к каждому элементу среднее арифметическое всех элементов вектора.

  8. Для выполнения всех заданий использовать стандартные алгоритмы библиотеки STL.

Задача 3.

  1. Создать ассоциативный контейнер – множество с дубликатами.

  2. Заполнить его элементами типа Money, для которого перегрузить необходимые операции.

  3. Найти во множестве максимальный элемент и вставить его в начало множества.

  4. Удалить из множества минимальный элемент.

  5. Отсортировать множество по убыванию и по возрастанию.

  6. Найти в списке элемент с заданным количеством рублей.

  7. Добавить к каждому элементу среднее арифметическое всех элементов вектора.

  8. Для выполнения всех заданий использовать стандартные алгоритмы библиотеки STL.

2. Описание класса

class Money

{

long rub;

int kop;

public:

Money() {rub=0L;kop=0;} //конструктор без параметров

Money(long a) {rub=a; kop=0;} //конструктор с одним параметром типа int

Money(long a,int b) {rub=a; kop=b;} //конструктор с двумя параметром типа long и типа int

Money (const Money& Money1) {rub=Money1.rub; kop=Money1.kop;} //конструктор с параметром типа Money

Money() {} //деструктор

int getrub() {return rub;} //получение количества рублей

int getkop() {return kop;} //получение количества копеек

void setrub(long a) {rub=a;} //установка количества рублей

void setkop(int a) {kop=a;} //установка количества копеек

Money& operator = (const Money& ); //перегрузка оператора присваивания

Money operator + (const Money& Money1) const; //перегрузка оператора "+"

Money operator - (const Money& Money1) const; //перегрузка оператора "-"

Money operator /(int k); //перегрузка оператора "/"

Money& operator +=(Money Money1); //перегрузка оператора "+="

Money& operator /=(int k); //перегрузка оператора "/="

bool operator ==(Money Money1) const; //перегрузка оператора "равно"

bool operator !=(Money Money1) const; //перегрузка оператора "не равно"

bool operator >(Money Money1) const; //перегрузка оператора "больше"

bool operator <(Money Money1) const; //перегрузка оператора "меньше"


friend istream& operator>>(istream& in, Money& Money1); //дружественный внешний оператор ввода

friend ostream& operator<<(ostream& out, Money Money1); //дружественный внешний оператор вывода

};

3. Определение компонентных функций и глобальных дружественных функций класса.

//Определение компонентных функций.

Money& Money::operator =(const Money& Money1)

{

rub=Money1.rub;

kop=Money1.kop;

return *this;

}

Money Money::operator + (const Money& Money1) const

{

Money Money2;

Money2.rub=rub+Money1.rub+(kop+Money1.kop)/100;

Money2.kop=(kop+Money1.kop)%100;

return Money2;

}

Money Money::operator - (const Money& Money1) const

{

Money Money2;

Money2.rub=rub-Money1.rub+(100+kop-Money1.kop)/100+1;

Money2.kop=(100+kop-Money1.kop)%100;

return Money2;

}

Money Money::operator / (int k)

{

Money Money2;

long t=(100*rub+kop)/k;

Money2.rub=t/100;

Money2.kop=t%100;

return Money2;

}

Money& Money::operator += (Money Money1)

{

long t;

t=100*(rub+Money1.rub)+kop+Money1.kop;

rub=t/100;

kop=t%100;

return *this;

}

Money& Money::operator /= (int k)

{

long t=(100*rub+kop)/k;

rub=t/100;

kop=t%100;

return *this;

}

bool Money::operator ==(Money Money1) const

{

if ((rub*100+kop)==(Money1.rub*100+Money1.kop))

return true;

else

return false;

}

bool Money::operator !=(Money Money1) const

{

if ((rub*100+kop)!=(Money1.rub*100+Money1.kop))

return true;

else

return false;

}

bool Money::operator >(Money Money1) const

{

if ((rub*100+kop)>(Money1.rub*100+Money1.kop))

return true;

else

return false;

}

bool Money::operator <(Money Money1) const

{

if ((rub*100+kop)<(Money1.rub*100+Money1.kop))

return true;

else

return false;

}

// Определение глобальных функций.

istream &operator >>(istream& in, Money& Money1)

{

cout<<"input rubli\n";

in>>Money1.rub;

cout<<"input kopejki\n";

in>>Money1.kop;

return in;

}

ostream &operator <<(ostream& out,Money Money1)

{

out<
return out;

}

Задача 1.

4. Глобальные функции для выполнения заданий.

My_vector Create_vector(int n)

//создание списка, заполенного случайными данными

{

My_vector vector1;

int t;

Money a;

for (int i=0;i
{

t=rand()%10000;

a.setrub(t/100);

a.setkop(t%100);

vector1.push_back(a);

}

return vector1;

}

void out_el(Money mon1) {cout<
void print_vector(My_vector vector1)

//вывод элементов вектора

{

for_each(vector1.begin(),vector1.end(),out_el);

cout<
}

Money min_el(My_vector &vector1)

//поиск минимального элемента

{

My_vector::iterator min;

min=min_element(vector1.begin(),vector1.end());

return *min;

}

void ins(My_vector& vector1,Money a,int n)

//добавление элемента a на позицию n

{

if (n>vector1.size()+1)

cout<<"No such position"<
else

{

My_vector::iterator imon1=vector1.begin()+n-1;

vector1.insert(imon1,a);

}

}

Money Avg(My_vector& vector1)