Разработка программы для выполнения вычислений над матрицами
Обзор некоторых сведений о матрицах. Описание этапов работы с функциями. Проектирование программы для выполнения вычислений над матрицами в среде программирования MSVisualStudio 2008, при помощи языка программирования C++. Проверка результатов в Mathcad.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 06.04.2013 |
Размер файла | 182,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
18
Размещено на http://www.allbest.ru/
Разработка программы для выполнения вычислений над матрицами
Введение
матрица программирование язык
На сегодняшний день математическое программирование - важная составляющая всего программирования. Большие и сложные вычисления благодаря простым программам становятся простыми.
В данной курсовой работе создавалась программа для вычислений над матрицами.
В качестве среды программирования выбрана MSVisualStudio 2008 и язык программирования C++.
1. Вектор
Матрица состоящая только из одного столбца или строки называется вектором. Размерностью вектора называется число его элементов.
1.1 Сумма двух векторов
Пусть в линейном пространстве вектора представлены так:
Тогда суммой векторов будет называться следующий вектор:
1.2 Разность двух векторов
Пусть в линейном пространстве вектора представлены так:
Тогда разностью векторов будет называться следующий вектор:
1.3 Произведение вектора на число
Если есть некоторое число x и вектор .
Тогда произведением вектора на число x будет называться следующий вектор
1.4 Скалярное произведение двух векторов
Скалярное произведение двух векторов и , заданных своими координатами, может быть вычислено по формулу .
2. Классы
Класс - это тип структуры, позволяющий включать в описание типа не только элементы данных, но и функции (функции-элементы или методы).
Для ограничения доступа к элементам класса используются следующие спецификаторы доступа:
public - ограничений доступа нет;
protected - доступны только в порожденных классах;
private - доступны только в своем классе.
2.1 Конструкторы и деструкторы
Добавим в класс функцию Vector(int sz)
Такая функция называется конструктором и служит для инициализации создаваемого объекта данных. Имя конструктора должно совпадать с именем класса, конструктор н должен возвращать значений и содержать оператор return.Тип его явно не описывается. Конструктор может быть перегружен, поэтому у любого нового типа данных могут быть несколько конструкторов.
~Vector()- специальный оператор, который называется деструктором. Он необходим для того, чтобы корректно завершить существование нашего объекта, то есть освободить память в куче.
Деструктор, как и конструктор, не должен возвращать значение и иметь явное описание типа. В отличие от конструкторов, которых может быть несколько у одного и того же класса, деструктор должен быть один и не должен иметь аргументов.
Vector(const Vector &A)называется конструктором копий. Он используется при создании объекта с инициализацией его объектом того же типа.
Кроме того, конструктор копии используется при инициализации формального параметра функции в случае передачи ей объекта по значению, и при возврате объекта из функции по оператору return. При передаче ссылок и указателей конструктор копии не используется.
Неявный конструктор копии обеспечивает простое поэлементное копирование одного объекта во второй. Такой вид копирования часто называют поверхностным.
2.2 Перегрузка операций
Большинство операций языка С++ для новых типов данных может быть перегружено. Для перегрузки операции необходимо создать функцию с названием, состоящим из ключевого слова operator и знака перегружаемой операции. Количество параметров этой функции определяется тем, одноместная или двухместная операция перегружается, а также наличием неявных элементов у методов класса.
Перегрузка операций предполагает введение в язык двух взаимосвязанных особенностей: возможности объявлять в одной области видимости несколько процедур или функций с одинаковыми именами и возможности описывать собственные реализации операций.
Например, чтобы перегрузить оператор сложения, нужно определить функцию с именем operator+.
Операторные функции перегруженных операторов, за исключением new и delete,должны подчиняться следующим правилам:
- операторная функция должна быть либо нестатической функцией-членом класса, либо принимать аргумент типа класса или перечислимого типа, или аргумент, который является ссылкой на тип класса или перечислимый тип;
- операторная функция не может изменять число аргументов или приоритеты операторов и порядок их выполнения по сравнению с использованием соответствующео оператора для встроенных типов данных;
- операторная функция унарного оператора, объявленная как функция-член, не должна иметь параметров; если же она объявлена как глобальная функция, она должна иметь один параметр;
- операторная функция не может иметь параметры по умолчанию и др.
2.3 Дружественные функции
Согласно концепции инкапсуляции данных С++ функция, не являющаяся членом класса, не может получить доступ к его закрытым (private) элементам. В языке С++ реализована возможность обойти данное ограничение с помощью друзей. С++ позволяет объявить 2 вида друзей класса: дружественную функцию или дружественный класс. Дружественные функции не являются членами класса, но тем не менее имеют доступ к его закрытым членам. Более того, одна такая функция может иметь доступ к закрытым членам нескольких классов. Чтобы объявить функцию дружественной некоторому классу, в определение этого класса включают ее прототип, перед которым ставится ключевое слово friend.
friend ostream&operator<<(ostream& os, const Vector& A)
Дружественная функция не является членом класса, в котором она объявлена. Поэтому, вызывая дружественную функцию, не нужно указывать имя объекта или указатель на объект и операцию доступа к члену класса (точку или стрелку). Доступ к закрытым членам класса дружественная функция получает только через объект класса, который в силу этого должен быть либо объявлен внутри функции, либо передан ей в качестве аргумента.
Функция может быть дружественна сразу нескольким классам.
2.4 Неявный указатель this
Каждый метод класса содержит в качестве данного следующий указатель, передаваемый при вызове метода в качестве параметра:
имя_типа *this;
Этот указатель представляет собой адрес конкретного объекта, для которого был вызван метод.
Использовать указатель this для доступа к элементам класса можно, но вряд ли целесообразно, поскольку это и так подразумевается по умолчанию. Явно использовать this необходимо только в тех случаях, когда требуется работа непосредственно с адресами объектов, например, при организации динамических структур данных.
Код программы
#include"stdafx.h"
#include<iostream>
#include"conio.h"
#include"time.h"
using namespace std;
// КЛАСС Vector
class Vector
{
public:
double *V;
int sz; // число строк
public:
// конструктор по умолчанию
Vector();
// конструктор
Vector(int sz);
// конструктор копий
Vector(const Vector &A);
// заполнение вектора случайными числами
void SetVector();
// перегрузка оператора присваивания
Vector&operator=(Vector &A);
// перегрузка оператора сложения
Vector operator+(Vector &);
// перегрузка оператора вычитания
Vector operator-(Vector &);
// перегрузка оператора умножения на число
Vector operator*(const int&);
// перегрузка оператора умножение вектора на вектор
Vector operator*(Vector &);
// перегрузка оператора вывода в поток
friend ostream&operator<<(ostream& os, const Vector& A);
// деструктор
~Vector();
};
// Конструктор по умолчанию
Vector::Vector()
{
V = NULL;
}
// Конструктор
Vector::Vector(int _sz)
{
sz = _sz;
V = new double [sz];
for (int i = 0; i < sz; i++)
V[i] = 0;
}
// Конструктор копий
Vector::Vector(const Vector &A)
{
sz = A.sz;
V = new double [sz];
for (int i = 0; i < sz; i++)
V[i] = A.V[i];
}
// Заполнение вектора случайными числами
void Vector::SetVector()
{
for(int i = 0; i < sz; i++)
{
V[i]=(double)((rand()%200)-100.0);
}
}
// Перегрузка оператора присваивания
Vector& Vector::operator =(Vector &A)
{
if(V!=NULL)
{
delete[] V;
}
V = new double [sz];
sz = A.sz;
for(int i = 0; i < sz; i++)
V[i] = A.V[i];
return *this;
}
// Сложение векторов
Vector Vector::operator+(Vector &A)
{
Vector temp(sz);
if(sz!=A.sz)
{
cout<<"Сложение векторов невозможно.\n"
"Размеры векторов не совпадают!\n"
"Программа завершила работу.\n";
exit(0);
}
else
{
for(int i = 0; i < sz; i++)
temp.V[i] = V[i] + A.V[i];
return temp;
}
}
// Вычитание векторов
Vector Vector::operator-(Vector &A)
{
Vector temp(sz);
if(sz!=A.sz)
{
cout<<"Сложение векторов невозможно.\n"
"Размеры векторов не совпадают!\n"
"Программа завершила работу.\n";
exit(0);
}
else
{
for(int i = 0; i < sz; i++)
temp.V[i] = V[i] - A.V[i];
return temp;
}
}
// Умножение вектора на число
Vector Vector::operator*(const int&k)
{
Vector temp(sz);
for(int i = 0; i < sz; i++)
temp.V[i] = V[i]*k;
return temp;
}
// Умножение вектора на вектор
Vector Vector::operator*(Vector &A)
{
Vector temp(1);
for(int i = 0; i < sz; i++)
temp.V[0] += V[i] * A.V[i];
return temp;
}
// Деструктор
Vector::~Vector()
{
delete[] V;
}
// Операция вывода
ostream&operator<<(ostream& os, const Vector& A)
{
os << '\n';
for(int i = 0; i < A.sz; i++)
{
os << A.V[i] << "\t";
}
return os;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_CTYPE, "Russian_Russia.1251");
srand((unsigned)time(NULL));
int k, l, m, x;
int numb;
cout << "Введите размеры векторов: " << endl;
cout << "\tПервый вектор: ";
cin >> k;
cout << endl << "\tВторой вектор: ";
cin >> l;
cout << endl << "\tВведите число: " ;
cin >> x;
if(k == l)
m = k;
else
{
cout << "Размеры векторов не совпадают. Операции невозможны";
_getch();
return 0;
}
Vector v(k), s(l), res(m);
v.SetVector();
s.SetVector();
cout << endl << v << endl;
cout << s << endl;
cout << "\nВыберете операцию:";
cout << "\nСложение двух векторов №1";
cout << "\nРазность двух векторов №2";
cout << "\nУмножение двух векторов №3";
cout << "\nУмножение вектора на число №4";
cout << "\nВыход - введите 0\n";
cin >> numb;
cout << endl;
if(numb == 0)
return 0;
else
{
switch(numb)
{
case 1:
{
res = v + s;
cout << "Результат\t" << res << endl;
break;
}
case 2:
{
res = v - s;
cout << "Результат\t" << res << endl;
break;
}
case 3:
{
res = v * s;
cout << "Результат\t" << res << endl;
break;
}
case 4:
{
res = v * x;
cout << "Результат\t" << res << endl;
break;
}
}
_getch();
}
return 0;
}
Результаты
3. Проверка результатов в Mathcad
Сумма двух векторов
Разность двух векторов
Скалярное произведение двух векторов
Произведение вектора на число
Список литературы
1. Бьeрн Страуструп. Справочное руководство по C++, 1995
2. Глушаков С.В. Программирование на С++, изд.2-е, доп. и переработ. - М.:АСТ, 2008. - 685 с.
3. Харви Дейтел, Пол Дейтел. Как программировать на С. -- Бином-Пресс, 2008. -- 1024 с.
Размещено на Allbest.ru
Подобные документы
Понятие матриц и операции, выполняемые с ними. Разработка программы для вычислений над матрицами в среде MS Visual Studio Express с применением языка программирования C++. Работа с библиотекой математического типа vector. Реализация перегрузки операций.
курсовая работа [107,3 K], добавлен 22.12.2010Использование программной системы Mathcad для выполнения, документирования и использования вычислений и инженерных расчетов. Вычисление пределов, суммы ряда. Работа с матрицами, построение трехмерного графика. Решение систем нелинейных уравнений.
отчет по практике [1,5 M], добавлен 11.09.2014Изучение структуры рабочего документа MathCad - программы, предназначенной для автоматизации математических расчетов. Работа с переменными, функциями и матрицами. Применение MathCad для построения графиков, решения уравнений и символьных вычислений.
презентация [639,2 K], добавлен 07.03.2013Основные операции с матрицами. Проектирование объектно-ориентированного модуля для работы с матрицами в среде Delphi 7. Разработка программы, которая позволяет выполнять различные действия над матрицами. Описание интерфейса программы, исходный код модуля.
курсовая работа [1014,2 K], добавлен 15.01.2013Разработка приложения на базе скриптового языка программирования JavaScript, с использованием каскадных таблиц стилей CSS в среде программирования Bluefish Editor. Обоснование выбора инструментов. Применение клавиш управления памятью калькулятора.
курсовая работа [3,8 M], добавлен 22.06.2015Основные типы модулей, использующиеся в среде программирования Delphi 6. Концепция объектно-ориентированного программирования. Разработка эскизного и технического проектов программы. Алгоритм выполнения операций сложения, вычитания и умножения матриц.
курсовая работа [559,1 K], добавлен 03.01.2011Изучение основ программирования и создание полноценного приложения в среде программирования Delphi. Разработка эскизного и технического проектов программы. Внедрение выполнения программы. Разработка рабочего проекта, спецификация и текст программы.
курсовая работа [560,1 K], добавлен 18.07.2012Разработка программы с использованием языка программирования Pascal для выполнения алгебраических действий с действительными числами без знака в шестнадцатеричной системе счисления. Описание хода выполнения, схема алгоритма, листинг программы, ее функции.
реферат [687,5 K], добавлен 28.10.2011Основные действия над матрицами. Последовательность умножения вектора на матрицу. Спецификаторы доступа, которые используют для ограничения доступа к элементам класса. Перегрузка операций. Создание программы, реализующей работу с классом Matrix.
курсовая работа [321,7 K], добавлен 26.01.2013Структура и основные операции коммерческого банка. Использование языка программирования Visual Basic for Application, математическая формулировка задачи. Разработка модуля программы расчёта кредитов и депозитов. Схема алгоритма выполнения программы.
курсовая работа [2,9 M], добавлен 09.04.2012