Advertisement
goloshapov

1

May 24th, 2015
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.17 KB | None | 0 0
  1. /**
  2. * @file RGR_goloshapov.cpp
  3. * @author Голощапов Б. К. , гр. 515а
  4. * @date 20.05.2015
  5. * @brief Расчетно-графическая работа
  6. *
  7. * База данных рейсов полётов
  8. */
  9. #define _CRT_SECURE_NO_WARNINGS
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <ctype.h>
  13. #include <locale.h>
  14. #include <string.h>
  15. #define STR_LEN 256
  16.  
  17. void add_file();//добавление записи
  18. void edit_file();//изменение записи
  19. void del_file();//удаление записи
  20. void show_file();//показ записей
  21. void show_by_data_month();//показ записей с тнеобходимой датойм рождения по месяцу
  22. void show_by_surname();//показ записей по первым 3 буквам фамилии
  23. void restore_file();//восстановление записи
  24. void save();//сохраниение записи в файл
  25. void help();//вывод справочной информации
  26. void open_file();//открытие/создание файла (если его нет, создание по именем исполянемой прогр.) записей
  27. void cfgcheck();//открытие/создание файла конфигурации
  28. void findname(char* filepath);//призваивание необходимого имени файлам
  29. int scanf_mod();//проверка на правильность введения типа данных int
  30. void readline(char* str, int str_len);//проверка строки
  31.  
  32. struct peoples_info
  33. {
  34. char finish[STR_LEN];
  35. int number;
  36. int date[3];
  37. bool del = false;
  38. } *info = NULL;
  39. int quantity = 0;
  40. char cfgname[STR_LEN];
  41. char dbname[STR_LEN];
  42.  
  43. int main(int argc, char* argv[])
  44. {
  45. setlocale(LC_ALL, "rus");
  46. system("color F0");
  47. findname(*argv);
  48. cfgcheck();
  49. open_file();
  50. int command;
  51.  
  52. for (;;)
  53. {
  54. printf("Выберите необходимый № команды:(9 -> для получения user info): ");
  55. command = scanf_mod();
  56. while (getchar() != '\n');
  57. switch (command)
  58. {
  59. case 0: free(info); return 0;
  60. case 1: add_file(); break;
  61. case 2: edit_file(); break;
  62. case 3: del_file(); break;
  63. case 4: show_file(); break;
  64. case 5: show_by_data_month(); break;
  65. case 6: show_by_surname(); break;
  66. case 7: restore_file(); break;
  67. case 8: save(); break;
  68. case 9: help(); break;
  69. default: printf("Команда не распознана.\n\n");
  70. }
  71. }
  72. }
  73.  
  74. void open_file()
  75. {
  76. FILE *fp;
  77. int i = 0, j = 0;
  78. if (!(fp = fopen(cfgname, "rb+")))
  79. {
  80. fp = fopen(cfgname, "wb+");
  81. char dbfilein[STR_LEN] = "";
  82. strcpy(dbfilein, "DB = ");
  83. if (strlen(dbname) == 0)
  84. strcpy(dbname, "new_db.dat");
  85. strcat(dbfilein, dbname);
  86. fputs(dbfilein, fp);
  87. printf("Файл конфигурации не найден.\nФайл конфигурации с названием %s создан.\n", cfgname);
  88. fclose(fp);
  89. printf("Файл базы данных с именем \"%s\" создан\n", dbname);
  90. fp = fopen(dbname, "wb+");
  91. fclose(fp);
  92. printf("\n");
  93. }
  94. else
  95. {
  96. if (!(fp = fopen(dbname, "rb")))
  97. fp = fopen(dbname, "wb");
  98. fclose(fp);
  99. fp = fopen(dbname, "rb+");
  100. fseek(fp, 0, SEEK_END);
  101. int filesize = ftell(fp);
  102. if (filesize == 0)
  103. {
  104. fclose(fp);
  105. return;
  106. }
  107. rewind(fp);
  108. for (int i = 0; i < int(filesize / sizeof(peoples_info)); i++)
  109. {
  110. info = (peoples_info*)realloc(info, sizeof(peoples_info)* (++quantity));
  111. fread(&info[i], sizeof(peoples_info), 1, fp);
  112. }
  113. fclose(fp);
  114. }
  115. }
  116.  
  117. void save()
  118. {
  119. int command;
  120. FILE *fp;
  121. printf("1. Сохранить в текущий файл(\"%s\").\n2. Сохранить в новый файл\n", dbname);
  122. printf("Введите команду: ");
  123. command = scanf_mod();
  124. switch (command)
  125. {
  126. case 1:
  127. if ((fp = fopen(dbname, "rb+")))
  128. {
  129. fp = fopen(dbname, "wb+");
  130. for (int i = 0; i < quantity; i++)
  131. fwrite(&info[i], sizeof(peoples_info), 1, fp);
  132. fclose(fp);
  133. printf("Данные успешно записаны в файл \"%s\"\n", dbname);
  134. }
  135. break;
  136. case 2:
  137. char dbname_tmp[STR_LEN];
  138. printf("Введите имя новой базы данных: ");
  139. setlocale(0, ".866");
  140. readline(dbname_tmp, STR_LEN);
  141. if (!strstr(dbname_tmp, ".dat"))
  142. strcat(dbname_tmp, ".dat");
  143. if (!(fp = fopen(dbname_tmp, "rb+")))
  144. {
  145. fp = fopen(dbname_tmp, "wb+");
  146. for (int i = 0; i < quantity; i++)
  147. fwrite(&info[i], sizeof(peoples_info), 1, fp);
  148. setlocale(0, "rus");
  149. printf("Данные успешно записаны в файл %s\n", dbname_tmp);
  150. }
  151. else
  152. printf("Файл с таким именем уже существует.\n");
  153. fclose(fp);
  154. break;
  155. default: printf("Команда не распознана.\n");
  156. }
  157. printf("\n");
  158. }
  159.  
  160. void add_file()
  161. {
  162. int id = quantity;
  163. bool flag = false;
  164. for (int i = 0; i < quantity; i++)
  165. {
  166. if (info[i].del)
  167. {
  168. flag = true;
  169. id = i;
  170. break;
  171. }
  172. }
  173. if (flag)
  174. printf("Запись #%d удалена. Она будет перезаписана.\n", id);
  175. else
  176. {
  177. if (!(info = (peoples_info*)realloc(info, sizeof(peoples_info)* (++quantity))))
  178. {
  179. printf("Ошибка выделения памяти. Запись не создана.\n\n");
  180. quantity--;
  181. return;
  182. }
  183. }
  184.  
  185. printf("Номер телефона ");
  186. d:
  187. info[id].number = scanf_mod();
  188. if (info[id].number <= 0){
  189. printf("Нельзя ввести отрицательный номер телефона!Попробуйте ещё раз: "); goto d;
  190. }
  191. printf("Имя и фимилия: ");
  192. readline(info[id].finish, STR_LEN);
  193.  
  194.  
  195.  
  196. printf("Дата рождения: ");
  197. for (int i = 0; i < 3; i++)
  198. scanf("%d", &info[id].date[i]);
  199. info[id].del = false;
  200. printf("Запись успешно создана.\n");
  201. }
  202.  
  203. void edit_file()
  204. {
  205. int id, command;
  206. if (!quantity)
  207. {
  208. printf("Записей в базе данных нет.\n\n");
  209. return;
  210. }
  211. printf("Введите номер записи, которую хотите изменить: ");
  212. id = scanf_mod();
  213. if (id < 0 || id >= quantity)
  214. printf("Такой записи не существует.\n\n");
  215. else
  216. {
  217. printf("Что именно вы хотите изменить?\n1. Конечный пункт\n2. Тип самолёта\n3. Номер рейса\n");
  218. printf("Введите команду: ");
  219. command = scanf_mod();
  220. switch (command)
  221. {
  222. case 1:
  223. printf("Конечный пункт: ");
  224. readline(info[id].finish, STR_LEN);
  225. printf("Запись успешно изменена.\n\n");
  226. break;
  227. case 2:
  228. printf("Тип самолёта: ");
  229.  
  230. for (int i = 0; i < 3; i++)
  231. scanf("%d", &info[id].date[i]);;
  232. printf("Запись успешно изменена.\n\n");
  233. break;
  234. case 3:
  235. printf("Номер рейса: ");
  236. info[id].number = scanf_mod();
  237. printf("Запись успешно изменена.\n\n");
  238. break;
  239. default: printf("Команда не распознана.\n\n");
  240. }
  241. }
  242. }
  243.  
  244. void del_file()
  245. {
  246. int id;
  247. if (!quantity)
  248. {
  249. printf("Записей в базе данных нет.\n\n");
  250. return;
  251. }
  252. printf("Введите номер записи, которую хотите удалить: ");
  253. id = scanf_mod();
  254. if (id < 0 || id >= quantity)
  255. {
  256. printf("Записи не существует.\n\n");
  257. return;
  258. }
  259. if (info[id].del)
  260. printf("Эта запись уже удалена.\n\n");
  261. else
  262. {
  263. info[id].del = true;
  264. printf("Запись успешно удалена.\n\n");
  265. }
  266. }
  267.  
  268. void show_file()
  269. {
  270. if (quantity == 0)
  271. {
  272. printf("Записей в базе данных нет.\n\n");
  273. return;
  274. }
  275. printf("ID Номер телефона Имя и фамилия Дата рождения\n");
  276. setlocale(0, ".866");
  277. for (int i = 0; i < quantity; i++){
  278. if (!info[i].del){
  279. printf("%-4d %-19d %-22s ", i, info[i].number, info[i].finish);
  280. for (int j = 0; j < 3; j++)
  281. printf("%d.", info[i].date[j]);
  282.  
  283. }
  284. printf("\n");
  285. }
  286. setlocale(0, "rus");
  287. }
  288.  
  289. void show_by_data_month()
  290. {
  291. int k = 0;
  292. int a = 0;
  293. if (!quantity)
  294. {
  295. printf("Записей в базе данных нет.\n\n");
  296. return;
  297. }
  298. printf("Введите месяц.\n\n");
  299. scanf("%d", &a);
  300.  
  301. for (int i = 0; i < quantity; i++)
  302. if (info[i].date[1] == a && !info[i].del)
  303. k++;
  304. if (!k)
  305. {
  306. printf("Таких маршрутов нет.\n\n");
  307. return;
  308. }
  309. printf("ID Номер телефона Имя и фамилия Дата рождения\n");
  310. setlocale(0, ".866");
  311. for (int i = 0; i < quantity; i++){
  312. if (info[i].date[1] == a && !info[i].del){
  313. printf("%-4d %-19d %-22s ", i, info[i].number, info[i].finish);
  314. for (int j = 0; j < 3; j++)
  315. printf("%d.", info[i].date[j]);
  316. printf("\n");
  317. }
  318.  
  319. }
  320. setlocale(0, "rus");
  321. }
  322.  
  323. void show_by_surname()
  324. {
  325. char temp[STR_LEN] = "";
  326. int k = 0;
  327. if (!quantity)
  328. {
  329. printf("Записей в базе данных нет.\n\n");
  330. return;
  331. }
  332. printf("Введите первые 3 символа: ");
  333. a:
  334. readline(temp, STR_LEN);
  335. if (strlen(temp) != 3)
  336. {
  337. printf("Введите только 3 символа: ");
  338. goto a;
  339. }
  340. for (int i = 0; i < quantity; i++)
  341. if (strstr(info[i].finish, temp) && !info[i].del)
  342. k++;
  343. if (!k)
  344. {
  345. printf("Таких маршрутов нет.\n\n");
  346. return;
  347. }
  348. printf("ID Номер телефона Имя и фамилия Дата рождения\n");
  349. setlocale(0, ".866");
  350. for (int i = 0; i < quantity; i++)
  351. if (strstr(info[i].finish, temp) && !info[i].del)
  352. printf("%-4d %-19d %-22s %d\n", i, info[i].number, info[i].finish, info[i].date[i]);
  353. printf("\n");
  354. setlocale(0, "rus");
  355. }
  356.  
  357. void restore_file()
  358. {
  359. int id;
  360. if (!quantity)
  361. {
  362. printf("Записей в базе данных нет.\n\n");
  363. return;
  364. }
  365. printf("Введите номер записи, которую хотите восстановить: ");
  366. id = scanf_mod();
  367. if (id < 0 || id >= quantity)
  368. {
  369. printf("Такой записи не существует.\n\n");
  370. return;
  371. }
  372. if (!info[id].del)
  373. {
  374. printf("Эта запись не удалена.\n\n");
  375. return;
  376. }
  377. info[id].del = false;
  378. printf("Запись успешно восстановлена.\n\n");
  379. }
  380.  
  381. void help()
  382. {
  383. printf("Данная программа выводит информацию о рейсах полётов.\n\n");
  384. printf("=-=-=-=-Меню:-=-=-=-=\n"
  385. " ->> 1. Добавить запись\n ->> 2. Изменить запись\n ->> 3. Удалить запись\n"
  386. " ->> 4. Просмотреть все записи\n ->> 5. Просмотреть записи по задданному месяцу даты рождения\n"
  387. " ->> 6. Просмотреть записи по запросу фамилии\n ->> 7. Восстановить запись\n"
  388. " ->> 8. Сохранить базу данных\n ->> 9. Вывести справку\n ->> 0. Выйти из программы\n\n");
  389. }
  390.  
  391. void findname(char * filepath)
  392. {
  393. int i = 0;
  394. char temp[STR_LEN] = "";
  395. char *token_ptr = strtok(filepath, "\\");
  396. while (token_ptr)
  397. {
  398. strcpy(temp, token_ptr);
  399. token_ptr = strtok(NULL, "\\");
  400. }
  401. strncat(cfgname, temp, strlen(temp) - 4);
  402. strcat(cfgname, ".cfg");
  403. }
  404.  
  405. void cfgcheck()
  406. {
  407. FILE *fp;
  408. int i = 0;
  409. char string[STR_LEN] = "";
  410. char* token_ptr;
  411. if (!(fp = fopen(cfgname, "r+"))) return;
  412. while (!feof(fp))
  413. {
  414. fgets(string, STR_LEN, fp);
  415. if (!strncmp(string, "DB = ", 5))
  416. {
  417. token_ptr = strtok(string, " = ");
  418. token_ptr = strtok(NULL, " = ");
  419. strcpy(dbname, token_ptr);
  420. }
  421. }
  422. }
  423.  
  424. int scanf_mod()
  425. {
  426. int var;
  427. while (!(scanf("%d", &var)))
  428. {
  429. printf("Команда не распознана. Попробуйте ещё раз: ");
  430. fflush(stdin);
  431. //scanf("%*[^\n]");
  432. }
  433. return var;
  434. }
  435.  
  436. void readline(char str[], int str_len)
  437. {
  438. setlocale(LC_ALL, ".866");
  439. int i = 0, ch;
  440.  
  441. while (isspace(ch = getchar()));
  442. while (ch != '\n')
  443. {
  444. if (i < str_len)
  445. str[i++] = ch;
  446. ch = getchar();
  447. }
  448. str[i] = '\0';
  449. setlocale(LC_ALL, "rus");
  450. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement