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

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

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Задача 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();
}