Государственноеобразовательное учреждение
высшегопрофессионального образования
УльяновскийГосударственный Университет
ФакультетМатематики и Информационных технологий
Кафедраинформационных технологий
КУРСОВАЯРАБОТА
Программированиедействий над матрицами на языке С++.
Прикладнаяинформатика 08.08.01
Проект выполнил студент
Русин Виктор Александрович
Ульяновск
2010 г.
Содержание
Введение
1. Теоретическаячасть
1.1 Описание программы, матрицы
1.2 C++
1.3 Microsoft Visual Studio Express
1.4 Стандартная библиотека шаблонов (STL)
1.5 Vector
1.6 Перегрузка операторов
2. Проектирование и этапы разработки
2.1 Постановка задачи
2.2 Средства разработки
2.3 Описание процесса компиляции и запуска программы
3. Реализация
3.1 Структура программы
3.2 Структура класса
Заключение
Литература
Приложение. Исходный код программы. Заголовочные файлы
Введение
На сегодняшний день математическоепрограммирование – важная составляющая всего программирования. Большие исложные вычисления благодаря простым программам становятся простыми.
В данной курсовойработе создавалась программа для вычислений над матрицами.
В качестве средыпрограммирования выбрана MSVisual Studio2008 и язык программирования C++.
/>1/>. Теоретическая часть 1.1 Описание программы, матрицы
Ма́трица— математический объект, записываемый в виде прямоугольной таблицы чисел (илиэлементов кольца) и допускающий алгебраические операции (сложение, вычитание, умножение)между ним и другими подобными объектами. Обычно матрицы представляютсядвумерными (прямоугольными) таблицами. Иногда рассматривают многомерные матрицыили матрицы непрямоугольной формы.Операции над матрицами
Пусть aij — элементы матрицы A, а bij — элементы матрицы B.
Линейныеоперации:
Умножениематрицы A на число λ (обозначение: λA) заключается в построении матрицы B, элементы которой получены путёмумножения каждого элемента матрицы A на это число, то есть каждый элементматрицы B равен
bij = λaij
Сложениематриц A + B есть операция нахождения матрицы C, все элементы которой равны попарнойсумме всех соответствующих элементов матриц A и B, то есть каждый элемент матрицы C равен
cij = aij+ bij
/>
Вычитаниематриц A − B определяется аналогично сложению,это операция нахождения матрицы C, элементы которой
cij = aij — bij
/>
Сложение ивычитание допускается только для матриц одинакового размера.
Существует нулеваяматрица Θтакая, что её прибавление к другой матрице A не изменяет A, то есть
A + Θ = A
Все элементынулевой матрицы равны нулю.
Умножениематриц (обозначение: AB, реже со знаком умножения />)— есть операция вычисления матрицы C, элементы которой равны суммепроизведений элементов в соответствующей строке первого множителя и столбцевторого.
/>
В первоммножителе должно быть столько же столбцов, сколько строк во втором. Еслиматрица A имеетразмерность />, B — />, то размерность их произведения AB = C есть />.
/>
/>
/>
Возводить встепень можно только квадратные матрицы.
Транспонированиематрицы (обозначение: AT) — операция, при которой матрицаотражается относительно главной диагонали, то есть
/>
Если A — матрица размера />, то AT — матрица размера />.1.2 C++
C++(Си++) — компилируемый статически типизированный язык программирования общегоназначения. Поддерживает разные парадигмы программирования, но, в сравнении сего предшественником — языком Си, — наибольшее внимание уделено поддержкеобъектно-ориентированного и обобщённого программирования.
Название «C++»происходит от Си (C), в которомунарный оператор ++ обозначает инкремент переменной.
В 1990-х годах языкстал одним из наиболее широко применяемых языков программирования общегоназначения.
При создании C++стремились сохранить совместимость с языком Си. Большинство программ на Сибудут исправно работать и с компилятором C++.C++ имеет синтаксис, основанный насинтаксисе Си. 1.3 Microsoft Visual Studio Express
MicrosoftVisual StudioExpress — линейка бесплатныхинтегрированных сред разработки, облегчённая версия MicrosoftVisual Studio,разработанной компанией Microsoft.Согласно утверждению Microsoft,«Express»-редакции предлагаютотлаженную, простую в обучении и использовании среду разработки пользователям,не являющимся профессиональными разработчиками ПО, — любителям и студентам.Последняя версия была выпущена 19 ноября 2007, пакет обновления SP1— 11 августа 2008. С апреля 2009 года Microsoftпрекратила поддержку всех предыдущих версий VisualStudio Express.В апреле 2010 выпущена VisualStudio 2010 Express
1.4Стандартная библиотека шаблонов (STL)
STL (англ. Standard Template Library) — набор согласованных обобщённых алгоритмов, контейнеров,средств доступа к их содержимому и различных вспомогательных функций.
Стандартнаябиблиотека шаблонов до включения в стандарт C++ была сторонней разработкой, вначале — фирмы HP, а затем SGI. Стандарт языка не называет её «STL», так какэта библиотека стала неотъемлемой частью языка, однако многие люди до сих пориспользуют это название, чтобы отличать её от остальной части стандартнойбиблиотеки (потоки ввода/вывода (iostream), подраздел Си и др.).
Проект подназванием STLPort, основанный на SGI STL, осуществляет постоянное обновлениеSTL, iostream и строковых классов. Некоторые другие проекты также занимаютсяразработкой частных применений стандартной библиотеки для различныхконструкторских задач. Каждый производитель компиляторов C++ обязательнопоставляет какую-либо реализацию этой библиотеки, так как она является оченьважной частью стандарта и широко используется.
АрхитектураSTL была разработана Александром Степановым и Менг Ли.
1.5 Vector
Вектор (vector)напоминает нам массив, только он способен расти до произвольного размера,поддерживает информацию о размере. Как и массив к вектору можно обратитьвоспользовавшись операцией индексирования []. Вот характеристики:
· Доступк данных с одинаковой скоростью
· Вставкаприводит к перемещению элементов
· Прирасширении данные копируются в другой блок
Как видите вектороптимален для получения информации, но при большом количестве вставок лучшевоспользоваться другими контейнерами, например, списками. Проблема в том, чтофизически вектор располагается в непрерывной памяти. На C это реализовывалифункциями malloc.
Возможно вы ужесталкивались с такой проблемой, что массивы в с++ имеют ограниченный размер, амы точно не знаем количество элементов, необходимое в массиве. В таких случаяхнеобходимо использовать динамическое программирование. Т.е. выделять память подэлементы массива при необходимости добавить какой-либо элемент. В принципе, вс++ это можно реализовать вручную, но зачем? если есть специальный класс — vector. Он позволяет создавать нам массивы переменной длины в зависимости отситуации.
Для работы с векторомнеобходимо подключить заголовочный файл:
#include«vector»
Объявить рабочуюобласть:
После этого векторнеобходимо объявить, это можно сделать двумя способами.
vector vArray1; vector vArray2(30);
В первом случаеуказывается пустой вектор, а во втором начальный размер.
Можно получатьинформацию о параметрах вектора:
· size()- сколько данных храниться
· capacity()- сколько может храниться до изменения размера
· max_size()- максимальный размер обычно равен наиболее большому доступному блоку памяти />1.6Перегрузка операторов
Перегрузка операторов— в программировании — один из способов реализации полиморфизма, заключающийсяв возможности одновременного существования в одной области видимости несколькихразличных вариантов применения оператора, имеющих одно и то же имя, норазличающихся типами параметров, к которым они применяются.Реализация
Перегрузкаопераций предполагает введение в язык двух взаимосвязанных особенностей:возможности объявлять в одной области видимости несколько процедур или функцийс одинаковыми именами и возможности описывать собственные реализации операций(то есть знаков операций, обычно записываемых в инфиксной нотации, междуоперандами). Принципиально реализация их достаточно проста:
Перегрузка операцийпредполагает введение в язык двух взаимосвязанных особенностей: возможностиобъявлять в одной области видимости несколько процедур или функций содинаковыми именами и возможности описывать собственные реализации операций (тоесть знаков операций, обычно записываемых в инфиксной нотации, междуоперандами).
Иногда возникаетпотребность описывать и применять к созданным программистом типам данныхоперации, по смыслу эквивалентные уже имеющимся в языке. Классический пример —библиотека для работы с комплексными числами. Они, как и обычные числовые типы,поддерживают арифметические операции, и естественным было бы создать дляданного типа операции «плюс», «минус», «умножить», «разделить», обозначив ихтеми же самыми знаками операций, что и для других числовых типов. Запрет наиспользование определённых в языке элементов вынуждает создавать множествофункций с именами вида ComplexPlusComplex, IntegerPlusComplex,ComplexMinusFloat и так далее.
Когда одинаковые посмыслу операции применяются к операндам различных типов, их вынужденноприходится называть по-разному. Невозможность применять для разных типовфункции с одним именем приводит к необходимости выдумывать различные имена дляодного и того же, что создаёт путаницу, а может и приводить к ошибкам.Например, в классическом языке Си существует два варианта стандартнойбиблиотечной функции нахождения модуля числа: abs() и fabs() — первыйпредназначен для целого аргумента, второй — для вещественного. Такое положение,в сочетании со слабым контролем типов Си, может привести к труднообнаруживаемойошибке: если программист напишет в вычислении abs(x), где x — вещественнаяпеременная, то некоторые компиляторы без предупреждений сгенерируют код,который будет преобразовывать x к целому путём отбрасывания дробной части ивычислять модуль от полученного целого числа!
Отчастипроблема решается средствами объектного программирования — когда новые типыданных объявляются как классы, операции над ними могут быть оформлены какметоды классов, в том числе и одноимённые (поскольку методы разных классов необязаны иметь различные имена), но, во-первых, оформление подобным образомопераций над значениями разных типов неудобно, а во-вторых, это не решаетпроблему создания новых операторов.
Средства,позволяющие расширять язык, дополнять его новыми операциями и синтаксическимиконструкциями (а перегрузка операций является одним из таких средств, наряду собъектами, макрокомандами, функционалами, замыканиями) превращают его уже в метаязык— средство описания языков, ориентированных на конкретные задачи. С его помощьюможно для каждой конкретной задачи построить языковое расширение, наиболее ейсоответствующее, которое позволит описывать её решение в наиболее естественной,понятной и простой форме. Например, в приложении к перегрузке операций:создание библиотеки сложных математических типов (векторы, матрицы) и описаниеопераций с ними в естественной, «математической» форме, создаёт «язык длявекторных операций», в котором сложность вычислений скрыта, и возможно описыватьрешение задач в терминах векторных и матричных операций, концентрируясь на сутизадачи, а не на технике. Именно из этих соображений подобные средства были всвоё время включены в язык Алгол-68.
Чтобы разрешитьсуществование нескольких одноимённых операций, достаточно ввести в языкправило, согласно которому операция (процедура, функция или оператор)опознаются компилятором не только по имени (обозначению), но и по типам ихпараметров. Таким образом, abs(i), где i объявлено как целое, и abs(x), где xобъявлено как вещественное — это две разные операции. Принципиально вобеспечении именно такой трактовки нет никаких сложностей.
Чтобы дать возможностьопределять и переопределять операции, необходимо ввести в язык соответствующиесинтаксические конструкции. Вариантов их может быть достаточно много, но посути они ничем друг от друга не отличаются, достаточно помнить, что запись вида« » принципиальноаналогична вызову функции«(,)». Достаточно разрешитьпрограммисту описывать поведение операторов в виде функций — и проблемаописания решена.
2. Проектирование и этапы разработки
/>/>
2.1Постановка задачи
Задачазаключается в создании динамического класса для работы с матрицами.
Чтениематриц происходит из файлов в котором они находятся, и после решений всеполученные результаты выводятся в другой файл.
Интерфейс.
Интерфейс представлен примитивным меню в которомпользователь выбирает действие. При не открытии одного из файлов выводитсяошибка, при успешное выполнение выводится сообщение об успехе.
2.2Средства разработки
Вкачестве средства разработки выбран MS Visual Studio 2008 Express. />
2.3Описание процесса компиляции и запуска программы
Длякомпиляции программы используется IDE MS Visual Studio. В папке с проектом должны присутствоватьфайлы: file1.txt, file2.txt, file3.txt
Скомпиллированнаяпрограмма состоит из следующих файлов:
/>1) папка cnf(конфигурационные файлы);
2)matrix.exe (исполняемый файл);
/>
3.Реализация
3.1 Структура программы
Программасодержит компоненты, отвечающие за:
1)интерфейс,
2)математическую логику,
3)взаимодействие объектов класса,
4)перегрузку операторов.
3.2 Структура класса
/>/>/>
Заключение
Входе выполнения курсовой работы была получена работоспособная программа,удовлетворяющая начальному заданию.
Входе разработке были проанализированы и использованы следующие технологии:
1)Stl;
2)потоков данных;
3)перегрузка операторов;
Вкачестве дальнейшего совершенствования программы представляется возможнымувеличение функциональности класса и интерфейса (с целью увеличенияинформативности)./>/>
Литература
1. Свободная энциклопедия ru.wikipedia.org/
2. Книга У. Форд, У. Топп «Структураданных в С++» ООО «Бином-Пресс»2006г.
3. Беллман Р. Введение в теорию матриц. — М.: Мир, 1969.
4. Курош А.Г.Курс высшей алгебры: Учебник для вузов 15-е изд.,стереотип. — М.: Лань, 2006. — 432 с.
5. Дж. Голуб, Ч. Ван Лоун Матричныевычисления. — М.: Мир, 1999.
6. Сайт «Знакомимся с вектором». www.cyberguru.ru/
7. Б. Страуструп. «Языкпрограммирования C++. Специальное издание.», 2004 г.
Приложение. Исходный код программы. Заголовочныефайлы.
1. matrix.h
#pragma once
#include
#include
#include
using std::vector;
using std::cout;
using std::istream;
using std::ostream;
class _matrix
{
private:
vector > vvf;
int stroka;
int stolbec;
public:
_matrix() {};
_matrix(int str, int stolb)
{
stroka = str;
stolbec = stolb;
vvf.resize(stroka, vector(stolbec));
}
_matrix (const _matrix &obj)
{
stroka = obj.stroka;
stolbec = obj.stolbec;
vvf = obj.vvf;
}
~_matrix()
{
vvf.clear();
}
_matrix& operator+(_matrix &obj2)
{
_matrix* obj = new _matrix(*this);
for(int y = 0; y
for(int x = 0; x
(*obj)(y, x) = (*this)(y, x) + obj2(y, x);
return *obj;
}
_matrix& operator-(_matrix &obj2)
{
_matrix* obj = new _matrix(*this);
for(int y = 0; y
for(int x = 0; x
(*obj)(y, x) = (*this)(y, x) — obj2(y, x);
return *obj;
}
_matrix &operator*(_matrix &obj2)
{
_matrix* obj = new _matrix(*this);
for(int y = 0; y stroka; y++)
for(int x = 0; x stolbec; x++)
{
(*obj)(y, x) = 0;
for(int k = 0; k stroka; k++)
(*obj)(y, x) += obj2(k,x) * (*this)(y, k);
}
return *obj;
}
_matrix &operator=(const _matrix &obj)
{
stroka = obj.stroka;
stolbec = obj.stolbec;
vvf = obj.vvf;
return *this;
}
float &operator()(int& i, int& j)
{
return vvf[i][j];
}
_matrix &transpon()
{
_matrix transobj(*this);
for(int y = 0; y
for(int x = 0; x
(*this)(y, x) = transobj(x, y);
return *this;
}
vector multvec(int str, float value)
{
vector temp(stroka);
for(int x = 0; x
{
temp[x] = value * vvf[str][x];
}
return temp;
}
void norm(int str, float value)
{
for(int x = 0; x
{
vvf[str][x] = vvf[str][x]/value;
}
}
void subvec(int str,vector temp)
{
for(int x = 0; x
{
vvf[str][x] = vvf[str][x] — temp[x];
}
}
_matrix Inversion()
{
_matrix obj(*this);
_matrix invobj(stroka, stolbec);
float f;
for(int y = 0; y
invobj(y,y) = 1;
for(int x = 0; x
{
for(int y = 1; y
{
if(x
{
f =obj(y, x)/obj(x,x);
obj.subvec(y, obj.multvec(x, f));
invobj.subvec(y, invobj.multvec(x, f));
}
}
}
for(int x = stolbec-1; x > -1; x--)
{
for(int y = stroka-1; y > -1; y--)
{
f = obj(x,x);
obj.norm(x, f);//cout
invobj.norm(x, f);
if(x > y)
{
f =obj(y, x)/obj(x,x);
obj.subvec(y, obj.multvec(x, f));
invobj.subvec(y, invobj.multvec(x, f));
}
}
}
cout
cout
return invobj;
}
friend ostream &operator
friend istream &operator>>(istream&stream, _matrix &obj);
};
ostream &operator
{
for(int y = 0; y
{
for(int x = 0; x
{
stream
}
stream
}
return stream;
}
istream &operator>>(istream &stream,_matrix &obj)
{
for(int y = 0; y
for(int x = 0; x
stream >> obj(y, x);
return stream;
}
Приложение 2. Исходный код программы. Файлы cpp.
1. main.cpp
#include
#include
#include
#include «matrix.h»
using std::cout;
using std::ofstream;
using std::ifstream;
using std::cin;
using std::endl;
int primer1(_matrix &, _matrix &);
int primer2(_matrix &);
int primer1(_matrix &_objA, _matrix &_objB)
{
ofstream fout1;
_matrix _objC;
fout1.open(«file3.txt»);
if(!fout1)
{
cout
exit(1);
}
_objC = _objA + _objB;
fout1
fout1
_objC = _objA — _objB;
fout1
fout1
_objC = _objA * _objB;
fout1
fout1
return 0;
}
int primer2(_matrix &_objA)
{
ofstream fout1;
fout1.open(«file3.txt»);
_matrix _objC;
if(!fout1)
{
cout
exit(1);
}
_objC = _objA.Inversion();
fout1
fout1
_objC = _objA * _objC;
fout1
fout1.precision(3);
fout1
return 0;
}
bool freadMatrix(_matrix& mtr, char* fileName)
{
ifstream fin;
fin.open(fileName);
if(!fin) return false;
fin>>mtr;
fin.close();
return true;
}
int menu()
{
int primer;
_matrix objA(5, 5);
_matrix objB(5, 5);
//чтение файлов
if(!freadMatrix(objA, «file1.txt») ||!freadMatrix(objB, «file2.txt»))
{
cout
return 1;
}
cout
cin >> primer;
switch(primer)
{
case(1):
primer1(objA, objB);
break;
case(2):
primer2(objA);
break;
}
cout
return 0;
}
int main(int argc, char** argv)
{
menu();
_getch();
return 0;
}