Моделирование поведения векторов в трехмерном евклидовом пространстве

Разработка программы на языке C++, моделирующей поведение векторов в трехмерном евклидовом пространстве. Характеристика способов реализации функции-оператора. Анализ функций и системных вызовов, примененных в программе. Листинг и пример работы программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 13.06.2016
Размер файла 24,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНА МЕТАЛУРГІЙНА АКАДЕМІЯ УКРАЇНИ

Кафедра інформаційних технологій і систем

КУРСОВА РОБОТА

з дисципліни: «Системне програмування і операційні системи »

Перевірив

к.т.н., доц.

Гуда А. І.

Виконала

студентка гр. КН 01-12

Куваннікова В.А.

Содержание

  • Задание
  • 1.Теоретическая часть
  • 2. Практическая часть
  • Задание
  • Лабораторная работа № 4. Вариант 2013-3 Написать программу на языке C++, моделирующую поведение векторов в трехмерном евклидовом пространстве. Определить сумму, сумму с присваиванием, разность, разность с присваиванием, скалярное и векторные произведения, умножение на число, определение длины вектора, проверки равенства, перпендику- лярности линейной независимости и коллинеарности векторов. Предусмотреть возможность вывода в удобном формате и доступ по чтению к компонентам вектора.
  • 1. Теоретическая часть
  • Стандартные обозначения.
  • Предметная область определяет действия символов Алгебра: действительные числа a + b ? c Умножение и сложение действительных чисел.
  • Аналитическая геометрия: вектора ~z = ~a ? 0.6 + ~c Умножение вектора на скаляр и сложение векторов.
  • Программирование: строки s t ring s = "ABCDE" , t = "ZZZ" , x ; s += "atu_example_string_x42" ; / / конкатенация строк x = t + s ; / / аналогично Реализация действий в C++
  • Стандартный поход: функции class Vect { public : Vect ( double ax , double ay ) : x (ax ) , y (ay ) {}; void addfrom ( const Vect &r ) ; friend Vect add( const Vect &l , const Vect &r ) ; private: double x , double y ; }; Vect a(1 ,2 ) , b(1 ,1 ) , c (0 ,0 ) ; a . addfrom (b ) ; c = add( a , b ) ;
  • Достоинство подхода: используются привычная для программиста форма записи. Недостатки: непривычная форма записи для специалиста впредметной области, слишком длинная форма записи.
  • Функции-операторы
  • Вызов функций при использовании операторов.Решение проблемы в C++
  • Действия в любом случае выполняют функции; функциям даются специальные имена, состоящие из слова “operator” и собственно символа оператора (например “+”, “<
  • Ограничения
  • Какие функции-операторы определять нельзя
  • Пользовательские типы:Хотя бы один из операторов должен быть пользовательского типа. Нельзя определять действие оператора только для фундаментальных или производных типов.
  • Неизменность характеристик оператора: нельзя изменить приоритет, арность и ассоциативность оператора. Нельзя определять новые операторы. Запрещено перегружать операторы : : . .? ? : sizeof typeid throw static_cast dynamic_cast reinterpret_cast .
  • Способ реализации функции-оператора
  • Функция член класса
  • В предыдущем примере оператор “+=” был определен как функция-член, а оператор “+” - как функция не-член (друг). Как следует делать выбор? Если функция-оператор реализована как член класса, то ее вызов выглядит так: a . operator@ (b) ; / / binary a . operator@ ( ) ; / / unary В этом случае на первый (левый) операнд, так как он передается с помощью указателя this накладывается существенное ограничение: это должен быть объект, являющийся экземпляром данного класса. Для него не производятся неявные преобразования. Если такое ограничение - свойство самого оператора, то следует использовать функцию-член класса. Например, операторы “=”, “&”, “[]”, “->” должны быть членами класса операторов .
  • Способ реализации функции-оператора
  • Функция не-член класса программа вектор трехмерный листинг
  • Если операнды у оператора равноправны, то следует реализовывать функцию-оператор как не-член класса (как друга или помощника). При этом разрешены неявные преобразования как для первого, так и для второго аргумента. Бинарные операторы “+”, “-”, “*” и т.д. правильно определять как функции не-члены класса. Если уже определены операторы “+=”, “-=”, то можно использовать их функциональность и реализовать “+”, “-”, “*” как функции-помощники, не имеющие доступ к реализации. Если первый аргумент - объект не нашего типа, то функция не может быть реализована как функция-член класса. Например, многие классы определяют оператор “<
  • Унарный оператор
  • Передача параметров унарному оператору (1)
  • Унарный оператор - как функция член класса В этом случае у функции не должно быть явных аргументов - единственный операнд передается с помощью указателя this. Пример: class A { public : A& operator++(); / / p re fix : ++a const A operator++(int ) ; / / pos t fix : a++ }; При этом следующие вызовы эквивалентны: A a ; ++a ; a .operator++(); Для определения постфиксных ++ и -- следует передать фиктивный параметр типа int.
  • Унарный оператор Передача параметров унарному оператору (2) Унарный оператор - как функция не-член класса В этом случае у функции должен быть один явный аргумент - единственный операнд передается через него. Пример: class A { public : friend const A& operator+(const A& arg ) ; }; При этом следующие вызовы эквивалентны: A a ; +a ; operator+(a ) ;
  • Бинарный оператор Передача параметров бинарному оператору (1) Бинарный оператор - как функция член класса В этом случае у функции должен быть 1 явный аргумент - правый операнд передается через него, а левый - с помощью указателя this. Пример: class A { public : A& operator+=( const A& rhs ) ; }; При этом следующие вызовы эквивалентны: A a . b ; a+=b ; a .operator+=(b ) ;
  • Бинарный оператор Передача параметров бинарному оператору (2) Бинарный оператор - как функция не-член класса В этом случае у функции должно быть 2 явных аргумента - оба операнда передается явно. Пример: class A { public : friend const A operator+(const A& lhs , const A& rhs ) ; }; При этом следующие вызовы эквивалентны: A a , b , c ; c = a+b ; c = operator+(a ,b ) ;
  • Автоматически создаваемые операторы Компилятор создаст сам, если не задал пользователь
  • Автоматически создаются функции для следующих операторов = Реализация: вызываются операторы “=” для всех вложенных и базовых объектов. & / / унарный ; (+const ) Реализация: возвращает адрес объекта. Правило Если объект захватывает ресурсы (память, файлы), то у него должен быть определен оператор присваивания (также как конструктор копирования и деструктор). Можно запретить присваивание, описав оператор в “private” и не дав его определения (C++11: “= delete”).
  • Передача аргументов По ссылке или по значению
  • Передача по ссылке (const T &arg)
  • Передача больших объектов по ссылке дешевле, чем по значению. Если оператор не должен изменять аргумент, то следует использовать ссылку на константный объект. Передача по значению (T arg) Если содержимое объекта мало (например один int или double), то имеет смысл передавать по значению.
  • Возврат значения По ссылке или по значению
  • Возврат по ссылке
  • Возврат больших объектов по ссылке дешевле, чем по значению. Если результат содержится в одном из операндов, то можно вернуть ссылку на этот операнд. Возврат по значению Если результат не содержится ни в одном из операндов, то приходится возвращать объект по значению (может быть по константному значению). Правило Если сомневаешься, как получать аргументы или возвращать значение - делай так, как это сделано для фундаментальных типов.
  • Рекомендации по определению функций-операторов
  • Сначала определяйте операторы с присваиваниями (+=), а потом, с использованием уже созданного - соответствующие бинарные операторы (+). Оператор “=” (а также +=. -=, . . . ) должен возвращать *this. Оператор “=” должен или проверять на равенство левого и правого оператора, или использовать swap-технологию. В операторе “=” помните про все члены данных. Не перегружайте &&, ||, “,” без особой необходимости. Осторожно используйте операторы преобразования.

2. Практическая часть

2.1 Функции и системные вызовы, которые использовались в программе

1)void -- тип, спецификатор типа и ключевое слово в языках программирования Си, Си++, Java, C#,Objective-C, D и ActionScript.Функция void используется тогда, когда функции не надо возвращать какое либо значение. Допустим ей надо только что нибудь посчитать и вывести результат нигде не сохраняя.

