Форум программистов, компьютерный форум CyberForum.ru

Можно ли переделать метод ? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа с массивами C++ http://www.cyberforum.ru/cpp-beginners/thread859302.html
Имеем код, здесь у меня есть массив в нем задан алфавит, затем мы заменяем к примеру пять первых символов этого алфавита, как сделать проверку , чтобы символы которые мы вбили первые пять, уже не повторялись, далее, а далее по алфавиту все продолжалось, НАПРИМЕР: был алфавит ABCDEFG....и т.д. мы заменили первые 5 символов таким образов D A B F G, и затем вывод на экран будет таков: сначала наши 5...
C++ Работа с файлами Беда. Пишу программу для генерации онлайн тестов из обычного текстового файла. И столкнулся с такой проблемой. Файл будущего теста имеет вид: 1. Vopros (1) Otvet 11 (0) Otvet 12 (1) Otvet 13 2. Vopros (0) Otvet 21 (0) Otvet 22 http://www.cyberforum.ru/cpp-beginners/thread859293.html
Строки. Напечатать слова, в которых нет повторяющихся букв C++
Дана последовательность, содержащая от 1 до 30 слов. Слова разделены одним или несколькими пробелами. За последним словом – точка. Напечатать слова, в которых нет повторяющихся букв;
C++ Матрицы. Найти строку с максимальной суммой модулей элементов
Среди строк заданной целочисленной матрицы, содержащих только нечетные элементы, найти строку с максимальной суммой модулей элементов. спасибо заранее за помощь!
C++ Матрицы. Получить логическую последовательность http://www.cyberforum.ru/cpp-beginners/thread859265.html
help me,please! Даны натуральное число n , действительное число x , действительная матрица размера n x 2n . Получить логическую последовательность b1,…,bn , где b имеет значение «истина», если элементы i-ой строки матрицы не превосходят x , и значение «ложь» в противном случае.
C++ действительная матрица (Найти среднее арифметическое каждого из столбцов, имеющих четные номера) помогите написать,пожалуйста! Даны натуральное число n , действительная матрица размером n x 9 . Найти среднее арифметическое каждого из столбцов, имеющих четные номера. подробнее

Показать сообщение отдельно
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
08.05.2013, 21:00     Можно ли переделать метод ?
есть метод:
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
Из многочисленных подходов к решению этой подзадачи наш выбор остановился на алгоритме, в основе которого лежит определение относительного положения точки и вектора на плоскости. Вектор — это направленный отрезок прямой линии, начинающийся в точке beg_p и заканчивающийся в точке end_p. При графическом изображении конец вектора украшают стрелкой. Теперь призовите ваше пространственное воображение или вооружитесь карандашом и бумагой, чтобы проверить следующее утверждение. Вектор (beg_p, end_p) делит плоскость на пять непересекающихся областей:
 
    все точки слева от воображаемой бесконечной прямой, на которой лежит наш вектор (область LEFT),
    все точки справа от воображаемой бесконечной прямой, на которой лежит наш вектор (область RIGHT),
    все точки на воображаемом продолжении прямой назад от точки beg_p в бесконечность (область BEHIND),
    все точки на воображаемом продолжении прямой вперед от точки end_p в бесконечность (область AHEAD),
    все точки, принадлежащие самому вектору (область BETWEEN).
 
Для выяснения относительного положения точки, заданной некоторым объектом класса Point, добавим в класс Point перечисляемый тип:
 
enum ORIENT { LEFT, RIGHT, AHEAD, BEHIND, BETWEEN };
а также метод Classify(beg_p, end_p), возвращающий значение типа ORIENT для данной точки относительно вектора (beg_p, end_p).
 
Обладая этим мощным методом, совсем нетрудно определить, находится ли точка внутри некоторого треугольника. Мы договорились перед началом решения задачи, что треугольники будут задаваться перечислением их вершин в порядке изображения их на плоскости по часовой стрелке. То есть каждая пара вершин образует вектор, и эти векторы следуют один за другим по часовой стрелке. При этом условии некоторая точка находится внутри треугольника тогда и только тогда, когда ее ориентация относительно каждой вектора-стороны треугольника имеет одно из двух значений: либо RIGHT, либо BETWEEN. Эту подзадачу будет решать метод InTriangle() в классе Point.
 
Изложим по порядку, какие изменения нужно внести в тексты модулей.
1. Модуль Point.h.
 
    Добавьте перед объявлением класса Point объявление нового типа ORIENT, а также упреждающее объявление типа Triangle:
 
enum ORIENT { LEFT, RIGHT, AHEAD, BEHIND, BETWEEN };
class Triangle;
 
Последнее необходимо, чтобы имя типа Triangle было известно компилятору в данной единице трансляции, так как оно используется в сигнатуре метода InTriangle().
 
    Добавьте внутри класса Point объявления функций:
 
Point operator +(Point&);
Point operator -(Point&);
double Length() const; // определяет длину вектора точки
// в полярной системе координат
ORIENT Classify(Point&, Point&) const; // определяет положение точки
// относительно вектора,
// заданного двумя точками
bool InTriangle(Triangle&) const; // определяет,
// находится ли точка внутри
// треугольника
 
Функция-операция “–” и метод Length() будут использованы при реализации метода Classify(), а функция-операция “+” добавлена для симметрии. Метод Classify(), в свою очередь, вызывается из метода InTriangle().
1. Модуль Point.cpp.
 
    Добавьте после директивы #include директиву #include .
 
Она необходима для использования функции sqrt(x) из математической библиотеки С++ в алгоритме метода Length().
Добавьте после директивы #include “Point.h” директиву #include “Triangle.h”.
Последняя необходима в связи с использованием имени класса Triangle в данной единице трансляции.
Добавьте реализацию функций-операций:
 
Point Point::operator +(Point& p) {
    return Point(x + p.x, y + p.y);
    }
    Point Point::operator -(Point& p) {
    return Point(x - p.x, y - p.y);
    }
 
        Добавьте реализацию метода Length():
 
    double Point::Length() const {
    return sqrt(x*x + y*y);
    }
 
        Добавьте реализацию метода Classify():
 
    ORIENT Point::Classify(Point& beg_p, Point& end_p) const {
    Point p0 = *this; 
    Point a = end_p - beg_p; 
    Point b = p0 - beg_p; 
    double sa = a.x * b.y - b.x * a.y;
 
    if (sa > 0.0) return LEFT; 
    if (sa < 0.0) return RIGHT;
 
    if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0)) return BEHIND; 
    if (a.Length() < b.Length()) return AHEAD;
 
    return BETWEEN;
    }
 
    Алгоритм заимствован из [6], поэтому мы не будем здесь подробно его разбирать. Обратите внимание, что аргументы передаются в функцию по ссылке — это позволяет избежать вызова конструктора копирования.
 
        Добавьте реализацию метода InTriangle():
 
    bool Point::InTriangle(Triangle& tria) const { 
    ORIENT or1 = Classify(tria.Get_v1(), tria.Get_v2()); 
    ORIENT or2 = Classify(tria.Get_v2(), tria.Get_v3()); 
    ORIENT or3 = Classify(tria.Get_v3(), tria.Get_v1());
 
    if ((or1 == RIGHT || or1 == BETWEEN) 
    && (or2 == RIGHT || or2 == BETWEEN) 
    && (or3 == RIGHT || or3 == BETWEEN)) return true; 
    else return false;
    }
    2. Модуль Triangle.h: добавьте в классе Triangle объявление дружественной функции (все равно, в каком месте):
    friend bool TriaInTria(Triangle, Triangle); // Определить, 
    // входит ли один треугольник во второй
    3. Модуль Triangle.cpp: добавьте в конец файла реализацию внешней дружественной функции:
    // Определить, входит ли треугольник tria1 в треугольник tria2
    bool TriaInTria(Triangle tria1, Triangle tria2) {
    Point v1 = tria1.Get_v1(); 
    Point v2 = tria1.Get_v2(); 
    Point v3 = tria1.Get_v3(); 
    return (v1.InTriangle(tria2) && 
    v2.InTriangle(tria2) && 
    v3.InTriangle(tria2)); 
    return true;
    }
 
    Результат, возвращаемый функцией, основан на проверке вхождения каждой вершины первого треугольника (tria1) во второй треугольник (tria2).
    4. Модуль Main.cpp: замените заглушку функции IsIncluded() следующим кодом:
    // ——————————- определение отношения включения
    void IsIncluded(Triangle* p_tria[], int k) {
    cout << "======== Отношение включения ==========" << endl; 
    cout << "Введите номер 1-го треугольника (от 1 до " << k << "): "; 
    int i1 = GetNumber(1, k) - 1;
 
    cout << "Введите номер 2-го треугольника (от 1 до " << k << "): "; 
    int i2 = GetNumber(1, k) - 1;
 
    if (TriaInTria(*p_tria[i1], *p_tria[i2])) 
    cout << p_tria[i1]->GetName() << " - входит в - " 
    << p_tria[i2]->GetName() << endl; 
    else 
    cout << p_tria[i1]->GetName() << " - не входит в - " 
    << p_tria[i2]->GetName() << endl; 
    ExitBack();
    }
Он Проверяет включение одного треугольника в другой. У меня же проверка идет включение четырехугольников и прямоугольников(наследник класса четырехугольник). Можно код переделать? Полная ссылка http://opensource.com.ua/contents/978594723842p.html

Добавлено через 4 часа 30 минут
Блин помогите. Ведь четырехугольник это те же два треугольника можно так сказать. Не могу разобраться.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru