0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 26
1

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

23.11.2012, 20:09. Показов 2797. Ответов 6
Метки нет (Все метки)

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

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

Сведения о книгах содержат:
• номер УДК;
• фамилию и инициалы автора;
• название;
• год издания;
• количество экземпляров данной книги в библиотеке.

Программа должна обеспечивать:

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

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
#include "stdafx.h"
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
 
typedef struct AsFalonour //создание нового типа запись для хранения информационных полей элемента списка
 
{
    int  nomerUDK[10]; // номер УДК
    int  kol; //количество книг в картотеке
    char nazv[20]; //название книги
    int  god; //год издания
    char avt[20]; //фамилия автора книги
 
} book; //имя созданного типа
 
typedef struct spisok //создание нового типа запись для хранения информации элемента списка
 
{
    book inf; //информационные поля
 
    struct spisok* next; //указатель на следующий элемент списка
 
    struct spisok* pred; //указатель на предыдущий элемент списка
 
} el; //имя созданного нового типа
 
//-------------------------------------------------------------\\
 
el* vvodSp(el **top2) //создание списка
 
{
    char s[3]={'y','e','s'}; //переменная для хранения ответа на вопрос о продолжении ввода списка
 
    el *cur, *pr, *top, *tail, *tail2, *cur2; //указатель
    
    system ("cls");
 
    *top2 = top = tail = tail2 = NULL; //обнуление указателей на начало и хвост списков
 
    printf ("Vvedite pervyu zapis\n");
 
    while(strcmp(strlwr(s), "no") != 0) //пока ответ не равен no
 
{
        cur = (el*) malloc (sizeof(el)); //выделяем память под новый элемент (далее текущий)
 
        cur->next = NULL; //обнуление указателя на следующий элемент текущего элемента
 
        cur->pred = tail; //указатель на предыдущий элемент текущего элемента присваивается хвосту списка
 
        if(top == NULL) top = cur; //если указатель на начало списка пуст то указателем на начало списка становится текущий элемент
 
            else tail->next = cur; //если нет, то указателем на хвост списка становится текущий элемент
 
            tail = cur; //указатель на хвост приравнивается текущему элементу
 
            cur2 = (el*) malloc (sizeof(el)); //выделяется память под новый элемент второго списка, выполняются те же действия
 
            cur2->next = NULL;
 
            cur2->pred = tail2;
 
        if((*top2) == NULL) (*top2) = cur2; // *top2 это указатель на указатель
 
            else tail2->next = cur2;
 
            tail2 = cur2;
 
    printf("Vvedite nomer UDK:\n"); 
 
    scanf("%s", cur->inf.nomerUDK);
 
    printf("Vvedite FIO avtora:\n");
 
    scanf("%s", cur->inf.avt);
 
    printf("Vvedite nazvanie knigi:\n");
 
    scanf("%s", cur->inf.nazv);
 
    printf("Vvedite god izdaniya:\n");
 
    scanf("%d", &cur->inf.god);
 
    printf("Vvedite koli4estvo ekzemplyarov knigi:\n"); //аналогичное с количеством
 
    scanf("%d", &cur->inf.kol);
 
    cur2->inf = cur->inf; //копировние информационных полей элемента первого списка в элемент второго списка
 
    cur2->inf.kol = 0; //количество выданных книг в начале равно 0
 
    printf("Vvesti eshe odny zapis'?(no - exit; yes - prodoljenie)\n");
 
    scanf("%s", s);
 
    while(strcmp(strlwr(s), "no") != 0 && strcmp(strlwr(s), "yes") != 0) //пока не введён правильный вариант
 
{
        printf("Vi vveli neverno, povtorite vibor\n");
 
        scanf("%s", s);
}
}
 
return top; //возвращение указателя на начало первого списка
 
}
 
//-----------------------------------------------------\\
 
void vivodSp(el *cur) //вывод списка
 
{
 
    system ("cls");
 
    printf ("Tekyshi spisok:\n");
 
    if(cur == NULL) printf("Pered tem kak vivodit' spisok neobhodimo ego sozdat'!");
 
        else
{
        printf("Nomer UDK\tAvtor\t\tNazvanie\tGod izdaniya\tKoli4estvo\t");
 
        while(cur != NULL) //печать списка пока не достигнут конец списка, если количество книг больше нуля
 
{
            if(cur->inf.kol > 0) printf("%s\t\t%s\t\t%s\t\t%d\t\t\%d\t\t\n", cur->inf.nomerUDK, cur->inf.avt, cur->inf.nazv, cur->inf.god, cur->inf.kol);
 
            cur = cur->next; //переход к следующему элементу
}
}
    getch();
}
 
//--------------------------------------------------------------\\
 
void vidacha(el *cur, el *cur2)
 
{
    int nomerUDK[10];
 
    int n = 0;
    
    system("cls");
 
    if (cur == NULL) printf("Pered tem kak proizvodit' vidachy knig nado sozdat spisok!");
 
    else
 
{
        printf ("Vvedite nomer UDK:\n"); //ввод УДК
 
        scanf ("%s", nomerUDK);
 
        while (cur != NULL) //пока не конец списка
 
{
    if((cur->inf.nomerUDK == nomerUDK) && cur->inf.kol > 0) //если элемент содержит сведения о нужной книге и есть свободные в наличии
{
        cur->inf.kol--; //уменьшаем количество в первом списке
 
        cur2->inf.kol++; //и увеличиваем во втором
 
        n++; //поиск успешен
 
    printf("Kniga vidana na ryki!");
 
    break; //конец поиска
 
}
 
    else if(((cur->inf.nomerUDK == nomerUDK)) && cur->inf.kol == 0) //если свободных нет
 
{
    printf("Vse knigi nahodyatsa na rykah!");
 
    n++; //поиск успешен
 
    break; //конец поиска
 
}
 
    cur = cur->next; //переход к следующем элементу
 
}
 
    if(n == 0) printf("Takoi knigi voobshe net!");
 
}
 
    getch();
 
}
 
//---------------------------------------------------------------------\\
 
void vozvrat(el *cur, el *cur2) //возвращение элемента
 
{
    int udknomer[10];
    int n = 0;
 
    system("cls");
 
    if(cur == NULL) printf("Pered tem kak proizvodit' poisk v spiske nado ego sozdat'!");
 
    else
 
{
        printf("Vvedite nomer UDK:\n");
 
        scanf("%s", udknomer);
 
        while(cur != NULL)
 
{
            if(((cur->inf.nomerUDK, udknomer) == 0) && cur2->inf.kol > 0) //если есть книги на руках (кол-во>0)
{
            cur->inf.kol++; //увеличивается в первом списке количество
 
            cur2->inf.kol--; //уменьшается во втором
 
            n++;
 
        printf("Kniga vozvrashena!");
 
            break;
}
 
    else if(((cur->inf.nomerUDK, udknomer) == 0) && cur2->inf.kol <= 0) //если книг на руках нет
 
{
        printf("Vse svoi knigi doma, 4yjih nam ne nado)");
 
        n++;
 
        break;
}
    cur = cur->next;
 
    cur2 = cur2->next;
}
        if (n == 0) printf ("Takoi knigi ne naideno!\n");
}
    getch();
}
 
//---------------------------------------------------------------------\\
 
void main() //основная программа
 
{
    int n = 0;
 
    el *top = NULL, *top2 = NULL;
 
    while(n != 11)
{
 
        system("cls");
 
        printf("Vvedite nomer pynkta dlya vypolneniya:\n");
 
        printf("1.Zapolnit' spisok\n");
 
        printf("2.Vivesti tekyshi spisok\n");
 
        printf("3.Vivesti tekyshi spisok vidannih knig\n");
 
        printf("4.Vidat knigy na ryki\n");
 
        printf("5.Vernyt' knigy v biblioteky\n");
 
        printf("6.Vihod\n");
 
        printf("Vash vibor:\n");
 
        scanf("%d", &n);
 
    while(n > 7 || n < 1)
 
{
    printf("Takogo pynkta net! Vvedite povtorno:\n");
 
    scanf("%d", &n);
}
 
        if (n == 1) top = vvodSp(&top2);
 
        else if(n == 2) vivodSp(top);
 
        else if(n == 3) vivodSp(top2);
 
        else if(n == 4) vidacha(top, top2);
 
        else if(n == 5) vozvrat(top, top2);
 
        else if(n == 6) break;
 
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2012, 20:09
Ответы с готовыми решениями:

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

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

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

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

6
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
23.11.2012, 20:14 2
C++
1
(cur->inf.nomerUDK == nomerUDK)
Здесь сравниваются адреса массивов?
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 26
23.11.2012, 20:18  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
(cur->inf.nomerUDK == nomerUDK)
Здесь сравниваются адреса массивов?
здесь проверяется, содержит ли массив элемент с таким же значением, т.е. был ли введен вообще такой номер УДК
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
23.11.2012, 20:23 4
имя массива является указателем на первый элемент массива. Для примера:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main(){
    int A[1];
    int B[1];
    A[0]=B[0]=10;
    std::cout<<"A[0] = "<<A[0]<<"\tB[0] = "<<B[0]<<std::endl;
    std::cout<<"A = "<<A<<"\tB = "<<B<<std::endl;
    std::cin.get();
    return 0;
}
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 26
23.11.2012, 20:29  [ТС] 5
Цитата Сообщение от Croessmah Посмотреть сообщение
имя массива является указателем на первый элемент массива.
Это понятно. Но изменение имени этой локальной переменной с nomerUDK на любое другое не помогает...
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
23.11.2012, 20:34 6
Цитата Сообщение от jayjay Посмотреть сообщение
Но изменение имени этой локальной переменной с nomerUDK на любое другое не помогает...
А причем тут имя переменной?
Цитата Сообщение от jayjay Посмотреть сообщение
Это понятно.
Судя по всему, не понятно.

Вы сравниваете адрес массива cur->inf.nomerUDK с адресом локального массива nomerUDK. Соответственно, всегда получаете false.
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 26
23.11.2012, 20:44  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
А причем тут имя переменной?

Судя по всему, не понятно.

Вы сравниваете адрес массива cur->inf.nomerUDK с адресом локального массива nomerUDK. Соответственно, всегда получаете false.
Вот оно что. Теперь точно понятно) И как мне правильно осуществить тогда сравнение?
0
23.11.2012, 20:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2012, 20:44
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru