Разработка программы для выполнения вычислений над матрицами
Разработка
программы для выполнения вычислений над матрицами
Введение
матрица программирование язык
На сегодняшний день математическое
программирование - важная составляющая всего программирования. Большие и
сложные вычисления благодаря простым программам становятся простыми.
В данной курсовой работе создавалась программа
для вычислений над матрицами.
В качестве среды программирования выбрана MSVisualStudio
2008 и язык программирования C++.
.
Вектор
Матрица состоящая только из одного столбца или
строки называется вектором. Размерностью вектора называется число его
элементов.
.1 Сумма двух векторов
Пусть в линейном пространстве
вектора представлены так:
Тогда суммой векторов будет называться следующий вектор:
1.2 Разность двух векторов
Пусть в линейном пространстве
вектора представлены так:
Тогда разностью векторов будет называться следующий вектор:
1.3 Произведение вектора на число
Если есть некоторое число x и вектор .
Тогда произведением вектора на число x будет
называться следующий вектор
1.4 Скалярное произведение двух векторов
Скалярное произведение двух векторов
и , заданных своими координатами,
может быть вычислено по формулу .
2.
Классы
Класс - это тип структуры, позволяющий включать
в описание типа не только элементы данных, но и функции (функции-элементы или
методы).
Для ограничения доступа к элементам класса
используются следующие спецификаторы доступа:
· public -
ограничений доступа нет;
· protected -
доступны только в порожденных классах;
· private -
доступны только в своем классе.
.1 Конструкторы и деструкторы
Добавим в класс функцию Vector(int sz)
Такая функция называется конструктором и служит
для инициализации создаваемого объекта данных. Имя конструктора должно
совпадать с именем класса, конструктор н должен возвращать значений и содержать
оператор return.Тип его явно не описывается. Конструктор может быть перегружен,
поэтому у любого нового типа данных могут быть несколько конструкторов.
~Vector()- специальный оператор, который
называется деструктором. Он необходим для того, чтобы корректно завершить
существование нашего объекта, то есть освободить память в куче.
Деструктор, как и конструктор, не должен возвращать
значение и иметь явное описание типа. В отличие от конструкторов, которых может
быть несколько у одного и того же класса, деструктор должен быть один и не
должен иметь аргументов.(const Vector &A)называется конструктором копий. Он
используется при создании объекта с инициализацией его объектом того же типа.
Кроме того, конструктор копии используется при
инициализации формального параметра функции в случае передачи ей объекта по
значению, и при возврате объекта из функции по оператору return.
При передаче ссылок и указателей конструктор копии не используется.
Неявный конструктор копии обеспечивает простое
поэлементное копирование одного объекта во второй. Такой вид копирования часто
называют поверхностным.
.2 Перегрузка операций
Большинство операций языка С++ для новых типов
данных может быть перегружено. Для перегрузки операции необходимо создать
функцию с названием, состоящим из ключевого слова operator
и знака перегружаемой операции. Количество параметров этой функции определяется
тем, одноместная или двухместная операция перегружается, а также наличием
неявных элементов у методов класса.
Перегрузка операций предполагает введение в язык
двух взаимосвязанных особенностей: возможности объявлять в одной области
видимости несколько процедур или функций с одинаковыми именами и возможности
описывать собственные реализации операций.
Например, чтобы перегрузить оператор сложения,
нужно определить функцию с именем operator+.
Операторные функции перегруженных операторов, за
исключением new и delete,должны подчиняться следующим правилам:
операторная функция должна быть либо
нестатической функцией-членом класса, либо принимать аргумент типа класса или
перечислимого типа, или аргумент, который является ссылкой на тип класса или
перечислимый тип;
операторная функция не может изменять число
аргументов или приоритеты операторов и порядок их выполнения по сравнению с
использованием соответствующео оператора для встроенных типов данных;
операторная функция унарного оператора,
объявленная как функция-член, не должна иметь параметров; если же она объявлена
как глобальная функция, она должна иметь один параметр;
операторная функция не может иметь параметры по
умолчанию и др.
.3 Дружественные функции
Согласно концепции инкапсуляции данных С++
функция, не являющаяся членом класса, не может получить доступ к его закрытым
(private) элементам. В языке С++ реализована возможность обойти данное
ограничение с помощью друзей. С++ позволяет объявить 2 вида друзей класса:
дружественную функцию или дружественный класс. Дружественные функции не
являются членами класса, но тем не менее имеют доступ к его закрытым членам.
Более того, одна такая функция может иметь доступ к закрытым членам нескольких
классов. Чтобы объявить функцию дружественной некоторому классу, в определение
этого класса включают ее прототип, перед которым ставится ключевое слово
friend. ostream&operator<<(ostream& os, const Vector& A)
Дружественная функция не является членом класса,
в котором она объявлена. Поэтому, вызывая дружественную функцию, не нужно
указывать имя объекта или указатель на объект и операцию доступа к члену класса
(точку или стрелку). Доступ к закрытым членам класса дружественная функция
получает только через объект класса, который в силу этого должен быть либо
объявлен внутри функции, либо передан ей в качестве аргумента.
Функция может быть дружественна сразу нескольким
классам.
.4 Неявный указатель this
Каждый метод класса содержит в качестве данного
следующий указатель, передаваемый при вызове метода в качестве параметра:
имя_типа *this;
Этот указатель представляет собой адрес
конкретного объекта, для которого был вызван метод.
Использовать указатель this
для доступа к элементам класса можно, но вряд ли целесообразно, поскольку это и
так подразумевается по умолчанию. Явно использовать this
необходимо только в тех случаях, когда требуется работа непосредственно с
адресами объектов, например, при организации динамических структур данных.
Код программы
#include"stdafx.h"
#include<iostream>
#include"conio.h"
#include"time.h"namespace
std;
// КЛАСС VectorVector
{:*V;sz; // число строк:
// конструктор по умолчанию();
// конструктор(int sz);
// конструктор копий(const Vector
&A);
// заполнение вектора случайными
числамиSetVector();
// перегрузка оператора
сложенияoperator+(Vector &);
// перегрузка оператора
вычитанияoperator-(Vector &);
// перегрузка оператора умножения на
числоoperator*(const int&);
// перегрузка оператора умножение
вектора на векторoperator*(Vector &);
// перегрузка оператора вывода в
потокostream&operator<<(ostream& os, const Vector& A);
// деструктор
~Vector();
};
// Конструктор по
умолчанию::Vector()
{= NULL;
}
// Конструктор::Vector(int _sz)
{= _sz;= new double [sz];(int i = 0;
i < sz; i++)[i] = 0;
}
// Конструктор копий::Vector(const
Vector &A)
{= A.sz;= new double [sz];(int i =
0; i < sz; i++)[i] = A.V[i];
}
// Заполнение вектора случайными
числамиVector::SetVector()
{(int i = 0; i < sz; i++)
{[i]=(double)((rand()%200)-100.0);
}
}
// Перегрузка оператора
присваивания& Vector::operator =(Vector &A)
{(V!=NULL)
{[] V;
}= new double [sz];= A.sz;(int i =
0; i < sz; i++)[i] = A.V[i];*this;
}
// Сложение
векторовVector::operator+(Vector &A)
{temp(sz);(sz!=A.sz)
{<<"Сложение векторов
невозможно.\n"
"Размеры векторов не
совпадают!\n"
"Программа завершила
работу.\n";(0);
}
{(int i = 0; i < sz; i++).V[i] =
V[i] + A.V[i];temp;
}
}
// Вычитание
векторовVector::operator-(Vector &A)
{temp(sz);(sz!=A.sz)
{<<"Сложение векторов
невозможно.\n"
"Размеры векторов не
совпадают!\n"
"Программа завершила
работу.\n";(0);
}
{(int i = 0; i < sz; i++).V[i] =
V[i] - A.V[i];temp;
}
}
// Умножение вектора на
числоVector::operator*(const int&k)
{temp(sz);(int i = 0; i < sz;
i++).V[i] = V[i]*k;temp;
}
// Умножение вектора на
векторVector::operator*(Vector &A)
{temp(1);(int i = 0; i < sz;
i++).V[0] += V[i] * A.V[i];temp;
}
// Деструктор::~Vector()
{[] V;
}
// Операция
вывода&operator<<(ostream& os, const Vector& A)
{<< '\n';(int i = 0; i <
A.sz; i++)
{<< A.V[i] <<
"\t";
}os;
}_tmain(int argc, _TCHAR* argv[])
{(LC_CTYPE,
"Russian_Russia.1251");((unsigned)time(NULL));k, l, m,
x;numb;<< "Введите размеры векторов: " << endl;<<
"\tПервый вектор: ";>> k;<< endl << "\tВторой
вектор: ";>> l;<< endl << "\tВведите число: "
;>> x;(k == l)= k;
{<< "Размеры векторов не
совпадают. Операции невозможны";
_getch();0;
}v(k), s(l),
res(m);.SetVector();.SetVector();<< endl << v <<
endl;<< s << endl;<< "\nВыберете
операцию:";<< "\nСложение двух векторов №1";<<
"\nРазность двух векторов №2";<< "\nУмножение двух
векторов №3";<< "\nУмножение вектора на число №4";<<
"\nВыход - введите 0\n";>> numb;<< endl;(numb == 0)0;
{(numb)
{1:
{= v + s;<<
"Результат\t" << res << endl;;
}2:
{= v - s;<<
"Результат\t" << res << endl;;
}3:
{= v * s;<<
"Результат\t" << res << endl;;
{= v * x;<< "Результат\t"
<< res << endl;;
}
}
_getch();
}0;
}
Результаты
3.
Проверка результатов в Mathcad
Сумма двух векторов
Разность двух векторов
Скалярное произведение двух векторов
Произведение вектора на число
Список литературы
1. Бьeрн Страуструп. Справочное
руководство по C++, 1995
. Глушаков С.В.
Программирование на С++, изд.2-е, доп. и переработ. - М.:АСТ, 2008. - 685 с.
. Харви Дейтел, Пол Дейтел.
Как программировать на С. - Бином-Пресс, 2008. - 1024 с.