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

Бинарное дерево поиска знаков зодиака - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка сегментации при освобождении памяти http://www.cyberforum.ru/cpp-beginners/thread220146.html
Вот в упор не понимаю, почему программа вылетает уже на завершающем этапе. Пожалуйста, посмотрите, что не так // для тестирования #include <iostream> #include "vbytearray.h" using namespace std; int main() { cout << "\n******** Test VByteArray ********\n";
C++ C++ Builder6 Текс т в файле: "Если душа родилась крылатой- Что ей хоромы- и что ей хаты" Используя функции обработки строковых и символьных переменных, соединить обе строки и выделить подстроку заключённую между символами "-". http://www.cyberforum.ru/cpp-beginners/thread219960.html
IPconfig в С++ C++
нужна информация протокол IPconfig в С++ пути реализации + мне надо что был там исходник чтобы увидеть как обращаеться
Обработка двумерных массивов C++
Здравствуйте. Помогите, пожалуйста, решить задачу. Вот текст: Из одномерного массива i=1.64 получить действительную квадратную матрицу 8*8, элементами которой являются числа x1 ,…, x64 расположенные в ней по схеме, приведенной на рис. 4.2а и 4.2б Рис. 4.2а http://i017.***********/1012/3f/196d24eb68e1x.jpg Рис. 4.2б http://s46.***********/i112/1012/32/33794db06d83x.jpg Заранее спасибо
C++ Сделайте программу на C или C++ пожалуйста!! http://www.cyberforum.ru/cpp-beginners/thread219868.html
Написать программу, которая вычисляет среднее арифметическое элементов, находящихся на побочной диагонали двумерного массива и заменяет результатом элементы, располагающиеся ниже главной диагонали.(Напишите пожалуйста к каждой строчке комментарий.Спасибо!)
C++ Надо написать программу оперирующую с 2мя динам. структурами надо написать пр-мму у которой 2 основных обьекта в коде: ученики и группы, причем для учеников набор атрибутов должен быть следующим- 5 оценок,платное/бесплатное обучение, стипендия, ну и ФИО в 40 символов у группы- только номер и вот тут начинается самое интересное: ну консольный ввод/вывод - логично) Реализация строго динамическая, и должна быть функция редактирования студентов и группы... подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.01.2011, 22:32     Бинарное дерево поиска знаков зодиака
во наговнокодил, но вроде работает...
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <string>
#include <clocale>
#include <stdexcept>
 
const int DAYS_IN_MONTH[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
class Date {
    int mi_month;
    int mi_day;
public:
    Date() : mi_month(1), mi_day(1) {}
    Date(int m, int d) : mi_month(m), mi_day(d) {}
    int month() const { return mi_month; }
    int day() const { return mi_day; }
    void month(int m) { mi_month = m; }
    void day(int d) { mi_day = d; }
    bool correct() const {
        return ( mi_month > 0 && mi_month < 13 && mi_day > 0 && mi_day <= DAYS_IN_MONTH[mi_month] );
    }
    bool operator < (const Date & another) const {
        return ( mi_month < another.month() || ( mi_month == another.month() && mi_day < another.day() ) );
    }
    bool operator > (const Date & another) const {
        return ( mi_month > another.month() || ( mi_month == another.month() && mi_day > another.day() ) );
    }
    bool operator == (const Date & another) const {
        return ( mi_month == another.month() && mi_day == another.day() );
    }
    bool operator <= (const Date & another) const {
        return ( *this < another || *this == another );
    }
    bool operator >= (const Date & another) const {
        return ( *this > another || *this == another );
    }
    // до кучи :)
    bool operator != (const Date & another) const {
        return ( mi_day != another.day() || mi_month != another.month() );
    }
};
 
class Sign {
    std::string ms_name;
    Date md_start;
    Date md_end;
    Sign * mp_left;
    Sign * mp_right;
public:
    Sign(std::string n, Date s, Date e) : ms_name(n), md_start(s), md_end(e), mp_left(0), mp_right(0) {
        if ( md_start > md_end )
            md_end.month(13);
    }
    Sign(const Sign & another) : ms_name(another.ms_name), md_start(another.md_start), md_end(another.md_end),
        mp_left(0), mp_right(0) {}
    ~Sign(){
        if ( mp_left )
            delete mp_left;
        if ( mp_right )
            delete mp_right;
    }
    std::string name() const { return ms_name; }
    void name(std::string n) { ms_name = n; }
    Date startDate() const { return md_start; }
    Date endDate() const { return md_end; }
    Sign * left() const { return mp_left; }
    void left(Sign * ps) { mp_left = ps; }
    Sign * right() const { return mp_right; }
    void right(Sign * ps) { mp_right = ps; }
    bool operator < (const Sign & another) const {
        return ( md_end < another.md_start );
    }
    bool operator > (const Sign & another) const {
        return ( md_start > another.md_end );
    }
    bool operator == (const Sign & another) const {
        return ( md_start >= another.md_start && md_end <= another.md_end );
    }
};
 
class Tree {
    Sign * mp_root;
    void addSign(Sign * ptr, const Sign & val){
        if ( ! ptr )
            throw std::runtime_error("Null pointer!");
        
        if ( *ptr > val ){
            if ( ptr->left() ){
                addSign(ptr->left(), val);
            }
            else {
                ptr->left(new Sign(val));
            }
        }
        else if ( *ptr < val ){
            if ( ptr->right() ){
                addSign(ptr->right(), val);
            }
            else {
                ptr->right(new Sign(val));
            }
        }
        else
            throw std::runtime_error("Doubling signs!");
    }
    Sign * findSign(Sign * ps, const Sign & test){
        if ( ! ps )
            return 0;
        else if ( test == *ps )
            return ps;
        else if ( test < *ps )
            return findSign(ps->left(), test);
        else if ( test > *ps )
            return findSign(ps->right(), test);
        else {
            std::cerr << "Date comparsion failed!" << std::endl;
            return 0;
        }
    }
    Tree(const Tree & another);
public:
    Tree() : mp_root(0) {}
    ~Tree() {
        if ( mp_root )
            delete mp_root;
    }
    void add(Sign s){
        if ( ! mp_root )
            mp_root = new Sign(s);
        else
            addSign(mp_root, s);
    }
    std::string signName(Date d){
        Sign * ps = findSign(mp_root, Sign("", d, d));
        if ( ! ps ){
            d.month(13);
            ps = findSign(mp_root, Sign("", d, d));
        }
        return ( ps ) ? ps->name() : "Not found!";
    }
};
 
int main(){
    setlocale(LC_ALL, "Russian");
 
    Tree z;
    z.add(Sign("Дева", Date(8, 24), Date(9, 23)));
    z.add(Sign("Лев", Date(7, 23), Date(8, 23)));
    z.add(Sign("Весы", Date(9, 24), Date(10, 23)));
    z.add(Sign("Рак", Date(6, 22), Date(7, 22)));
    z.add(Sign("Скорпион", Date(10, 24), Date(11, 22)));
    z.add(Sign("Близнецы", Date(5, 22), Date(6, 21)));
    z.add(Sign("Стрелец", Date(11, 23), Date(12, 21)));
    z.add(Sign("Телец", Date(4, 21), Date(5, 21)));
    z.add(Sign("Козерог", Date(12, 22), Date(1, 20)));
    z.add(Sign("Овен", Date(3, 21), Date(4, 20)));
    z.add(Sign("Водолей", Date(1, 21), Date(2, 19)));
    z.add(Sign("Рыбы", Date(2, 20), Date(3, 20)));
 
    int month, day;
    std::cout << "Вводите дату в формате Месяц День. 0 0 - выход" << std::endl;
    while ( true ){
        std::cout << "Дата: ";
        std::cin >> month >> day;
        if ( month < 1 || day < 1 )
            break;
        Date d(month, day);
        if ( ! d.correct() ){
            std::cerr << "Ошибка! Попробуйте ещё раз." << std::endl;
            continue;
        }
        std::cout << "Знак: " << z.signName(d) << std::endl;
    }
 
    return 0;
}
Бинарное дерево поиска знаков зодиака
 
Текущее время: 18:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru