Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
1

Как работают явные преобразования из char[] в int?

07.01.2018, 21:48. Показов 956. Ответов 7
Метки с (Все метки)

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

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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
ifstream file("C:\\Users\\Admin\\Desktop\\тест.txt");
struct Node //Звено дерева (инв.номер, название, автор, издательство, год, номнер стелажа)
{
    int x; //Инв.номер
    string name;//Название
    string author;//Автор
    string pub;//Издательство
    int year;//Год
    int number_st;//Номер стелажа
 
    Node *l, *r; //Указатели на новые звенья
};
Node *root = NULL;//Начальное звено
 
void scrin(Node *, int x = NULL);
void ReadAndWrite(Node *&tree, int x = NULL);
void show(Node *tree);
////////////////////////////////////////////////////////
void menu();
 
void search(int x, Node *&Tree = root);
void ShowAll(Node *&Tree = root);
void SearchByAuthor(string, Node *tree= root);
void SearchByName(string, Node *tree = root);
void DeleteByNumber(int, Node *tree = root);
 
int main()
{
    setlocale(0, "");
    if (!file.is_open()) 
    {
        cout << "Файл не может быть открыт \n"; 
        cin.get();
        return 0;
    }
    scrin(NULL);
    menu();
    file.close();
    return 0;
}
void scrin(Node *tree, int x)
{
    if (!file.eof())
    {
        char buf[256];
        if (tree == NULL)
        {
            tree = new Node;
            root = tree;
            tree->l = tree->r = NULL; //Подзвенья инициализируем пустотой во избежание ошибок   
 
            ReadAndWrite(tree, x);
            scrin(tree);
        }
        else
        {
            int Ibuf;
            if (x = NULL)
            {
                file.getline(buf, 256, ' ');
                Ibuf = (int)buf;
            }
            else Ibuf = x;
            if (Ibuf < tree->x)
            {
                if (tree->l != NULL)
                    scrin(tree->l, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->l = new Node;  
                    tree->l->l = tree->l->r = NULL; 
                    tree->l->x = (int)buf; 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
            if (Ibuf > tree->x) 
            {
                if (tree->r != NULL)    scrin(tree->r, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->r = new Node;  //Выделяем память правому подзвену
                    tree->r->l = tree->r->r = NULL; 
                    tree->r->x = x; //Записываем в правое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
        }
    }
}
 
void ReadAndWrite( Node *&tree, int x)
{
    char buf[256];
    if (x != NULL) tree->x = x;
    else file.getline(buf, 256, ' ');
    tree->x = (int)buf;
    getline(file, tree->name, ' ');
    getline(file, tree->author, ' ');
    getline(file, tree->pub, ' ');
    file.getline(buf, 256, ' ');
    tree->year = (int)buf;
    file.getline(buf, 256, ' ');
    tree->number_st = (int)buf;
}
// это не всё
Добавлено через 3 часа 12 минут


При преобразовании правильным образом каким-то странным неведанным причинам рушится к чертям вся программа, я не знаю политику этого форму к мату, по этому просто вот мой код:
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
ifstream file("C:\\Users\\Admin\\Desktop\\тест.txt");
struct Node //Звено дерева (инв.номер, название, автор, издательство, год, номнер стелажа)
{
    int x; //Инв.номер
    string name;//Название
    string author;//Автор
    string pub;//Издательство
    int year;//Год
    int number_st;//Номер стелажа
 
    Node *l, *r; //Указатели на новые звенья
};
Node *root = NULL;//Начальное звено
 
void scrin(Node *, int x = NULL);
void ReadAndWrite(Node *&tree, int x = NULL);
void show(Node *tree);
////////////////////////////////////////////////////////
void menu();
 
void search(int x, Node *&Tree = root);
void ShowAll(Node *&Tree = root);
void SearchByAuthor(string, Node *tree= root);
void SearchByName(string, Node *tree = root);
void DeleteByNumber(int, Node *tree = root);
 
int main()
{
    setlocale(0, "");
    if (!file.is_open()) 
    {
        cout << "Файл не может быть \n"; 
        cin.get();
        return 0;
    }
    scrin(NULL);
    menu();
    cin.get();
    file.close();
    return 0;
}
 
void scrin(Node *tree, int x)
{
    if (!file.eof())
    {
        char buf[256];
        if (tree == NULL)
        {
            tree = new Node;
            root = tree;
            tree->l = tree->r = NULL; //Подзвенья инициализируем пустотой во избежание ошибок   
 
            ReadAndWrite(tree, x);
            scrin(tree);
        }
        else
        {
            int Ibuf;
            if (x = NULL)
            {
                file.getline(buf, 256, ' ');
                Ibuf = (int)buf;
            }
            else Ibuf = x;
            if (Ibuf < tree->x)
            {
                if (tree->l != NULL)
                    scrin(tree->l, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->l = new Node;  //Выделяем память левому подзвену. Именно подзвену, а не просто звену
                    tree->l->l = tree->l->r = NULL; //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    tree->l->x = (int)buf; //Записываем в левое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
            if (Ibuf > tree->x)   //Если нововведенный элемент x больше чем элемент x из семечка дерева, уходим вправо
            {
                if (tree->r != NULL)    scrin(tree->r, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->r = new Node;  //Выделяем память правому подзвену. Именно подзвену, а не просто звену
                    tree->r->l = tree->r->r = NULL; //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    tree->r->x = x; //Записываем в правое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
        }
    }
}
 
void ReadAndWrite( Node *&tree, int x)
{
    char buf[256];
    if (x != NULL) tree->x = x;
    else file.getline(buf, 256, ' ');
    tree->x = atoi(buf);
    getline(file, tree->name, ' ');
    getline(file, tree->author, ' ');
    getline(file, tree->pub, ' ');
    file.getline(buf, 256, ' ');
    tree->year = atoi(buf);
    file.getline(buf, 256, ' ');
    tree->number_st = atoi(buf);
}
void menu()
{
    int num;
    string buf;
    int option;
    cout << "Введите номер опции" << endl;
    cout << "1)Поск по инвентарному номеру" << endl;
    cout << "2)Выдача всего списка" << endl;
    cout << "3)Поск по автору" << endl;
    cout << "4)Поск по названию" << endl;
    cout << "5)Удаление информации о книге по инвентарноу номеру" << endl; 
//  cout << "6)Поск по инвентарному номеру" << endl;
    cin >> option;
    switch (option)
    {
        case 1: 
            
            cout << "Введите инвентарный номер для вывода информации" << endl;
            cin >> num;
            search(num);
            break;
        case 2: ShowAll();
            break;
        case 3: 
            cout << "Введите имя автора для вывода информации" << endl;
            cin >> buf;
            SearchByAuthor(buf);
            break;
        case 4:
            cout << "Введите название книги для вывода информации" << endl;
            cin >> buf;
            SearchByName(buf);
            break;
        case 5: 
            cout << "Введите номер книги для удаления";
            cin >> num;
            DeleteByNumber(num);
            break;
    }
    cout << "Вернуться в меню(1) или завершить(2)";
    cin.get();
}
 
void search(int x, Node *&tree)
{
    if (tree == NULL) cout << "Запись не найдена" << endl;
    else if (x == tree->x)  show(tree);
    else if (x < tree->x)   search(x, tree->l);
    else if (x > tree->x)   search(x, tree->r);
}
 
void ShowAll(Node *&Tree)
{
 
    if (Tree != NULL) //Пока не встретится пустое звено
    {
        ShowAll(Tree->l); //Рекурсивная функция для вывода левого поддерева
        show(Tree); //Отображаем корень дерева
        ShowAll(Tree->r); //Рекурсивная функци для вывода правого поддерева
    }
}
 
void SearchByAuthor(string author, Node *tree)
{
    if (tree != NULL) //Пока не встретится пустое звено
    {
        if (tree->author != author)
        {
            SearchByAuthor(author, tree->l); //Поиск в левой ветке
            SearchByAuthor(author, tree->r); //Поиск в правой ветке
        }
        else show(tree);
    }
}
 
void SearchByName(string name, Node *tree)
{
    if (tree != NULL) //Пока не встретится пустое звено
    {
        if (tree->name != name)
        {
            SearchByAuthor(name, tree->l); //Поиск в левой ветке
            SearchByAuthor(name, tree->r); //Поиск в правой ветке
        }
        else show(tree);
    }
}
 
void show(Node *tree)
{
    //if (tree->name == "") cout << "Запись удалина" << endl;
    //else 
    {
        cout << "Инв.номер: " << tree->x;
        cout << "   Название: " << tree->name;
        cout << "   Автор: " << tree->author;
        cout << "   Издательство: " << tree->pub;
        cout << "   Год: " << tree->year;
        cout << "   Номер стелажа: " << tree->number_st<<endl;
    }
}
void DeleteByNumber(int x, Node *tree)
{
    if (tree == NULL) cout << "Запись не найдена" << endl;
    else if (x == tree->x)
    {
        tree->name = "";
        tree->author = "";//Автор
        tree->pub = "";//Издательство
        tree->year = NULL;//Год
        tree->number_st = NULL;//Номер стелажа
    }
    else if (x < tree->x)   search(x, tree->l);
    else if (x > tree->x)   search(x, tree->r);
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2018, 21:48
Ответы с готовыми решениями:

Нет преобразования int в char*
int main() { char s; char* kz = 0; cout &lt;&lt; &quot;Vvedite stroku: &quot;; cin &gt;&gt; s; // строку...

Преобразования массива с типа int к типу char
Помогите решить задачу. Требуется создать шаблон класса для преобразования массива с типа int к...

явные преобразования
откоректируйте синтаксис Any a; f(&quot;&quot;,ios::binary); /* * */ f.write((char*) a,sizeof(a));

Как превести из char* в int и наоборот из int в char*?
Как превести из char* aa='123' в int aa=123 и наоборот из int в char* . Понимаю что самому...

7
16 / 16 / 11
Регистрация: 28.10.2016
Сообщений: 75
07.01.2018, 22:37 2
Лучший ответ Сообщение было отмечено IlyaKr как решение

Решение

Строка 66:
C++
1
if (x = NULL) //???
x = NULL всегда возвращает NULL, следовательно,
C++
1
2
3
4
5
6
7
int Ibuf;
if (x = NULL)
{
    file.getline(buf, 256, ' ');
    Ibuf = (int)buf;
}
else Ibuf = x;
Ibuf всегда будет равен 0

Добавлено через 13 минут
P.s. а само преобразование
C++
1
2
char *s = ...;
(int)s;
работает так же, как и
C++
1
reinterpret_cast<int>(s);
, т.е. берётся адрес, на который указывает s (допустим, наш адрес - это 0x00BB7E50) воспринимается как число, и переводится в десятичную систему счисления. (например, наш адрес в 10-ной системе будет числом 12287568).
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
 
    void* p = reinterpret_cast<void*>(0x0F1337F0);
    
    cout << p << endl;
    cout << (int)p << endl;
 
    _getch();
    return 0;
}
Выполни эту программу и сравни числа на калькуляторе Windows, или любом онлайн-конвертере.

Добавлено через 4 минуты
И ещё:
C++
1
2
3
if (x != NULL) tree->x = x;
else file.getline(buf, 256, ' ');
tree->x = atoi(buf);
Ничего странного не замечаешь?
(Что будет, если x таки != NULL)?

Добавлено через 1 минуту
Тогда уже так:
C++
1
2
3
4
5
6
7
if (x != NULL) 
        tree->x = x;
    else
    {
        file.getline(buf, 256, ' ');
        tree->x = atoi(buf);
    }
Добавлено через 2 минуты
P.s.s. Я не моралфаг, но всё же советовал бы передавать в функции
C++
1
2
void SearchByName(string name, Node *tree);
void SearchByAuthor(string author, Node *tree);
значения по lvalue-ссылкам, т.е.
C++
1
2
void SearchByName(const string& name, Node *tree);
void SearchByAuthor(const string& author, Node *tree);
а так же
C++
1
2
3
tree->name = "";
tree->author = "";//Автор
tree->pub = "";//Издательство
посоветую заменить на
C++
1
2
3
tree->name.clear();
tree->author.clear();//Автор
tree->pub.clear();//Издательство
Добавлено через 6 минут

Не по теме:


К мелочам типа неконстантных указателей в аргументах и прочего решил не придираться, за моралфага примут. :D

1
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
08.01.2018, 11:57  [ТС] 3
Цитата Сообщение от Kodirovsshik Посмотреть сообщение
само преобразование
, а само преобразование я сам исправил, не дожидаясь ответа, а что на счёт
Цитата Сообщение от Kodirovsshik Посмотреть сообщение
Строка 66:
также успел исправить, но эффекта мало. Сейчас я тестю вывод, но мало того, что непоследовательно выводится, так ещё и рушится инфа первой и третей строки и первого пункта(инв.номер).
P.s. Я написал текстовик, с нужным форматом для тестов, но что-то не так, возможно всё рушит '\n', но магия чисел 1 и 3 мне не ясна
0
Вложения
Тип файла: txt тест.txt (279 байт, 5 просмотров)
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
08.01.2018, 12:07  [ТС] 4
Нынче код выглядит так(если убрать всё лишнее и оставить только вывод):
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
ifstream file("C:\\Users\\Admin\\Desktop\\тест.txt");
struct Node //Звено дерева (инв.номер, название, автор, издательство, год, номер стелажа)
{
    int x; //Инв.номер
    string name;//Название
    string author;//Автор
    string pub;//Издательство
    int year;//Год
    int number_st;//Номер стелажа
 
    Node *l, *r; //Указатели на новые звенья
};
Node *root = NULL;//Начальное звено
 
void scrin(Node *, int x = NULL);
void ReadAndWrite(Node *&tree, int x = NULL);
void show(Node *tree);
void ShowAll(Node *&Tree = root);
 
int main()
{
    setlocale(0, "");
    if (!file.is_open()) 
    {
        cout << "Файл не может быть открыт\n"; 
        cin.get();
        return 0;
    }
    scrin(NULL);
    menu();
    cin.get();
    file.close();
    return 0;
}
 
void scrin(Node *tree, int x)
{
    if (!file.eof())
    {
        char buf[256];
        if (tree == NULL)
        {
            tree = new Node;
            root = tree;
            tree->l = tree->r = NULL; //Подзвенья инициализируем пустотой во избежание ошибок   
 
            ReadAndWrite(root, x);
            scrin(root);
        }
        else
        {
            int Ibuf;
            if (x == NULL)
            {
                file.getline(buf, 256, ' ');
                Ibuf = (int)buf;
            }
            else Ibuf = x;
            if (Ibuf < tree->x)
            {
                if (tree->l != NULL)
                    scrin(tree->l, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->l = new Node;  //Выделяем память левому подзвену. Именно подзвену, а не просто звену
                    tree->l->l = tree->l->r = NULL; //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    tree->l->x = (int)buf; //Записываем в левое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
            if (Ibuf > tree->x)   //Если нововведенный элемент x больше чем элемент x из семечка дерева, уходим вправо
            {
                if (tree->r != NULL)    scrin(tree->r, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->r = new Node;  //Выделяем память правому подзвену. Именно подзвену, а не просто звену
                    tree->r->l = tree->r->r = NULL; //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    tree->r->x = x; //Записываем в правое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
        }
    }
}
 
void ReadAndWrite( Node *&tree, int x)
{
    char buf[256];
    if (x != NULL) tree->x = x;
    else 
    {
        file.getline(buf, 256, ' ');
        tree->x = atoi(buf);
    }
    file.getline(buf, 256, ' ');
    tree->name = buf;
    file.getline(buf, 256, ' ');
    tree->author=buf;
    file >> tree->pub;
    file.getline(buf, 256, ' ');
    tree->year = atoi(buf);
    file.getline(buf, 256, ' ');
    tree->number_st = atoi(buf);
}
void menu()
{
    int num;
    string buf;
    int option;
    cout << "Введите номер опции" << endl;
    cout << "1)Поиск по инвентарному номеру" << endl;
    cout << "2)Выдача всего списка" << endl;
    cout << "3)Поиск по автору" << endl;
    cout << "4)Поиск по названию" << endl;
    cout << "5)Удаление информации о книге по инвентарному номеру" << endl; 
//  cout << "6)Поиск по инвентарному номеру" << endl;
    cin >> option;
    switch (option)
    {
        case 1: 
            
            cout << "Введите инвентарный номер для вывода информации" << endl;
            cin >> num;
            search(num);
            break;
        case 2: ShowAll();
            break;
        case 3: 
            cout << "Введите имя автора для вывода информации" << endl;
            cin >> buf;
            SearchByAuthor(buf);
            break;
        case 4:
            cout << "Введите название книги для вывода информации" << endl;
            cin >> buf;
            SearchByName(buf);
            break;
        case 5: 
            cout << "Введите номер книги для удаления";
            cin >> num;
            DeleteByNumber(num);
            break;
    }
    //cout << "Вернуться в меню(1) или завершить(2)";
//Да, я не сделал тут рекурсию меню, я это знаю. Я считаю, что сейчас это не так важно
    cin.get();
}
 
void search(int x, Node *&tree)
{
    if (tree == NULL) cout << "Запись не найдена" << endl;
    else if (x == tree->x)  show(tree);
    else if (x < tree->x)   search(x, tree->l);
    else if (x > tree->x)   search(x, tree->r);
}
 
void ShowAll(Node *&Tree)
{
 
    if (Tree != NULL) //Пока не встретится пустое звено
    {
        ShowAll(Tree->l); //Рекурсивная функция для вывода левого поддерева
        show(Tree); //Отображаем дерево
        ShowAll(Tree->r); //Рекурсивная функция для вывода правого поддерева
    }
}
void show(Node *tree)
{
    //if (tree->name == "") cout << "Запись удалина" << endl;
    //else 
    {
        cout << "Инв.ном.: " << tree->x;
        cout << "   Назв.: " << tree->name;
        cout << "   Автор: " << tree->author;
        cout << "   Издат: " << tree->pub;
        cout << "   Год: " << tree->year;
        cout << "   Номер ст.: " << tree->number_st<<endl<<endl;
    }
}
0
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
08.01.2018, 12:11 5
Ну так актуальный вариант покажи.
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
08.01.2018, 12:16  [ТС] 6
P.s. также по какой-то причине обнуляется год

Добавлено через 39 секунд
Я сейчас работаю с выводом, а дальше как пойдёт

Добавлено через 47 секунд
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
ifstream file("C:\\Users\\Admin\\Desktop\\тест.txt");
struct Node //Звено дерева (инв.номер, название, автор, издательство, год, номер стелажа)
{
    int x; //Инв.номер
    string name;//Название
    string author;//Автор
    string pub;//Издательство
    int year;//Год
    int number_st;//Номер стелажа
 
    Node *l, *r; //Указатели на новые звенья
};
Node *root = NULL;//Начальное звено
 
void menu();
void scrin(Node *, int x = NULL);
void ReadAndWrite(Node *&tree, int x = NULL);
void show(Node *tree);
void ShowAll(Node *&Tree = root);
 
int main()
{
    setlocale(0, "");
    if (!file.is_open())
    {
        cout << "Файл не может быть открыт\n";
        cin.get();
        return 0;
    }
    scrin(NULL);
    menu();
    cin.get();
    file.close();
    return 0;
}
 
void scrin(Node *tree, int x)
{
    if (!file.eof())
    {
        char buf[256];
        if (tree == NULL)
        {
            tree = new Node;
            root = tree;
            tree->l = tree->r = NULL; //Подзвенья инициализируем пустотой во избежание ошибок   
 
            ReadAndWrite(root, x);
            scrin(root);
        }
        else
        {
            int Ibuf;
            if (x == NULL)
            {
                file.getline(buf, 256, ' ');
                Ibuf = (int)buf;
            }
            else Ibuf = x;
            if (Ibuf < tree->x)
            {
                if (tree->l != NULL)
                    scrin(tree->l, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->l = new Node;  //Выделяем память левому подзвену. Именно подзвену, а не просто звену
                    tree->l->l = tree->l->r = NULL; //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    tree->l->x = (int)buf; //Записываем в левое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
            if (Ibuf > tree->x)   //Если нововведенный элемент x больше чем элемент x из семечка дерева, уходим вправо
            {
                if (tree->r != NULL)    scrin(tree->r, Ibuf); //При помощи рекурсии заталкиваем элемент на свободный участок
                else //Если элемент получил свой участок, то
                {
                    tree->r = new Node;  //Выделяем память правому подзвену. Именно подзвену, а не просто звену
                    tree->r->l = tree->r->r = NULL; //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    tree->r->x = x; //Записываем в правое подзвено записываемый элемент 
                    ReadAndWrite(tree, x);
                    scrin(root);
                }
            }
        }
    }
}
 
void ReadAndWrite(Node *&tree, int x)
{
    char buf[256];
    if (x != NULL) tree->x = x;
    else
    {
        file.getline(buf, 256, ' ');
        tree->x = atoi(buf);
    }
    file.getline(buf, 256, ' ');
    tree->name = buf;
    file.getline(buf, 256, ' ');
    tree->author = buf;
    file >> tree->pub;
    file.getline(buf, 256, ' ');
    tree->year = atoi(buf);
    file.getline(buf, 256, ' ');
    tree->number_st = atoi(buf);
}
void menu()
{
    int num;
    string buf;
    int option;
    cout << "Введите номер опции" << endl;
    cout << "1)Поиск по инвентарному номеру" << endl;
    cout << "2)Выдача всего списка" << endl;
    cout << "3)Поиск по автору" << endl;
    cout << "4)Поиск по названию" << endl;
    cout << "5)Удаление информации о книге по инвентарному номеру" << endl;
    //  cout << "6)Поиск по инвентарному номеру" << endl;
    cin >> option;
    switch (option)
    {
    case 1:
 
        cout << "Введите инвентарный номер для вывода информации" << endl;
        cin >> num;
        //search(num);
        break;
    case 2: ShowAll();
        break;
    case 3:
        cout << "Введите имя автора для вывода информации" << endl;
        cin >> buf;
        //SearchByAuthor(buf);
        break;
    case 4:
        cout << "Введите название книги для вывода информации" << endl;
        cin >> buf;
        //SearchByName(buf);
        break;
    case 5:
        cout << "Введите номер книги для удаления";
        cin >> num;
        //DeleteByNumber(num);
        break;
    }
    //cout << "Вернуться в меню(1) или завершить(2)";
    //Да, я не сделал тут рекурсию меню, я это знаю. Я считаю, что сейчас это не так важно
    cin.get();
}
 
 
void ShowAll(Node *&Tree)
{
 
    if (Tree != NULL) //Пока не встретится пустое звено
    {
        ShowAll(Tree->l); //Рекурсивная функция для вывода левого поддерева
        show(Tree); //Отображаем дерево
        ShowAll(Tree->r); //Рекурсивная функция для вывода правого поддерева
    }
}
void show(Node *tree)
{
    //if (tree->name == "") cout << "Запись удалина" << endl;
    //else 
    {
        cout << "Инв.ном.: " << tree->x;
        cout << "   Назв.: " << tree->name;
        cout << "   Автор: " << tree->author;
        cout << "   Издат.: " << tree->pub;
        cout << "   Год: " << tree->year;
        cout << "   Номер ст.: " << tree->number_st << endl << endl;
    }
}
этот код будет вернее, если не будет работать вывод, то не будет работать ничего
0
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
08.01.2018, 12:20 7
В чём смысл 63-й строки?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
08.01.2018, 17:06  [ТС] 8
Там производится запись потом сравнение. Я уже переписал код, он работает, по крайней мере вывод.

Добавлено через 56 секунд
Я переписал его с нуля, но это того стоило.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2018, 17:06

Реализация функции char *padl(const char *string, int len, int c=' ')
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо...

Форматирование строк, char to int & int to char
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот всё просто в pawn ...

Как в выделенную память записать поочередно число int, массив char[n], и еще число int
Выделяю память void* Start=malloc(Size); Как туда записать поочередно число int, массив char,...

Ошибка "error C2446: :: нет преобразования "int" в "char *"
Ошибка: &quot;error C2446: :: нет преобразования &quot;int&quot; в &quot;char *&quot; Когда нажимаю двойным кликом на...


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

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

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