Министерство образования республики Беларусь
Учреждение образования
«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»
Институт информационных технологий
Специальность Информационные системы и технологии
КОНТРОЛЬНАЯ РАБОТА
По курсу___Объектно-ориентированное программирование ___________
Вариант № 14
Студент-заочник _I_ курса
Группы № 982321_________
ФИО Костюкович Андрей___
________Васильевич__________
Адрес_г.Борисов, ул. Н-Нёман
_________д.170 кв.134__________
Тел. 8-044-754-84-85_______
Минск, 2010
Содержание
-
Задание №1.........................................................................................................3
-
Текст программы к заданию №1......................................................................9
-
Результат работы программы №1...................................................................10
-
Теория к заданию №1.......................................................................................10
-
Задание №2........................................................................................................12
-
Текст программы к заданию №2.....................................................................15
-
Результат работы программы №2...................................................................16
-
Теория к заданию №2.......................................................................................16
-
Задание №3........................................................................................................17
-
Текст программы к заданию №3.....................................................................19
-
Результат работы программы №3...................................................................20
-
Теория к заданию №3.......................................................................................20
-
Литература........................................................................................................21
1. Разработать класс реализующий стек - список фамилий. Создать несколько (2) объектов разработанного класса. Методы класса: поместить в стек и взять из стека, конструкторы и деструктор.
#include <stdio.h>
#include <iostream.h>
#include <string.h>
class steck
{
private:
char *st[100];
int count;
public :
//Получить элемент из стека
char *pop()
{
if (count>=0) count--;
if (count<0) return "steck is empty";
return st[count];
}
//Затолкнуть фамилию в стек
void push(char *fam)
{
if (count<0) count=0;
st[count]=fam;
count++;
}
//Конструктор по умолчанию
steck()
{
count=0;
}
//Конструктор с параметрами
steck(char *fam)
{
count=0;
st[count]=fam;
count++;
}
//Конструктор копирования
steck(steck &w)
{
memcpy (st, w.st, 4);
}
//Деструктор
~steck()
{
delete [] *st;
}
};
int main()
{ int i;
steck *st=new steck();
steck *st2=new steck();
steck *st1=new steck("Vasin Mihail Sergeevich");
//Заталкиваем элементы в первый стек
st->push("Levin Boris Arkadevich");
st->push("Bikov Andrei Evgenevich");
cout<<"result:"<<endl;
cout<<"---------- 1 steck st--------------------"<<endl;
//Выталикиваем элементы из первого стека
cout<<st->pop()<<endl;
cout<<st->pop()<<endl;
cout<<st->pop()<<endl;
cout<<"---------- 2 steck st1--------------------"<<endl;
//Выталикиваем элементы из второго стека
cout<<st1->pop()<<endl;
cout<<st1->pop()<<endl;
cout<<st1->pop()<<endl;
//Заталкиваем эемент во воторой стек
st1->push("Lobanov Semen ");
cout<<"---------- 3 steck st2--------------------"<<endl;
//Результат работы конструктора копирования
st2=st1;
cout<<st2->pop()<<endl;
return 0;
}
Результат работы программы №1
Теория к заданию №1.
В данном задании я описал класс steck, который содержит конструктор по умолчанию, конструктор с параметрами, конструктор копирования и два метода для помещения и извлечения элемента из стека, деструктор и две переменных (char* и int). В функции int main() создаю три объекта класса steck.
Класс в языке С++ задается с помощью ключевого слова class, за которым следует его имя и в фигурных скобках {} дается его описание. После определения класса ставится точка с запятой.
Каждый класс имеет специальные функции, которые называются конструктор и деструктор. Конструктор класса вызывается всякий раз, когда объект создается в памяти ЭВМ и служит обычно для инициализации данных класса. Конструктор имеет то же имя, что и имя класса. Деструктор вызывается при удалении класса из памяти и используется, как правило, для освобождения ранее выделенной памяти под какие-либо данные этого класса. Имя деструктора совпадает с именем класса, но перед ним ставится символ ‘~’.
Для создания нового экземпляра класса в памяти ЭВМ используется оператор new языка С++, а для удаления – оператор delete. Экземпляр класса также можно создать подобно обычным переменным без использования указателей.
В классах помимо переменных, конструкторов и деструкторов можно задавать описания и обычных функций, которые, в этом случае, называются методами.
В классах для переменных и функций предусмотрена возможность установки разных уровней доступа к данным, которые определяются тремя ключевыми словами: public, private и protected. Ключевое слово public означает общий доступ к переменным и функциям класса. Уровень доступа private указывает на частный способ доступа к элементам класса и устанавливается по умолчанию при описании класса. Частный уровень доступа дает возможность обращаться к переменным и функциям только внутри класса и запрещает извне, например, через представители или указатели на класс. Режим доступа protected также как и private запрещает доступ к элементам класса через представители и указатели, но разрешает обращаться к ним из дочерних классов при наследовании.
Стек - это конечная последовательность некоторых однотипных элементов - скалярных переменных, массивов, структур или объединений, среди которых могут быть и одинаковые.
Если в стеке элементов нет, то он называется пустым.
2. Создать несколько объектов (например, a и b) разработанного класса. Класс – символьная строка. Реализовать для объектов данного класса перегрузку операции <= (b<=a). Содержимое объектов (a,b, их строк), до и после выполнения операции, вывести на экран.
#include <stdio.h>
#include <iostream.h>
#include <string.h>
class compare
{
private:
char *st;
Int count;
public :
//Конструктор по умолчанию
compare()
{
st=new char[255];
}
//Конструктор с параметрами
compare(char *str)
{
st=new char[255];
strcpy(st,str);
}
//Конструктор копирования
compare(compare &w)
{
memcpy (st, w.st, 4);
}
//Перегружаем оперетор <=
int operator<=(compare &st1)
{
int i,ncounta=0;
int ncountb=0;
//Подсчет количества символов в строке1
for(i=0;st[i]!='\0';i++)
ncounta++;
//Подсчет количества символов в строке2
for(i=0;st1.st[i]!='\0';i++)
ncountb++;
//Сравнение длинн строк
if (ncounta<=ncountb) return 1;
else return 0;
}
//Вывод результата
void writeResult()
{
cout<<st<<endl;
}
//Деструктор
~compare()
{
delete st;
}
};
Int main()
{
compare a("I lovedfsdfds c++");
compare b("I love c++");
//Вывод сравниваемых срок до сравнения
a.writeResult();
b.writeResult();
cout<<"--------------------------------------------------------"<<endl;
cout<<"result:"<<endl;
cout<<"--------------------------------------------------------"<<endl;
//сравнение строк
if (b<=a)
cout<<"b<=a"<<endl;
else
cout<<"b>a"<<endl;
//Вывод сравниваемых срок после сравнения
a.writeResult();
b.writeResult();
cout<<endl<<endl;
return 0;
}
Результат работы программы №1
Теория к заданию №2.
В данном задании я описал класс compare, который содержит конструктор по умолчанию, конструктор с параметрами, конструктор копирования, два метода – один для перегрузки оператора <= ( int operator<=(compare &st1)), а второй для вывода результата (void writeResult()), деструктор. В функции int main() создаю два экземпляра класса compare – a и b и сравниваю их содержимое.
С базовыми типами можно использовать любые операции: +, -, *, ++, = и многие другие. А над объектами эти операции применять нельзя, поэтому существует такое понятие как перегрузка операций. Делается это созданием метода внутри класса. Единственной важной особенностью данного метода - имя идентификатора. Имя идентификатора для перегруженных операций состоит из ключевого слова operator и названия операции. Во всём остальном этот метод определяется как и любые другие.
3. Реализовать контейнерный класс список, элементами которого являются числа. Создайте итераторы: один для продвижения в прямом направлении, другой для продвижения в обратном направлении. Используйте их для переворачивания содержимого списка
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
Int main()
{
deque<int> lSpisok;//двунаправленный список
deque<int> ::iterator itr;//объявление итератора для прямого прохождения списка
deque<int> ::reverse_iterator itr1;//объявление итератора для обратного прохождения списка
//блок поиска ошибок
try
{
int i=0;
for (i=0;i<10;i++)
lSpisok.push_back(i);//заполняем список значениями от 0 до 9
//Вывод результата
cout<<"result"<<endl;
cout<<"-------------------- iterator -------------------------------------------"<<endl;
for(itr=lSpisok.begin();itr!=lSpisok.end();++itr)
cout<<*itr<<endl;
cout<<"----------------------- reverse_iterator --------------------------------"<<endl;
for(itr1=lSpisok.rbegin();itr1!=lSpisok.rend();++itr1)
cout<<*itr1<<endl;
}
catch(deque<int> ex) //обработка исключения в типе deque<int>
{
cout<<"Error in type deque<int>"<<endl;
return 0;
}
return 0;
}
Результат работы программы №3
Теория к заданию №3.
Контейнерные классы -- это универсальные шаблонные классы, предназначенные для хранения элементов заданного типа в смежных областях памяти. Стандарт C++ уже включает в себя большое количество контейнеров, как часть STL (Standard Template Library -- Стандартная Библиотека Шаблонов).
Итератор — это класс, объект которого имеет частичную семантику указателя. Итераторы делятся по способу доступа на итераторы последовательного доступа и итераторы произвольного доступа. Итераторы последовательного доступа бывают однонаправленными и двунаправленными. Итератор похож на указатель своими основными операциями: указание одного отдельного элемента в коллекции объектов (называется доступ к элементу) и изменение себя так, чтобы указывать на следующий элемент (называется перебор элементов). Также должен быть определён способ создания итератора, указывающего на первый элемент контейнера, и способ узнать, перебраны ли все элементы контейнера. В зависимости от используемого языка и цели, итераторы могут поддерживать дополнительные операции или определять различные варианты поведения.
В программе создаём двунаправленный список и два итератора: один для прямого прохождения списка, а второй для обратного. Также используем блок обработки исключительных ситуаций (try{}).