Мегаобучалка Главная | О нас | Обратная связь


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



2018-07-06 378 Обсуждений (0)
Лабораторная работа №8 0.00 из 5.00 0 оценок




Типы данных, определённые программистом

Цель работы: Получение навыков в создании новых типов данных и определении множества операций над ними.

 

Домашнее задание.

Изучить материал по темам: конструкторы, деструкторы и доступность компонентов класса; компонентные данные и компонентные функции; друзья классов; расширение действия стандартных операций; шаблоны классов.

 

Лабораторное задание

1. Набрать и отладить программу №1

//Программа №1

#include "stdafx.h"

#include <string.h>

#include <iostream>

#include <MATH.H>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

 

// class Matr

//-------------------------------------------------------------------

template <class T>

class Matr

{

long line;

long col;

T ** matr;

 

public:

virtual ~Matr(); //Деструктор

Matr(long l, long c); // Конструктор

Matr():line(0), col(0),matr(NULL){} //Конструктор по умолчанию

Matr(Matr<T>& A); //Конструктор копии

 

T * operator[](long i){return matr[i];}

template <class T>

friend Matr<T> operator*( Matr<T>& A, Matr<T>& B);

const Matr<T>& operator=(const Matr<T>& A);

template <class T>

friend Matr<T> operator*(double K, const Matr<T>& A);

Matr<T> operator+(const Matr<T>& A);

Matr<T> operator-(const Matr<T>& A);

void display();

};

 

// Matr<T>::Matr()

//-------------------------------------------------------------------

template <class T>

Matr<T>::Matr(long l1, long col1)

{

line = l1;

col = col1;

matr = new T*[line];

if(matr == NULL) cout<< "Out of memory";

for (int i = 0; i < line; i++){

matr[i] = new T[col];

if(matr[i] == NULL) cout<<"Out of memory";

}

}

// Matr<T>::Matr(Matr<T>& A)

//-------------------------------------------------------------------

template <class T>

Matr<T>::Matr(Matr<T>& A):line(A.line), col(A.col)

{

matr = new T*[line];

if(matr == NULL) cout<< "Out of memory";

for (int i = 0; i < line; i++){

matr[i] = new T[col];

if(matr[i] == NULL) cout<<"Out of memory";

}

for(long j = 0; j<line; j++){

for( int i = 0; i<col; i++){

matr[j][i] = A.matr[j][i];

}

}

}

// Matr<T>::~Matr()

//-------------------------------------------------------------------

template <class T>

Matr<T>::~Matr()

{

for (int i = 0; i < line; i++) delete matr[i];

delete matr;

}

// void display(const Matr<T>& A)

//-------------------------------------------------------------------

template <class T>

void Matr<T>::display(){

cout<<"\n";

for(int i = 0; i<line;i++){

cout<<"\n";

for(int j = 0; j < col; j++)

cout<<matr[i][j]<<"\t";

}

}

// Matr<T>::operator*()

//-------------------------------------------------------------------

template <class T>

Matr<T> operator*( Matr<T>& A,

Matr<T>& B)

{

if(!(A.col == B.line)) cout<<"\n A*B A.col != B.line";

Matr<T> arMatr(A.line, B.col);

long l1 = A.line;

long col1 = A.col;

long col2 = B.col;

for(long i = 0; i < l1; i++){

for(long j = 0; j < col2; j++){

arMatr[i][j] = 0;

for(long k = 0; k < col1; k++) {

arMatr[i][j]+=A[i][k]*B[k][j];

}

}

}

return arMatr;

}

// Matr::operator=()

//-------------------------------------------------------------------

template <class T>

const Matr<T>& Matr<T>::operator=(const Matr<T>& A)

{

if(this == &A) return *this;

line = A.line;

col = A.col;

for(long i = 0; i<A.line; i++){

for(long j = 0; j<A.col; j++){

matr[i][j] = A.matr[i][j];

}

}

return *this;

}

// Matr<T>::operator*()

//-------------------------------------------------------------------

template <class T>

Matr<T> operator*(double K, const Matr<T>& A)

{

Matr<T> M(A.line, A.col);

for(long i = 0; i<A.line; i++){

for(long j = 0; j<A.col; j++){

M.matr[i][j] = K * A.matr[i][j];

}

}

return M;

}

// Matr<T>::operator+()

//-------------------------------------------------------------------