2)Ключевое слово double обозначает простой тип, используемый для хранения 64-разрядных значений с плавающей запятой. В следующей таблице представлен приблизительный диапазон и точность для типа double.

type

Приблизительный диапазон

Точность

Тип платформы .NET Framework

double

±5.0 Ч 10?324 до ±1.7 Ч 10308

15-16 знаков

Double

3)Функция float. Число с плавающей запятой (или число с плавающей точкой) -- форма представления вещественных (действительных) чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Используемое наиболее часто представление утверждено в стандарте IEEE 754. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.

4) Функция, не являющаяся членом класса, может иметь доступ к его частным членам в случае, если она объявлена другом (friend) класса. Например, в следующем примере функция frd() объявлена другом класса cl:

class cl {

...

public:

friend void frd();

...

};

Как можно видеть, ключевое слово friend предшествует объявлению функции.

Одна из причин, почему язык С++ допускает существование функций-друзей, связана с той ситуацией, когда два класса должны использовать одну и ту же функцию. В качестве примера рассмотрим программу, в которой определяются два класса -- line и box. Класс line содержит все необходимые данные и код для начертания горизонтальной пунктирной линии любой заданной длины, начиная с указанной точки с координатами х и у и с использованием заданного цвета. Класс box содержит необходимый код и данные для того, чтобы изобразить прямоугольник с заданными левой верхней и правой нижней точками, причем использовать для этого указанный цвет. Оба класса используют функцию same_color() для того, чтобы определить, нарисованы ли линия и прямоугольник одним и тем же цветом.

5) Функция setlocale задает локаль, которая будет использоваться текущей программой. Можно изменить все параметры локали, или конкретные её части. Эта функция также может быть использована для получения имени текущей локали, передавNULL в через параметр locale.

Локаль содержит информацию о том, как интерпретировать и выполнять определенные операции ввода/вывода и преобразования с учетом географического расположения и специфики языков в определённых условиях.

Большинство используемых сред программирования имеют определенную информацию о локали, установленной в соответствии с предпочтениями пользователя или автоматической локализации. Но, независимо от этой системной локали, в момент запуска, все Си-программы имеют установленную Cи-локаль, которая является нейтральной локалью с минимальной информацией, что позволяет предсказать результат программы. Для того чтобы использовать, по умолчанию, локаль установленную в среде программирования, необходимо вызвать функцию setlocale с параметром locale равным "".

По умолчанию, установлена локаль: SetLocale (LC_ALL, "C").

Вся локаль, по умолчанию, может быть установлена вызовом функции SetLocale (LC_ALL, "");

Если необходимо изменить часть текущей локали, вместо параметра LC_ALL определяем параметр определённой категории. Какие именно категории есть, вы можете увидеть в таблице, ниже.

Чтобы изменить все параметры локали, необходимо вызвать функцию setlocale с параметром category LC_ALL, на пример, так: setlocale(LC_ALL,"");

2.2 Листинг и пример работы программы

#include <iostream>

#include <cmath>

using namespace std;

//Класс для реализации векторов:

class Vector

{

//Координаты вектора - закрытый массив-член класса:

double coords[3];

public:

//Перегрузка оператора [] для индексации объектов:

double &operator[](int i)

{

int k=i%3;

return coords[k];

}

//Перегрузка оператора () для присваивания координатам значений:

Vector operator()(double x,double y,double z)

{

coords[0]=x;

coords[1]=y;

coords[2]=z;

return *this;

}

//Перегрузка оператора () для вычисления векторного произведения:

Vector operator()(Vector a,Vector b)

{

for(int i=0; i < 3; i++)

coords[i]=a[i+1]*b[i+2]-a[i+2]*b[i+1];

return *this;

}

//Перегрузка оператора +

Vector operator+ (const Vector &a)

{

return Vector(coords[0]+a.coords[0], coords[1]+a.coords[1],coords[2]+a.coords[2]);

}

Vector& operator += (Vector &a)

{

coords[0] += a.coords[0];

coords[1] += a.coords[1];

coords[2] += a.coords[2];

return *this;

}

//Перегрузка оператора -

Vector operator- (const Vector &a)

{

return Vector(coords[0]-a.coords[0], coords[1]-a.coords[1],coords[2]-a.coords[2]);

}

// оператор -=

Vector& operator -= (Vector &a)

{

coords[0] -= a.coords[0];

coords[1] -= a.coords[1];

coords[2] -= a.coords[2];

return *this;

}

//Перегрузка оператора * для вычисления скалярного произведения:

double operator*(Vector obj)

{

double res=0;

for(int i=0; i < 3; i++)

res+=coords[i]*obj[i];

return res;

}

//Умножение на число

Vector operator *= (int x)

{

for (int i = 0; i < 3; i++)

coords[i] *= x;

return *this;

}

//Конструктор с тремя аргументами:

Vector(double x,double y,double z)

{

coords[0]=x;

coords[1]=y;

coords[2]=z;

}

//Метод для отображения координат вектора:

void show()

{

cout << "(" << coords[0] << ", " << coords[1] << ", " << coords[2]<<")\n";

}

//Длина вектора

void vectorLength()

{

double res;

res = sqrt(coords[0]*coords[0] + coords[1]*coords[1] + coords[2]*coords[2]);

cout << res;

}

//Коллинеарность

void collinear(Vector &v)

{

float a, b, c;

a=coords[0]/v.coords[0];

b=coords[1]/v.coords[1];

c=coords[2]/v.coords[2];

if(a==b==c) cout << "Вектора коллинеарны"<<endl;

else cout << "Вектора не коллинеарны"<<endl;

}

//Перпендикулярность

void perpend(Vector &v)

{

float a=coords[0]*v.coords[0] + coords[1]*v.coords[1] + coords[2]*v.coords[2];

if(a==0) cout << "Вектора перпендикулярны"<<endl;

else cout << "Вектора не перпендикулярны"<<endl;

}

//Конструктор без аргументов:

Vector()

{

for(int i=0; i < 3; i++)

coords[i]=0;

}

friend ostream & operator<< (ostream &, const Vector &);

friend istream & operator>> (istream &, Vector &);

};

ostream& operator<< (ostream &out, const Vector &a)

{

out << "(" << a.coords[0] << ", " << a.coords[1] << ", " << a.coords[2]<<")\n";

return out;

}

int main()

{

setlocale(LC_ALL,"Russian");

Vector a,b(2,1,3),c,d(0,0,0),e(0,0,0);

a(1,-3,4);

cout << "Отображение координат векторов:"<<endl;

cout << "a = ";

a.show();

cout << "b = ";

b.show();

cout << "d = ";

d.show();

cout << "e = ";

e.show();

cout << endl;

cout << "Сумма a + b = " << a + b;

d += b;

cout << "Сумма с присваиванием d += b: " << d;

cout << "Разность a - b = " << a - b;

e -= b;

cout << "Разность с присваиванием e -= b: " << e;

cout << "Скалярное произведение a * b = " << a * b << endl;

if((a * b)==0) cout << "Вектора a и b перпендикулярны\n";

else cout << "Вектора a и b не перпендикулярны\n";

c(a,b);

e *= 5;

cout << "Умножение на число e * 5 = " << e;

cout << "Векторное произведение [ab] = ";

c.show();

cout << "Длина вектора a = ";

a.vectorLength();

cout << endl;

a.perpend(b);

a.collinear(b);

system("PAUSE");

return 0;

}

Размещено на Allbest.ru

...

