- •Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»
- •1.Интегрированная среда mvs-2010
- •1.1.Методические указания
- •2.Массивушки и подпрограммочки
- •Прочитайте это задание и методические указания до конца, прежде чем терзать клавиатуру, соседа, преподавателя и пр. Сущности
- •Попробуйте сдать работу, предварительно тщательно протестировав ее на предмет отсутствия хомутов
- •2.1.Методические указания
- •3.Поиск экстремумов с ограничениями или «Брачное агенство»
- •Постановка задачи
- •Задание
- •Листинг файла mAgency.Cpp (с главной функцией)
- •Листинг файла Lib.H
- •Листинг файла Lib.Cpp
- •4.Задача «куча камней»
- •4.1.Постановка задачи.
- •4.2.Методические указания.
- •Некоторые примеры разделения камней на две кучи, которые должна решать ваша программа
- •5.Разработка простого класса
- •5.1.Задание
- •5.2.Описание вариантов заданий
- •5.3.Драгоценные методические указания
- •6.Класс вектор
- •6.1.Пример класса tVector
- •6.2.Класс tVector с перегруженными операциями
- •7.Наследование классов
- •7.1.Задание
- •7.2.Методическая помощь
- •7.3.Описание самых легких вариантов заданий
- •7.4.Контроль качества выполненной работы
- •8.Приложение с окном вида
- •9.Абстрактные классы и виртуальные функции
- •9.1.Задание
- •9.2.Методические указания
- •Void PrintClassNamе1(cBasе *pb) // параметр-указатель
- •Void PrintClassNamе2(cBasе &b) // параметр-ссылка
- •Void PrintClassNamе3(cFirst f) // параметр-значение
- •9.3.Варианты заданий
- •10.Разработка класса контейнера
- •10.1.Задание
- •10.2.Описание вариантов заданий
- •10.3.Методические указания
- •12.Перегрузка векторных и матричных операций
- •12.1.Задание
- •12.2.Бесценные методические указания
- •12.3.Некоторые особенности перегрузки операций
- •12.4.Варианты заданий
- •13.Программирование односвязного списка
- •13.1.Задание
- •13.2.Описание вариантов заданий
- •14.Приложение, основанное на модальном диалоговом окне
- •14.1.Нудные методические указания Модальные и немодальные диалоговые окна
- •Ресурсы и элементы управления
- •Сценарий создания приложения
- •Разбор приложения
- •Усовершенствование приложения
- •15.Приложения
- •15.1.Виды сортировок
- •Классификация сортировок
- •Сортировка массивов
- •15.2.Алгоритм сортировки включением
- •Пример сортировки с помощью прямого включения
- •15.3.Сортировка Шелла
- •Список литературы
12.Перегрузка векторных и матричных операций
По мере увеличения размера программы средняя наработка на отказ постоянно уменьшается
Закон Мерфи
Цель работы – практически освоить программирование перегрузки операций на примере выполнения математических операций над векторами и матрицами (4 час.).
12.1.Задание
Разработайте консольное приложение, а если хотите – приложение с графическим интерфейсом пользователя, в котором реализуются операции над векторами и матрицами, оформленные как перегруженные «классовые» операции в соответствии с вашим индивидуальным заданием. Само собой разумеется, что вы должны разработать классы матриц и векторов и в них реализовать перегруженные операции. Для хранения значений элементов матриц и векторов необходимо использовать указатели.
Любое приложение должно предоставлять очеееень привередливому пользователю, например, тому же добрейшему преподу, следующие бесплатные, т.е. даровые, услуги:
возможность многократно вводить исходные данные и получать результат без выхода из приложения, т.е. без его перезапуска на выполнение;
возможность ввода размеров векторов, матриц и других параметров;
реализовать перегруженную операцию [] доступа к элементам векторов и матриц;
в каждом варианте задания необходимо реализовать перегруженные операции как компонентные функции, дружественные и глобальные;
наглядный вывод, чтобы было понятно даже самому тупому юзеру, исходных данных и результатов выполнения операций в соответствии с доставшимся вам самым легким вариантом задания. Операции вывода значений векторов и матриц на монитор реализовать как перегруженные.
Вывод программы должен быть максимально наглядным. Например, если в программе реализуется операция умножения двух матриц, то лучше всего вывод программы организовать в следующем виде:
Обратите внимание, что здесь проиллюстрирована операция умножения матриц и результирующая матрица «настоящая».
12.2.Бесценные методические указания
Для того чтобы в описании и реализации своих классов можно было использовать, например, стандартный ввод и вывод с помощью потоков cin и cout, начните файл с таких объявлений:
// Файл Matrix.h
#pragma once
#include "stdafx.h" // Добавить
using namespace std; // Добавить
class CMatrix
{
//
};
Допустим, требуется выполнять операции над прямоугольной матрицей размером NxM, где N – число строк, а М – число столбцов. Тогда выделить память для этой матрицы можно так:
double **Mtr;
Mtr=new double * [N];
for(int i=0;i<N;i++) Mtr[i]= new double [M];
Соответственно, освободить память можно так:
for(int i=0;i<N;i++) delete [] Mtr[i];
delete []Mtr;
Можно, элементарно, выделить память и для треугольной матрицы (в первой строке N столбцов, а в последней – 1):
double **Mtr;
Mtr=new double * [N];
for(int i=0;i<N;i++) Mtr[i]= new double [N-i];
Реализация перегруженной операции доступа по индексу [] для вектора вам известна, а как ее реализовать для матрицы как двумерного массива? Операции [][] в языке С++ не существует! Как же быть, если требуется передать два индекса (строка и столбец) посредством одного параметра? Да например так:
int Index=i/*строка*/*1000+j/*столбец*/; // "Упаковка индексов"
int i=Index/1000,j=Index%1000; // "Распаковка индексов"
Еще можно номер строки хранить в двух старших байтах переменной типа int, а номер столбца – в двух младших. Достоинством такого подхода является возможность контроля номера строки и номера столбца, т.е. индексов двумерного массива.
Заметим, однако, что можно перегрузить операцию [] и таким образом:
double * CMatrix::operator [](int Index)
{
return Mtr[Index];
}
В этом случае выражение Obj[i] возвращает указатель на i-тую строку матрицы, а Obj[i][j] – значение двумерного массива в i-той строке и j-том столбце. Другими словами, имеет место тождество Obj[i][j] == *(Obj[i]+j).
Сказанное относится не только к двумерным массивам, а и к многомерным. Однако при таком подходе сложнее контролировать корректность индексов.
