Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
1

Бинарные деревья. Составить программу, которая содержит информацию о книгах в библиотеке.

08.11.2018, 16:18. Просмотров 2043. Ответов 19
Метки нет (Все метки)

Здравствуйте. Учусь в универе. Задали написать вот такую программу. А я с бинарными деревьями никогда не работал. Помогите кто может
Составить программу, которая содержит информацию о книгах в библиотеке.
Сведения о книгах содержат:
1. Номер УДК
2. Фамилия и инициалы автора;
3. Название;
4. Год издания;
5. Количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
1. Исходное формирования данных о все книгах в библиотеке в виде бинарного дерева;
2. Добавление данных о книгах, впервые поступающих в библиотеку;
3. Удаление данных о списанных книги;
4. Проверить, бинарное дерево является сбалансированным.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2018, 16:18
Ответы с готовыми решениями:

Составить программу, которая содержит текущую информацию о книгах в библиотеке
Написал код. А он мне в visual 2019 не хочет компилировать. И выдаёт странные ошибки. Может вы...

Составить программу, которая содержит текущую информацию о книгах в библиотеке
1.Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о...

Составить программу, которая содержит текущую информацию о книгах в библиотеке
Уважаемые форумчане, нужна ваша помощь. нужно составить программу, которая содержит текущую...

Составить программу, которая содержит текущую информацию о книгах в библиотеке
Всем добрый вечер, прошу помощи с программой! Не работают функции взятия и выдачи книг. Не могу...

19
1458 / 924 / 807
Регистрация: 30.04.2016
Сообщений: 3,184
08.11.2018, 16:30 2
DragonBorn88, здравствуйте! По какому принципу происходит добавление? То есть, как мы будем определять, что книга впервые поступила в библиотеку? По какому принципу происходит списание? Я могу пока сделать добавление данных в дерево. Но мне нужно больше информации. Откуда добавляются данные? Из текстового файла?

Добавлено через 3 минуты
DragonBorn88, еще один вопрос. Это должно быть бинарное дерево поиска или просто бинарное дерево?

Добавлено через 2 минуты
Цитата Сообщение от Fixer_84 Посмотреть сообщение
По какому принципу происходит добавление?
Скорее всего это будет номер УДК. Ответьте, пожалуйста, на остальные вопросы.
0
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
08.11.2018, 18:32  [ТС] 3
Просто бинарное дерево. Добавление с клавиатуры.
Вот я нашел код, но выбивает ошибки. Посмотрите, может ошибку сможете найти

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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#include <string>
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <windows.h>
 
using namespace std;
struct Rozm {
    int ID;
    string PIB, book_name, year_w, count_book;
};
// узол дерева
struct Node {
    Rozm *d;
    Node *left;
    Node *right;
};
// Прототипы функции
Node * first(Rozm *d); // Формирование первого элемента дерева
Node * search_Insert(Node *root, Rozm *d); // Поиск с добавлением
Node * add(Node *root);//Добавление нового элемента дерева
void print_tree(Node *root, int l); //Удаление дерева с удалением
void print_search(Node *root, Rozm *d, int f, string n); //Вывод дерева за критериями
void Delete_Node_BinaryTree(Node **p, int f); //Удаление вершин
 
//----------------
//MAIN
int main(int argc, char** argv) {
    SetConsoleOutputCP(1251);
    do{
        system("CLS"); 
        cout << endl << "List of library books:\n" << endl;
    int ID[10] = { 00, 15, 21, 17, 46, 51, 18, 13, 89, 75};
    string PIB[10] = { "Remark","Pushkin","King","Sapkovsky","Strugatckiy","Koelyo", "Akunin","Bronte","Frankbaum","Levi" };
    string book_name[10] = { "Triumf Ark","Balada","Dream Catcher","Witcher","To Moon and Back","Alone", "Jane Eir","FairyTailes","3 days in the forest","Big Foot" };
    string year_w[10] = { "1987","1879","1995","2001","1987","1878", "1983","1992","1874","1965" };
    string count_book[10] = { "66","25","95","20","98","18", "3","19","14","65" };
    
    // Формирование узла корня
    Rozm *d = new Rozm;
     d->ID = ID[0]; d->PIB = PIB[0]; d->book_name = book_name[0]; d->year_w = year_w[0];d->count_book = count_book[0];
    Node *root = first(d);
 
    // Формирование дерева упорядоченного по коду книги
    for (int i = 1; i < 10; i++)
    {
            Rozm *d = new Rozm;
        d->ID = ID[i]; // Случайное число от 400 до 1000
        d->PIB = PIB[i];
        d->book_name = book_name[i];
        d->year_w = year_w[i];
        d->year_w = year_w[i];
        d->count_book = count_book[i];
    
        // если такой записи не существует,
        search_Insert(root, d); // присоеденение к дереву
 
    }
    print_tree(root, 0); // Вывод дерева на экран 
    cout << endl;
    
    //ADD NEW
    add(root); // Добавление нового элемента
    cout << endl;
    print_tree(root, 0); // Вывод дерева на экран 
    cout << endl;
    
    //DELETE BOOK
    cout << "-----------------------------------------------------------------------" << endl;
    cout << "Input ID of book you want to delete: ";
    int key1; // Разговор с таким кодом будет удален
    cin >> key1;
    Delete_Node_BinaryTree(&root, key1);
    cout << endl;
    cout << endl << "New list o books: " << endl;
    print_tree(root, 0);
    cout << "-----------------------------------------------------------------------" << endl;
    cout<< "Do you want to continue:\n 1. Yes. \n 2. No." << endl;
    }while(getche()!='2');
    _getch();
    return 0;
}
 
// Формирование первого элемента дерева
Node * first(Rozm *d)
{
    Node *pv = new Node;
    pv->d = d;
    pv->left = NULL;
    pv->right = NULL;
    return pv;
}
 
// Добавление нового элемента
Node * add(Node *root)
{
    string nid, npib, nname, nyear, ncount;
    int nf;
    Rozm *d = new Rozm;
    cout << "-----------------------------------------------------------------------" << endl;
    cout << "Input data about new book: " << endl;
        cout << "ID book: " << endl;
    cin >> nf; d->ID = nf;
    cin.get();
        cout << "Name autor: " << endl;
    cin >> npib; 
    d->PIB = npib;
        cout << "Name book: " << endl;
    cin.get();
    getline(cin, nname); 
    d->book_name = nname;
        cout << "Year: " << endl;
    cin.get();
    getline(cin, nyear); 
    d->year_w = nyear;
        cout << "Count of books: " << endl;
    cin.get();
    getline(cin, ncount); 
    d->year_w = ncount;
    search_Insert(root, d);
 
}
// Поиск 
Node * search_Insert(Node *root, Rozm *d)
{
    Node *pv = root, *prev;
    bool found = false;
    while (pv && !found)
    {
        prev = pv;
        if (d->PIB == pv->d->PIB)
            found = true;
        else
            if (d->ID < prev->d->ID)
                pv = pv->left;
            else
                pv = pv->right;
 
    }
    if (found) return pv;
    // Создание нового узла
    Node *pnew = new Node;
    pnew->d = d;
    pnew->left = 0;
    pnew->right = 0;
    if (d->ID < prev->d->ID)
        // Присоединение к левому поддереву предка       
prev->left = pnew;
    else
        // Присоединение к правому поддереву предка
        prev->right = pnew;
    return NULL;
}
//Прямой обход и вывод дерева
void print_tree(Node *p, int level)
{
    if (p) {
        print_tree(p->left, level + 1); // вывод левого поддерева
        for (int i = 0; i < level; i++)
            cout << " ";
        cout << p->d->ID << " " << p->d->PIB << " " << p->d->book_name << " " << p->d->year_w << " " << p->d->count_book << endl; // Вывод кореня поддерева
        print_tree(p->right, level + 1); // вывод правого поддерева
    }
}
//Прямой обход и вывод дерева по критериям 
void print_search(Node *root, Rozm *d, int f, string n)
{
    Node *pv = root, *prev;
    bool found = false;
    while (pv && !found)
    {
        prev = pv;
        if ((n.compare(pv->d->year_w) == 0) && (f == pv->d->ID))
            found = true;
        else
            if (d->ID < prev->d->ID)
                pv = pv->left;
            else
                pv = pv->right;
    }
    if (found) cout << pv->d->ID << " " << pv->d->PIB << " " << pv->d->book_name << " " << pv->d->year_w << " " << pv->d->count_book << endl;
}
//Вывод вершин бинарногодерева
void Delete_Node_BinaryTree(Node **p, int f)
{
    if ((*p) != NULL)
    {
        if (((*p)->d->ID == f)) {
            Node * ptr = *p;
            if ((*p)->left == NULL && (*p)->right == NULL)
                *p = NULL;
            else
                if ((*p)->left == NULL)
                    *p = ptr->right;
                else
                    if ((*p)->right == NULL)
                        *p = ptr->left;
                    else
                    {
                        *p = ptr->right;
                        Node **ptr1;
                        ptr1 = p;
                        while (*ptr1 != NULL)
                            ptr1 = &((*ptr1)->left);
                        *ptr1 = ptr->left;
                    }
            delete(ptr);
 
            Delete_Node_BinaryTree(p, f);
        }
        else {
            Delete_Node_BinaryTree(&((*p)->left), f);
            Delete_Node_BinaryTree(&((*p)->right), f);
        }
    }
}
0
1458 / 924 / 807
Регистрация: 30.04.2016
Сообщений: 3,184
08.11.2018, 21:04 4
DragonBorn88, пока удалось добавить записи в дерево и вывести по заданному полю:

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
#include <iostream>
#include <string>  
 
    using namespace std;
    
struct Info {
    int id;
    string author_name;
    string book_name;
    int p_year;
    int books_q;
} data[10]; //Максимальное число записей
    
struct node { 
    Info d;
    node *left;
    node *right;
};
    
node* newNode(Info &d) {
  node* element = new node; 
  element->d = d;
  element->left = NULL; 
  element->right = NULL; 
  return element;
}
 
node* insert(node* element, Info &key) { 
    if (element == NULL) 
        return newNode(key);
    if (key.id <= element->d.id)
        element->left = insert(element->left, key);
    else 
        element->right = insert(element->right, key);
    return element;
}
 
void printOrder(node* element) { 
    if (element == NULL)
        return;
    printOrder(element->left);
    cout << element->d.author_name << "\n"; //Вывод узлов с именем автора книги
    printOrder(element->right);
}
 
int main() {
    int n;
    cout << "Enter a number of fields:\n";
    cout << "n = ";
    cin >> n;
    node* root = NULL;
    for (int i = 1; i <= n; i++) {
        if (i == 1) {
            cout << "\nEntry #" << i << "\n";
            cout << "Enter a book ID: "; cin >> data[i].id; 
            cout << "Enter an author name: "; cin >> data[i].author_name;
            cout << "Enter a book name: "; cin >> data[i].book_name;
            cout << "Enter a publish year: "; cin >> data[i].p_year;
            cout << "Enter a number of copies: "; cin >> data[i].books_q;
            root = insert(root, data[i]);
        } else {
            cout << "\nEntry #" << i << "\n";
            cout << "Enter a book ID: "; cin >> data[i].id; 
            cout << "Enter an author name: "; cin >> data[i].author_name;
            cout << "Enter a book name: "; cin >> data[i].book_name;
            cout << "Enter a publish year: "; cin >> data[i].p_year;
            cout << "Enter a number of copies: "; cin >> data[i].books_q;
            insert(root, data[i]);
        }
    }
  cout << "\nOutput of the program:\n";
  printOrder(root); //Вывод узлов с именем автора
  system("pause");
  return 0;
}
P.S. Я вывожу имя автора для каждой записи при обходе дерева, но можно вывести всю информацию. Вас такой ввод устраивает?

Добавлено через 11 минут
DragonBorn88, почему вы не хотите использовать бинарное дерево поиска? Это позволит избежать повторов при добавлении и выводить данные в отсортированном порядке (по любому полю).
0
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
08.11.2018, 22:35  [ТС] 5
Устроит полностью.
Можете использовать поиска. Я думал так будет проще.
0
1458 / 924 / 807
Регистрация: 30.04.2016
Сообщений: 3,184
09.11.2018, 23:09 6
DragonBorn88, здравствуйте! Я структуры в деревья так еще ни разу не добавлял. Вот тестовый вариант того, что получилось. Посмотрите. Может быть, вам подойдет. Поля записи обязательно без пробелов!

Пример входных данных (файл db.txt):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
17895
Stephen_King
Under_the_Dome
2001
30000
 
57894
Rudyard_Kipling
Rikki-Tikki-Tavi
1990
10000
 
78900
Lewis_Carroll
Alice_in_Wonderland
1980
20000
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#include <bits/stdc++.h>
#include <windows.h>
 
    using namespace std;
 
int n, k;
bool isRegistred;
 
struct Info { //Описание узла бинарного дерева
    int id;
    int p_year;
    int books_q;
    char author_name[40];
    char book_name[40];
} data[100]; //Максимальное число записей в файле базы данных (файл db.txt)
 
struct BTree { //Описание бинарного дерева
    Info d;
    BTree* left;
    BTree* right;
};
 
BTree* add(Info d) { //Функция добавления узла в дерево
    BTree* node = new BTree;
    node->d = d;
    node->left = NULL;
    node->right = NULL;
    return node;
}
 
BTree* insert(BTree* node, Info key) {
    if (node == NULL)
        return add(key);
    if (key.id < node->d.id) {
        node->left = insert(node->left, key);
        isRegistred = false;
    } else if (key.id > node->d.id) {
        node->right = insert(node->right, key);
        isRegistred = false;
    } else {
        isRegistred = true;
    }   
    if (isRegistred) {
        cout << "\nThe book with such an ID is already registred!\n";
    }
    return node;
}
 
//ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
 
BTree* minValue(BTree* node) { //Вспомогательная функция для del()
    BTree* current = node;
    while (current->left != NULL)
        current = current->left;
    return current;
}
 
clearDB() { //Функция очистки файла базы данных
    ofstream f("db.txt", ios::out | ios::trunc);
    f.close();
}
 
int height(BTree* node) { //Функция определения высоты дерева (вспомогательная функция для isBalanced())
    if (node == NULL)
        return 0;
    return 1 + max(height(node->left), height(node->right));
}
 
BTree* del(BTree* root, int id) { //Функция удаления узла из дерева (по ID книги)
    if (root == NULL) return root;
    if (id < root->d.id)
        root->left = del(root->left, id);
    else if (id > root->d.id)
        root->right = del(root->right, id);
    else {
        if (root->left == NULL) {
            BTree* temp = root->right;
            free(root);
            return temp;
        } else if (root->right == NULL) {
            BTree* temp = root->left;
            free(root);
            return temp;
        }
        BTree* temp = minValue(root->right);
        root->d.id = temp->d.id;
        root->right = del(root->right, temp->d.id);
    }
    return root;
}
 
BTree* root = NULL;
 
void readFromDB() { //Функция считывания данных из базы данных (db.txt)
    ifstream f("db.txt");
    k = 0;
    while (f >> data[k].id 
             >> data[k].author_name 
             >> data[k].book_name 
             >> data[k].p_year 
             >> data[k].books_q) {
        if (k == 0) {
            root = insert(root, data[k]);
        } else {
            insert(root, data[k]);
        }
        k++;
    }
    f.close();
}
 
void output(BTree* node) { //Функция записи данных из дерева в базу данных (файл db.txt)
    ofstream f("db.txt", ios::out | ios::app);
    if (node == NULL)
        return;
    output(node->left);
    f << node->d.id << "\n" 
      << node->d.author_name << "\n" 
      << node->d.book_name << "\n" 
      << node->d.p_year << "\n" 
      << node->d.books_q << "\n\n";
    output(node->right);
    f.close();
}
 
bool isBalanced(BTree* root) { //Функция проверки дерева на сбалансированность
    int lh, rh;
    if (root == NULL)
        return 1;
    lh = height(root->left);
    rh = height(root->right);
    if (abs(lh-rh) <= 1 && isBalanced(root->left) && isBalanced(root->right)) {
        return 1;
    }
    return 0;
}
 
addBook() { //Функция добавления данных о новых книгах
    readFromDB();
    clearDB();
    cout << "\nThe number of fields in the database: " << k << "\n";
    if (k == 0) {
        cout << "Enter a number of fields:\n";
        cout << "n = ";
        cin >> n;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                cout << "\nEntry #" << i + 1 << "\n\n";
                cout << "Enter a book ID: ";
                cin >> data[i].id;
                cout << "Enter an author name: ";
                cin >> data[i].author_name;
                cout << "Enter a book name: ";
                cin >> data[i].book_name;
                cout << "Enter a publish year: ";
                cin >> data[i].p_year;
                cout << "Enter a number of copies: ";
                cin >> data[i].books_q;
                root = insert(root, data[i]);
            } else {
                cout << "\nEntry #" << i + 1 << "\n\n";
                cout << "Enter a book ID: ";
                cin >> data[i].id;
                cout << "Enter an author name: ";
                cin >> data[i].author_name;
                cout << "Enter a book name: ";
                cin >> data[i].book_name;
                cout << "Enter a publish year: ";
                cin >> data[i].p_year;
                cout << "Enter a number of copies: ";
                cin >> data[i].books_q;
                insert(root, data[i]);
            }
        }
    } else {
        cout << "How much more to add?\n\n";
        cout << "n = ";
        cin >> n;
        for (int i = k; i < n + k; i++) {
            cout << "\nEntry #" << i + 1 << "\n\n";
            cout << "Enter a book ID: ";
            cin >> data[i].id;
            cout << "Enter an author name: ";
            cin >> data[i].author_name;
            cout << "Enter a book name: ";
            cin >> data[i].book_name;
            cout << "Enter a publish year: ";
            cin >> data[i].p_year;
            cout << "Enter a number of copies: ";
            cin >> data[i].books_q;
            insert(root, data[i]);
        }
    }
    output(root);
}
 
void delBook() { //Функция удаления данных о книге по ID
    int id;
    cout << "\nEnter a book ID: ";
    cin >> id;
    readFromDB();
    clearDB();
    root = del(root, id);
    output(root);
}
 
bool checkIfTreeIsBalanced() { //Функция проверки бинарного дерева на сбалансированность
    readFromDB();
    if (isBalanced(root)) {
        cout << "The tree is balanced!\n";
    } else {
        cout << "The tree is NOT balanced!\n";
    }
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    menu: 
    int choice, back;
    cout << "Choose an option:\n\n";
    cout << "0 - Exit\n";
    cout << "1 - Add new books\n";
    cout << "2 - Delete a book\n";
    cout << "3 - Check if tree is balanced\n";
    cout << "\nYour choice: ";
    cin >> choice;
    switch (choice) {
    case 0:
        exit(0);
        break;
    case 1:
        addBook();
        break;
    case 2:
        delBook();
        break;
    case 3:
        checkIfTreeIsBalanced();
        break;
    }
    cout << "\nDo want back to menu?\n";
    cout << "1 - Yes\n";
    cout << "2 - No\n";
    cout << "Your choice: ";
    cin >> back;
    if (back == 1) {
        root = NULL;
        system("cls");
        goto menu;
    } else {
        exit(0);
    }
    system("pause");
    return 0;
}
0
1458 / 924 / 807
Регистрация: 30.04.2016
Сообщений: 3,184
10.11.2018, 11:44 7
DragonBorn88, отпишитесь, пожалуйста. Вас устраивает такой вариант?
0
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
10.11.2018, 20:31  [ТС] 8
У меня возникла вот такая ошибка. Что я делаю не правильно?
0
Миниатюры
Бинарные деревья. Составить программу, которая содержит информацию о книгах в библиотеке.  
1458 / 924 / 807
Регистрация: 30.04.2016
Сообщений: 3,184
11.11.2018, 00:51 9
DragonBorn88, здравствуйте! Специально запускал проект в MS Visual Studio 2017. Есть небольшие отличия в компиляторах. Вот код, который скомпилировался и работает:

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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
 
    //using namespace std;
 
using std::cin;
using std::ios;
using std::ofstream;
using std::ifstream;
using std::cout;
 
int n, k;
bool isRegistred;
 
struct Info { //Описание узла бинарного дерева
    int id;
    int p_year;
    int books_q;
    char author_name[40];
    char book_name[40];
} data[100]; //Максимальное число записей в файле базы данных (файл db.txt)
 
struct BTree { //Описание бинарного дерева
    Info d;
    BTree* left;
    BTree* right;
};
 
BTree* add(Info d) { //Функция добавления узла в дерево
    BTree* node = new BTree;
    node->d = d;
    node->left = NULL;
    node->right = NULL;
    return node;
}
 
BTree* insert(BTree* node, Info key) {
    if (node == NULL)
        return add(key);
    if (key.id < node->d.id) {
        node->left = insert(node->left, key);
        isRegistred = false;
    }
    else if (key.id > node->d.id) {
        node->right = insert(node->right, key);
        isRegistred = false;
    }
    else {
        isRegistred = true;
    }
    if (isRegistred) {
        cout << "\nThe book with such an ID is already registred!\n";
    }
    return node;
}
 
//ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
 
BTree* minValue(BTree* node) { //Вспомогательная функция для del()
    BTree* current = node;
    while (current->left != NULL)
        current = current->left;
    return current;
}
 
void clearDB() { //Функция очистки файла базы данных
    ofstream f("db.txt", ios::out | ios::trunc);
    f.close();
}
 
int height(BTree* node) { //Функция определения высоты дерева (вспомогательная функция для isBalanced())
    if (node == NULL)
        return 0;
    return 1 + max(height(node->left), height(node->right));
}
 
BTree* del(BTree* root, int id) { //Функция удаления узла из дерева (по ID книги)
    if (root == NULL) return root;
    if (id < root->d.id)
        root->left = del(root->left, id);
    else if (id > root->d.id)
        root->right = del(root->right, id);
    else {
        if (root->left == NULL) {
            BTree* temp = root->right;
            free(root);
            return temp;
        }
        else if (root->right == NULL) {
            BTree* temp = root->left;
            free(root);
            return temp;
        }
        BTree* temp = minValue(root->right);
        root->d.id = temp->d.id;
        root->right = del(root->right, temp->d.id);
    }
    return root;
}
 
BTree* root = NULL;
 
void readFromDB() { //Функция считывания данных из базы данных (db.txt)
    ifstream f("db.txt");
    k = 0;
    while (f >> data[k].id
        >> data[k].author_name
        >> data[k].book_name
        >> data[k].p_year
        >> data[k].books_q) {
        if (k == 0) {
            root = insert(root, data[k]);
        }
        else {
            insert(root, data[k]);
        }
        k++;
    }
    f.close();
}
 
void output(BTree* node) { //Функция записи данных из дерева в базу данных (файл db.txt)
    ofstream f("db.txt", ios::out | ios::app);
    if (node == NULL)
        return;
    output(node->left);
    f << node->d.id << "\n"
        << node->d.author_name << "\n"
        << node->d.book_name << "\n"
        << node->d.p_year << "\n"
        << node->d.books_q << "\n\n";
    output(node->right);
    f.close();
}
 
bool isBalanced(BTree* root) { //Функция проверки дерева на сбалансированность
    int lh, rh;
    if (root == NULL)
        return 1;
    lh = height(root->left);
    rh = height(root->right);
    if (abs(lh - rh) <= 1 && isBalanced(root->left) && isBalanced(root->right)) {
        return 1;
    }
    return 0;
}
 
void addBook() { //Функция добавления данных о новых книгах
    readFromDB();
    cout << "\nThe number of fields in the database: " << k << "\n";
    if (k == 0) {
        cout << "Enter a number of fields:\n";
        cout << "n = ";
        cin >> n;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                cout << "\nEntry #" << i + 1 << "\n\n";
                cout << "Enter a book ID: ";
                cin >> data[i].id;
                cout << "Enter an author name: ";
                cin >> data[i].author_name;
                cout << "Enter a book name: ";
                cin >> data[i].book_name;
                cout << "Enter a publish year: ";
                cin >> data[i].p_year;
                cout << "Enter a number of copies: ";
                cin >> data[i].books_q;
                root = insert(root, data[i]);
            }
            else {
                cout << "\nEntry #" << i + 1 << "\n\n";
                cout << "Enter a book ID: ";
                cin >> data[i].id;
                cout << "Enter an author name: ";
                cin >> data[i].author_name;
                cout << "Enter a book name: ";
                cin >> data[i].book_name;
                cout << "Enter a publish year: ";
                cin >> data[i].p_year;
                cout << "Enter a number of copies: ";
                cin >> data[i].books_q;
                insert(root, data[i]);
            }
        }
    }
    else {
        cout << "How much more to add?\n\n";
        cout << "n = ";
        cin >> n;
        for (int i = k; i < n + k; i++) {
            cout << "\nEntry #" << i + 1 << "\n\n";
            cout << "Enter a book ID: ";
            cin >> data[i].id;
            cout << "Enter an author name: ";
            cin >> data[i].author_name;
            cout << "Enter a book name: ";
            cin >> data[i].book_name;
            cout << "Enter a publish year: ";
            cin >> data[i].p_year;
            cout << "Enter a number of copies: ";
            cin >> data[i].books_q;
            insert(root, data[i]);
        }
    }
    clearDB();
    output(root);
}
 
void delBook() { //Функция удаления данных о книге по ID
    int id;
    cout << "\nEnter a book ID: ";
    cin >> id;
    readFromDB();
    root = del(root, id);
    clearDB();
    output(root);
}
 
void checkIfTreeIsBalanced() { //Функция проверки бинарного дерева на сбалансированность
    readFromDB();
    if (isBalanced(root)) {
        cout << "The tree is balanced!\n";
    }
    else {
        cout << "The tree is NOT balanced!\n";
    }
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    menu:
    int choice, back;
    cout << "Choose an option:\n\n";
    cout << "0 - Exit\n";
    cout << "1 - Add new books\n";
    cout << "2 - Delete a book\n";
    cout << "3 - Check if tree is balanced\n";
    cout << "\nYour choice: ";
    cin >> choice;
    switch (choice) {
    case 0:
        exit(0);
        break;
    case 1:
        addBook();
        break;
    case 2:
        delBook();
        break;
    case 3:
        checkIfTreeIsBalanced();
        break;
    }
    cout << "\nDo want back to menu?\n";
    cout << "1 - Yes\n";
    cout << "2 - No\n";
    cout << "Your choice: ";
    cin >> back;
    if (back == 1) {
        root = NULL;
        system("cls");
        goto menu;
    }
    else {
        exit(0);
    }
    system("pause");
    return 0;
}
0
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
11.11.2018, 12:09  [ТС] 10
Всё работает красиво.
Сделайте ещё пожалуйста что бы содержимое db.txt выводилось в консоли
0
Изображения
 
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
11.11.2018, 12:28  [ТС] 11
На экран я смог вывести файл txt.
Почему программа пишет что дерево не сбалансировано? Как я понимаю это не очень хорошо? Или это не существенно?
0
1458 / 924 / 807
Регистрация: 30.04.2016
Сообщений: 3,184
11.11.2018, 16:04 12
Лучший ответ Сообщение было отмечено DragonBorn88 как решение

Решение

DragonBorn88, здравствуйте! Вам нужно посмотреть определение сбалансированности бинарного дерева поиска. Дерево называется сбалансированным, если высота левого поддерева отличается от высоты правого не более чем на 1 и наоборот. Если никакие элементы в дерево еще не добавлялись, то программа скажет, что дерево сбалансировано (по определению пустое дерево всегда сбалансировано). Все зависит от id книги. По id узлы добавляются в дерево. Вам все еще нужна функция вывода узлов дерева на экран?

Для примера введите эти данные (удалите все старые узлы из файла или сам файл):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
17895
Stephen_King
Under_the_Dome
2001
30000
 
57894
Rudyard_Kipling
Rikki-Tikki-Tavi
1990
10000
 
78900
Lewis_Carroll
Alice_in_Wonderland
1980
20000
Вернитесь в меню и проверьте дерево на сбалансированность (нажмите 3). Программа скажет, что дерево не сбалансировано.

А теперь, удалите узел с id = 57894.

Снова вернитесь в меню и нажмите 3 - дерево стало сбалансированным после удаления узла с id 57894.

Добавлено через 29 минут
DragonBorn88, добавил функцию печати файла db.txt на экран. Вот итоговый код:

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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
 
    //using namespace std;
 
using std::cin;
using std::ios;
using std::ofstream;
using std::ifstream;
using std::cout;
 
int n, k;
bool isRegistred;
 
struct Info { //Описание узла бинарного дерева
    int id;
    int p_year;
    int books_q;
    char author_name[40];
    char book_name[40];
} data[100]; //Максимальное число записей в файле базы данных (файл db.txt)
 
struct BTree { //Описание бинарного дерева
    Info d;
    BTree* left;
    BTree* right;
};
 
BTree* add(Info d) { //Функция добавления узла в дерево
    BTree* node = new BTree;
    node->d = d;
    node->left = NULL;
    node->right = NULL;
    return node;
}
 
BTree* insert(BTree* node, Info key) {
    if (node == NULL)
        return add(key);
    if (key.id < node->d.id) {
        node->left = insert(node->left, key);
        isRegistred = false;
    }
    else if (key.id > node->d.id) {
        node->right = insert(node->right, key);
        isRegistred = false;
    }
    else {
        isRegistred = true;
    }
    if (isRegistred) {
        cout << "\nThe book with such an ID is already registred!\n";
    }
    return node;
}
 
//ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
 
BTree* minValue(BTree* node) { //Вспомогательная функция для del()
    BTree* current = node;
    while (current->left != NULL)
        current = current->left;
    return current;
}
 
void clearDB() { //Функция очистки файла базы данных
    ofstream f("db.txt", ios::out | ios::trunc);
    f.close();
}
 
int height(BTree* node) { //Функция определения высоты дерева (вспомогательная функция для isBalanced())
    if (node == NULL)
        return 0;
    return 1 + max(height(node->left), height(node->right));
}
 
BTree* del(BTree* root, int id) { //Функция удаления узла из дерева (по ID книги)
    if (root == NULL) return root;
    if (id < root->d.id)
        root->left = del(root->left, id);
    else if (id > root->d.id)
        root->right = del(root->right, id);
    else {
        if (root->left == NULL) {
            BTree* temp = root->right;
            free(root);
            return temp;
        }
        else if (root->right == NULL) {
            BTree* temp = root->left;
            free(root);
            return temp;
        }
        BTree* temp = minValue(root->right);
        root->d.id = temp->d.id;
        root->right = del(root->right, temp->d.id);
    }
    return root;
}
 
BTree* root = NULL;
 
void readFromDB() { //Функция считывания данных из базы данных (db.txt)
    ifstream f("db.txt");
    k = 0;
    while (f >> data[k].id
        >> data[k].author_name
        >> data[k].book_name
        >> data[k].p_year
        >> data[k].books_q) {
        if (k == 0) {
            root = insert(root, data[k]);
        }
        else {
            insert(root, data[k]);
        }
        k++;
    }
    f.close();
}
 
void output(BTree* node) { //Функция записи данных из дерева в базу данных (файл db.txt)
    ofstream f("db.txt", ios::out | ios::app);
    if (node == NULL)
        return;
    output(node->left);
    f << node->d.id << "\n"
        << node->d.author_name << "\n"
        << node->d.book_name << "\n"
        << node->d.p_year << "\n"
        << node->d.books_q << "\n\n";
    output(node->right);
    f.close();
}
 
void outputToConsole(BTree* node) { //Функция вывода содержимого файла db.txt на экран
    readFromDB();
    ifstream f("db.txt");
    if (f.good()) {
    cout << "\nContents of db.txt:\n";
    k = 0;
    while (f >> data[k].id 
             >> data[k].author_name 
             >> data[k].book_name 
             >> data[k].p_year 
             >> data[k].books_q) {
    cout << "\n" << data[k].id << "\n"
                 << data[k].author_name << "\n"
                 << data[k].book_name << "\n"
                 << data[k].p_year << "\n"
                 << data[k].books_q << "\n";
    k++;
    }
    if (root == NULL) {
            cout << "The file db.txt is empty!\n";
        } 
    } else {
        cout << "No file db.txt found!\n";
    }
    f.close();
}
 
bool isBalanced(BTree* root) { //Функция проверки дерева на сбалансированность
    int lh, rh;
    if (root == NULL)
        return 1;
    lh = height(root->left);
    rh = height(root->right);
    if (abs(lh - rh) <= 1 && isBalanced(root->left) && isBalanced(root->right)) {
        return 1;
    }
    return 0;
}
 
void addBook() { //Функция добавления данных о новых книгах
    readFromDB();
    cout << "\nThe number of fields in the database: " << k << "\n";
    if (k == 0) {
        cout << "Enter a number of fields:\n";
        cout << "n = ";
        cin >> n;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                cout << "\nEntry #" << i + 1 << "\n\n";
                cout << "Enter a book ID: ";
                cin >> data[i].id;
                cout << "Enter an author name: ";
                cin >> data[i].author_name;
                cout << "Enter a book name: ";
                cin >> data[i].book_name;
                cout << "Enter a publish year: ";
                cin >> data[i].p_year;
                cout << "Enter a number of copies: ";
                cin >> data[i].books_q;
                root = insert(root, data[i]);
            }
            else {
                cout << "\nEntry #" << i + 1 << "\n\n";
                cout << "Enter a book ID: ";
                cin >> data[i].id;
                cout << "Enter an author name: ";
                cin >> data[i].author_name;
                cout << "Enter a book name: ";
                cin >> data[i].book_name;
                cout << "Enter a publish year: ";
                cin >> data[i].p_year;
                cout << "Enter a number of copies: ";
                cin >> data[i].books_q;
                insert(root, data[i]);
            }
        }
    }
    else {
        cout << "How much more to add?\n\n";
        cout << "n = ";
        cin >> n;
        for (int i = k; i < n + k; i++) {
            cout << "\nEntry #" << i + 1 << "\n\n";
            cout << "Enter a book ID: ";
            cin >> data[i].id;
            cout << "Enter an author name: ";
            cin >> data[i].author_name;
            cout << "Enter a book name: ";
            cin >> data[i].book_name;
            cout << "Enter a publish year: ";
            cin >> data[i].p_year;
            cout << "Enter a number of copies: ";
            cin >> data[i].books_q;
            insert(root, data[i]);
        }
    }
    clearDB();
    output(root);
}
 
void delBook() { //Функция удаления данных о книге по ID
    int id;
    cout << "\nEnter a book ID: ";
    cin >> id;
    readFromDB();
    root = del(root, id);
    clearDB();
    output(root);
}
 
void checkIfTreeIsBalanced() { //Функция проверки бинарного дерева на сбалансированность
    readFromDB();
    if (isBalanced(root)) {
        cout << "The tree is balanced!\n";
    }
    else {
        cout << "The tree is NOT balanced!\n";
    }
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    menu:
    int choice, back;
    cout << "Choose an option:\n\n";
    cout << "0 - Exit.\n";
    cout << "1 - Add new books.\n";
    cout << "2 - Delete a book.\n";
    cout << "3 - Check if tree is balanced.\n";
    cout << "4 - Output data to console.\n";
    cout << "\nYour choice: ";
    cin >> choice;
    switch (choice) {
    case 0:
        exit(0);
        break;
    case 1:
        addBook();
        break;
    case 2:
        delBook();
        break;
    case 3:
        checkIfTreeIsBalanced();
        break;
    case 4:
        outputToConsole(root);
        break;
    }
    cout << "\nDo want back to menu?\n";
    cout << "1 - Yes\n";
    cout << "2 - No\n";
    cout << "Your choice: ";
    cin >> back;
    if (back == 1) {
        root = NULL;
        system("cls");
        goto menu;
    }
    else {
        exit(0);
    }
    system("pause");
    return 0;
}
0
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
11.11.2018, 16:40  [ТС] 13
Огромное вам спасибо
0
Комп_Оратор)
Эксперт по математике/физике
8419 / 4181 / 569
Регистрация: 04.12.2011
Сообщений: 12,429
Записей в блоге: 14
11.11.2018, 18:48 14
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Здравствуйте. Учусь в универе. Задали написать вот такую программу. А я с бинарными деревьями никогда не работал. Помогите кто может
Составить программу, которая содержит информацию о книгах в библиотеке.
Сведения о книгах содержат:
1. Номер УДК
2. Фамилия и инициалы автора;
3. Название;
4. Год издания;
5. Количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
1. Исходное формирования данных о все книгах в библиотеке в виде бинарного дерева;
2. Добавление данных о книгах, впервые поступающих в библиотеку;
3. Удаление данных о списанных книги;
4. Проверить, бинарное дерево является сбалансированным.
1.Задание напоминает смесь бульдога с носорогом. Написание словаря и специализация для хранения книг - разные по сложности и совершенно мешающие друг другу задачи. То есть, если писать словарь то контейнер - шаблон. А если обеспечивать конкретный интерфейс то специализировать std::map<Book>
2.
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Добавление данных о книгах, впервые поступающих в библиотеку;
Тот кто дал Вам это, сделал (или Вы своими словами пересказали) криво. Добавлять информацию при поступлении уже имеющихся экземпляров необходимо, всё-равно. Как-то же надо их считать.
Хуже всего, что не Вы ни Ваш университет не понимаете, что балансировка дерева с повторениями, это грустная тема. Если оно не оформлено как map - то есть для пар ключ/значение, где ключи уникальны, а значение - количество. Этот приём позволяет избежать повторов на уровне структуры дерева скрыв их в данных узла (нода).
В задании забыли написать, что человеку, который (по ряду разнообразных обстоятельств неотвратимой силы)
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
с бинарными деревьями никогда не работал
нужно самому написать бинарное дерево (причём дерево поиска, судя по требованию - балансировка).
Поэтому вот такой код, вполне мог бы прокатить за отмазку:
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
#include <iostream>
#include<map>
#include<string>
using namespace std;
struct Boo
{
int udk;
int year;
string author_name;
char firstIn, secondIn;
string book_name;
friend  ostream & operator<<( ostream & os, const Boo& lhs);
};
 
 ostream & operator<<(ostream & os, const Boo& lhs)
{
    return os<<"UDK "<<lhs.udk<<" year "<<lhs.year<<" autor "<<
        lhs.author_name<<' '<<lhs.firstIn<<'.'<<lhs.secondIn<<" the book name "<<lhs.book_name;
 
}
 
struct lessBoo{
bool operator()(const Boo& lhs, const Boo& rhs)
{
if(lhs.udk < rhs.udk) return true;
else if(lhs.udk == rhs.udk)
if(lhs.year < rhs.year) return true;
else if(lhs.year == rhs.year)
if(lhs.author_name < rhs.author_name) return true;
else if(lhs.author_name == rhs.author_name)
if(lhs.firstIn < rhs.firstIn) return true;
else if(lhs.firstIn == rhs.firstIn)
if(lhs.secondIn < rhs.secondIn) return true;
else if(lhs.secondIn == rhs.secondIn)
if(lhs.book_name < rhs.book_name) return true;
return false;
}
};
template< class U>
bool foo_is_balanced( U& m){ return false;}
template< class U, class K, class less>
bool foo_is_balanced( map<U, K, less>& m){ return true;}
 
 
int main( int argc, char *argv[] )
{
    Boo boo_boo_boo[] ={
        {123, 2080, "Tarantoga", 'Z', 'Z', "15 years among kurdles end osmeols"},
        {123, 2080, "Tarantoga", 'Z', 'Z', "15 years among kurdles end osmeols"},
        {123, 2080, "Tarantoga", 'Z', 'Z', "15 years among kurdles end osmeols"},
        {123, 2080, "Tarantoga", 'Z', 'Z', "15 years among kurdles end osmeols"},
        {123, 2081, "Tarantoga", 'Z', 'Z', "15 years among kurdles end osmeols"},
        {123, 1981, "Lem", 'S', 'S', "Star notes of Ion Tihiy"},
        {123, 1981, "Lem", 'S', 'S', "Star notes of Ion Tihiy"},
        {132, 2017, "Htototam", 'H', 'h', "Tihiy don team lead and other honest dones"},
        {132, 2017, "Htototam", 'H', 'h', "Tihiy don team lead and other honest dones"},
        {132, 2016, "Htototam", 'H', 'h', "Tihiy don team lead and other honest dones"}
    };
map<Boo, int, lessBoo> lesbo;
size_t sz=sizeof(boo_boo_boo)/sizeof(*boo_boo_boo);
for(size_t i=0; i<sz; ++i)lesbo[boo_boo_boo[i++]]++;
map<Boo, int, lessBoo>::const_iterator it = lesbo.begin(), it_end = lesbo.end();
for(;it!=it_end; ++it)cout<<(it->first)<< " is present in "<<(it->second)<<" copies"<<'\n';
if(foo_is_balanced(lesbo))cout<<"map is always balanced\n";
else cout<<"that is compal time expression and can newer be printed\n";
if(foo_is_balanced(boo_boo_boo))cout<< "that is compal time expression and can newer be printed\n";
else cout<<"array is never balanced\n";
    cin.get();
    return 0;
}
0
13 / 9 / 4
Регистрация: 10.09.2018
Сообщений: 352
11.11.2018, 19:17  [ТС] 15
Ваш код мне выдаёт вот такие ошибки:
0
Миниатюры
Бинарные деревья. Составить программу, которая содержит информацию о книгах в библиотеке.  
Комп_Оратор)
Эксперт по математике/физике
8419 / 4181 / 569
Регистрация: 04.12.2011
Сообщений: 12,429
Записей в блоге: 14
11.11.2018, 19:31 16
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Ваш код мне выдаёт вот такие ошибки:
мой компилятор это ест. Если бы вы дали строку на которую он ругается, было бы легче. Попробуйте (навскидку) :
C++
1
2
3
4
template< class U>
bool foo_is_balanced( const U& m){ return false;}
template< class U, class K, class less>
bool foo_is_balanced( const map<U, K, less>& m){ return true;}
Добавлено через 9 секунд
Хотя к функтору-предикату это не может иметь отношения, кажется.
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
11.11.2018, 19:32 17
IGPIGP, ну и чему такому научит ваш код? Что существует std::map? Спасибо, для этого справка есть.
А задание учит человека самостоятельно проектировать сложные структуры данных типа деревьев.
0
Комп_Оратор)
Эксперт по математике/физике
8419 / 4181 / 569
Регистрация: 04.12.2011
Сообщений: 12,429
Записей в блоге: 14
11.11.2018, 20:14 18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А задание учит человека самостоятельно проектировать сложные структуры данных типа деревьев.
И как оно связано с
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
я с бинарными деревьями никогда не работал
?
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
? Спасибо, для этого справка есть.
Пожалуйста.
Задание написать само-балансирующееся дерево и требование хранить тип данных : тюбетейка, с полями: цвет, узор, вышитые инициалы и т.п. Мне показалось, туповатым (мягко говорю). Мы отличаемся тем, что Вам оно кажется нормальным.
А как на счёт балансировки дерева с повторениями?
Моё замечание насчёт пар ключ/значение тоже непонятно?

Не по теме:

И наконец. Даже без обёртки мапа в этой задаче заняла объём хорошей лабы. А если писать дерево - курсовая. Я не хочу это даже комментировать.



Добавлено через 32 минуты
DragonBorn88, Вы молчите и я попытаюсь дать ещё совет наугад:
попробуйте закоментить конст в объявлении итераторов карты:
C++
1
map<Boo, int, lessBoo>::/*const_*/iterator it = lesbo.begin(), it_end = lesbo.end();
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
11.11.2018, 21:05 19
IGPIGP, то что в ВУЗах наших за курсовую считается написание банального самобалансирующегося дерева - это бич нашего образования. Какой-нибудь конструктор Яковлев или Ильюшин во время учёбы в ВУЗе свой первый самолёт создавал, а тут блин, дерево запрограммировать, ну да, не только дерево, ещё и АВЛ-балансирующееся, ещё и обвязать его интерфейсом мапы... всё равно не тянет на научный труд даже уровня курсовой. Самолёт, блин(!!!) и какое-то дерево по и без того подробно описанным в интернете и книгах принципам.
1
Комп_Оратор)
Эксперт по математике/физике
8419 / 4181 / 569
Регистрация: 04.12.2011
Сообщений: 12,429
Записей в блоге: 14
11.11.2018, 21:29 20
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
IGPIGP, то что в ВУЗах наших за курсовую считается написание банального самобалансирующегося дерева - это бич нашего образования. Какой-нибудь конструктор Яковлев или Ильюшин во время учёбы в ВУЗе свой первый самолёт создавал, а тут блин, дерево запрограммировать, ну да, не только дерево, ещё и АВЛ-балансирующееся, ещё и обвязать его интерфейсом мапы... всё равно не тянет на научный труд даже уровня курсовой. Самолёт, блин(!!!) и какое-то дерево по и без того подробно описанным в интернете и книгах принципам.
С этим согласен полностью. Однако если даже не принимать во внимание тот факт, что Яковлев или Ильюшин не могли бы себе позволить фразу типа:
Цитата Сообщение от Яковлев или Ильюшин
С бипланами дел не имел, но буду благодарен, если кто набросает эскиз фюзеляжа в основных размерах
, то я уверен, что задание таким студентам не могло быть похоже на:
"Разработать биплан грузоподъёмностью 800 кг полезной нагрузки, предусмотрев возможность перевозки 4 голов крупного рогатого скота, различной степени упитанности и удойности, 5-6 мешков корнеплодов, весом до 80 кг, каждый и т.п.".
То есть при чём, выбор общей конфигурации корпуса, силовой установки, дальности полёта, взлётно-посадочных характеристик и пр. базовых параметров, к конкретизации грузового отсека?
Меня удивило это условие.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2018, 21:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Динамические структуры данных. Составить программу, которая содержит текущую информацию о книгах в библиотеке
не могу решить Составить программу, которая содержит текущую информацию о книгах в библиотеке....

Составить программу, которая содержит текущую информацию о книгах
• номер УДК; • фамилию и инициалы автора; • название; • год издания; • количество...

Составить программу, которая содержит текущую информацию о книгах в библиотеке
Ребят, понимаю, что очень нагло с моей стороны, но решается очень серьёзный вопрос, как говорится,...

Разработать программу, которая содержит текущую информацию о книгах в библиотеке.
Разработать программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.