У вас вопросы?
У нас ответы:) SamZan.net

Перегрузите оператор вызова функции для вычисления скалярного произведения двух векторов

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 4.4.2025

Задача 197

Постановка задачи: Добавьте в класс Bivect методы для вычисления длины вектора, угла между двумя векторами. Перегрузите оператор вызова функции () для вычисления скалярного произведения двух векторов.

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

Код программы:

Файл Bivect.h

#ifndef BIVECTH

#define BIVECTH

class Bivect

{

double x, у; // Координаты вектора

char *name; // Имя вектора

static int xc, ус; // Координаты центра экрана

static int I; // Длина лепестков стрелки

static double beta; // Угол отклонения в радианах

   public:

Bivect ()                                                // Конструктор по умолчанию

{ х = 0; у = 0; name = 0;}      // создает нулевой вектор без названия

Bivect (float x, float у, char *s); // Конструктор

Bivect(Bivect&); // Конструктор копирования

~Bivect() // Деструктор освобождает

{ delete[] name; } // память, занимавшуюся именем

  static void SetStaticParam(int xci, int yd, int len, double bt);

Bivect& operator=(Bivect &a); // Оператор присваивания

Bivect operator+( Bivect &a); // Сумма

Bivect operator-(Bivect &a); // Разность

Bivect operator*(double); // Умножение вектора на число

friend Bivect operator*(double, Bivect&); // Умножение числа на вектор

Bivect operator-(); // Противоположный вектор

void Show(int color = 10); // Рисование вектора на экране

 private:

void Arrow(); // Изображает стрелку на конце вектора

};

# endif

Файл BIVECT.CPP

#include "Bivect.h"

#include <graphics.h>

#include <string.h>

#include <math.h>

#include <stdlib.h>

Bivect:: Bivect(float xO, float yO, char *nm)   // Конструктор

{

 x = xO; y = yO;      // xO, yO - координаты, nm - имя вектора

 name = new char[strlen(nm) + 1];    // Выделение памяти под имя

 strcpy(name, nm);   // Копирование имени

}

Bivect:: Bivect(Bivect& b)    // Конструктор копирования

{

 x= b.x; y = b.y;     // Копируем координаты

 name = new char[strlen(b.name) + 1];   // Выделение памяти под имя

 strcpy(name, b.name);    // Копирование имени

}

void Bivect::SetStaticParam(int xci, int yci, int len, double bt)

{

 xc = xci; yc = yci; I = len;

 beta = bt * M_PI / 180;

}

Bivect& Bivect::operator=(Bivect &b)   // Оператор присваивания

{

 if (this != &b){     // Если не присваивание самому себе

   delete name;      // Освобождение старой памяти

   name = new char [strlen(b.name)+1];   // Выделение памяти под имя

   if (name)                 // Если удалолсь выделить память

     strcpy(name, b.name);      // Копирование имени

   x = b.x;                        // Присваивание координат

   y = b.y;

}                               

 return *this;                      // Возвращение обновленного вектора

}

Bivect Bivect::operator+(Bivect &b)             // Суммирование векторов

{

 char *tmp = new char[strlen(name) + 2 + strlen(b.name)];

 strcpy(tmp, name);                        // Формирование имени нового

 strcat(tmp,"+");                // вектора из двух имен,

 strcat(tmp, b.name);           // соединенных знаком'+'

 Bivect sum(x + b.x, y + b.y, tmp);          // Создание нового вектора  

delete[] tmp;

 return sum;  // Возвращение созданного вектора

}

Bivect Bivect: :operator-(Bivect &b)     // Вычитание векторов

strcpy(tmp, name);

strcat(tmp,"-");

strcat(tmp, b.name);

Bivect diff(x - b.x, у - b.y, tmp);

delete[] tmp;

return diff;

 // Временный массив для имени разности 

 // Формирование имени нового

 // вектора из двух имен,

 // соединенных знаком'-'

// Создание нового вектора

// Удаление временной строки

// Возвращение созданного вектора

}

Bivect Bivect::operator*(double k)

{

 char factor[10];

 gcvt(k, 3, factor);

 char *tmp = new char[strlen(factor) + 2 + strlen(name)];

 strcpy(tmp, factor);                // Копируем сомножитель

 strcat(tmp,"");                       // Добавляем знак умножения

 strcat(tmp, name);                //Добавляем название вектора

 Bivect prnmb(k * x, k * y, tmp);   // Создание вектора-произведения

 delete[] tmp;

 return prnmb;

}

Bivect operator*(double k, Bivect& a)                  // Умножение числа на вектор

{

 return a * k;

}

Bivect Bivect:: operator-()                    // Противоположный вектор

{

 Bivect b;

 return b - *this;

}

void Bivect:: Show(int color)             // Функция рисования вектора на экране       

{

 int c = getcolor();

 setcolor(color);

 line(xc, yc, xc + x,yc - y);

 Arrow();

 int xt = 2, yt = 2;

 if(x <= 0) xt = -6;

 if(y >= 0) yt = -10;

 outtextxy(xc + x + xt, yc - y + yt, name);

 setcolor(c);

}

Round(double x)

{

 return x - int(x) > 0.5 ? int(x)+1: int(x);

}

void Bivect:: Arrow()                  //Рисование стрелки для вектора

{

 double x1, y1, x2, y2;

 double alpha = atan2(y, x);

 double delta = alpha - beta;

 double gamma = alpha + beta;

 x1 = x -I * cos(delta);

 y1 = y -I * sin(delta);

 line(Round(xc + x), Round(yc - y), Round(xc + x1), Round(yc - y1));

 x2 = x -I * cos(gamma);

 y2 = y -I * sin(gamma);

 line(Round(xc + x), Round(yc - y), Round(xc + x2), Round(yc -y2));

}

double Bivect::Dlina()             //Вычисление длины вектора

{

double l;

l=sqrt(x*x+y*y);

return l;

}

double Bivect::Ygol(Bivect b)  

{

double ygol=acos((x*b.x+y*b.y)/(Dlina()*b.Dlina()));

 return ygol;

}

Файл MNBIVECT.CPP

#include"Bivect.h"

#include<conio.h>

#include<iostream.h>

#include<graphics.h>

int Bivect::xc, Bivect::yc, Bivect::I;  //Определение статических членов класса

double Bivect::beta;

void main()

{

 int gd=DETECT,gm;

 Bivect a(-80,60,"a"),c,b(-100,-100,"b");   //Определение объектов класса 

 initgraph(&gd,&gm,"C:\\TC\\BGI");

 Bivect::SetStaticParam(getmaxx()/2,getmaxy()/2,12,15);  //Установка значений статических переменных

 line(10,getmaxy()/2,getmaxx(),getmaxy()/2);

 line(getmaxx()/2,10,getmaxx()/2,getmaxy());

 a.Show(GREEN);                                      //Рисуем зелёный вектор а

 cout<<"Dlina a="<<a.Dlina()<<endl;

 getch();

 b.Show(BLUE);                       //рисуем синий вектор b

 cout<<"Dlina b="<<b.Dlina()<<endl;

 getch();

  cout<<"         ygol mejdy a i b   ";

 cout<<a.Ygol(b);

 getch();

 c=a+b;

 c.Show(YELLOW);              //Рисуем желтым сумму этих векторов

 cout<<"Dlina a+b="<<c.Dlina()<<endl;

 getch();

 c=a-b;

 c.Show(RED);              //Рисуем красным разность векторов

 cout<<"Dlina a-b="<<c.Dlina()<<endl;

 getch();

 c=-b;

 c.Show(WHITE);

 cout<<"Dlina -b="<<c.Dlina()<<endl;

 getch();

 a=-1.5*a;

 a.Show();

 cout<<"Dlina -1.5*a="<<a.Dlina()<<endl;

 getch();

 closegraph();

}




1. проекта растут на Ямале В ЯНАО спекулируют на Рогозине Чтобы получить 4 тыс
2. Практические основы стратегического развития инновационного бизнеса
3. Лечебное дело 2
4. Доклад- Электротравма
5. Крепостное крестьянство в романе Пушкина Евгений Онегин
6. тема МЧП. Виды и краткая характеристика источников МЧП.
7. реферату- Виникнення парашута історія його вдосконаленняРозділ- Астрономія авіація космонавтика Виникне
8. ТЕМА ldquo;СПЕЦИФИКА РАЗВИТИЯ ТУРИЗМА В РОССИИrdquo; Выполнил студент
9. Тематика семинарских занятий по экономической теории
10. Тема 6 Основы законодательства в обеспечении социальной защиты населения