Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП. Вариант 14. Год выполнения - 2010. Преподаватель Луцик Ю.А..doc
Скачиваний:
36
Добавлен:
01.04.2014
Размер:
98.3 Кб
Скачать

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

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

«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»

Институт информационных технологий

Специальность Информационные системы и технологии

КОНТРОЛЬНАЯ РАБОТА

По курсу___Объектно-ориентированное программирование ___________

Вариант № 14

Студент-заочник _I_ курса

Группы № 982321_________

ФИО Костюкович Андрей___

________Васильевич__________

Адрес_г.Борисов, ул. Н-Нёман

_________д.170 кв.134__________

Тел. 8-044-754-84-85_______

Минск, 2010

Содержание

  1. Задание №1.........................................................................................................3

  2. Текст программы к заданию №1......................................................................9

  3. Результат работы программы №1...................................................................10

  4. Теория к заданию №1.......................................................................................10

  5. Задание №2........................................................................................................12

  6. Текст программы к заданию №2.....................................................................15

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

  8. Теория к заданию №2.......................................................................................16

  9. Задание №3........................................................................................................17

  10. Текст программы к заданию №3.....................................................................19

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

  12. Теория к заданию №3.......................................................................................20

  13. Литература........................................................................................................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{}).