Разработка программы для выполнения вычислений над матрицами - Курсовая работа

бесплатно 0
4.5 114
Обзор некоторых сведений о матрицах. Описание этапов работы с функциями. Проектирование программы для выполнения вычислений над матрицами в среде программирования MSVisualStudio 2008, при помощи языка программирования C . Проверка результатов в Mathcad.


Аннотация к работе
Пусть в линейном пространстве вектора представлены так: Тогда суммой векторов будет называться следующий вектор: 1.2 Разность двух векторов Добавим в класс функцию Vector(int sz) Vector(const Vector &А)называется конструктором копий. Кроме того, конструктор копии используется при инициализации формального параметра функции в случае передачи ей объекта по значению, и при возврате объекта из функции по оператору return. Чтобы объявить функцию дружественной некоторому классу, в определение этого класса включают ее прототип, перед которым ставится ключевое слово friend.

Введение
матрица программирование язык

На сегодняшний день математическое программирование - важная составляющая всего программирования. Большие и сложные вычисления благодаря простым программам становятся простыми.

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

В качестве среды программирования выбрана 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 &А)называется конструктором копий. Он используется при создании объекта с инициализацией его объектом того же типа.

Кроме того, конструктор копии используется при инициализации формального параметра функции в случае передачи ей объекта по значению, и при возврате объекта из функции по оператору 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

#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() 0)-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<<"Сложение векторов невозможно.

"

"Размеры векторов не совпадают!

"

"Программа завершила работу.

";

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<<"Сложение векторов невозможно.

"

"Размеры векторов не совпадают!

"

"Программа завершила работу.

";

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 << "

";

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 << "\ТПЕРВЫЙ вектор: ";

cin >> k;

cout << endl << "\ТВТОРОЙ вектор: ";

cin >> l;

cout << endl << "\ТВВЕДИТЕ число: " ;

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

";

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. Бьерн Страуструп. Справочное руководство по C , 1995

2. Глушаков С.В. Программирование на С , изд.2-е, доп. и переработ. - М.:АСТ, 2008. - 685 с.

3. Харви Дейтел, Пол Дейтел. Как программировать на С. - Бином-Пресс, 2008. - 1024 с.

Размещено на .ru
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?