Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обработка данных о преподавании https://www.cyberforum.ru/ cpp-beginners/ thread1583899.html
Создать структуру, имеющую следующие поля: номер специальности, название предмета, семестр, количество часов в неделю, всего часов, наличие экзамена. Разработать следующие функции: • добавление в...
C++ Алгоритм copy
У меня есть вектор указателей vector<cString *> (cString - это мой класс), подскажите, можно ли вывести вектор в консоль, однако нужно что бы выводились разыменованные элементы ? Я выводил вот так ...
C++ Перевести указанные типы переменных в текстовом файле в «венгерскую запись» https://www.cyberforum.ru/ cpp-beginners/ thread1583881.html
Пишу в шарпе, возникла проблема, когда преподаватели потребовали сдачи в с++ С этим возникли сложности, прошу помощи с переводом, вот код, а задание связано с венгерской записью Перевести...
C++ Создать структуру, имеющую следующие поля: номер специальности, название предмета, семестр https://www.cyberforum.ru/ cpp-beginners/ thread1583877.html
Создать структуру, имеющую следующие поля: номер специальности, название предмета, семестр, количество часов в неделю, всего часов, наличие экзамена. Разработать следующие функции: • добавление в...
C++ Узнать системное время
Составить программу по работе с файловой системой, которая позволяет узнать системное время, и если время от 8:45 до 11:15 – выводит сообщение «Доброе утро!» и даёт звуковой сигнал.
C++ Поменять местами первый и последний элементы односвязной очереди https://www.cyberforum.ru/ cpp-beginners/ thread1583875.html
Составить программу обработки динамической структуры данных: поменять местами первый и последний элементы односвязной очереди Q.
C++ Получить новый файл из компонентов исходного файла, являющимися полными квадратами https://www.cyberforum.ru/ cpp-beginners/ thread1583873.html
Разработать программу для заполнения двоичного файла целыми числами в интервале . Получить новый файл из компонентов исходного файла, являющимися полными квадратами.
Вывести на экран строки файла, в которых встречается заданный символ C++
Создать в редакторе текстовый файл, внести в него 10 строк произвольного текста. Разработать программу, которая: • выводит на экран строки файла, в которых встречается заданный символ • формирует...
C++ Отсортировать элементы главной диагонали массива по возрастанию https://www.cyberforum.ru/ cpp-beginners/ thread1583869.html
Заполнить двумерный числовой массив А целыми числами. Отсортировать элементы главной диагонали массива по возрастанию и выделить красным цветом элементы главной диагонали, превышающие среднее...
C++ Вернуть строку символов, которая получена из строки S1 путём удаления символов с позиции N1 до позиции N2 • Разработать функцию, которая возвращает строку символов, которая получена из строки S1 путём удаления символов с позиции N1 до позиции N2. • Разработать функцию, которая возвращает строку... https://www.cyberforum.ru/ cpp-beginners/ thread1583868.html
По номеру дня в году вывести число и месяц в общепринятой форме C++
Составить программу, которая по номеру дня в году выводит число и месяц в общепринятой форме. Например, 33-ий день в году – 2 февраля.
C++ Как позволить функциями видеть друг друга? Есть 2 функции вне main, которые должны быть способны вызывать друг друга. Как расширить видимость? https://www.cyberforum.ru/ cpp-beginners/ thread1583854.html
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 851
0

Перегрузка операций - C++ - Ответ 8354456

17.11.2015, 16:41. Показов 363. Ответов 0
Метки (Все метки)

Написал код. (Обход Грэхэма)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include<cmath>
#include<stack>
#include<vector>
#include<fstream>
using namespace std;
const double PI = 3.14159265;
//============================================//
 
struct hull
{
    double x;
    double y;
};
 
int Lowest_point(hull *value, const int n)
{
    int k = 0;
    for (int i = 1; i < n; i++)
    {
        if (value[i].y < value->y)
        {
             k = i;
        }
 
    }
    return k;
}
 
void Angle(vector<double>& ps2, hull* point, const int n)
{
    
    ps2.resize(n);
    int j = Lowest_point(point, n);
    for (int i = 0; i < n; i++)
        ps2[i] = atan2(point[i].y - point[j].y, point[i].x - point[j].x) * 180 / PI;
 
    for (int i = 0; i < n; i++)
        cout << ps2[i] << endl;
}
 
 
void Sort(vector<double> &a, hull *b, const int n)
{
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (a[j] > a[i])
            {
                swap(a[i], a[j]);
                swap(b[i], b[j]);
            }
        }
    }
}
 
double result(const hull &p1, const hull &p2, const hull &p3)
{
    return (p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y);
}
 
bool leftTurn(const hull &a, const hull &b, const hull &c)
{
    return result(a, b, c) > 0;
}
 
