Задача: Классы Графы, Прямая

  • Автор темы pechenushka
  • Дата начала
P

pechenushka

Гость
#1
Доброго времени суток. Помогите пожалуйста решить :

1) Разработать класс "Прямая на плоскости". Реализовать, если необходимо, конструкторы и деструктор. Переопределить операции ввода\вывода и операции определения параллельности и перпенликулярности двух прямых. Разработать функцию определения точки пересечения двух прямых, функцию опеределения принадлежности заданной точки прямой, функцию определения прямой, проходящей через две точки.

2) Дан граф. Вывести все вершины графа, недостижимые из заданной вершины

3) Дан граф. Построить его дополнение

Спасибо большое заранее.
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#2
2) Дан граф. Вывести все вершины графа, недостижимые из заданной вершины
3) Дан граф. Построить его дополнение
C++:
/*
Дан граф. Вывести все вершины графа, недостижимые из заданной вершины
Дан граф. Построить его дополнение

/*
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>

//Класс Граф (реализация методом связывания (Матрица смежности))
class TGraph 
{
private:
bool** Bound; //Массив связей (0(false) - не связан; 1(связан);
int TopCount; //Кол-во вершин графа
public:
TGraph(int Top); //Конструктор класса TGraph, Top - кол-во вершин графа
void PrintBound(void); //Вывод графа на экран (Матрица смежности)
void SetBound(int A, int B, bool Bounded); //Установка связи вершин
TGraph& Adverbial(void); //Построение дополнения к графу
void UnDestination(int Top); //Ф-ия вывода недостижимых вершин из вершины Top
~TGraph(); //Деструктор класса TGraph
};

//Конструктор класса TGraph
TGraph::TGraph(int Top = 0)
{
//Выделение памяти под массив (связи вершин
Bound = new bool* [Top]; //Выделение памяти под указатели на строки(bool-массив) матрицы смежности
for (int i = 0; i< Top; i++) 
{
Bound[i] = new bool [Top]; //Выделение памяти для строк (bool-массив) матрицы смежности
memset(Bound[i],0,Top); //Обнуление массива связей	
}
TopCount = Top; //Кол-во вершин

}

//Функция вывода Графа (в связях)
void TGraph::PrintBound(void)
{
for (int i = 0; i<TopCount; i++)
{
for (int j = i; j<TopCount; j++)
{
if (i == j) continue;
if (Bound[i][j])
{
std::cout<<"["<<i+1<<"]"<<" --- "<<"["<<j+1<<"]"<<std::endl;
}
}
}
}
//Функция построения дополнения к графу
TGraph& TGraph::Adverbial(void)
{
TGraph *Result = new TGraph(this->TopCount);
for (int i = 0; i<TopCount; i++)
for (int j = 0; j<TopCount; j++)
(Bound[i][j]) ? Result->Bound[i][j]=false : Result->Bound[i][j]=true;
return *Result;
}

//Функция установки связи
void TGraph::SetBound(int A, int B, bool Bounded = true)
{
A--; B--;
if (A >= TopCount || B>=TopCount) return;
Bound[A][B] = Bounded;
Bound[B][A] = Bounded;
}
void UnDestination(int Top); //Ф-ия вывода недостижимых вершин из вершины Top
void TGraph::UnDestination(int Top)
{
if (Top-1 >= TopCount) return;
std::cout<<std::endl<<"Недостижимые вершины из вершины ["<<Top<<"] : ";
for (int i = 0; i<TopCount; i++)
{
if (i == Top-1) continue;
if (!Bound[i][Top-1])
{
std::cout<<"Вершина ["<<i+1<<"]"<<"\t";
}
}
}
TGraph::~TGraph()
{
for (int i =0; i < TopCount; i++)
delete[] Bound[i];
delete[] Bound;
}

using namespace std;

void main(void)
{
setlocale(LC_ALL,"Russian");
TGraph a(3); // Инициализация графа из трех вершин
a.SetBound(1,2); //Определение связи вершин
a.SetBound(1,3);
cout<<"Исходный Граф :"<<endl;
a.PrintBound();
cout<<endl<<"Дополнение к Графу:"<<endl;
a.Adverbial().PrintBound(); //Вывести дополнение графа
cout<<endl;
a.UnDestination(2); //Вывести недоступные вершины из вершины 2 графа
cout<<endl;
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#3
2 rrrFer::
рФер, не закрывай эту тему пока, я по п.1 запостю код еще...
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#4
:)) Оки ;-)) Спс ;-)) Я с конца начал (прошлый год еще) Кстати есть такие интересненькие :)))
Жалко "ключевых слов" нету, для поиска на форуме народу бы полегче было....
Тем бы повторяющихся наверное было в разы меньше ;-))) А то задачи со строками меня убили просто ;-))) Когда за день 3 почти идентичные поста были :)
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#5
1) Разработать класс "Прямая на плоскости". Реализовать, если необходимо, конструкторы и деструктор. Переопределить операции ввода\вывода и операции определения параллельности и перпенликулярности двух прямых. Разработать функцию определения точки пересечения двух прямых, функцию опеределения принадлежности заданной точки прямой, функцию определения прямой, проходящей через две точки.
C++:
/*
1) Разработать класс "Прямая на плоскости". Реализовать, если необходимо, конструкторы и деструктор. 
Переопределить операции ввода\вывода и операции определения параллельности и перпенликулярности двух прямых. 
Разработать функцию определения точки пересечения двух прямых, функцию опеределения принадлежности заданной точки прямой,
функцию определения прямой, проходящей через две точки.

*/
/*
codeby.net
Autor: DarkKnight125
*/

