Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Вариант.doc
Скачиваний:
10
Добавлен:
17.09.2019
Размер:
227.84 Кб
Скачать

Министерство образования Российской Федерации

Пермский государственный технический университет

Кафедра автоматизированных систем управления

Лабораторные работы на языке программирования СИ++

Выполнил:

студент гр. АСУзу-10-2

Проверил: Викентьева

Пермь 2011

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

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

  1. Определить пользовательский класс Time для работы с временными интервалами. Интервал должен быть представлен в виде двух полей: минуты типа int и секунды типа int. При выводе минуты отделяются от секунд двоеточием.

  2. Определить в классе следующие конструкторы: без параметров, с параметрами, копирования.

  3. Определить в классе деструктор.

  4. Определить в классе компоненты-функции для просмотра и установки полей данных (селекторы и модификаторы).

  5. Перегрузить операцию присваивания.

  6. Перегрузить операции ввода и вывода объектов с помощью потоков.

  7. Перегрузить операции вычитания секунд и сравнение временных интервалов.

  8. Написать программу, в которой продемонстрировать создание объектов и работу всех перегруженных функций.

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

class Time

{

int min,sec;

public:

Time () {min=0;sec=0;} //конструктор без параметров

Time(int a) {min=a; sec=0;} //конструктор с одним параметром типа int

Time(int a,int b) {min=a; sec=b;} //конструктор с двумя параметром типа int

Time (Time& time1) {min=time1.min; sec=time1.sec;} //конструктор с параметром типа Time

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

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

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

void setmin(int a) {min=a;} //установка количества минут

void setsec(int a) {sec=a;} //установка количества секунд

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

Time operator - (int sec1); //перегрузка оператора "-"

int operator ==(Time time1); //перегрузка оператора "равно"

int operator !=(Time time1); //перегрузка оператора "не равно"

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

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

};

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

Time& Time::operator =(Time& time1)

{

min=time1.min;

sec=time1.sec;

return *this;

}

Time Time::operator - (int sec1)

{

Time time1;

time1.min=(60*min+sec-sec1)/60;

time1.sec=(60*min+sec-sec1)%60;

return time1;

}

int Time::operator == (Time time1)

{

return min==time1.min && sec==time1.sec;

}

int Time::operator != (Time time1)

{

return min!=time1.min || sec!=time1.sec;

}

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

istream &operator >>(istream& in, Time& time1)

{

cout<<"input minutes\n";

in>>time1.min;

cout<<"input seconds\n";

in>>time1.sec;

return in;

}

ostream &operator <<(ostream& out,Time time1)

{

out<<time1.min<<":"<<time1.sec;

return out;

}

5. Функция main()/

void main()

{

char ch;

int m,s;

Time a; //конструктор по умолчанию

Time b(2); //конструктор с одним параметром типа int

Time c(5,10); //конструктор с двумя параметрами типа int

Time d(c); //конструктор с одним параметром типа Time

cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl; //вывод созданных переменных

cout<<(c==d)<<" "<<(a==b)<<" "<<(c!=b)<<endl;

//проверка условий c равно d; a равно b; c не равно b

cin>>a; //ввод переменной a

cin>>b; //ввод переменной b

c=d-12; //из времени d вычитается 12 секунд

cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl; //вывод результатов

m=a.getmin(); //получение количества минут из переменной a

s=a.getsec(); //получение количества секунд из переменной a

cout<<m<<" "<<s<<endl; //вывод результатов

b.setmin(4); //установка количества минут в переменную b

b.setsec(32); //установка количества секунд в переменную b

cout<<b<<endl;

cin>>ch;

}

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

0:0

2:0

5:10

5:10

1 0 1

input minutes

4

input seconds

53

input minutes

8

input seconds

19

4:53

8:19

4:58

5:10

4 53

4:32

7.

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

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

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

  4. Унарный оператор, определяемый внутри класса, не имеет операндов кроме случаев постфиксных операторов инкремента и декремента.

  5. Унарный оператор, определяемый вне класса должен иметь один операнд данного класса.

  6. Бинарный оператор, определяемый внутри класса, будет иметь один операнд.

  7. Бинарный оператор, определяемый вне класса, будет иметь два операнда.

  8. Операция присваивания возвращает ссылку на переменную, которой было присвоено значение.

  9. Операция присваивания перегружается как бинарная функция-член класса, получающая в качестве параметра переменную этого же класса и возвращающая ссылку на переменную, которой было присвоено значение.

  10. Операция присваивания возвращает ссылку на переменную, которой было присвоено значение.

  11. Операции ввода-вывода перегружаются созданием дружественных функций – членов классов, определяющих потоки ввода-вывода.

  12. Компилятор будет воспринимать вызов оператора как вызов функции-члена класса Student, имеющую 1 параметр – ссылку на тип Student, и возвращающую ссылку на тип Student.

  13. Компилятор будет воспринимать вызов оператора как вызов дружественной для класса Student функции, имеющую 1 параметр – ссылку на тип Student, и возвращающую ссылку на тип Student.

  14. Компилятор будет воспринимать вызов оператора как вызов функции-члена класса Student, имеющую 2 параметра – ссылки на тип Student, и возвращающую значение типа bool.

  15. Компилятор будет воспринимать вызов оператора как вызов дружественной для класса Student функции, имеющую 2 параметра – ссылки на тип Student, и возвращающую значение типа bool.

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

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

1) Определить класс-контейнер ВЕКТОР с элементами типа int.

2) Реализовать конструкторы, деструктор, операции ввода-вывода, операцию присваивания.

3) Реализовать следующие перегруженные операции:

  • [] – доступа по индексу;

  • int() – определение размеров вектора;

  • * вектор – умножение элементов векторов a[i]*b[i];

  • +n – переход вправо к элементу с номером n (с помощью класса-итератора).

4) Реализовать класс-итератор. Реализовать с его помощью операции последовательного доступа.

5)Написать тестирующую программу, иллюстрирующую выполнение операций.

2. Описание класса-контейнера.

class Vect

{

int size; //размер вектора

int *data; //указатель на массив значений элементов вектора

Iterator begin; //указатель на первый элемент вектора

Iterator end; //указатель на элемент, следующий за последним

public:

Vect(int s,int val=0);

/*конструктор с двумя параметрами типа int,

один из которых имеет значение по умолчанию*/

Vect(Vect& vect1); //конструктор с параметром типа Vect

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

Vect& operator=(Vect & vect1); //перегруженный оператор присваивания

int& operator[](int n); //перегруженный оператор обращения к элементу вектора

int operator() (); //длина вектора

Vect operator* (Vect& vect1); //перегруженный оператор произведения векторов

friend istream& operator >>(istream& input,Vect& vect1); //перегруженный оператор ввода

friend ostream& operator <<(ostream& output,Vect& vect1); //перегруженный оператор вывода

Iterator first() {return begin;} //извлекает указатель на первый элемент

Iterator last() {return end;} //извлекает указатель на элемент, следующий за последним

};

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

/*конструктор с двумя параметрами типа int,

один из которых имеет значение по умолчанию*/

Vect::Vect(int s,int val)

{

size=s;

data=new int[size];

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

data[i]=val;

begin.element=&data[0];

end.element=&data[size];

}

Vect::Vect(Vect& vect1) //конструктор с параметром типа Vect

{

size=vect1.size;

data=new int[size];

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

data[i]=vect1.data[i];

begin.element=&data[0];

end.element=&data[size];

}

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

{

delete[] data;

size=0;

}

Vect& Vect::operator=(Vect& vect1) //перегруженный оператор присваивания

{

if (this==&vect1)

return *this;

if (size!=0)

delete [] data;

size=vect1.size;

data=new int[size];

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

data[i]=vect1.data[i];

begin.element=&data[0];

end.element=&data[size];

return *this;

}

int& Vect::operator[](int n) //перегруженный оператор обращения к элементу вектора

{

if (n<0 || n>=size)

{

cout<<"Index out of range"<<endl;

}

else

return data[n];

}

int Vect::operator() () //длина вектора

{

return size;

}

Vect Vect::operator* (Vect& vect1) //перегруженный оператор произведения векторов

{

if (size!=vect1.size)

{

cout<<"Vectors of different size";

}

Vect vect2(size);

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

vect2.data[i]=data[i]*vect1.data[i];

vect2.begin.element=&vect2.data[0];

vect2.end.element=&vect2.data[size];

return vect2;

}

istream& operator>>(istream& input,Vect& vect1) //перегруженный оператор ввода

{

int s;

cout<<"input size"<<endl;

input>>s;

if (s<0)

{

cout<<"Incorrect size"<<endl;

return input;

}

Vect in_vect(s);

in_vect.size=s;

cout<<"input data"<<endl;

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

input>>in_vect.data[i];

vect1=in_vect;

return input;

}

ostream& operator <<(ostream& output,Vect& vect1) //перегруженный оператор вывода

{

for (int i=0;i<vect1.size;i++)

output<<vect1.data[i]<<" ";

return output;

}

4. Описание класса-итератора

class Iterator

{

int *element; //указатель на элемент вектора

friend class Vect; //объявление класса Vect как дружественного

public:

Iterator() {element=0;} //создание пустого указателя

Iterator(Iterator& itt1) {element=itt1.element;} //создание указателя-копии

int& operator* () {return *element;} //перегруженный оператор разыменования указателя

int operator ==(Iterator& itt1) {return element==itt1.element;} //перегруженный оператор равенства

int operator !=(Iterator& itt1) {return element!=itt1.element;} //перегруженный оператор неравенства

Iterator& operator +(int n); //сдвиг указателя на n позиций вправо

};

Компонентная функция класса-итератора.

//сдвиг указателя на n позиций вправо

Iterator& Iterator::operator +(int n)

{

element+=n;

return *this;

}