void Stack(vector<double> &ang, hull *point)
{
    stack<int>S;
    S.push(0);
    S.push(1);
 
    for (int c = 2; c < ang.size(); c++)
    {
        int a, b;
        do
        {
            b = S.top();
            S.pop();
            a = S.top();
        }
 
        while (!leftTurn(point[a], point[b], point[c]));
 
        S.push(b);
        S.push(c);
    }
 
    cout << endl;
    while (!S.empty())
    {
        cout << point[S.top()].x << " " << point[S.top()].y << endl;
        S.pop();
    }
}
 
 
int main()
{
    ifstream inFile;
    inFile.open("point.txt");
 
    if (!inFile.is_open())
    {
        cout << "Could not open the file! ";
        system("pause");
        exit(EXIT_FAILURE);
    }
 
    int N;
    inFile >> N;
 
    hull *ps = new hull[N];
 
    int i = 0;
    while (i < N && inFile.good())
    {
        inFile >> ps[i].x >> ps[i].y;
        ++i;
    }
    vector<double>ps2;
 
    Angle(ps2, ps, N);
    Sort(ps2, ps, N);
    Stack(ps2, ps);
 
    delete[] ps;
    system("pause");
    return 0;
}
Работает все отлично, но преподу не понравилось что реализовано с помощью atan2 (а как еще то угол посчитать), тобишь скорость работы < и предложил свой вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stack>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
struct Point {
    double x, y;
    Point(double a = 0, double b = 0) {
        x = a;
        y = b;
    }
    bool operator < (const Point& p) {
        return ((x*p.y - y*p.x)>0);
    } 
    Point operator - (const Point &p) {
        return Point(x - p.x, y - p.y);
    }
    Point operator + (const Point &p) {
        return Point(x + p.x, y + p.y);
    }
};
 
typedef vector<Point> vec_point;
 
vec_point read_verts(const string filename) {
    ifstream f1(filename);
 
    vec_point verts;
    int n;
    Point temp;
 
    f1 >> n;
 
    for (int i = 0; i < n; i++) {
        f1 >> temp.x >> temp.y;
        verts.push_back(temp);
    }
    return verts;
}
 
vec_point Graham(vec_point verts) {
    int min = 0;
    for (int i = 1; i < verts.size(); i++) {
        if (verts[min].y > verts[i].y)
            min = i;
    }
    swap(verts[min], verts[0]);
 
    for (int i = 1; i < verts.size(); i++) {
        verts[i].x -= verts[0].x;
        verts[i].y -= verts[0].y;
    }
 
    sort(verts.begin() + 1, verts.end());
 
    stack<int> Stack;
    Stack.push(0);
    Stack.push(1);
 
    for (int c = 2; c < verts.size(); c++) {
        int a, b;
        do {
            b = Stack.top();
            Stack.pop();
            a = Stack.top();
        } while (!(b - a < c - b));
        Stack.push(b);
        Stack.push(c);
    }
 
    vec_point res;
    while (Stack.size()) {
        int num = Stack.top();
        Stack.pop();
        res.push_back(verts[num] + verts[0]);
    }
    res.push_back(verts[0]);
 
    return res;
}
 
int main() {
    vec_point res = Graham(read_verts("graham.txt"));
    for (int i = 0; i < res.size(); i++)
        cout << res[i].x << ' ' << res[i].y << '\n';
 
    return 0;
}
Не особо понимаю смысл этих операторов и как они работают (в данном случае). Мало того данный код не запускается. У меня вопрос: Намного ли хуже тем что я воспользовался atan2? и где во втором коде ошибка ?

Вернуться к обсуждению:
Перегрузка операций C++
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2015, 16:41
Готовые ответы и решения:

Перегрузка операций += и -=
Объясните, пожалуйста, как правильно выполнить перегрузку операций += и -=? При такой реализации...

Перегрузка операций С++
Подскажете пожалуйста, как буквам &quot;А&quot; и &quot;В&quot; присвоить номера 10 и 11 вместо 17 и 18. // пр4.cpp:...

перегрузка операций С++
Доброй ночи. Товарищи помогите пожалуйста, нужно срочно сдать лабораторную, а я никак не освою...

Перегрузка операций
Добрый день форумчане, помогите решить задачку Перегрузить 8 операторов для класса Вот пример...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 16:41
Помогаю со студенческими работами здесь

Перегрузка операций
Всем привет. Пытаюсь понять ооп. Задали такую лабу: 1. Определить класс согласно варианту...

ПЕРЕГРУЗКА ОПЕРАЦИЙ
Всем добрый день.Нужна помощь по перегрузкам операций.Написать программу.Кто сможет помочь,буду...

Перегрузка операций
C++ ругается когда я пытаюсь сделать след-ю перегрузку операций. У меня трехмерный массив matrix и...

Перегрузка операций
Здравствуйте, помогите с лабораторной. Я правильно сделал и как менять названия у перегрузки...

Перегрузка операций
Данная программа выполянет операции с дробями. Но у меня возникла проблема. Я создал сервисную...

Перегрузка операций
Не могу понять в чем ошибка. Нужно вводитьномер в формате (123) 456-789 Но почему то только...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru