Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР Программирование - Опарин И.А. - 2 семестр....docx
Скачиваний:
5
Добавлен:
18.09.2019
Размер:
62.47 Кб
Скачать

Задача 9(№197)

Постановка задачи: Пусть даны матрица A порядка n и n-мерный вектор B. Напишите функцию, заменяющую заданный столбец матрицы A на вектор B. Добавьте в класс 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();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]