Уже определен .obj c++
26.05.2023, 21:54. Показов 3081. Ответов 2
Выводит ошибку int kol уже определен в main.obj, bool changed уже определен в main.obj и еще множество переменных
файл main.cpp
| 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
| #define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
#include "main.h"
#include "files.h"
#include "func.h"
eCMD Menu()
{
while (true)
{
system("cls");
printf("Добро пожаловать в магазин техники!\n");
puts("Выберите действие:");
puts("1 - Открыть файл");
puts("2 - Просмотр данных");
puts("3 - Запись в файл");
puts("4 - Выход из программы");
int opt;
fflush(stdin);
scanf_s("%d", &opt);
switch (opt) {
case 1: return CMD_READ;
case 2: return CMD_SHOW;
case 3: return CMD_SAVE;
case 4: return CMD_EXIT;
default: printf("Вы ввели неправильную команду\n");
while ((opt = getchar() != '\n') && opt != EOF) {}
system("pause");
}
}
}
int main()
{
system("chcp 1251");
kol = 3;
techno_shop* add = Database;
strcpy(add->name, "Телевизор"); //используется для копирования строки из одного массива символов в другой массив символов.
strcpy(add->brend, "Samsung");
add->serial_num = 359182;
add->price = 45999.99;
add->amount = 15;
add++;
strcpy(add->name, "Стиральная машина");
strcpy(add->brend, "Bosh");
add->serial_num = 948273;
add->price = 15500;
add->amount = 10;
add++;
strcpy(add->name, "Монитор");
strcpy(add->brend, "LOC");
add->serial_num = 648204;
add->price = 23000;
add->amount = 6;
add++;
eCMD cmd = CMD_NONE;
while (true)
{
if (cmd == CMD_EXIT){
if (changed == true)
{
int choise;
printf("Вы вышли и забыли сохраниться.Вы уверены что хотите выйти? 1 - Да.0 - Нет\n");
scanf("%d", &choise);
if (choise == 0) { cmd = CMD_NONE; }
else { break; }
system("pause");
}
else { break; }
}
cmd = Menu();
switch (cmd)
{
case CMD_SHOW: Show(Database, kol, changed); break;
case CMD_READ: Read(Database, kol); break;
case CMD_SAVE: Save(Database, kol, changed); break;
}
}
free(Database);
printf("Досвидания,приходите еще!\n");
system("pause");
return 0;
} |
|
файл main.h
| C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
enum eCMD {
CMD_EXIT = -1, CMD_NONE, CMD_READ, CMD_SHOW,
CMD_EDIT, CMD_ADD, CMD_DELETE, CMD_SORT,
CMD_FIND, CMD_SAVE
};
const int max = 4;
struct techno_shop
{
char name[256];
char brend[256];
int serial_num;
double price;
int amount;
};
int kol = 0;
bool changed = false; // проверка на изменение файла
techno_shop* Database = (techno_shop*)malloc(max * sizeof(techno_shop)); |
|
файл func.cpp
| 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
| #include "func.h"
#include <iostream>
using namespace std;
eCMD MenuShow()
{
while (true)
{
printf("Выберите функцию:\n");
printf("1 - Добавить \n");
printf("2 - Удалить \n");
printf("3 - Сортировать \n");
printf("4 - Редактировать\n");
printf("5 - Поиск\n");
printf("6 - Выход\n");
int func = 0;
fflush(stdin); // очистка консоли
scanf_s("%d", &func);
switch (func)
{
case 1: return CMD_ADD;
case 2: return CMD_DELETE;
case 3: return CMD_SORT;
case 4: return CMD_EDIT;
case 5: return CMD_FIND;
case 6: return CMD_EXIT;
default: printf("Вы ввели неправильную команду\n"); /*Эта строка кода использует цикл while, чтобы считывать символы с ввода, пока не будет встречен символ
новой строки ('\n') или символ конца файла (EOF). После этого символы продолжают считываться,
пока не будет встречен символ новой строки или символ конца файла.
Таким образом, цикл очищает оставшиеся символы во вводе*/
while((func=getchar()!='\n')&&func!=EOF) {}
system("pause");
return CMD_SHOW;
}
}
}
techno_shop* Add(techno_shop* Database, int& kol, bool& changed)
{
kol++;
techno_shop* temp;
if (kol > 4) { temp = (techno_shop*)realloc(Database, (kol+1) * sizeof(techno_shop)); } /*Если условие выполняется (т.е kol больше 5), тогда происходит выделение новой
памяти с использованием функции realloc. Память выделяется для массива типа techno_shop
с размером kol * sizeof(techno_shop)*/
else temp = Database;
for (int i = kol - 1; i < kol; i++)
{
printf("Начинаем вводить новую строку:\n");
while (getchar() != '\n');
printf("Введите название товара:\n");
fgets(temp[i].name, sizeof(temp[i].name), stdin); //Функция fgets используется для чтения строки из стандартного ввода (stdin).
temp[i].name[strcspn(temp[i].name, "\n")] = '\0';
if (strlen(temp[i].name) > 20) {
strncpy(temp[i].name, temp[i].name, 20);
temp[i].name[20] = '\0';
}
printf("Введите бренд:\n");
fgets(temp[i].brend, sizeof(temp[i].brend), stdin);
temp[i].brend[strcspn(temp[i].brend, "\n")] = '\0';
if (strlen(temp[i].brend) > 20) {
strncpy(temp[i].brend, temp[i].brend, 20);
temp[i].brend[20] = '\0';
}
printf("Введите серийный номер товара:\n");
while ((scanf("%d", &temp[i].serial_num) != 1)||temp[i].serial_num<0) {
printf("Ошибка ввода. Пожалуйста, введите положительное число:\n");
while (getchar() != '\n');
}
rewind(stdin);
printf("Введите цену:\n");
while (scanf("%lf", &temp[i].price) != 1 || temp[i].price < 0 ) {
printf("Ошибка ввода. Пожалуйста, введите положительное число:\n");
while (getchar() != '\n');
}
rewind(stdin);
printf("Введите кол-во товара на складе:\n");
while ((scanf("%d", &temp[i].amount) != 1)||temp[i].amount<0) {
printf("Ошибка ввода. Пожалуйста, введите положительное число:\n");
while (getchar() != '\n');
}
rewind(stdin);
}
printf("Строка добавлена!\n");
system("pause");
changed = true;
return temp;
}
void Delete(techno_shop* Database, int& kol, bool& changed)
{
int del;
printf("Введите номер строки которую хотите удалить\n");
scanf_s("%d", &del);
if (del < 1 || del > kol)
{
printf("Неправильно введен номер строки\n"); system("pause"); return;
}
kol--;
for (int i = del - 1; i < kol;i++) {
Database[i] = Database[i + 1];
}
printf("Данные удалены\n");
system("pause");
changed = true;
}
void Sort(techno_shop* Database, int colvo)
{
int choice;
printf("Выберите как Вы хотите отсортировать: 1 - По возрастанию цены, 2 - По возрастанию количества на складе\n");
scanf_s("%d", &choice);
if (choice == 1)
{
techno_shop temp;
for (int i = 0; i < colvo - 1; i++)
{
for (int j = 0; j < colvo - i - 1; j++)
{
if (Database[j].price > Database[j + 1].price)
{
temp = Database[j];
Database[j] = Database[j + 1];
Database[j + 1] = temp;
}
}
}
}
else if (choice == 2)
{
techno_shop temp;
for (int i = 0; i < colvo - 1; i++)
{
for (int j = 0; j < colvo - i - 1; j++)
{
if (Database[j].amount > Database[j + 1].amount)
{
temp = Database[j];
Database[j] = Database[j + 1];
Database[j + 1] = temp;
}
}
}
}
else
{
printf("Такого выбора нет\n");
system("pause");
return;
}
}
void Edit(techno_shop* Database, int kol, bool& changed)
{
int stroka;
printf("Какую строку вы хотите изменить?\n");
scanf_s("%d", &stroka);
if (stroka < 0 || stroka > kol) { cout << "Такой строки нет." << endl; system("pause"); return; }
int choice;
printf("Что вы хотите изменить: 1 - Название Товара, 2 - Бренд, 3 - Серийный номер, 4 - Цена, 5-Количество на складе, 0 - Выход\n");
scanf("%d", &choice);
if (choice == 0 || choice>5) return;
fflush(stdin);
printf("Введите свои данные: \n");
switch (choice)
{
case 1:
while (getchar() != '\n');
fgets(Database[stroka - 1].name, sizeof(Database[stroka - 1].name), stdin);
Database[stroka - 1].name[strcspn(Database[stroka - 1].name, "\n")] = '\0';
if (strlen(Database[stroka - 1].name) > 20) {
strncpy(Database[stroka - 1].name, Database[stroka - 1].name, 20);
Database[stroka - 1].name[20] = '\0'; } break;
case 2:
while (getchar() != '\n');
fgets(Database[stroka - 1].brend, sizeof(Database[stroka - 1].brend), stdin);
Database[stroka - 1].brend[strcspn(Database[stroka - 1].brend, "\n")] = '\0';
if (strlen(Database[stroka - 1].brend) > 20) {
strncpy(Database[stroka - 1].brend, Database[stroka - 1].brend, 20);
Database[stroka - 1].brend[20] = '\0';} break;
case 3:
while ((scanf_s("%d", &Database[stroka - 1].serial_num)!=1)||( Database[stroka - 1].serial_num < 0)) {
printf("Ошибка ввода. Пожалуйста, введите положительное число:\n");
while (getchar() != '\n');}; rewind(stdin); break;
case 4: while ((scanf_s("%lf", &Database[stroka - 1].price) != 1) || (Database[stroka - 1].price < 0)) {
printf("Ошибка ввода. Пожалуйста, введите положительное число:\n");
while (getchar() != '\n');
}; rewind(stdin); break;
case 5: while ((scanf_s("%d", &Database[stroka - 1].amount) != 1) || (Database[stroka - 1].amount < 0)) {
printf("Ошибка ввода. Пожалуйста, введите положительное число:\n");
while (getchar() != '\n');}; rewind(stdin); break;
default: printf("Вы ввели неправильное число!\n");
}
printf("Данные успешно изменены.\n");
system("pause");
changed = true;
}
void Show(techno_shop* Database, int& kol, bool& changed)
{
eCMD cmd = CMD_NONE;
while (cmd != CMD_EXIT)
{
system("cls");
fflush(stdin);
printf("|%-3s|%-21s|%-21s|%-10s|%-10s|%-6s|\n", "№", "Название товара" , "Бренд" , "Серийный номер " , "Цена" , "Количество на складе");
printf("----------------------------------------------------------------------------------------------------\n");
for (int i = 0; i < kol; i++)
{
printf("|%-3d|%-21s|%-21s|%-18.1d|%-10.1f|%-20.1d|\n", i + 1, Database[i].name, Database[i].brend, Database[i].serial_num, Database[i].price, Database[i].amount);
printf("----------------------------------------------------------------------------------------------------\n");
}
cmd = MenuShow();
switch (cmd)
{
case CMD_EDIT: Edit(Database, kol, changed); break;
case CMD_ADD: Database = Add(Database, kol, changed); break;
case CMD_DELETE: Delete(Database, kol, changed); break;
case CMD_SORT: Sort(Database, kol); break;
case CMD_FIND: Find(Database, kol); break;
}
}
}
void Find(techno_shop* Database, int kol)
{
int option;
int coun = 0;
printf("Выберите по какому параметру вы хотите найти товар: 1 - По названию товара, 2 - По названию бренда товара\n");
scanf_s("%d", &option);
if (option == 1) {
char str[50];
int s = 0;
coun++;
printf("Введите название товара\n");
while (getchar() != '\n');
fgets(str, sizeof(str), stdin); //Функция fgets используется для чтения строки из стандартного ввода (в данном случае stdin) и сохранения её в указанный буфер str.
str[strcspn(str, "\n")] = '\0'; //функция strcspn возвращает длину самого длинного начального сегмента строки str, не содержащего символ новой строки
for (int i = 0; i < kol; i++)
{
if (strcmp(Database[i].name, str)==0)
{
printf("----------------------------------------------------------------------------------------------------\n");
printf("|%-3d|%-21s|%-21s|%-18.1d|%-10.1f|%-20.1d|\n", i + 1, Database[i].name, Database[i].brend, Database[i].serial_num, Database[i].price, Database[i].amount);
printf("----------------------------------------------------------------------------------------------------\n");
s++;
}
}
if (s == 0) { printf("Такого товара нет.\n"); } system("pause");
}
else if (option == 2) {
char str1[50];
int s = 0;
coun++;
printf("Введите бренд товара\n");
while (getchar() != '\n');
fgets(str1, sizeof(str1), stdin);
str1[strcspn(str1, "\n")] = '\0';
for (int i = 0; i < kol; i++)
{
if (strcmp(Database[i].brend, str1)==0)
{
printf("----------------------------------------------------------------------------------------------------\n");
printf("|%-3d|%-21s|%-21s|%-18.1d|%-10.1f|%-20.1d|\n", i + 1, Database[i].name, Database[i].brend, Database[i].serial_num, Database[i].price, Database[i].amount);
printf("----------------------------------------------------------------------------------------------------\n");
s++;
}
}
if (s == 0) { printf("Такого товара нет.\n"); } system("pause");
}
if (coun == 0) {
printf("Такого выбора нет\n");
system("pause");
return;
}
} |
|
файл func.h
| C++ | 1
2
3
4
5
6
7
8
9
| #pragma once
#define _CRT_SECURE_NO_WARNINGS // это директива препроцессора, которая отключает предупреждения компилятора о небезопасных функциях стандартной библиотеки C
#include "main.h"
void Show(techno_shop* Database, int& kol, bool& changed);
void Edit(techno_shop* Database, int kol, bool& changed);
techno_shop* Add(techno_shop* Database, int& kol, bool& changed);
void Delete(techno_shop* Database, int& kol, bool& changed);
void Sort(techno_shop* Database, int kol);
void Find(techno_shop* Database, int kol); |
|
файл file.cpp
| 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
| #include "files.h"
#include <stdio.h>
#include <iostream>
using namespace std;
void Read(techno_shop* Database, int& kol)
{
char file[21];
FILE* inp;
while (true)
{
printf("Введите название файла\n");
cin >> file;
inp = fopen(file, "r"); //открытие файла с режимом "r" чтение
if (!inp)
{
printf("Файл не найден.\n"); system("pause"); return;
}
else { break; }
}
fseek(inp, 0, SEEK_END);
long end = ftell(inp); //С помощью функций fseek и ftell определяется размер файла (end)
rewind(inp); //затем с помощью rewind указатель файла перемещается в начало.
long size = sizeof(techno_shop); //Вычисляется размер структуры
int n = end / size;
if (n > 5) Database = (techno_shop*)realloc(Database, n * sizeof(techno_shop)); //если n>5 идет перераспределение памяти для массива database чтобы учесть кол во записей в файле
int i = 0;
while (!feof(inp)) /*В цикле while (!feof(inp)) происходит чтение данных из файла. Каждая запись в файле имеет формат:
название,бренд,серийный_номер,цена,количество.*/
{
fscanf(inp, "%[^,]20s", Database[i].name);
fseek(inp, 1, SEEK_CUR);
fscanf(inp, "%[^,]20s", Database[i].brend);
fseek(inp, 1, SEEK_CUR);
fscanf(inp, "%d,%lf,%d\n", &(Database[i].serial_num), &(Database[i].price), &(Database[i].amount));
i++;
}
fclose(inp);
kol = i;
printf("Прочтено успешно\n");
system("pause");
}
void Save(techno_shop* Database, int& kol, bool& changed)
{
char file[20];
FILE* inp;
while (true)
{
printf("Введите название файла\n");
scanf("%20s", file);
inp = fopen(file, "w");
if (!inp)
{
printf("Такого названия файла быть не может\n");
}
else { break; }
}
for (int i = 0; i < kol; i++)
{
fprintf(inp, "%s,%s,%d,%lf,%d", Database[i].name, Database[i].brend, Database[i].serial_num, Database[i].price, Database[i].amount);
}
fclose(inp);
changed = false;
printf("Данные были сохранены\n");
system("pause");
} |
|
файл files.h
| C++ | 1
2
3
4
5
6
| #pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
void Read(techno_shop* Database, int& kol);
void Save(techno_shop* Database, int& kol, bool& changed); |
|
0
|