Подобные документы

  • Разработка игровой программы, моделирующей поведение мяча в закрытом безвоздушном пространстве. Изменение значения гравитации и трения о стены. Интерфейс программы, ее основная форма. Блок-схема программы и ее основной код. Добавление третьего измерения.

    контрольная работа [111,1 K], добавлен 27.08.2012

  • Составление алгоритмов и написание программ циклической структуры с использованием векторов, указателей и векторов указателей на вектор на языке C++. Статическое и динамическое распределение памяти. Функция ввода и обработки элементов вектора или матрицы.

    контрольная работа [210,5 K], добавлен 25.03.2015

  • Создание на языке C базы данных "Стадионы города", требования к программе. Осуществление загрузки базы данных в массив и вывод главного меню в основной программе. Алгоритм работы программы в виде блок-схемы. Описание функций программы и ее листинг.

    курсовая работа [183,6 K], добавлен 06.10.2010

  • Понятие и основные свойства точки, определение ее места в пространстве. Алгоритм построения сечения пространственных тел. Способы визуализации трехмерного пространства. Создание компьютерного приложения для проектирования в трехмерном пространстве.

    курсовая работа [636,0 K], добавлен 04.02.2010

  • Моделирование "черного ящика". Листинг программы, моделирующей случайную помеху. Вид распределения сгенерированной помехи. Листинг программы для получения значений откликов. Аппроксимация уравнения регрессии линейным уравнением, значимость коэффициентов.

    реферат [1,4 M], добавлен 24.12.2012

  • Объемное (твердотельное) геометрическое пространственное моделирование. Правило правой руки для построения системы координат. Выбор точки зрения в трехмерном пространстве. Пространство модели и пространство листа. Построение обечаек и шпангоутов.

    дипломная работа [3,6 M], добавлен 28.11.2009

  • Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.

    курсовая работа [721,4 K], добавлен 10.11.2010

  • Особенности метода численного интегрирования функции одной переменной. Замена на каждом элементарном отрезке подынтегральной функции на многочлен первой степени (линейную функцию). Разработка алгоритма программы, ее листинг. Пример работы программы.

    контрольная работа [217,9 K], добавлен 14.07.2012

  • Создание программы на языке программирования С#, которая проверяет наличие в матрице хотя бы одного столбца, содержащего положительный элемент, поиск его номера. Упорядочивание его элементов по возрастанию. Листинг программы и инструкция по работе с ней.

    курсовая работа [1,9 M], добавлен 28.05.2014

  • Разработка программы на языке Pascal. Описание переменных. Действия, которые должна выполнить программа согласно выбранного алгоритма. Детализация графической части программы. Листинг и тестирование программы. Вывод массива данных на экран монитора.

    контрольная работа [360,4 K], добавлен 13.06.2012

  • Описание математической модели. Обоснование метода реализации. Вид алгоритма и программы. Руководство системного программиста, оператора. Комбинирование метод хорд и касательных. Интерпретация и анализ результатов. Листинг программы, контрольный пример.

    курсовая работа [3,3 M], добавлен 12.01.2014

  • Подготовка рабочей среды в AutoCAD. Определение параметров вывода на печать. Установка точности линейных и угловых единиц измерения. Выбор используемых элементов модели, стилей. Удаление скрытых линий и поверхностей. Реалистичное представление сцен.

    курсовая работа [1,9 M], добавлен 03.03.2014

  • Анализ существующего подхода к построению трехмерного изображения данных из симметричных матричных форм. Технические характеристики ПЭВМ, требования к документации. Функции, автоматизирующие процесс взаимодействия пользователей с графической информацией.

    дипломная работа [192,8 K], добавлен 05.06.2011

  • Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.

    курсовая работа [305,9 K], добавлен 03.07.2011

  • Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.

    курсовая работа [164,5 K], добавлен 18.05.2014

  • Разработка программы, моделирующей игру "Кости". Использование в программе генератора псевдослучайных чисел. Схема иерархии модулей. Описание работы программы. Регистрация игрока, окно программы. Определение языка программирования, основные операторы.

    курсовая работа [3,2 M], добавлен 29.07.2010

  • Разработка программы, моделирующей работу библиотеки. Функция поиска по базе книг и граждан, записанных в библиотеку. Поиск книги. Добавление или удаление абонента. Текст программы на С#. Просмотр списка должников. Запись книги на абонента в программе.

    курсовая работа [426,9 K], добавлен 20.02.2014

  • Описание логической и модульной структуры разрабатываемой программы, используемые в данном процессе основные технические средства. Организация хранения данных в программе, проектирование интерфейса. Тестирование и отладка, листинг готовой программы.

    курсовая работа [494,5 K], добавлен 20.06.2012

  • Описание авторской идеи анимации, использования базовых команд и конструкций. Процесса проектирования программы. Описание алгоритма разработанной программы. Последовательность создания анимации. Листинг программы и скриншот рисунка по программе.

    курсовая работа [911,5 K], добавлен 20.05.2013

  • Рассмотрение основных особенностей компьютерной программы Assembler: функции, структурное описание. Характеристика собственных векторов обработчиков прерываний. Div64 как функция-вычислитель, реализующая операцию деления знаковых чисел в формате 64:16.

    контрольная работа [224,7 K], добавлен 11.03.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.