template <class T>

Matr<T> Matr<T>::operator+(const Matr<T>& A)

{

if(line != A.line || col != A.col) {

cout<<"\n A != B";

Matr<T> M(0,0);

return M;

}

Matr<T> M(A.line, A.col);

for(long i = 0; i<A.line; i++){

for(long j = 0; j<A.col; j++){

M.matr[i][j] = matr[i][j] + A.matr[i][j];

}

}

return M;

}

// Matr<T>::operator-()

//-------------------------------------------------------------------

template <class T>

Matr<T> Matr<T>::operator-(const Matr<T>& A)

{

if(line != A.line) {

cout<<"\n - no A.line = B.line";

Matr<T> M(0,0);

return M;

}

if(col != A.col) {

cout<<"\n - no A.line = B.line";

Matr<T> M(0,0);

return M;

}

Matr<T> M(A.line, A.col);

for(long i = 0; i<A.line; i++){

for(long j = 0; j<A.col; j++){

M.matr[i][j] = matr[i][j] - A.matr[i][j];

}

}

return M;

}

// TMatr()

//-------------------------------------------------------------------

template <class T>

Matr<T> TMatr(Matr<T>& M){

Matr<T> TM(M.col, M.line);

for(int i = 0; i < M.line; i++)

for(int j = 0; j < M.col; j++)

TM[j][i] = M[i][j];

return TM;

}

 

void main(){

Matr<double> A(2,2), B(2,2);

A[0][0]=A[0][1]=A[1][0]=A[1][1] = 1;

B[0][0]=B[0][1]=B[1][0]=B[1][1] = 2;

A.display();

B.display();

A=(2.5*A-A+B)*B;

A.display();

getchar();

}

2. В каждую компонентную функцию вставить строку программы, печатающую, что именно эта компонентная функция вызвана. (В конструктор, например, вставить строку cout<<"\n Это конструктор.";) и объяснить последовательность вызовов компонентных функций при выполнении main().

3. До определить множество операций над матрицами, т.е. написать компонентные функции, реализующие операции ==, !=, > , < , A * const, cout<<A. Считать, что матрица А > матрицы В, если max |aij |> max |bij|; i = 1,…,N; j = 1, …, M.

4. Определить новый тип данных, комплексное число, и множество операций над ним.

5. Написать отчет.

 

Содержание отчета

5. Титульный лист отчета должен содержать название, цель лабораторной работы, группу и фамилию студента, выполнившего её, и фамилию преподавателя, проверившего отчет.

6. Выполненное домашнее задание.

7. Тексты программ, написанных при выполнении 3 и 4 пунктов лабораторного задания.

 

Контрольные вопросы.

1. Для чего используется конструктор копии? В каких случаях наличие конструктора копии в классе обязательно, для правильной работы программы, а в каких нет?

2. Как работает компонентная функция operator= ? В каких случаях наличие компонентной функции operator= в классе обязательно, для правильной работы программы, а в каких нет?

3. Конструктор преобразования типа. Приведите примеры явного и неявного вызова конструктора преобразования типа для класса комплексное число.

4. Перегрузка операций. Запишите множество перегружаемых и не перегружаемых операций языка С++. Расскажите о свойствах перегруженных операций.

5. Напишите класс vector (вектор) и определите над ним множество операций { +, -, ==, =, !=, скалярное произведение}.

6. Напишите класс str (строка) и определите над ним множество операций { +, -, ==, =, !=, <, >}.

7. Напишите класс круг и определите над ним множество операций {==, !=, <,> } (по площади).

8. Напишите класс квадрат и определите над ним множество операций {==, !=, <,> } (по площади).

9. Напишите класс список, обеспечивающий: вставку, удаление, доступ к элементу в списке.

10. Деструктор, его назначение и сигнатура.

11. Добавьте в класс Matr статическую компонентную функцию и статическое поле данных, в котором хранится количество объектов типа Matr.

12. Напишите компонентные функции, обеспечивающие сохранение и восстановление объекта типа Matr из файла.

13. В чем состоит идея инкапсуляции данных? В чем её основное достоинство? С помощью каких средств языка С++ она реализуется в программе? Приведите примеры класса, написанного с инкапсулированными данными и нет.

 

 



2018-07-06 378 Обсуждений (0)
Лабораторная работа №8 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа №8

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (378)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)