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
| #include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <Windows.h>
using namespace std;
struct Buyer // Структура "Покупатель"
{
string date; // Дата покупки
string fio; // ФИО
string address; // Домашний адрес
string phone; // Номер телефона
float sum; // Сумма покупки
};
struct List // Cтруктура линейный динамический спискок
{
Buyer info; // Информация хранящиеся в элементах списка
List* next; // Указатель на следующий элемент списка
};
// Прототипы функций
// т.е. заголовки функций, а их реализации находится после реализации функции main
void enter_new(Buyer& st); // Функция для ввода информации о новом покупателе с клавиатуры
void sort(List*& head); // Функция для сортировка списка
int change(List*& head, int number); // Функция для изменения информации с номером number
int del(List*& head, List*& end, int number); // Функция для удаления элемента списка с номером number
int find(List*& head, Buyer& st, string fio);
void out(List* head); // Функция для вывода списка на экран
void save(List* head, string a); // Функция для сохранения списка в файл
void load(List*& head, List*& end, Buyer& st, string a); // Функция для чтения списка из файла
void add(List*& head, List*& end, Buyer st, string date, string fio, string address, string phone, float sum); // Функция для добавления элемента st в список
int length(List* head); // Функция для получения количества элементов в списке head
void clear(List*& head, List*& end); // Функция для очистки памяти занятой списком
int main() // Главная функция
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Buyer st;
List* head = NULL, * end = NULL; // Объявляем указатели на начало и конец списка
int choise;
int number;
do
{
system("cls"); // Очищаем экран
// Выводим меню
cout << "1. Добавить элемент в список" << endl;
cout << "2. Отсортировать элементы по алфавиту" << endl;
cout << "3. Изменить элемент списка" << endl;
cout << "4. Удалить элемент из списка" << endl;
cout << "5. Поиск элемента" << endl;
cout << "6. Вывод таблицы" << endl;
cout << "7. Сохранить список в файл" << endl;
cout << "8. Чтение списка из файла" << endl;
cout << "9. Очистить список" << endl;
cout << "10. Выход" << endl;
cout << "Выберете действие: ";
cin >> choise;
cout << endl;
switch (choise) // В зависимости от того, что выбрали, выполняем определенные действия
{
case 1:
{
enter_new(st); // Вызываем функцию для получения нового элемента "Покупатель"
add(head, end, st, st.date, st.fio, st.address, st.phone, st.sum); // Добавляем покупателя в список
cout << "Покупатель добавлен\n";
break;
}
case 2:
{
sort(head); // Вызываем функция для сортировки данных о покупателе по алфавиту
cout << "Список отсортирован\n";
break;
}
case 3:
{
cout << "Номер элемента для изменения: ";
cin >> number;
// Вызываем метод для изменения данных о покупателе
// И если функция равна 0 значит всё прошло успешно
// Иначе данные не были изменены
if (change(head, number) == 0) cout << "Элемент с номером " << number << " изменён\n";
else cout << "Элемента с номером " << number << " нет\n";
break;
}
case 4:
{
cout << "Номер элемента для удаления: ";
cin >> number;
// Вызываем метод для удаления покупателя
// И если функция равна 0 значит всё прошло успешно
// Иначе покупатель не был удален
if (del(head, end, number) == 0) cout << "Элемент с номером " << number << " удалён\n";
else cout << "Элемента с номером " << number << " нет\n";
break;
}
case 5:
{
cout << "Введите ФИО покупателя: ";
getline(cin, st.fio);
cin.get();
if (find(head, st, st.fio) != -1)
{
cout << "Такой покупатель есть." << endl;
}
else cout << "Такой покупатель отсутствует." << endl;
break;
}
case 6:
{
out(head); // Вызываем функцию для вывода информации о покупателе на экран
break;
}
case 7:
{
int number;
string a;
cout << "1. Сохранить в файл по умолчанию" << '\n';
cout << "2. Ввести путь самостоятельно (Пример: 'D:\\file.txt')" << endl;
cout << "Выберите действие: ";
cin >> number;
if (number == 1)
{
a = "file.txt";
save(head, a);
}
else
{
cout << "Введите путь к файлу: ";
cin >> a;
save(head, a);
}
break;
}
case 8:
{
int number;
string a;
cout << "1.Читать из файла по умолчанию" << '\n'
<< "2.Ввести путь самостоятельно (Пример:'D:\\input.txt')" << endl;
cout << "Выберите действие: "; cin >> number;
if (number == 1)
{
a = "input.txt";
load(head, end, st, a);
}
else
{
cout << "Введите путь к файлу: ";
cin >> a;
load(head, end, st, a);
}
break;
}
case 9:
{
clear(head, end);
cout << "Вы очистили список" << endl;
break;
}
case 10:
{
return 0;
}
}
if (choise > 0 && choise <= 8) system("pause"); // Если выбранное действие попадает в промежуток от 1 до 8, то задерживаем результат на экране
} while (choise != 0);
return 0;
}
void enter_new(Buyer& st) // Функция для ввода информации о новом покупателе с клавиатуры
{
cout << "Введите дату покупки: ";
cin >> st.date;
cin.get(); // Для остановки закрытия окна консоли
cout << "Введите ФИО покупателя: ";
getline(cin, st.fio);
cout << "Введите домашний адрес покупателя: ";
getline(cin, st.address);
cout << "Введите номер телефона покупателя: ";
cin >> st.phone;
cin.get(); // Для остановки закрытия окна консоли
cout << "Введите сумму покупки покупателя: ";
cin >> st.sum;
cin.get(); // Для остановки закрытия окна консоли
}
void sort(List*& head) // Функция для сортировка списка
{
List* t = head, * tt;
Buyer temp;
while (t != NULL)
{
tt = t->next;
while (tt != NULL)
{
if (tt->info.fio < t->info.fio)
{
temp = tt->info;
tt->info = t->info;
t->info = temp;
}
tt = tt->next;
}
t = t->next;
}
}
int change(List*& head, int number) // Функция для изменения информации с номером number
{
int n = length(head); // Получаем количество элементов списка
if (number > n || number <= 0 || n == 0) // Если number больше количества элементов списка или меньше или равно нуля или список пуст то
{
return 1; //возвращаем результат работы функции = 1 т.е. есть ошибки
}
int i = 0; // Обнуляем текущий элемент списка
List* t = head;
while (t != NULL) // Пока не конец списка
{
i++; // Увеличиваем номер на 1
if (i == number) // Если номер текущего элемента равен номеру искомого то
{
Buyer st;
enter_new(st); // Вызываем функцию для получения информации о новом покупателе
t->info = st; // И в номер с номером number заносим данные о новом покупателе
break; // Прерываем цикл
}
t = t->next; // Переходим к следующему элементу
}
return 0; // Оповещаем о корректном изменении
}
int del(List*& head, List*& end, int number) // Функция для удаления элемента списка с номером number
{
int n = length(head); // Получаем количество элементов списка
if (number > n || number <= 0 || n == 0) // Если number больше количества элементов списка или меньше или равно нуля или список пуст то
{
return 1; // Возвращаем результат работы функции = 1, т.е. есть ошибки
}
List* t = head, * tt = head;
if (number == 1) // Если необходимо удалить первый элемент списка то
{
t = head; // Запоминаем первый элемент списка в переменной t
head = head->next; // Переходим к следующему элементу
delete t; // Удаляем первый элемент
// Если голова списка стала пустой то
// Конец списка ставим пустым
if (head == NULL) end = NULL;
}
else // Иначе
{
tt = head; // Запоминаем текущий элемент списка
t = head->next; // Запоминаем последующий элемент списка
int i = 1; // Индексацию начинаем с 1 т.к. первый элемент уже просмотрен
while (t != NULL) // Пока не конец списка
{
i++; // Увеличиваем индекс на 1
if (i == number) // Если i == number, т.е. номер текущего элемента равен номеру удаляемого то
{
tt->next = t->next; // Переставляем указатели
break; // Прерываем цикл
}
// Переходим к следующим элементам
tt = tt->next;
t = t->next;
}
if (number == n) end = tt; // Если удаляемый элемент является последним то меняем указатель на конец списка
delete t; // Освобождаем память занятую под элемент с номером number
}
return 0; // Оповещаем о корректном удалении
}
int find(List*& head, Buyer& st, string fio) // Функция для поиска по имени
{
int i = 0;
while (head != NULL)
{
if (head->info.fio == fio)
return i;
i++;
head = head->next;
}
return -1;
}
void out(List* head) // Функция для вывода списка на экран
{
if (head == NULL) // Если head = NULL значит список пуст
{
cout << "Список пуст\n";
return;
}
// Выводим шапку для вывода информации
cout << setw(0) << "№"
<< setw(20) << "Дата покупки"
<< setw(30) << "ФИО покупателя"
<< setw(40) << "Домашний адрес покупателя"
<< setw(50) << "Номер телефона покупателя"
<< setw(60) << "Сумма покупки покупателя"
<< endl;
for (int i = 1; head != NULL; i++)
{
cout << setw(0) << i
<< setw(20) << head->info.date
<< setw(30) << head->info.fio
<< setw(40) << head->info.address
<< setw(50) << head->info.phone
<< setw(60) << head->info.sum
<< endl;
head = head->next;
}
}
void save(List* head, string a) // Функция для сохранения списка в файл
{
ofstream out;
out.open(a);
if (out.is_open())
{
out << "№"
<< setw(20) << "Дата покупки"
<< setw(30) << "ФИО покупателя"
<< setw(40) << "Домашний адрес покупателя"
<< setw(50) << "Номер телефона покупателя"
<< setw(60) << "Сумма покупки покупателя"
<< endl;
for (int i = 0; head != NULL; i++)
{
out << i << setw(20) << head->info.date
<< setw(30) << head->info.fio
<< setw(40) << head->info.address
<< setw(50) << head->info.phone
<< setw(60) << head->info.sum
<< endl;
head = head->next;
}
cout << "Данные сохранены в файл\n";
}
else cout << "Сохранение не удалось" << endl;
out.close();
}
void load(List*& head, List*& end, Buyer& st, string a)
{
ifstream in;
in.open(a);
if (in.is_open())
{
while (!in.eof())
{
in >> st.date;
in >> st.fio;
in >> st.address;
in >> st.phone;
in >> st.sum;
add(head, end, st, st.date, st.fio, st.address, st.phone, st.sum);
}
}
else cout << "Чтение из файла не удалось" << endl;
in.close();
}
void add(List*& head, List*& end, Buyer st, string date, string fio, string address, string phone, float sum) // Функция для добавления элемента st в список
{
if (head == NULL) // Если список ещё не создан,то
{
head = new List; // Выделяем место под голову списка
head->next = NULL; // Зануляем указатель на следующий элемент
head->info = st; // Заносим данные в голову списка
end = head; // Конец списка устанавливаем в head
}
else // Иначе
{
List* x = new List; // Выделяем место под новый элемент
x->info = st; // Заносим туда данные
x->next = NULL; // Указатель на следующий элемент ставим в NULL т.е. его не существует пока что
end->next = x; // И связываем новый элемент с концом списка
end = x; // И концу списка присваем x
}
}
int length(List* head) // Функция для получения количества элементов в списке head
{
int n = 0; // Обнуляем количество элементов списка
while (head != NULL) // Пока не конец списка делаем
{
n++; // Увеличиваем количество элементов на 1
head = head->next; // Переходим к следующему звену списка
}
return n; // Возвращаем количество элементов списка
}
void clear(List*& head, List*& end) // Функция для очистки памяти занятой списком
{
List* t;
while (head != NULL) // Пока не конец списка, делаем
{
t = head->next; // Переходим к следующему элементу
delete head; // Очищаем память занятой под head
head = t; // Заносим в head значение t
}
end = NULL;
} |