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

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

06.11.2019, 21:00. Просмотров 5226. Ответов 20
Метки c++ (Все метки)

Написал код. А он мне в visual 2019 не хочет компилировать. И выдаёт странные ошибки. Может вы поможете.
Задание звучало так:
Составить программу, которая содержит текущую информацию о
книгах в библиотеке. Сведения о книгах включают:
номер УДК; фамилию и инициалы автора;
название; год издания;
количество экземпляров данной книги в библиотеке. Программа
должна обеспечивать:
начальное формирование данных обо всех книгах в библиотеке в
виде списка;
при выдаче каждой книги на руки вводится номер УДК, и программа
уменьшает значение количества книг на единицу или выдает
сообщение о том, что требуемой книги в библиотеке нет или
требуемая книга находится на руках;
при возвращении каждой книги вводится номер УДК, и программа
увеличивает значение количества книг на единицу;
по запросу выдаются сведения о наличии книг в библиотеке.

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
#include "stdio.h"
#include "conio.h"
#include <cstdlib>
#include <stdlib.h>
#include <iostream>
using namespace std;
const int lim = 25;
 
 
 
void getline(char* str, int lim)
{
    int c, i;
    c = 1;
    for (i = 0; (i < lim - 1) && (c != (int)'\n'); i++)
    {
        c = getchar();
        str[i] = c;
    }
    str[i] = '\0';
}
 