#include <iostream>
#include <ctype.h>

//Структура точка
struct TPoint
{
double x; //координаты х
double y; // координаты y
};

//Класс прямая линия
class TLine
{
private:
double a; 
double b;
double c;
public:
TLine::TLine(double , double, double); //Конструктор класса прямой со вводом аргументов
TLine::TLine(); //Конструктор по умолчанию
bool TLine::isParallele(TLine B); //Определение параллельности
bool TLine::isPerpendiculare(TLine B); //Определение перпендикулярности
bool TLine::GetCrossPoint(TLine B, TPoint &Point); //функция определения Пересечение в точки
friend std::ostream& operator<< (std::ostream& out,TLine& Line); //Перегруженая функция вывода в поток ostream
friend std::istream& operator>> (std::istream& in,TLine& Line); //Перегруженая функция ввода в поток istream
};
//Конструктор по умолчанию
TLine::TLine()
{
a = 1;
b = 0;
c = 0;
}
//Конструктор класса прямой со вводом аргументов
TLine::TLine(double a, double b, double c = 0.0)
{
if (a==0 && b==0) // проверим что бы (a и b) одновременно не были равны нулю
{
a=1; b=1;
}
this->a = a;
this->b = b;
this->c = c;
}

//Перегруженая функция вывода в поток ostream
std::ostream& operator<< (std::ostream& out,TLine& Line)
{
out<<Line.a<<"x + "<<Line.b<<"y + "<<Line.c<<" = 0";
return out;
}
//Перегруженая функция ввода в поток istream
std::istream& operator>> (std::istream& in,TLine& Line)
{
std::cout<<std::endl<<"Введите уравнение прямой типа Ах+By + C =0 "<<std::endl;
std::cout<<"Введите A = ";
in>>Line.a;
std::cout<<"Введите B = ";
in>>Line.b;
std::cout<<"Введите C = ";
in>>Line.c;

//Проверим что бы одновременно не были равны нулю A и B
if (Line.a == 0 && Line.b ==0)
{
Line.a = 0;
}

return in;
}

bool TLine::isParallele(TLine B)//Определение параллельности
{
if((this->a *B.b - B.a * this->b) == 0) return true;
else return false;
}
//Определение перпендикулярности
bool TLine::isPerpendiculare(TLine B)
{
if((this->a *B.a + B.b * this->b) == 0) return true;
else return false;
}
//функция определения Пересечение в точки
bool TLine::GetCrossPoint(TLine B, TPoint &Point)
{
if (this->isParallele(B)) return false;
Point.x = (this->b * B.c - B.b * this->c)/(this->a * B.b - B.a * this->b);
Point.y = (this->c * B.a - B.c * this->a)/(this->a * B.b - B.a * this->b);
return true;
}

//Главная функция программы
void main(void)
{
setlocale(LC_ALL,"Russian");
//Конструкторы
TLine a(1,1);
TLine b(2,2,4);
TPoint k; 
k.x = 1; k.y =1;

std::cout<<"Прямая А: "<<a<<std::endl;
std::cout<<"Прямая B: "<<b<<std::endl;

//Параллельность прямых
std::cout<<"Параллельность A и B :";
(a.isParallele(b)) ? std::cout<<"Параллельны": std::cout<<"Не параллельны";
std::cout<<std::endl;

//Перпендикулярность прямых
std::cout<<"Перпендикулярность A и B :";
(a.isPerpendiculare(b)) ? std::cout<<"Перпендикулярны": std::cout<<"Не перпендикулярны";
std::cout<<std::endl;

//Пересечение в точке
if (!a.GetCrossPoint(b,&k))
std::cout<<"Прямые не пересекаются";
else std::cout<<"Прямые пересекаются в точке :"<<k.x<<","<<k.y<<std::endl;

//Потоковый ввод/вывод
std::cout<<std::endl<<a;
std::cin>>a;
std::cout<<a;
}
рФер, с этой темой все ;-)