Advertisement
Guest User

Untitled

a guest
Jun 3rd, 2015
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.72 KB | None | 0 0
  1. // ура.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdlib.h>
  6. #include <cstdio>
  7. #include "locale.h"
  8. #include <cstdlib>
  9. #include <Windows.h>
  10. #pragma warning (disable:4996)
  11.  
  12. typedef struct R
  13. {
  14. char name[25];//название книги
  15. char writer[50];//имя автора
  16. char *genre;//жанр
  17. int data;//год издания
  18. char country[30];//страна издания
  19. int page;//количество страниц
  20. long int tirag;//тираж
  21. }Books;
  22.  
  23. typedef struct T
  24. {
  25. Books *book;//указатель на информационные поля
  26. struct T *next;//указатель на следующий элемент
  27. }List;
  28.  
  29. //меню и подменю
  30. int Menu();//вывод главного меню
  31. List* Menu1(List*);//вывод подменю для добавления элемента
  32. int Menu2();//вывод подменю для удаления элемента
  33. void Menu3(List*, List*);//вывод подменю для вывода списка
  34.  
  35. //Добавление элементов
  36. List* NewElement(List*);//добавление элементов
  37. List* NewBegin(List*);//добавление элемента в начало списка
  38. void NewPlace(List*);//добавление элемента в место, указанное пользователем
  39. void NewEnd(List*);//добавление элемента в конец списка
  40. List* InputFile(FILE*);//добавление элемента из файла
  41.  
  42.  
  43. //Ввод элементов
  44. List* InputOne();//ввод элемента списка
  45. char* InputGenre();//ввод поля "жанр"
  46.  
  47.  
  48. //Удаление элементов
  49. List* DeleteElement(List* N);//удаление элементов
  50. List* DeleteBegin(List*);//удаление первого элемента списка
  51. void DeletePlace(List*);//удаление элемента, указанного пользователем
  52. void DeleteEnd(List*);//удаление последнего элемента
  53.  
  54. //Поиск элементов
  55. List* SearchElement(List*);//поиск нужного элемента
  56. List* Search(List *);//сортировка по заданному параметру
  57. List* SearchLast(List*);//поиск последнего
  58. List* NewList(List*);//формирование нового списка
  59.  
  60. //Сортировка элементов
  61. void Sorting(List*);//сортировка по алфавиту
  62. int summa(List*);//вспомогательная функция к сортировке по алфавиту
  63. void end(List*);//вспомогательная функция к сортировке по алфавиту
  64. void end1(List*);//вспомогательная функция к сортировке по алфавиту
  65.  
  66. //Вывод списка
  67. void OutputList(List*);//вывод списка на экран
  68. void OutputFile(FILE*, List*);//вывод списка в файл
  69.  
  70. List* Free(List*);//освобождение памяти
  71. void Wellcome();//приветствие
  72. void Help();//справка
  73.  
  74. void main()
  75. {
  76. List *first = NULL, *second = NULL;
  77. SetConsoleCP(1251);
  78. SetConsoleOutputCP(1251);
  79. int S;
  80. Wellcome();
  81. system("pause");
  82. do
  83. {
  84. system("cls");
  85. S = Menu();
  86. switch (S)
  87. {
  88. // добавление элементов
  89. case 1:
  90. system("cls");
  91. first = Menu1(first);
  92. break;
  93. //удаление элементов
  94. case 2:
  95. if (first != NULL)
  96. {
  97. system("cls");
  98. first = DeleteElement(first);
  99. }
  100. else
  101. {
  102. puts("Картотека не введена");
  103. system("pause");
  104. }
  105. break;
  106. //поиск элементов
  107. case 3:
  108. if (first != NULL)
  109. {
  110. second = Search(first);
  111. system("cls");
  112. }
  113. else
  114. puts("Картотека не введена");
  115. system("pause");
  116. break;
  117. //Сортировка элементов
  118. case 4:
  119. if (first != NULL)
  120. Sorting(first);
  121. else
  122. puts("Картотека не введена");
  123. system("pause");
  124. break;
  125. //Вывод элементов
  126. case 5:
  127. system("cls");
  128. Menu3(first, second);
  129. break;
  130. case 6:
  131. system("cls");
  132. Help();
  133. system("pause");
  134. break;
  135. case 0:
  136. first = Free(first);
  137. second = Free(second);
  138. break;
  139. default:
  140. puts("Ошибка. Выберите один из пунктов меню");
  141. break;
  142. }
  143.  
  144. } while (S != 0);
  145.  
  146. }
  147.  
  148. //вывод главного меню
  149. int Menu()
  150. {
  151. int S;
  152.  
  153. puts("Выберите один из пунктов меню");
  154. puts("1.Добавить элементы в картотеку");
  155. puts("2.Удалить элементы из картотеки");
  156. puts("3.Найти нужный элемент");
  157. puts("4.Сортировать картотеку");
  158. puts("5.Вывести картотеку");
  159. puts("6.Помощь");
  160. puts("0.Выход из программы");
  161.  
  162. scanf_s("%d", &S);
  163. return S;
  164. }
  165. //вывод подменю для добавления элемента
  166. List* Menu1(List* first)
  167. {
  168. int s;
  169. char w[30];
  170. FILE* file;
  171. List* H = NULL;
  172. puts("1.Ввести элементы с клавиатуры");
  173. puts("2.Ввести элементы из файла");
  174. puts("0.Вернуться в меню");
  175. scanf_s("%d", &s);
  176. switch (s)
  177. {
  178. case 1:
  179. system("cls");
  180. first = NewElement(first);
  181. break;
  182. case 2:
  183. system("cls");
  184. printf("Введите название файла:");
  185. fflush(stdin);
  186. gets(w);
  187. system("cls");
  188. puts("1.Добавить элементы в уже существующую картотеку");
  189. puts("2.Создать новую картотеку");
  190. puts("0.Вернуться в меню");
  191. puts("Если вы создатите новую картотеку, старая будет удалена");
  192. scanf("%d", &s);
  193. switch (s)
  194. {
  195. case 1:
  196. if (file = fopen(w, "r"))
  197. {
  198. H = InputFile(file);
  199. if (first != NULL)
  200. while (first->next != 0)
  201. first = first->next;
  202. first = H;
  203. if (first != NULL)
  204. puts("Картотека добавлена");
  205. else
  206. puts("Файл пуст");
  207. }
  208. else
  209. puts("Не удалось открыть файл");
  210. system("pause");
  211. break;
  212. case 2:
  213. Free(first);
  214. if (file = fopen(w, "r"))
  215. {
  216. first = InputFile(file);
  217. if (first != NULL)
  218. puts("Картотека добавлена");
  219. else
  220. puts("Файл пуст");
  221. }
  222. else
  223. puts("Не удалось открыть файл");
  224. system("pause");
  225. break;
  226. default:
  227. puts("Ошибка.Выберите один из пуктов меню");
  228. break;
  229. }
  230. break;
  231. case 3:
  232. break;
  233. default:
  234. puts("Ошибка. Выберите один из пунктов меню");
  235. break;
  236. }
  237. return first;
  238. }
  239. //вывод подменю для удаления элемента
  240. int Menu2()
  241. {
  242. int s;
  243. puts("1.Удалить первый элемент");
  244. puts("2.Удалить выбранный элемент");
  245. puts("3.Удалить последний элемент");
  246. puts("0.Вернуться в главное меню");
  247. scanf_s("%d", &s);
  248. return s;
  249. }
  250. //вывод подменю для вывода списка
  251. void Menu3(List* first, List* second)
  252. {
  253. int s;
  254. FILE* file;
  255. char w[30];
  256. if (first != NULL || second != NULL)
  257. {
  258. puts("1.Вывести исходную картотеку на экран");
  259. puts("2.Вывести исходную картотеку в файл");
  260. puts("3.Вывести отсортированную картотеку на экран");
  261. puts("4.Вывести отсортированную картотеку в файл");
  262. puts("0.Вернуться в главное меню");
  263. scanf_s("%d", &s);
  264. switch (s)
  265. {
  266. case 1:
  267. system("cls");
  268. OutputList(first);
  269. system("pause");
  270. break;
  271. case 2:
  272. system("cls");
  273. printf("Введите имя файла:");
  274. fflush(stdin);
  275. gets(w);
  276. system("cls");
  277. puts("\n1.Добавить элементы в уже существующую картотеку");
  278. puts("2.Создать новую картотеку в файле");
  279. puts("0.Вернуться в главное меню");
  280. scanf_s("%d", &s);
  281. switch (s)
  282. {
  283. case 1:
  284. if (file = fopen(w, "a"))
  285. {
  286. OutputFile(file, first);
  287. system("pause");
  288. }
  289. break;
  290. case 2:
  291. if (file = fopen(w, "w"))
  292. {
  293. OutputFile(file, first);
  294. system("pause");
  295. }
  296. break;
  297. case 0:
  298. break;
  299. default:
  300. puts("Выберите один из пунктов меню");
  301. break;
  302. }
  303. case 3:
  304. system("cls");
  305. OutputList(second);
  306. system("pause");
  307. break;
  308. case 4:
  309. system("cls");
  310. printf("Введите имя файла:");
  311. fflush(stdin);
  312. gets(w);
  313. system("cls");
  314. puts("\n1.Добавить элементы в уже существующeую картотеку");
  315. puts("2.Создать новую картотеку в файле");
  316. puts("0.Вернуться в главное меню");
  317. scanf_s("%d", &s);
  318. switch (s)
  319. {
  320. case 1:
  321. if (file = fopen(w, "a"))
  322. {
  323. OutputFile(file, second);
  324. system("pause");
  325. }
  326. break;
  327. case 2:
  328. if (file = fopen(w, "w"))
  329. {
  330. OutputFile(file, second);
  331. system("pause");
  332. }
  333. break;
  334. case 0:
  335. break;
  336. default:
  337. puts("Выберите один из пунктов меню");
  338. break;
  339. }
  340. case 0:
  341. break;
  342. default:
  343. puts("Ошибка. Выберите один из пунктов меню");
  344. }
  345. }
  346. else
  347. puts("Картотека не введена");
  348. }
  349.  
  350.  
  351.  
  352. //ввод элемента списка
  353. List* InputOne()
  354. {
  355. List *N = NULL;
  356. N = (List*)malloc(sizeof(List));
  357. N->book = (Books*)malloc(sizeof(Books));
  358. N->next = NULL;
  359. do
  360. {
  361. printf("Введите название книги(не более 25 символов):");
  362. fflush(stdin);
  363. fgets((N->book->name), 30, stdin);
  364. if (strlen(N->book->name) > 25)
  365. puts("Извините, поле превышает 25 символов. Повторите ввод.");
  366. if (*(N->book->name) == '\n')
  367. puts("Извините, поле пустое. Повторите ввод.");
  368. } while ((strlen(N->book->name) > 25) || (*(N->book->name) == '\n'));
  369. N->book->name[strlen(N->book->name) - 1] = '\0';
  370.  
  371. do
  372. {
  373. printf("\nВведите автора книги(не более 25 символов):");
  374. fflush(stdin);
  375. fgets(N->book->writer, 55, stdin);
  376. if (strlen(N->book->writer) > 50)
  377. puts("Извините, поле превышает 50 символов. Повторите ввод.");
  378. if (*(N->book->writer) == '\n')
  379. puts("Извините, поле пустое. Повторите ввод.");
  380. } while ((strlen(N->book->writer) > 50) || (*(N->book->writer) == '\n'));
  381. N->book->writer[strlen(N->book->writer) - 1] = '\0';
  382.  
  383. N->book->genre = InputGenre();
  384.  
  385. do
  386. {
  387. printf("\nВведите год издания:");
  388. fflush(stdin);
  389. scanf_s("%d", &(N->book->data));
  390. if ((N->book->data) > 2016)
  391. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  392. if ((N->book->data) <1600)
  393. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  394. } while ((((N->book->data) > 2016) || ((N->book->data) < 1600)));
  395.  
  396. do
  397. {
  398. printf("\nВведите страну издания(не более 30 символов):");
  399. fflush(stdin);
  400. fgets(N->book->country, 55, stdin);
  401. if (strlen(N->book->country) > 30)
  402. puts("Извините, поле превышает 30 символов. Повторите ввод.");
  403. if (*(N->book->country) == '\n')
  404. puts("Извините, поле пустое. Повторите ввод.");
  405. } while ((strlen(N->book->country) > 30) || (*(N->book->country) == '\n'));
  406. N->book->country[strlen(N->book->country) - 1] = '\0';
  407.  
  408. do
  409. {
  410. printf("\nВведите количество страниц:");
  411. fflush(stdin);
  412. scanf_s("%d", &(N->book->page));
  413. if ((N->book->page) > 1500)
  414. puts("Извините, в книге не может быть больше 1500 страниц. Повторите ввод.");
  415. if ((N->book->page) <50)
  416. puts("Извините, в книге не может быть меньше 50 страниц. Повторите ввод.");
  417. } while ((((N->book->page) > 1500) || ((N->book->page) < 50)));
  418.  
  419. do
  420. {
  421. printf("\nВведите тираж:");
  422. fflush(stdin);
  423. scanf_s("%d", &(N->book->tirag));
  424. if ((N->book->tirag) > 10000000)
  425. puts("Извините, книга не может быть выпущена тиражом более 10000000. Повторите ввод.");
  426. if ((N->book->tirag) <0)
  427. puts("Извините, книга не может быть выпущена тиражом меньше 0. Повторите ввод.");
  428. } while ((((N->book->tirag) > 10000000) || ((N->book->tirag) < 0)));
  429.  
  430. return N;
  431. }
  432. //ввод поля "жанр"
  433. char* InputGenre()
  434. {
  435. int a;
  436. puts("\nВыберите жанр книги:");
  437. puts("1.Биография");
  438. puts("2.Детектив");
  439. puts("3.Детская литература");
  440. puts("4.Историческая литература");
  441. puts("5.Научная литература:");
  442. puts("6.Повесть");
  443. puts("7.Поэзия");
  444. puts("8.Роман");
  445. puts("9.Фантастика");
  446. scanf_s("%d", &a);
  447. switch (a)
  448. {
  449. case 1:
  450. return "Биография";
  451. break;
  452. case 2:
  453. return "Детектив";
  454. break;
  455. case 3:
  456. return "Детская_литература";
  457. break;
  458. case 4:
  459. return "Историческая_литература";
  460. break;
  461. case 5:
  462. return "Научная _литература";
  463. break;
  464. case 6:
  465. return "Повесть";
  466. break;
  467. case 7:
  468. return "Поэзия";
  469. break;
  470. case 8:
  471. return "Роман";
  472. break;
  473. case 9:
  474. return "Фантастика";
  475. break;
  476. default:
  477. return ("Жанр не указан");
  478. break;
  479. }
  480. }
  481. //добавление элемента в начало списка
  482. List* NewBegin(List *N)
  483. {
  484. List* H;
  485. H = InputOne();
  486. H->next = N;
  487. return H;
  488. }
  489. //добавление элемента в конец списка
  490. void NewEnd(List *N)
  491. {
  492. List* H;
  493. H = InputOne();
  494. while (N->next != NULL)
  495. N = N->next;
  496. N->next = H;
  497. }
  498. //добавление элемента в место, указанное пользователем
  499. void NewPlace(List* N)
  500. {
  501. List* K;
  502.  
  503. N = SearchElement(N);
  504. if (N == NULL)
  505. {
  506. puts("Такого элемента нет");
  507. system("pause");
  508. }
  509. else
  510. {
  511. K = InputOne();
  512. K->next = N->next;
  513. N->next = K;
  514. }
  515. }
  516. //добавление элементов
  517. List* NewElement(List*N)
  518. {
  519. if (N != NULL)
  520. {
  521. int s;
  522. puts("1.Добавить элемент в начало");
  523. puts("2.Добавить элемент после выбранного элемента");
  524. puts("3.Добавить элемент в конец");
  525. puts("0.Вернуться в главное меню");
  526. scanf_s("%d", &s);
  527. switch (s)
  528. {
  529. // в начало
  530. case 1:
  531. system("cls");
  532. N = NewBegin(N);
  533. break;
  534. // после выбранного
  535. case 2:
  536. system("cls");
  537. NewPlace(N);
  538. break;
  539. // в конец
  540. case 3:
  541. system("cls");
  542. NewEnd(N);
  543. break;
  544. case 0:
  545. break;
  546. default:
  547. puts("Ошибка. Выберите один из пунктов меню");
  548. break;
  549. }
  550. }
  551. else
  552. {
  553. N = InputOne();
  554. }
  555. return N;
  556. }
  557. //добавление элемента из файла
  558. List* InputFile(FILE* f)
  559. {
  560.  
  561. List *N, *H = NULL, *P = NULL;
  562. Books *O;
  563.  
  564. fpos_t pos;
  565. fseek(f, 0L, SEEK_END);
  566. fgetpos(f, &pos);
  567. fseek(f, 0L, SEEK_SET);
  568. if (pos != 0)
  569. {
  570. while (!feof(f))
  571. {
  572. N = (List*)malloc(sizeof(List));
  573. O = (Books*)malloc(sizeof(Books));
  574. O->genre = (char*)malloc(sizeof(char));
  575. N->book = O;
  576. fscanf(f, "%s\t\%s\t\%s\t\%d\t\%s\t\%d\t\%d\n", N->book->name, N->book->writer, N->book->genre, &(N->book->data), N->book->country, &(N->book->page), &(N->book->tirag));
  577. if (P == NULL)
  578. H = N;
  579. else
  580. P->next = N;
  581. P = N;
  582. }
  583. fclose(f);
  584. P->next = NULL;
  585. }
  586. return H;
  587. }
  588.  
  589. //удаление первго элемента списка
  590. List* DeleteBegin(List* N)
  591. {
  592. if (N != NULL)
  593. {
  594. List* H;
  595. H = N->next;
  596. free(N->book);
  597. free(N);
  598. return H;
  599. }
  600. else
  601. {
  602. puts("Картотека не введена");
  603. system("pause");
  604. }
  605. }
  606. //удаление последнего элемента списка
  607. void DeleteEnd(List* N)
  608. {
  609. if (N != NULL)
  610. {
  611. List* K, *H;
  612. H = N;
  613. if (H->next != NULL)
  614. {
  615. H = SearchLast(H);
  616. }
  617. K = H;
  618.  
  619. free(K->book);
  620. free(K);
  621. }
  622. else
  623. {
  624. puts("Картотека не введена");
  625. system("pause");
  626. }
  627. }
  628. //удаление элемента, указанного пользователем
  629. void DeletePlace(List* H)
  630. {
  631. if (H != NULL)
  632. {
  633. List* N, *K;
  634. N = H;
  635. N = SearchElement(N);
  636. if (N = NULL)
  637. {
  638. puts("Такого элемента нет");
  639. system("pause");
  640. }
  641. else
  642. {
  643. K = N->next;
  644. N->next = N->next->next;
  645. free(K->book);
  646. free(K);
  647. }
  648. }
  649. else
  650. {
  651. puts("Картотека не введена");
  652. system("pause");
  653. }
  654.  
  655. }
  656. //удаление элементов
  657. List* DeleteElement(List* N)
  658. {
  659. if (N != NULL)
  660. {
  661. int s;
  662. system("cls");
  663. s = Menu2();
  664. switch (s)
  665. {
  666. // первый элемент
  667. case 1:
  668. system("cls");
  669. N = DeleteBegin(N);
  670. puts("Элемент удален");
  671. system("pause");
  672. break;
  673. // выбранный элемент
  674. case 2:
  675. system("cls");
  676. DeletePlace(N);
  677. puts("Элемент удален");
  678. system("pause");
  679. break;
  680. // последний элемент
  681. case 3:
  682. system("cls");
  683. DeleteEnd(N);
  684. puts("Элемент удален");
  685. system("pause");
  686. break;
  687. case 0:
  688. break;
  689. default:
  690. puts("Ошибка. Выберите один из пунктов меню");
  691. break;
  692. }
  693. }
  694. else
  695. {
  696. puts("Картотека не введена");
  697. system("pause");
  698. }
  699. return N;
  700. }
  701.  
  702. //вывод списка на экран
  703. void OutputList(List *N)
  704. {
  705. if (N != NULL)
  706. {
  707.  
  708. while (N != NULL)
  709. {
  710. printf("\nНазвание книги: %s\n", N->book->name);
  711. printf("Автор книги: %s\n", N->book->writer);
  712. printf("Жанр: %s\n", N->book->genre);
  713. printf("Год выпуска: %d\n", N->book->data);
  714. printf("Страна: %s\n", N->book->country);
  715. printf("Количество страниц: %d\n", N->book->page);
  716. printf("Тираж: %d\n", N->book->tirag);
  717. N = N->next;
  718. }
  719. }
  720. else
  721. {
  722. puts("Картотека не введена");
  723. }
  724. }
  725. //вывод списка в файл
  726. void OutputFile(FILE* file, List* N)
  727. {
  728. while (N != NULL)
  729. {
  730. fprintf(file, "%s\t\%s\t\%s\t\%d\t\%s\t\%d\t\%d\n", N->book->name, N->book->writer, N->book->genre, N->book->data, N->book->country, N->book->page, N->book->tirag);
  731. N = N->next;
  732. }
  733. fclose(file);
  734. }
  735.  
  736. //освобождение памяти
  737. List *Free(List* N)
  738. {
  739. if (N != NULL)
  740. {
  741. List* H, *K = NULL;
  742. Books* M;
  743.  
  744. while (N->next != NULL)
  745. {
  746. H = N->next;
  747. K = N;
  748. //free(N->book->genre);
  749. M = N->book;
  750. free(M);
  751. free(K);
  752. if (H != NULL)
  753. N = H;
  754. }
  755. free(N->book);
  756. free(N);
  757. }
  758. return NULL;
  759. }
  760.  
  761. //формирование нового списка
  762. List* NewList(List* N, List *NN)
  763. {
  764. List* B;
  765.  
  766. B = (List*)malloc(sizeof(List));
  767. B->book = N->book;
  768. B->next = NULL;
  769. if (NN != NULL)
  770. NN->next = B;
  771. else
  772. NN = B;
  773. return NN;
  774. }
  775. //поиск элемента
  776. List* SearchElement(List *N)
  777. {
  778. int y;
  779. Books* search = (Books*)malloc(sizeof(Books));
  780. puts("Выберите по какому полю вы хотите произвести поиск:\n1.Название книги\n2.Автор книги\n3.Жанр\n4.Год издания\n5.Страна издания\n6.Количество страниц\n7.Тираж\n0.Завершить поиск");
  781. scanf_s("%d", &y);
  782. switch (y)
  783. {
  784. case 1:
  785. do
  786. {
  787. printf("Введите название книги(не более 25 символов):");
  788. fflush(stdin);
  789. fgets((search->name), 30, stdin);
  790. if (strlen(search->name) > 25)
  791. puts("Извините, поле превышает 25 символов. Повторите ввод.");
  792. if (*(search->name) == '\n')
  793. puts("Извините, поле пустое. Повторите ввод.");
  794. } while ((strlen(search->name) > 25) || (*(search->name) == '\n'));
  795. search->name[strlen(search->name) - 1] = '\0';
  796.  
  797. for (; N != NULL; N = N->next)
  798. {
  799. y = strcmp(N->book->name, search->name);
  800. if (y == 0)
  801. return N;
  802. }
  803. break;
  804. case 2:
  805. do
  806. {
  807. printf("\nВведите автора книги(не более 25 символов):");
  808. fflush(stdin);
  809. fgets(search->writer, 55, stdin);
  810. if (strlen(search->writer) > 50)
  811. puts("Извините, поле превышает 50 символов. Повторите ввод.");
  812. if (*(search->writer) == '\n')
  813. puts("Извините, поле пустое. Повторите ввод.");
  814. } while ((strlen(search->writer) > 50) || (*(search->writer) == '\n'));
  815. search->writer[strlen(search->writer) - 1] = '\0';
  816.  
  817. for (; N != NULL; N = N->next)
  818. {
  819. y = strcmp(N->book->writer, search->writer);
  820. if (y == 0)
  821. return N;
  822. }
  823. break;
  824. case 3:
  825. search->genre = (char*)malloc(sizeof(char));
  826. search->genre = InputGenre();
  827.  
  828. for (; N != NULL; N = N->next)
  829. {
  830. y = strcmp(N->book->genre, search->genre);
  831. if (y == 0)
  832. return N;
  833. }
  834. break;
  835. case 4:
  836. do
  837. {
  838. printf("\nВведите год издания:");
  839. fflush(stdin);
  840. scanf_s("%d", &(search->data));
  841. if ((search->data) > 2016)
  842. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  843. if ((search->data) < 1600)
  844. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  845. } while ((((search->data) > 2016) || ((search->data) < 1600)));
  846. for (; N != NULL; N = N->next)
  847. {
  848. if (N->book->data == search->data);
  849. return N;
  850. }
  851. break;
  852. case 5:
  853. do
  854. {
  855. printf("\nВведите страну издания(не более 30 символов):");
  856. fflush(stdin);
  857. fgets(search->country, 55, stdin);
  858. if (strlen(search->country) > 30)
  859. puts("Извините, поле превышает 30 символов. Повторите ввод.");
  860. if (*(search->country) == '\n')
  861. puts("Извините, поле пустое. Повторите ввод.");
  862. } while ((strlen(search->country) > 30) || (*(search->country) == '\n'));
  863. search->country[strlen(search->country) - 1] = '\0';
  864.  
  865. for (; N != NULL; N = N->next)
  866. {
  867. y = strcmp(N->book->country, search->country);
  868. if (y == 0)
  869. return N;
  870. }
  871. break;
  872. case 6:
  873. do
  874. {
  875. printf("\nВведите количество страниц:");
  876. fflush(stdin);
  877. scanf_s("%d", &(search->page));
  878. if ((search->page) > 1500)
  879. puts("Извините, в книге не может быть больше 1500 страниц. Повторите ввод.");
  880. if ((search->page) < 50)
  881. puts("Извините, в книге не может быть меньше 50 страниц. Повторите ввод.");
  882. } while ((((search->page) > 1500) || ((search->page) < 50)));
  883.  
  884. for (; N != NULL; N = N->next)
  885. {
  886. if ((N->book->page == search->page))
  887. return N;
  888. }
  889. break;
  890. case 7:
  891. do
  892. {
  893. printf("\nВведите тираж:");
  894. fflush(stdin);
  895. scanf_s("%d", &(search->tirag));
  896. if ((search->tirag) > 10000000)
  897. puts("Извините, книга не может быть выпущена тиражом более 10000000. Повторите ввод.");
  898. if ((search->tirag) < 0)
  899. puts("Извините, книга не может быть выпущена тиражом меньше 0. Повторите ввод.");
  900. } while ((((search->tirag) > 10000000) || ((search->tirag) < 0)));
  901.  
  902. for (; N != NULL; N = N->next)
  903. {
  904. if ((N->book->tirag == search->tirag))
  905. return N;
  906. }
  907. break;
  908. case 0:
  909. break;
  910. default:
  911. puts("Ошибка. Выберите один из пунктов меню");
  912. break;
  913. }
  914. return NULL;
  915. }
  916. //сортировка элементов по значению
  917. List* Search(List* N)
  918. {
  919. List* NN = NULL, *Q = NULL;
  920. int y, i = 0;
  921.  
  922. Books* search = (Books*)malloc(sizeof(Books));
  923. do
  924. {
  925. system("cls");
  926. puts("Выберите по какому полю вы хотите произвести поиск:\n1.Название книги\n2.Автор книги\n3.Жанр\n4.Год издания\n5.Страна издания\n6.Количество страниц\n7.Тираж\n0.Завершить сортировку");
  927. scanf_s("%d", &y);
  928. i++;
  929. switch (y)
  930. {
  931. case 1:
  932. do
  933. {
  934. printf("Введите название книги(не более 25 символов):");
  935. fflush(stdin);
  936. fgets((search->name), 30, stdin);
  937. if (strlen(search->name) > 25)
  938. puts("Извините, поле превышает 25 символов. Повторите ввод.");
  939. if (*(search->name) == '\n')
  940. puts("Извините, поле пустое. Повторите ввод.");
  941. } while ((strlen(search->name) > 25) || (*(search->name) == '\n'));
  942. search->name[strlen(search->name) - 1] = '\0';
  943. if (i == 1)
  944. {
  945. for (; N != NULL; N = N->next)
  946. {
  947. y = strcmp(N->book->name, search->name);
  948. if (y == 0)
  949. NN = NewList(N, NN);
  950. }
  951. }
  952. else
  953. {
  954. for (; NN != NULL; NN = NN->next)
  955. {
  956. y = strcmp(N->book->name, search->name);
  957. if (y == 0)
  958. Q = NewList(NN, Q);
  959. }
  960. NN = Q;
  961. Free(Q);
  962. }
  963. puts("Поиск выполнен");
  964. system("pause");
  965. break;
  966. case 2:
  967. do
  968. {
  969. printf("\nВведите автора книги(не более 25 символов):");
  970. fflush(stdin);
  971. fgets(search->writer, 55, stdin);
  972. if (strlen(search->writer) > 50)
  973. puts("Извините, поле превышает 50 символов. Повторите ввод.");
  974. if (*(search->writer) == '\n')
  975. puts("Извините, поле пустое. Повторите ввод.");
  976. } while ((strlen(search->writer) > 50) || (*(search->writer) == '\n'));
  977. search->writer[strlen(search->writer) - 1] = '\0';
  978. if (i == 1)
  979. {
  980. for (; N != NULL; N = N->next)
  981. {
  982. y = strcmp(N->book->writer, search->writer);
  983. if (y == 0)
  984. NN = NewList(N, NN);
  985. }
  986. }
  987. else
  988. {
  989. for (; NN != NULL; NN = NN->next)
  990. {
  991. y = strcmp(N->book->writer, search->writer);
  992. if (y == 0)
  993. Q = NewList(NN, Q);
  994. }
  995. NN = Q;
  996. Free(Q);
  997. }
  998. puts("Поиск выполнен");
  999. system("pause");
  1000. break;
  1001. case 3:
  1002. search->genre = (char*)malloc(sizeof(char));
  1003. search->genre = InputGenre();
  1004.  
  1005. if (i == 1)
  1006. {
  1007. for (; N != NULL; N = N->next)
  1008. {
  1009. y = strcmp(N->book->genre, search->genre);
  1010. if (y == 0)
  1011. NN = NewList(N, NN);
  1012. }
  1013. }
  1014. else
  1015. {
  1016. for (; NN != NULL; NN = NN->next)
  1017. {
  1018. y = strcmp(N->book->genre, search->genre);
  1019. if (y == 0)
  1020. Q = NewList(NN, Q);
  1021. }
  1022. NN = Q;
  1023. Free(Q);
  1024. }
  1025. puts("Поиск выполнен");
  1026. system("pause");
  1027. break;
  1028. case 4:
  1029. do
  1030. {
  1031. printf("\nВведите год издания:");
  1032. fflush(stdin);
  1033. scanf_s("%d", &(search->data));
  1034. if ((search->data) > 2016)
  1035. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  1036. if ((search->data) <1600)
  1037. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  1038. } while ((((search->data) > 2016) || ((search->data) < 1600)));
  1039.  
  1040. if (i == 1)
  1041. {
  1042. for (; N != NULL; N = N->next)
  1043. {
  1044. if (N->book->data == search->data)
  1045. NN = NewList(N, NN);
  1046. }
  1047. }
  1048. else
  1049. {
  1050. for (; NN != NULL; NN = NN->next)
  1051. {
  1052. if (N->book->data == search->data)
  1053. Q = NewList(NN, Q);
  1054. }
  1055. NN = Q;
  1056. Free(Q);
  1057. }
  1058. puts("Поиск выполнен");
  1059. system("pause");
  1060. break;
  1061. case 5:
  1062. do
  1063. {
  1064. printf("\nВведите страну издания(не более 30 символов):");
  1065. fflush(stdin);
  1066. fgets(search->country, 55, stdin);
  1067. if (strlen(search->country) > 30)
  1068. puts("Извините, поле превышает 30 символов. Повторите ввод.");
  1069. if (*(search->country) == '\n')
  1070. puts("Извините, поле пустое. Повторите ввод.");
  1071. } while ((strlen(search->country) > 30) || (*(search->country) == '\n'));
  1072. search->country[strlen(search->country) - 1] = '\0';
  1073. if (i == 1)
  1074. {
  1075. for (; N != NULL; N = N->next)
  1076. {
  1077. y = strcmp(N->book->country, search->country);
  1078. if (y == 0)
  1079. NN = NewList(N, NN);
  1080. }
  1081. }
  1082. else
  1083. {
  1084. for (; NN != NULL; NN = NN->next)
  1085. {
  1086. y = strcmp(N->book->country, search->country);
  1087. if (y == 0)
  1088. Q = NewList(NN, Q);
  1089. }
  1090. NN = Q;
  1091. Free(Q);
  1092. }
  1093. puts("Поиск выполнен");
  1094. system("pause");
  1095. break;
  1096. case 6:
  1097.  
  1098. do
  1099. {
  1100. printf("\nВведите количество страниц:");
  1101. fflush(stdin);
  1102. scanf_s("%d", &(search->page));
  1103. if ((search->page) > 1500)
  1104. puts("Извините, в книге не может быть больше 1500 страниц. Повторите ввод.");
  1105. if ((search->page) <50)
  1106. puts("Извините, в книге не может быть меньше 50 страниц. Повторите ввод.");
  1107. } while ((((search->page) > 1500) || ((search->page) < 50)));
  1108.  
  1109. if (i == 1)
  1110. {
  1111. for (; N != NULL; N = N->next)
  1112. {
  1113. if (N->book->page == search->page)
  1114. NN = NewList(N, NN);
  1115. }
  1116. }
  1117. else
  1118. {
  1119. for (; NN != NULL; NN = NN->next)
  1120. {
  1121. if (N->book->page == search->page)
  1122. Q = NewList(NN, Q);
  1123. }
  1124. NN = Q;
  1125. Free(Q);
  1126. }
  1127. puts("Поиск выполнен");
  1128. system("pause");
  1129. break;
  1130. case 7:
  1131. do
  1132. {
  1133. printf("\nВведите тираж:");
  1134. fflush(stdin);
  1135. scanf_s("%d", &(search->tirag));
  1136. if ((search->tirag) > 10000000)
  1137. puts("Извините, книга не может быть выпущена тиражом более 10000000. Повторите ввод.");
  1138. if ((search->tirag) <0)
  1139. puts("Извините, книга не может быть выпущена тиражом меньше 0. Повторите ввод.");
  1140. } while ((((search->tirag) > 10000000) || ((search->tirag) < 0)));
  1141.  
  1142. if (i == 1)
  1143. {
  1144. for (; N != NULL; N = N->next)
  1145. {
  1146. if (N->book->tirag == search->tirag)
  1147. NN = NewList(N, NN);
  1148. }
  1149. }
  1150. else
  1151. {
  1152. for (; NN != NULL; NN = NN->next)
  1153. {
  1154. if (N->book->tirag == search->tirag)
  1155. Q = NewList(NN, Q);
  1156. }
  1157. NN = Q;
  1158. Free(Q);
  1159. }
  1160. puts("Поиск выполнен");
  1161. system("pause");
  1162. break;
  1163. case 0:
  1164. break;
  1165. default:
  1166. puts("Ошибка.Выберите поле для сортировки");
  1167. system("pause");
  1168. break;
  1169. }
  1170. } while (y != 0);
  1171. return NN;
  1172. }
  1173. //сортировка элементов по алфавиту
  1174. void Sorting(List* H)
  1175. {
  1176. int summ, summ1;
  1177. summ = summa(H);
  1178. do
  1179. {
  1180. summ1 = summa(H);
  1181. if (summ1 > 2)
  1182. end(H);
  1183. else
  1184. {
  1185. if (summ1 == 2)
  1186. end1(H);
  1187.  
  1188. }
  1189. H = H->next;
  1190. summ--;
  1191. } while (summ != 0);
  1192. }
  1193. //вспомогательная функция к Sorting
  1194. void end(List *h)
  1195. {
  1196. List *p = NULL, *q, *w, *e;
  1197.  
  1198. int z, stop = 0, summ;
  1199. summ = summa(h);
  1200. if (h == NULL)
  1201. stop = 1;
  1202. if (stop != 1)
  1203. {
  1204. do
  1205. {
  1206. z = strcmp(h->book->name, (h->next)->book->name);
  1207. if (z <= 0)//отсылка мах в конец
  1208. {
  1209. e = h->next;
  1210. q = (List*)malloc(sizeof(List));
  1211. q->book = e->book;
  1212. q->next = NULL;
  1213. h->next = e->next;
  1214. free(e);
  1215. if (h->next != NULL)
  1216. if (h->next != NULL)
  1217. {
  1218. p = SearchLast(h);
  1219. (p->next)->next = q;
  1220. }
  1221. }
  1222. if (z > 0) //смена мест
  1223. {
  1224. q = (List*)malloc(sizeof(List));
  1225. w = h->next;
  1226. q->book = w->book;
  1227. w->book = h->book;
  1228. h->book = q->book;
  1229. free(q);
  1230. summ++;
  1231. }
  1232. summ--;
  1233. } while (summ != 0);
  1234. }
  1235. }
  1236. //вспомогательная функция к Sorting
  1237. void end1(List *h)
  1238. {
  1239. List *p, *e, *q, *w;
  1240. int z;
  1241. z = strcmp(h->book->writer, (h->next)->book->writer);
  1242. if (z < 0)//отсылка мах в конец
  1243. {
  1244. e = h->next;
  1245. q = (List*)malloc(sizeof(List));
  1246. q->book = e->book;
  1247. q->next = NULL;
  1248. h->next = q;
  1249. free(e);
  1250. if (h->next != NULL)
  1251. {
  1252. p = SearchLast(h);
  1253. (p->next)->next = q;
  1254. q->next = NULL;
  1255. }
  1256. }
  1257. if (z > 0) //смена мест
  1258. {
  1259. q = (List*)malloc(sizeof(List));
  1260. w = h->next;
  1261. q->book = w->book;
  1262. w->book = h->book;
  1263. h->book = q->book;
  1264. free(q);
  1265. }
  1266. }
  1267. //посдчет элементов
  1268. int summa(List *p)
  1269. {
  1270. int i = 0;
  1271. while (p != NULL)
  1272. {
  1273. i = i + 1;
  1274. p = p->next;
  1275. }
  1276. return i;
  1277. }
  1278. //поиск последнего элемента
  1279. List *SearchLast(List *H)
  1280. {
  1281. List *R;
  1282. R = NULL;
  1283. if (H != NULL)
  1284. {
  1285. R = H;
  1286. if (R->next != NULL)
  1287. {
  1288. while ((R->next)->next != NULL)
  1289. R = R->next;
  1290. }
  1291. }
  1292. return R;
  1293. }
  1294.  
  1295. void Wellcome()
  1296. {
  1297. puts("Здравствуйте! Вас Приветствует Электронная Библиотека!\n");
  1298. puts("С помочью 1 пункта меню, Вы можете создать электронную картотеку");
  1299. puts("Вашей библиотеки. Вы можете вводить данные с клавиатуры ");
  1300. puts("или загрузить их из файла.\n");
  1301. puts("С помощью 2 пункта меню Вы можете удалить элементы ");
  1302. puts("картотеки.\n");
  1303. puts("С помощью 3 пункта меню Вы можете найти элементы картотеки, ");
  1304. puts("по значению одного или нескольких полей.\n");
  1305. puts("С помощью пункта 4 меню Вы можете отсортировать Вашу картотеку");
  1306. puts("в алфавитном порядке.\n");
  1307. puts("С помощью пункта 5 меню Вы можете посмотреть вашу картотеку");
  1308. puts("или сохранить её в файл.\n");
  1309. puts("Если у Вас возникли какие-то сложности, с выполнение программы");
  1310. puts("в 6 пункте меню, вы можете посмотреть подсказки.\n");
  1311. puts("Для завершения работы программы, выберите нажмите 0.");
  1312. }
  1313.  
  1314. void Help()
  1315. {
  1316.  
  1317. puts("• Ввести элементы картотеки – нажать 1.");
  1318. puts("• Удалить элементы картотеки - нажать 2.");
  1319. puts("• Найти элементы - нажать 3.");
  1320. puts("• Выполнить сортировку по алфавиту – нажать 4");
  1321. puts("• Посмотреть или сохранить картотеку – нажать 5");
  1322. puts("• Help – нажать 6.");
  1323. puts("• Завершить работу программы – нажать 0.");
  1324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement