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

Тема в разделе "C/C++/C#", создана пользователем pechenushka, 9 сен 2009.

  1. pechenushka

    pechenushka Гость

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

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

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

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

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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;
    }
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2 rrrFer::
    рФер, не закрывай эту тему пока, я по п.1 запостю код еще...
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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;
    }
    рФер, с этой темой все ;-)
     
Загрузка...
Похожие Темы - Задача Классы Графы
  1. Янчик
    Ответов:
    0
    Просмотров:
    486
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    782
  3. elzim
    Ответов:
    0
    Просмотров:
    930
  4. ShaoKahn
    Ответов:
    1
    Просмотров:
    1.125
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.107

Поделиться этой страницей