struct book
{
    int UDKnumber;
    char autor[lim];
    char bookname[lim];
    long int year;
    int kolvo;
    book* next;
};
book* firstbook = new book;
book* lastbook = firstbook;
bool isFirst = true;
 
 
 
 
int _tmain(int argc)
{
 
    int n, i, c, j, k;
    int zapros;
    char* str;
    printf("Opredelite assortiment biblioteki\n");
    cin >> n;
 
    for (i = 0; i <= n - 1; i++)
    {
        if (isFirst) isFirst = false;
        else
        {
            lastbook->next = new book;
            lastbook = lastbook->next;
        }
        printf("ZAPIS #%d\n", i + 1);
        printf("UDK: ");
        cin >> lastbook->UDKnumber;
        putchar((int)'\n');
        fflush(stdin);
        printf("Autor: ");
        str = &lastbook->autor[0];
        getline(str, lim);
        putchar((int)'\n');
        printf("BookName: ");
        str = &lastbook->bookname[0];
        getline(str, lim);
        putchar((int)'\n');
        printf("Year: ");
        cin >> lastbook->year;
        putchar((int)'\n');
        printf("Kolvo: ");
        cin >> lastbook->kolvo;
        lastbook->next = NULL;
    }
    for (k = 0; k >= 0; k++)
    {
        fflush(stdin);
        printf("Vibor operacii\n");
        printf("1-Vidacha knigi 2-Sdacha knigi 3-Zapros o nalichii knig 4-Exit Program\n");
        c = getchar();
        switch (c)
        {
        case '1':
            printf("Vvedite zapros UDK: ");
            cin >> zapros;
            j = 0;
            for (book* t = firstbook; t != NULL; t = t->next)
            {
                if (zapros == t->UDKnumber)
                {
                    if (t->kolvo != 0)
                    {
                        t->kolvo = t->kolvo - 1;
                        break;
                    }
                    else
                    {
                        printf("kniga na danniy moment otsutstvuet\n");
                        break;
                    }
                }
                if (j == n - 1) printf("takoy knigi net v biblioteke\n");
                j++;
            }
            break;
        case '2':
            printf("Vvedite zapros UDK: ");
            cin >> zapros;
            j = 0;
            for (book* t = firstbook; t != NULL; t = t->next)
            {
                if (zapros == t->UDKnumber)
                {
                    t->kolvo = t->kolvo + 1;
                    break;
                }
                if (j == n - 1) printf("takoy knigi net v biblioteke\n");
                t = t->next;
                j++;
            }
            break;
        case '3':
            printf("UDK | AUTOR     | NAMEBOOK    | YEAR | COUNT\n");
            for (book* t = firstbook; t != NULL; t = t->next)
            {
                printf("%d      ", t->UDKnumber);
                for (i = 0; t->autor[i] != 10; i++)
                    cout << t->autor[i];
                cout << "    ";
                for (i = 0; t->bookname[i] != 10; i++)
                    cout << t->bookname[i];
                cout << "    ";
                printf("%d  ", t->year);
                printf("%d\n", t->kolvo);
            }
            break;
        case '4':
            return -1;
 
        }
    }
 
    delete firstbook;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2019, 21:00
Ответы с готовыми решениями:

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

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

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

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

20
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
06.11.2019, 21:56 2
Лучший ответ Сообщение было отмечено dimazavt как решение

Решение

dimazavt,
попробуйте так:
Кликните здесь для просмотра всего текста
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
#include "stdio.h"
#include "conio.h"
#include <cstdlib>
#include <stdlib.h>
#include <iostream>
using namespace std;
const int lim = 25;
 
 
 
void getline(char* str, int lim)
{   int c, i;
    c = 1;
    for (i = 0; (i < lim - 1) && (c != (int)'\n'); i++)
    {   c = getchar();
        str[i] = c;
    }
    str[i] = '\0';
}
 
struct book
{   int UDKnumber;
    char autor[lim];
    char bookname[lim];
    int year;
    int kolvo;
    book* next;
};
book* firstbook = new book;
book* lastbook = firstbook;
bool isFirst = true;
 
int main()
{
    int n, i, c, j, k;
    int zapros;
    char* str;
    printf("Opredelite assortiment biblioteki\n");
    cin >> n;
 
    for (i = 0; i <= n - 1; i++)
    {   if (isFirst) isFirst = false;
        else
        {   lastbook->next = new book;
            lastbook = lastbook->next;
        }
        printf("ZAPIS #%d\n", i + 1);
        printf("UDK: ");
        cin >> lastbook->UDKnumber;
        putchar((int)'\n');
        fflush(stdin);
        printf("Autor: ");
        str = &lastbook->autor[0];
        getline(str, lim);
        putchar((int)'\n');
        printf("BookName: ");
        str = &lastbook->bookname[0];
        getline(str, lim);
        putchar((int)'\n');
        printf("Year: ");
        cin >> lastbook->year;
        putchar((int)'\n');
        printf("Kolvo: ");
        cin >> lastbook->kolvo;
        lastbook->next = NULL;
    }
    for (k = 0; k >= 0; k++)
    {   fflush(stdin);
        printf("Vibor operacii\n");
        printf("1-Vidacha knigi 2-Sdacha knigi 3-Zapros o nalichii knig 4-Exit Program\n");
        c = getchar();
        switch (c)
        {   case '1':
                printf("Vvedite zapros UDK: ");
                cin >> zapros;
                j = 0;
                for (book* t = firstbook; t != NULL; t = t->next)
                {   if (zapros == t->UDKnumber)
                    {   if (t->kolvo != 0)
                        {   t->kolvo = t->kolvo - 1;
                            break;
                        }
                        else
                        {   printf("kniga na danniy moment otsutstvuet\n");
                            break;
                        }
                    }
                    if (j == n - 1) printf("takoy knigi net v biblioteke\n");
                    j++;
                }
                break;
            case '2':
                printf("Vvedite zapros UDK: ");
                cin >> zapros;
                j = 0;
                for (book* t = firstbook; t != NULL; t = t->next)
                {   if (zapros == t->UDKnumber)
                    {   t->kolvo = t->kolvo + 1;
                        break;
                    }
                    if (j == n - 1) printf("takoy knigi net v biblioteke\n");
                    t = t->next;
                    j++;
                }
                break;
            case '3':
                printf("UDK | AUTOR     | NAMEBOOK    | YEAR | COUNT\n");
                for (book* t = firstbook; t != NULL; t = t->next)
                {   printf("%d      ", t->UDKnumber);
                    for (i = 0; t->autor[i] != 10; i++)
                        cout << t->autor[i];
                    cout << "    ";
                    for (i = 0; t->bookname[i] != 10; i++)
                        cout << t->bookname[i];
                    cout << "    ";
                    printf("%d  ", t->year);
                    printf("%d\n", t->kolvo);
                }
                break;
            case '4':
                return -1;
 
        }
    }
 
    delete firstbook;
 
}


у меня компилируется.
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
06.11.2019, 23:15  [ТС] 3
XLAT, спасибо огромное ЗАРАБОТАЛО.
1
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 12:00  [ТС] 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
#include <iostream>
#include <cstring>
using namespace std;
 
struct book
{
    int UDKnumber;
    char autor[25];
    char bookname[50];
    int year;
    int kolvo;
    book* next;
};
 
book* firstbook = new book;
book* lastbook = firstbook;
bool isFirst = true;
 
int main()
{
    int n, i, c, j, k;
    int zapros;
    char* str;
    cout << "Opredelite assortiment biblioteki" << endl;
    cin >> n;
 
    for(i=0;i<n;i++)
    {
        if (isFirst) isFirst = false;
        else
        {
            lastbook->next = new book;
            lastbook = lastbook->next;
        }
        cout << "ZAPIS"<< i + 1 << endl;
        
        
        cout << "UDK: ";  //Индификатор киги
        cin >> lastbook->UDKnumber;//Индификатор киги
        fflush(stdin);  //Индификатор киги
        putchar((int)'\n'); //Индификатор киги
 
        cout << "Autor: ";  //автор киниги
        str = &lastbook->autor[0];  //автор киниги
        fflush(stdin);  //автор киниги
        cin.getline(str, 25);   //автор киниги
        putchar((int)'\n'); //автор киниги
        fflush(stdin);  //автор киниги
 
        cout << "BookName: "; //наиминования книги
        str = &lastbook->bookname[0];   //наиминования книги
        fflush(stdin);  //наиминования книги
        cin.getline(str, 50);   //наиминования книги
        putchar((int)'\n'); //наиминования книги
        fflush(stdin);  //наиминования книги
 
        cout << "Year: "; //ГОД ВЫПУСКА КНИГИ
        cin >> lastbook->year;  //ГОД ВЫПУСКА КНИГИ
        putchar((int)'\n'); //ГОД ВЫПУСКА КНИГИ
 
        cout << "Kolvo: "; //количество книг
        cin >> lastbook->kolvo; //количество книг
        lastbook->next = NULL;  //количество книг
    }
}
0
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
07.11.2019, 12:34 5
очевидно ошибка у вас возникает при попытке ввода символа отличного от цифры?
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 12:46  [ТС] 6
нет, я ввожу всё нормально. но он пропускает автора и перескакивает на наименования книги.
0
Миниатюры
Составить программу, которая содержит текущую информацию о книгах в библиотеке  
4552 / 3061 / 1281
Регистрация: 07.05.2019
Сообщений: 9,442
Записей в блоге: 1
07.11.2019, 12:53 7
Цитата Сообщение от dimazavt Посмотреть сообщение
При вводе данных пропускается
Автор и сразу выводится название книги.
Скорее всего автор не помещается в char autor[25], сделай там размер побольше - char autor[64]
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 12:56  [ТС] 8
oleg-m1973, К сожалению это не помогло. Я с этим уже бьюсь несколько часов.
0
4552 / 3061 / 1281
Регистрация: 07.05.2019
Сообщений: 9,442
Записей в блоге: 1
07.11.2019, 13:18 9
Цитата Сообщение от dimazavt Посмотреть сообщение
oleg-m1973, К сожалению это не помогло. Я с этим уже бьюсь несколько часов.
А здесь исправил?
Цитата Сообщение от dimazavt Посмотреть сообщение
cin.getline(str, 25);   //автор киниги
Добавлено через 1 минуту
И убери putchar((int)'\n') - зачем они здесь?

Добавлено через 19 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        cout << "UDK: ";  //Индификатор киги
        cin >> lastbook->UDKnumber;//Индификатор киги
 
        cout << "Autor: ";  //автор киниги
        cin.ignore();
        cin.getline(lastbook->autor, std::size(lastbook->autor));   //автор киниги
 
        cout << "BookName: "; //наиминования книги
        cin.ignore();
        cin.getline(lastbook->bookname, std::size(lastbook->bookname));   //наиминования книги
 
        cout << "Year: "; //ГОД ВЫПУСКА КНИГИ
        cin >> lastbook->year;  //ГОД ВЫПУСКА КНИГИ
1
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 13:19  [ТС] 10
oleg-m1973, да я всё исправил
и команда putchar((int)'\n') для переноса на следующую строк.

Добавлено через 1 минуту
oleg-m1973, Заработало, спасибо
0
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
07.11.2019, 13:29 11
dimazavt,
вот как бы я переписал ваш код,
чтобы ближе мне по духу:
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
#include <iostream>
using namespace std;
 
///----------------------------------------------------------------------------|
/// Ввод с защитой от дурака.
///----------------------------------------------------------------------------:
template<class T>
T input_user(const char* promt, int n = -1)
{   std::cout << promt << " ";
    if(n != -1) std::cout << "[" << n <<"] : ";
    T my;
    while(!(std::cin>>my) || std::cin.get() != '\n')
    {   std::cout << "Incorrect input!\n\n";
        std::cout << promt << " ";
        std::cin.clear();
        std::cin.sync();
    }
    return my;
}
 
void CLEARKEYBUFFER()
{   std::cin.clear();
    std::cin.sync();
}
 
struct book
{   int   UDKnumber;
    char  autor   [25];
    char  bookname[50];
    int   year;
    int   kolvo;
    book* next;
};
 
book* books;
 
int main()
{   setlocale(0, "");
 
    int zapros;
    
    int n; cout << "Opredelite assortiment biblioteki\n"; cin  >> n;
    books = new book[n];
 
    for(int i = 0; i < n; i++)
    {   
        cout << "ZAPIS: "<< i + 1 << " -----------------------------------:\n";
        
        //CLEARKEYBUFFER();
        //cout << "UDK: ";
        //cin >> books[i].UDKnumber;
            ///-----------------------------------------|
            /// ВВод с защитой от дурака.               |
            /// (вместо вверхних трёх строчек.)         |
            ///-----------------------------------------:
            books[i].UDKnumber = input_user<int>("UDK: ");
        std::cout << "// Индификатор киги  : " << (books+i)->UDKnumber << "\n";
 
        CLEARKEYBUFFER();
        cout << "Autor: ";
        cin.getline(books[i].autor, sizeof(books[i].autor));
        std::cout << "// Автор киниги      : " << (books+i)->autor     << "\n";
 
        CLEARKEYBUFFER();
        cout << "BookName: ";
        cin.getline(books[i].bookname, sizeof(books[i].bookname));
        std::cout << "// Наиминования книги: " << (books+i)->bookname  << "\n";
 
        CLEARKEYBUFFER();
        cout << "Year: ";
        cin >> books[i].year;
        std::cout << "// ГОД ВЫПУСКА КНИГИ : " << (books+i)->year      << "\n";
 
        CLEARKEYBUFFER();
        cout << "Kolvo: ";
        cin >> books[i].kolvo;
        std::cout << "// Количество книг   : " << (books+i)->kolvo     << "\n";
    }
}
там не в едином стиле кое-где, но это для демо-вариантов.
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 14:50  [ТС] 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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
 
using namespace std;
 
struct LIBRARY
{
    char nomer[30];
    char FIO[30];
    char nazvanie[40];
    int Year;
    int kolvo;
};
 
struct STR
{
    LIBRARY* Library;
    STR* next;
};
 
STR* create(LIBRARY* Library) //начальное формирование списка
{
    STR* root = new STR;
    root->Library = Library;
    root->next = NULL;
    return root;
}
 
 
 
void add(LIBRARY* Library, STR* root) //добавление нового элемента списка
{
    while (root->next)
        root = root->next;
    root->next = new STR;
    root->next->Library = Library;
    root->next->next = NULL;
}
 
void printLIBRARY(LIBRARY* Library) //вывод на экран  
{
 
    cout << "Nomer => " << Library->nomer << endl;
    cout << "FIO => " << Library->FIO << endl;
    cout << "Nazvanie => " << Library->nazvanie << endl;
    cout << "Year => " << Library->Year << endl;
    cout << "Kolvo => " << Library->kolvo << endl;
    cout << endl;
 
}
LIBRARY* makeLIBRARY() //добавление книги
{
    cout << "Enter book data:" << endl;
    LIBRARY* Library = new LIBRARY;
    fflush(stdin);
    cin.ignore();
    cout << "Enter book nomer: => ";
    cin.getline(Library->nomer, 30);
 
    cout << "Enter Author's FIO:  => ";
    cin.getline(Library->FIO, 30);
 
    cout << "Enter book name: => ";
    cin.getline(Library->nazvanie, 40);
 
    cout << "Enter made year:  => ";
    cin >> Library->Year;
 
    cout << "Enter count of books:  => ";
    cin >> Library->kolvo;
 
    return Library;
}
int choice()
{
    int answer;
    cout << "Main menu" << endl;
    cout << "1. Add new books to the list" << endl;
    cout << "2. Print LIBRARY at list" << endl;
    cout << "3. Vidacha knigi" << endl;
    cout << "4. Sdacha knigi" << endl;
    cout << "5. Exit" << endl;
    cout << "Enter your choice: ";
    cin >> answer;
    fflush(stdin);
    if (answer >= 1 && answer <= 5)
        return answer;
    else
        return 0;
}
 
STR* vidat(STR* str) //выдать книгу
{
    STR* last = str, * root = str;
    char qwe[30];
    char qw[30], q[1];
    cout << "Enter nomer of book => " << endl;
    cin.getline(qwe, 30);
    while (root)
    {
        if (!strcmp(qwe, root->Library->nomer))
        {
            {
                printLIBRARY(root->Library);
                cout << "Would you like to take this book ? ? (y/n) " << endl;// Хотят ли взять книгу
                char c;
                cin.get(c);
                if (c == 'y')
                {
                    root->Library->kolvo - 1;
                    
 
                }
                
            }
        }
        else
            cout << "Knigi net";
    }
 
    cout << "Kniga vidana" << endl;
    cout << "Ostaloc:"<< root->Library->kolvo << endl;
    return str;
}
 
STR* sat(STR* str)
{
    STR* last = str, * root = str;
    char qwe[30];
    char qw[30], q[1];
    cout << "Enter nomer of book => " << endl;
    cin.getline(qwe, 30);
    while (root)
    {
        if (!strcmp(qwe, root->Library->nomer))
        {
            printLIBRARY(root->Library);
            cout << "Do you want to hand over the book ? (y/n) " << endl;// Хотят ли сдать книгу
            char c;
            cin.get(c);
            if (c == 'y')
            {
                root->Library->kolvo ++;
                cout << root->Library->kolvo << endl;
            }
        }
    }
    cout << "book returned to the library" << endl;
    cout << "Stalo:" << root->Library->kolvo << endl;
 
}
 
int main()
{
    STR* root = NULL;
    int ch;
    while (1)
    {
        ch = choice();
        if (ch == 1)
        {
            cout << endl;
            if (root == NULL)
                root = create(makeLIBRARY());
            else
                add(makeLIBRARY(), root);
        }
 
        else if (ch == 2)
        {
            cout << endl;
            int i = 0;
            int N = 0;
 
            STR* proot = root;
            while (root)
            {
                N++;
                root = root->next;
            }
 
            LIBRARY* buf;
            LIBRARY** pLibrary = new LIBRARY * [N];
            root = proot;
 
            while (root)
            {
                pLibrary[i] = root->Library;
                root = root->next;
                i++;
            }
 
            root = proot;
 
 
            for (i = 0; i < N; i++)
                printLIBRARY(pLibrary[i]);
 
        }
 
        else if (ch == 3) // выдать книгу
        {
            root = vidat(root);
        }
 
        else if (ch == 4) //сдать книгу
        {
            root = sat(root);
        }
    }
    return 0;
}
0
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
07.11.2019, 15:49 13
dimazavt, я могу переписать ваш код.
но мне потребуются дополнительные структуры.
1. Класс(он же и структура) библиотеки.
2. Класс Гуй. обеспечивающий взаимодействие с юзером.

как это будет противоречить с вашим заданием???

ваша программа написана в таком стиле, в который я не умею.
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 19:29  [ТС] 14
XLAT, не не будет.

Добавлено через 2 часа 13 минут
XLAT, Буду благодарен если поможете.
0
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
07.11.2019, 20:26 15
dimazavt,
в условиях есть использование именно списка или можно взять обычный массив?
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 20:48  [ТС] 16
XLAT, Мне ответили что надо список. Но если вы сделаете что-нибудь, то я доделаю. Просто я только начал изучать данный язык, и очень мало знаю.
1
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
07.11.2019, 21:01 17
Лучший ответ Сообщение было отмечено dimazavt как решение

Решение

dimazavt,
я тут взял первый попавшийся, и надо переделывать:
недоделка на глючном списке
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
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
///----------------------------------------------------------------------------|
/// 1. начальное формирование данных обо всех книгах в библиотеке в виде списка;
/// 2. при выдаче каждои? книги на руки вводится номер УДК, и программа
///    уменьшает значение количества книг на единицу или выдает
///    сообщение о том, что требуемои? книги в библиотеке нет или
///    требуемая книга находится на руках;
/// 3. при возвращении каждои? книги вводится номер УДК, и программа
///    увеличивает значение количества книг на единицу;
/// 4. по запросу выдаются сведения о наличии книг в библиотеке.
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
 
using namespace std;
 
struct sBook
{   char nomer   [30];
    char FIO     [30];
    char nazvanie[40];
    int  Year;
    int  kolvo;
    sBook()
    {   cout << "Enter book data:------------------------------------------:\n";
        cin.ignore();
        
        cout << "Enter book nomer: => ";
        cin.getline(nomer, 30);
 
        cout << "Enter Author's FIO:  => ";
        cin.getline(FIO, 30);
 
        cout << "Enter book name: => ";
        cin.getline(nazvanie, 40);
 
        cout << "Enter made year:  => ";
        cin >> Year;
 
        cout << "Enter count of books:  => ";
        cin >> kolvo;
    }
    
    void info() 
    {   cout << "\nNomer    => " << nomer;
        cout << "\nFIO      => " << FIO;
        cout << "\nNazvanie => " << nazvanie;
        cout << "\nYear     => " << Year;
        cout << "\nKolvo    => " << kolvo;
        cout << "\n\n";
    }
};
 
///----------------------------------------------------------------------------|
/// Структура, являющаяся звеном списка.
///----------------------------------------------------------------------------:
struct Node
{   sBook     x; // Значение x будет передаваться в список.
    Node*  Next; // Указатель на следующий  элемент списка.
    Node*  Prev; // Указатель на предыдущий элемент списка.
};
 
///----------------------------------------------------------------------------|
/// Создаем тип данных Список
///----------------------------------------------------------------------------:
class List                              
{   Node* Head;
    Node* Tail; // Указатели на адреса начала списка и его конца.
    int amount;
    
public:
    List() : Head(NULL), Tail(NULL), amount(0)
    {};
   ~List()
    {   while (Head)           // Пока по адресу на начало списка что-то есть.
        {   Tail = Head->Next; // Резервная копия адреса следующего звена списка.
            delete Head;       // Очистка памяти от первого звена.
            Head = Tail;       // Смена адреса начала на адр.следующ.элемента.
        }
    }
    
    std::string name;
    
    ///-------------------------------|
    /// Отображение списка на экране. |
    ///-------------------------------:
    void Show()
    {   show_beg();
        show_end();
    }
    
    void show_beg()
    {   cout << "///-------------------------|\n";
        cout << "/// ВЫВОДИМ СПИСОК С НАЧАЛА |\n";
        cout << "///-------------------------:\n";
        
        if(amount == 0)
        {   cout << "... список пуст!\n";
            return;
        }
        
        Node *temp = Head;
        
        for (int i = 1; temp != NULL; ++i)
        {   std::cout << "Номер в списке-----------------------: " << i << "\n";
            temp->x.info();
            temp = temp->Next;
        }
        cout << "\n";
    }
    
    void show_end()
    {   cout << "///------------------------|\n";
        cout << "/// ВЫВОДИМ СПИСОК С КОНЦА |\n";
        cout << "///------------------------:\n";
        
        if(amount == 0)
        {   cout << "... список пуст!\n";
            return;
        }
        
        Node *temp= Tail;
        while (temp != NULL)
        {   temp->x.info();
            temp = temp->Prev;
        }
        cout << "\n";
    }
 
    ///-------------------------------|
    /// Добавление элемента в список. |
    ///-------------------------------:
    void Add()
    {   amount++;
        Node *temp = new
        Node;                  // Выделение памяти под новый элемент структуры.
        temp->Next = NULL;     // Изначально по следующему адресу пусто.
 
        if (Head != NULL)      // Если список не пуст.
        {   temp->Prev = Tail; // Адрес на предыдущий элемент в соотв.поле.
            Tail->Next = temp; // Адрес следующего за хвостом элемента.
            Tail = temp;       // Меняем адрес хвоста.
        }
        else                   // Если список пустой.
        {   temp->Prev = NULL; // Предыдущий элемент указывает в пустоту.
            Head = Tail = temp;// Голова=Хвост=тот элемент, что сейчас добавили.
        }
    }
    
    void Del_Tail()
    {   Del(amount - 1);
        std::cout << "Операция удаления элемента с хвоста завершена!\n";
    }
    
    void Del_Head()
    {   Del(0);
        std::cout << "Операция удаления элемента с головы завершена!\n";
    }
    
    void Del(int n = 0)
    {   Node* temp;
        if(check(n))
        {   if(n == 0)
            {   if(amount == 1)
                {   temp = Head;
                    Head = NULL;
                    Tail = NULL;
                }
                else
                {   temp = Head;
                    Head = Head->Next;
                }
                
            }
            else if(n == amount - 1)
            {   temp = Tail;
                Tail = Head->Prev;
            }
            else if(n == 1)
            {   temp = Head;
                Head = NULL;
                Tail = NULL;
            }
            else if(n < amount/2)
            {   temp = Head;
                for(int i = 0; i != n; i++)
                {   temp = temp->Next;
                }
                temp->Next->Prev = temp->Prev;
                temp->Prev->Next = temp->Next;
            }
            else
            {   temp = Tail;
                for(int i = amount-1; i != n; i--)
                {   temp = temp->Prev;
                }
                temp->Next->Prev = temp->Prev;
                temp->Prev->Next = temp->Next;
            }
            
            delete temp;
            amount--;
        }
        else
        {   show_error_mess_01(n);
        }
    }
    
    bool check(int n)
    {   if( !((n >= amount) || (n < 0)) ) return true;
        else return false;
    }
    
    void show_error_mess_01(int _n)
    {   std::cout << "ERROR: Элемент с номером " << _n << " отсутствует!\n";
    }
};
 
///----------------------------------------------------------------------------|
/// GUI класс для List.
///----------------------------------------------------------------------------:
class cGUI_list
{   List* lst;
public:
    cGUI_list(List* _lst) : lst(_lst)
    {
    }
    void change(List* _lst)
    {   lst = _lst;
    }
    
    void work()
    {   while (true)
        {   system("CLS");
            cout << "|-----------------------------------" << lst->name << "\n";
            cout << "1. Добавить книгу.\n";
            cout << "2. Просмотр списка книг с начала.\n";
            cout << "3. Просмотр списка книг с конца.\n";
            cout << "4. Удалить XXX книгу.\n";
            cout << "5. Взять книгу на дом.\n";
            cout << "6. Определение принадлежности элемента списка.\n";
            cout << "7. Выход.\n\n";
            cout << "Что будем редактировать? : ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   lst->Add();
                    cout << "Элемент был добавлен!\n";
                    break;
                }
                case 2:
                {   lst->show_beg();
                    break;
                }
                case 3:
                {   lst->show_end();
                    break;
                }
                case 4:
                {   del_book();
                    break;
                }
                case 5:
                {   ;
                    break;
                }
                case 6:
                {   cout << "Введите номер элемента для проверки его наличия: ";
                    int n;
                    cin >> n;
                    if(lst->check(n)) cout << "Есть такой элемент!\n";
                    else lst->show_error_mess_01(n);
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
            _getch();
        }
    }
    
    void del_book()
    {   while (true)
        {   system("CLS");
            cout << "|-----------------------------------" << lst->name << "\n";
            cout << "1. Просмотр списка книг с начала.\n";
            cout << "2. Ввести порядковый номер для удаления.\n";
            cout << "7. Выход.\n\n";
            cout << "Что будем делать? : ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   lst->show_beg();
                    break;
                }
                case 2:
                {   int n; cin >> n;
                    lst->Del(n);
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
            _getch();
        }
    }
};
 
///----------------------------------------------------------------------------|
/// Корневой GUI класс программы.
///----------------------------------------------------------------------------:
class cGUI
{   ///--------------------------------------------|
    /// Создаем набор однотипных списков в памяти. |
    ///--------------------------------------------:
    List lst[2];
    cGUI_list GUI_list;
public:
    cGUI() : GUI_list(NULL)
    {   lst[0].name = "Художественная.";
        lst[1].name = "Техническая.";
        work();
    }
    
    void work()
    {   while (true)
        {   system("CLS");
            cout << "1. Редактировать список художественно лит-ры.\n";
            cout << "2. Редактировать список технической лит-ры.\n";
            cout << "7. Выход\n\n";
            cout << "Выберите команду: ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   GUI_list.change(&lst[0]);
                    GUI_list.work();
                    break;
                }
                case 2:
                {   GUI_list.change(&lst[1]);
                    GUI_list.work();
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
        }
    }
};
 
///----------------------------------------------------------------------------|
/// Старт.
///----------------------------------------------------------------------------:
int main ()
{   setlocale(0, "");
 
    ///--------------------------|
    /// Создаем и запускаем гуй. |
    ///--------------------------:
    cGUI GUI;
    
    return 0;
}


т.к. приходится отвлекаться постоянно, моск развернут не в эту сторону
0
3 / 3 / 0
Регистрация: 11.09.2017
Сообщений: 67
07.11.2019, 21:23  [ТС] 18
XLAT, Щас буду доперать как это работает.
0
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
07.11.2019, 21:47 19
Цитата Сообщение от dimazavt Посмотреть сообщение
Щас буду доперать как это работает.
тут что важно понять:
отделить саму задачу от абстрактного контейнера, которым является лист.
один раз его написали - ставите на него копирайт my и дальше используете для всего круга задач,
в которых он нужен.
Разумеется задачи прежде всего сначала учебные,
но как ни странно в будущем став джедаем кодирования вы снова столкнетесь с необходимостью использовать
нечто свое, более подходящее для удовлетворения узко-специализированных требований.


можно сказать это один из основных фундаментов технологии программирования на плюсах.
0
бах-бах и в продакшен!
1694 / 1006 / 381
Регистрация: 23.09.2014
Сообщений: 3,254
Записей в блоге: 4
10.11.2019, 16:49 20
Лучший ответ Сообщение было отмечено dimazavt как решение

Решение

dimazavt,
переписал полностью список,
тестите:
Кликните здесь для просмотра всего текста
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
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
#include <iostream>
 
using namespace std;
 
struct sBook
{   char nomer   [30];
    char FIO     [30];
    char nazvanie[40];
    int  Year;
    int  kolvo;
    sBook()
    {   cout << "Enter book data:------------------------------------------:\n";
        cin.ignore();
        
        cout << "Enter book nomer: => ";
        cin.getline(nomer, 30);
 
        cout << "Enter Author's FIO:  => ";
        cin.getline(FIO, 30);
 
        cout << "Enter book name: => ";
        cin.getline(nazvanie, 40);
 
        cout << "Enter made year:  => ";
        cin >> Year;
 
        cout << "Enter count of books:  => ";
        cin >> kolvo;
    }
    
    void info() 
    {   cout << "\nNomer    => " << nomer;
        cout << "\nFIO      => " << FIO;
        cout << "\nNazvanie => " << nazvanie;
        cout << "\nYear     => " << Year;
        cout << "\nKolvo    => " << kolvo;
        cout << "\n\n";
    }
};
 
///----------------------------------------------------------------------------|
/// struct smylist;
///     Внимание: Требуется более тщательное тестирование
///               для выявление скрытых и возможно даже явных ошибок!
///----------------------------------------------------------------------------:
///--------------------------------------------------------------------speeddoc:
/// Интерфейс структуры smylist:
///     Группа ДОБАВИТЬ элемент:
///         void push();           // В конец(хвост, в низ) списка.           :1
///         bool insert(size_t n); // В произвольное(&1) место списка.        :2
///
///     Группа УДАЛИТЬ элемент:
///         void pop_back();       // Удалить хвостовой элемент из списка.    :3
///         bool erase(size_t n);  // Удалить произвольный(&1) элем.из списка.:4
///
///     Группа ДОСТУПА к элементу:
///         T* back();             // Доступ к хвостовому элементу списка.    :5
///         T* top(size_t n);      // Доступ к произвольному(&1) элем.списка. :6
///         T* top_down();         // Доступ к следующему элементу.           :7
///         T* top_down();         // Доступ к предыдущему элементу.          :8
///         
///     Группа СЕРВИС:
///         size_t size();         // Возвращает количество элементов.        :9
///                                // Если 0, то список путой!
///         void info();           // Вывод списка для просмотра на экран.   :10
///                                // Необходимо в структуре элемента иметь
///                                // метод info()! иначе ошибка компиляции.
///
///     ЗАМЕЧАНИЯ:
///         по работе:
///         1.  Т.к учебные классы часто бывают лишены печати совершенства.
///             рекомендую создавать новый объект непосредственно в списке!
///             Будет задействован дефолтный(без аргументов) конструктор
///             пользовательской структуры.
///         пример:
///             smylist list;
///                     list.push_back();
///                     list.back()->init(); // init(); пользовательский метод.
///                     // list.back() - указатель на пользовательский объект!
///         2.  Если же всё-таки ваш класс написан с требованиями
///             "правила трёх", то можно так:
///         пример:
///             my_class my_obj(arg, ...);
///             smylist list;
///                     list.push_back();
///                    *list.back() = my_obj;
///
///             вообщем не стал я добавлять это  для универсальности :)
///             [в планах]: определить метод smylist::push_back(T& obj);
///
///     (&1) --- если такое место существует, иначе возвращается NULL/false.
///----------------------------------------------------------------------------.
#define DEBUGLOG_
#ifdef  DEBUGLOG_
    #define DEBUGLOG(v) std::cout       << "\n[DEBUGLOG]-----------:\n" \
                                        << "func: " << __func__ << "\n" \
                                        << "line: " << __LINE__ << "\n" \
                                        << v << "\n"
    #define ASSERT(v)   if(!(v))\
                        {   std::cout   << "\n[ASSERT!]-------------:\n"\
                                        << "func: " << __func__ << "\n" \
                                        << "line: " << __LINE__ << "\n\n";\
                        }
    #define LOG(v) std::cout << "func: " << __func__ \
                                         << " >>> " << #v " = " << v << "\n"
#else
    #define DEBUGLOG(v)
    #define ASSERT(v)
    #define LOG(v)
#endif
 
using T = sBook;
//template<class T>
struct smylist
{   struct node
    {   node() : next(NULL), prev(NULL)
        {
        }
        T o;
        node* next;
        node* prev;
    };
    
    smylist() : size_(0), head(NULL), down(NULL), ptop(NULL)
    {   
    }
   ~smylist()
    {   node* temp = down;
        size_t   k = 0;
        while(temp)
        {   temp = temp->prev;
            delete down;
            down = temp;
            k++;
        }
        
#ifdef  DEBUGLOG_
        ASSERT(k == size_)
        DEBUGLOG("Кол-во удаленных деструктором узлов:");
        std::cout << k;
#endif
    }
    
    ///-------------------------------------------------------------------push:1
    void push()
    {   node* temp = new node;
        size_++;
        
        if(head == NULL)
        {   head = temp;
            down = temp;
            ptop = temp;
        }
        else
        {   temp->prev = down;
            down->next = temp;
            down       = temp;
        }
    }
    
    ///-----------------------------------------------------------------insert:2
    bool insert(size_t n)
    {   if(n > size_)
        {   DEBUGLOG("Недействительный номер списка!");
            return false;
        }
        
        if(n == size_ || n == 0)
        {   push();
            return true;
        }
        
        size_++;
        ptop = head;
        for(size_t i = 0; i < n; i++)
        {   ptop = ptop->next;
        }
        
        ///----------------------------|
        /// null<=prev-0-next=>1       |
        ///    0<=prev-1-next=>2       |
        ///    1<=prev-2-next=>null    |
        ///----------------------------:
        node* temp  = new node;
        temp->next  = ptop;
        temp->prev  = ptop->prev;
        ptop->prev->next = temp;
        ptop->prev       = temp;
        ptop             = temp;
        
        return true;
    }
       
    ///---------------------------------------------------------------pop_back:3
    void pop_back()
    {   if(down == NULL)
        {   DEBUGLOG("Список пустой!");
            return;
        }
        size_--;
        if(down->prev == NULL)
        {   ASSERT(size_+1 == 1) LOG(size_);
            delete down;
            head = NULL;
            down = NULL;
            ptop = NULL;
            return;
        }
        
        node* temp = down->prev;
        delete down; down = temp;
        down->next = NULL;
    }
 
    ///------------------------------------------------------------------erase:4
    bool erase(size_t n)
    {   if(n >= size_)
        {   DEBUGLOG("Недействительный номер списка!");
            return false;
        }
        
        ///----------------------------|
        /// null<=prev-0-next=>1       |
        ///    0<=prev-1-next=>2       |
        ///    1<=prev-2-next=>null    |
        ///----------------------------:
        size_--;
        node* temp = head;
        for(size_t i = 0; i < n; i++)
        {   temp = temp->next;
        }
        
        if(NULL == temp->prev && NULL == temp->next)
        {   head = NULL;
            down = NULL;
        }
        else if(NULL == temp->prev)
        {   temp->next->prev = NULL;
            head = temp->next;
        }
        else if(NULL == temp->next)
        {   temp->prev->next = NULL;
            down = temp->prev;
        }
        else
        {   temp->next->prev = temp->prev;
            temp->prev->next = temp->next;
        }
        ptop = head;
        delete temp;
        DEBUGLOG("Элемент списка удален!");
        
        return true;
    }
 
    ///-------------------------------------------------------------------back:5
    T* back()
    {   return &down->o;
    }
    
    ///--------------------------------------------------------------------top:6
    T* top(size_t n)
    {   if(n >= size_)
        {   DEBUGLOG("Недействительный номер списка!");
            return NULL;
        }
 
        ptop = head;
        for(size_t i = 0; i < n; i++)
        {   ptop = ptop->next;
        }
 
        return &ptop->o;
    }
    T* top()
    {   if(NULL == ptop) DEBUGLOG("Список пустой!");
        return &ptop->o;
    }
    
    ///---------------------------------------------------------------top_down:7
    T* top_down()
    {   if(NULL == ptop->next)
        {   DEBUGLOG("Нижняя граница достигнута!");
            return NULL;
        }
            
        ptop  = ptop->next;
        return &ptop->o;
    }
    
    ///-----------------------------------------------------------------top_up:8
    T* top_up()
    {   if(NULL == ptop->prev)
        {   DEBUGLOG("Верхняя граница достигнута!");
            return NULL;
        }
        ptop = ptop->prev;
        return &ptop->o;
    }
    
    ///-------------------------------------------------------------------size:9
    size_t size() { return size_;}
    
    ///------------------------------------------------------------------info:10
    void info()
    {   if(head == NULL)
        {   DEBUGLOG("Список пустой!");
            return;
        }
        
        std::cout << "\nСписок---------------------------------------------:\n";
        node* temp = head;
        for(int i = 0; temp; i++)
        {   std::cout << i << "\t <---|\n";
            temp->o.info();
            temp = temp->next;
        }
    }
    
    const char* name;
private:
    size_t size_;
    node*  head;
    node*  down;
    node*  ptop;
};
#undef DEBUGLOG
 
///----------------------------------------------------------------------задача:
///     Теперь сама ЗАДАЧА!
///
/// 1. начальное формирование данных обо всех книгах в библиотеке в виде списка;
/// 2. при выдаче каждои? книги на руки вводится номер УДК, и программа
///    уменьшает значение количества книг на единицу или выдает
///    сообщение о том, что требуемои? книги в библиотеке нет или
///    требуемая книга находится на руках;
/// 3. при возвращении каждои? книги вводится номер УДК, и программа
///    увеличивает значение количества книг на единицу;
/// 4. по запросу выдаются сведения о наличии книг в библиотеке.
///----------------------------------------------------------------------------.
#include <string>
#include <conio.h>
#include <windows.h>
using List = smylist;
///----------------------------------------------------------------------------|
/// GUI класс для List.
///----------------------------------------------------------------------------:
class cGUI_list
{   List* lst;
public:
    cGUI_list(List* _lst) : lst(_lst)
    {
    }
    void change(List* _lst)
    {   lst = _lst;
    }
    
    void work()
    {   while (true)
        {   system("CLS");
            cout << "|-----------------------------------" << lst->name << "\n";
            cout << "1. Добавить книгу.\n";
            cout << "2. Просмотр списка книг.\n";
            cout << "3. Взять книгу на дом.\n";
            cout << "4. Вернуть книгу.\n";
            cout << "5. Поиск книги.\n";
            cout << "6. Удалить книгу.\n";
            cout << "7. Выход.\n\n";
            cout << "Что будем редактировать? : ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   lst->push();
                    cout << "Элемент был добавлен!\n";
                    break;
                }
                case 2:
                {   lst->info();
                    break;
                }
                case 3:
                {   take_book(); goto m;
                    break;
                }
                case 4:
                {   return_book(); goto m;
                    break;
                }
                case 5:
                {   ;
                    break;
                }
                case 6:
                {   del_book();
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
            _getch();
            m:;
        }
    }
    
    void del_book()
    {   while (true)
        {   system("CLS");
            cout << "|-----------------------------------" << lst->name << "\n";
            cout << "1. Просмотр списка книг с начала.\n";
            cout << "2. Ввести порядковый номер для удаления.\n";
            cout << "7. Выход.\n\n";
            cout << "Что будем делать? : ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   
                    lst->info();
                    break;
                }
                case 2:
                {   cout << "Введите порядковый номер в списке: ";
                    int n; cin >> n;
                    lst->erase(n);
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
            _getch();
        }
    }
    
    void take_book()
    {   while (true)
        {   system("CLS");
            cout << "|-----------------------------------" << lst->name << "\n";
            cout << "1. Просмотр списка книг с начала.\n";
            cout << "2. Ввести номер книги, которую хотите взять.\n";
            cout << "7. Выход.\n\n";
            cout << "Что будем делать? : ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   lst->info();
                    break;
                }
                case 2:
                {   cout << "Ввести номер книги:\n";
                    char nomer[30]; cin >> nomer;
                    
                    sBook* p = search_by_nomer(nomer);
                    if(p == NULL)
                    {   std::cout << "Нет такой книги в списке!\n";
                    }
                    else if(p->kolvo)
                    {   
                        std::cout << "Вы взяли книгу!\n"
                                  << "Запомните номер:" << p->nomer;
                        p->kolvo--;
                    }
                    else
                    {   std::cout << "На данный момент такие книги розданы!\n";
                    }
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
            _getch();
        }
    }
    
    void return_book()
    {   while (true)
        {   system("CLS");
            cout << "|-----------------------------------" << lst->name << "\n";
            cout << "1. Ввести номер книги, которую хотите cдать.\n";
            cout << "7. Выход.\n\n";
            cout << "Что будем делать? : ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   cout << "Ввести номер книги, которую хотите cдать: \n";
                    char nomer[30]; cin >> nomer;
                    sBook* p = search_by_nomer(nomer);
                    if(p)
                    {   std::cout << "Книга принята! Спасибо.\n";
                        p->kolvo++;
                    }
                    else
                    {   std::cout << "Увы, это не та книга!\n";
                    }
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
            _getch();
        }
    }
    
    ///-------------------------------------|
    /// Поиск книги в списке по номеру.     |
    ///-------------------------------------:
    sBook* search_by_nomer(char* nomer)
    {   sBook* p;
        for(size_t i = 0; i < lst->size(); i++)
        {   p = lst->top(i);
            if(strcmp(p->nomer, nomer) == 0) return p;
        }
        return NULL;
    }
};
 
///----------------------------------------------------------------------------|
/// Корневой GUI класс программы.
///----------------------------------------------------------------------------:
class cGUI
{   ///--------------------------------------------|
    /// Создаем набор однотипных списков в памяти. |
    ///--------------------------------------------:
    List lst[2];
    cGUI_list GUI_list;
public:
    cGUI() : GUI_list(NULL)
    {   lst[0].name = "Художественная.";
        lst[1].name = "Техническая.";
        work();
    }
    
    void work()
    {   while (true)
        {   system("CLS");
            cout << "1. Редактировать список художественно лит-ры.\n";
            cout << "2. Редактировать список технической лит-ры.\n";
            cout << "7. Выход\n\n";
            cout << "Выберите команду: ";
            
            int action;
            cin >> action;
            
            system("CLS");
            switch(action)
            {   case 1:
                {   GUI_list.change(&lst[0]);
                    GUI_list.work();
                    break;
                }
                case 2:
                {   GUI_list.change(&lst[1]);
                    GUI_list.work();
                    break;
                }
                case 7:
                {   return;
                }
                default:
                {   cout << "Ошибка выбора пункта меню...\n\n";
                    break;
                }
            }
        }
    }
};
 
///----------------------------------------------------------------------------|
/// Старт.
///----------------------------------------------------------------------------:
int main ()
{   setlocale(0, "");
 
    ///--------------------------|
    /// Создаем и запускаем гуй. |
    ///--------------------------:
    cGUI GUI;
    
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2019, 16:49

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

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

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

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

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


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

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

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