dariagalich

Untitled

Dec 15th, 2019
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iomanip>
  5. #include <conio.h>
  6. #include <fstream>
  7. #include <locale.h>
  8. #include <windows.h>
  9. #include <io.h>
  10. #include <fcntl.h>
  11. using namespace std;
  12. //----КОНСТАНТЫ----------
  13. const int up = 72,
  14. down = 80,
  15. right_btn = 77,
  16. left_btn = 75,
  17. enter = 13,
  18. esc = 27,
  19. del = 83,
  20. d_n = 20;
  21. const string items[9] =
  22. {
  23. "Создать список или добавить новый эл-т ",
  24. " Удаление всех элементов списка ",
  25. " Просмотр списка ",
  26. " Запись данных в файл ",
  27. " Чтение из файла ",
  28. " Изменить ",
  29. " Поиск ",
  30. " Старые книги ",
  31. " Выход "
  32. };
  33. const string items2[4] =
  34. {
  35. "Поиск по автору книги ",
  36. "Поиск по названию книги",
  37. "Поиск по жанру книги",
  38. "Выход(esc)"
  39. };
  40. const string items3[3] =
  41. {
  42. "Запись в текстовый файл",
  43. "Запись в бинарный файл"
  44. "Выход(esc)"
  45. };
  46. const string items4[3] =
  47. {
  48. "Чтение из текстового файла",
  49. "Чтение из бинарного файла",
  50. "Выход(esc)"
  51. };
  52. //=======ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ===============
  53. string filename;
  54. int num_pages = 5, // Кол-во элементов на одной странице
  55. width = 0, // Ширина окна
  56. height = 0; // Высота окна
  57. int kol_el = 1;// Кол-во элементов
  58. //-------------------------------------------
  59. struct info
  60. {
  61. string autor;
  62. string name;
  63. string izdatelstvo;
  64. string janr;
  65. string cost;
  66. int d = 0, m = 0, g = 0;
  67. };
  68. struct book
  69. {
  70. info inf;
  71. book* next = 0;
  72. book* pred = 0;
  73. };
  74. //-------------------------------------------
  75. book vvod_book();
  76. book* dob(book* end, const book& s);
  77. book* dob_first(const book& s);
  78. book* udal(book* beg);
  79. book* list(book* beg, int active, int page, int k);
  80. book* delete_el(book* beg,int num_del);
  81. void cls();
  82. void gotoxy(int xpos, int ypos);
  83. void print(const book& s);
  84. void prosmotr(book* beg);
  85. void old_book(book beg);
  86. void sort_cost(book** beg);
  87. void sort_data(book* beg);
  88. void searchname(book* beg);
  89. void searchautor(book* beg);
  90. void searchjanr(book* beg);
  91. wchar_t* UnicodeString(string input);
  92. int change(book* beg, string& user_autor, string& new_user_autor);
  93. int read_file(string filename, book** beg, book** end);
  94. int write_file(string filename, book* temp);
  95. int write_file_binary(string filename, book* beg);
  96. int read_file_binary(string filename, book** beg, book** end);
  97. int menu(int& active, const string items[], int num_el);
  98. void SetColor(int text, int bg);
  99.  
  100. //===========основная программа===================================================
  101. int main()
  102. {
  103. // меняем размер шрифта
  104. CONSOLE_FONT_INFOEX cfi;
  105. cfi.cbSize = sizeof(cfi);
  106. cfi.nFont = 0;
  107. cfi.dwFontSize.X = 0; // Width of each character in the font
  108. cfi.dwFontSize.Y = 24; // Height
  109. cfi.FontFamily = FF_DONTCARE;
  110. cfi.FontWeight = FW_NORMAL;
  111. SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
  112. //----------------------------------
  113. HANDLE hCon;
  114. // вытаскиваем ширину и высоту
  115. hCon = GetStdHandle(-12);
  116. CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
  117. if (GetConsoleScreenBufferInfo(hCon, &consoleInfo))
  118. {
  119. width = consoleInfo.srWindow.Right - consoleInfo.srWindow.Left + 1;
  120. height = consoleInfo.srWindow.Bottom - consoleInfo.srWindow.Top + 1;
  121. }
  122. //======================================================================
  123. system("cls");
  124. ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); // полноэкранный режим
  125. setlocale(LC_ALL, "Rus");
  126. system("color 8F");
  127. book* beg = NULL,
  128. * end = NULL, input;
  129. string filename;
  130. int Num, current = 1;
  131. string user_autor, new_user_autor;
  132. int num_e = 0;
  133. int k = 0;
  134. while (1) {
  135. system("cls");
  136. switch (menu(current, items, 9))
  137. {
  138. case 1://создание списка или добовление нового эл-та в список
  139. system("cls");
  140. if (beg)
  141. end = dob(end, vvod_book());
  142. else
  143. {
  144. beg = dob_first(vvod_book());
  145. end = beg;
  146. }
  147. kol_el++;
  148. break;
  149. case 2://удаление всех элементов в списке
  150. system("cls");
  151. delete_el(beg,0);
  152. /*beg = udal(beg);
  153. cout << "Нажмите любую клавишу" << endl;
  154. cin.get();*/
  155. break;
  156. case 3://просмотр
  157. system("cls");
  158. //prosmotr(beg);
  159. list(beg, 0, 0, 0);
  160. break;
  161. case 4://запись в файл
  162. {
  163. system("cls");
  164. int current = 1;
  165. cout << "Выберите формат файла в который хотите записать:";
  166. switch (menu(current, items3, 3))
  167. {
  168. case 1://Запись в текстовый файл
  169. system("cls");
  170. write_file(filename, beg);
  171. break;
  172. case 2://Запись в бинарный файл
  173. write_file_binary(filename, beg);
  174. cin.get();
  175. break;
  176. case 27:break;
  177. }
  178. }
  179. break;
  180. case 5://чтение из файла
  181. {
  182. system("cls");
  183. int current = 1;
  184. cout << "Выберите формат файла в который хотите записать:";
  185. switch (menu(current, items4, 3))
  186. {
  187. case 1://чтение из текстового файла
  188. system("cls");
  189. read_file(filename, &beg, &end);
  190. break;
  191. case 2://чтение из бинарного файла
  192. read_file_binary(filename, &beg, &end);
  193. cin.get();
  194. break;
  195. case 27:break;
  196. }
  197. }
  198.  
  199. break;
  200. case 6://редактирование списка
  201. system("cls");
  202. cout << "Введите автора, которого вы хотите изменить " << endl;
  203. cin >> user_autor;
  204. cout << "Введите нового атвора: " << endl;
  205. cin >> new_user_autor;
  206. Num = change(beg, user_autor, new_user_autor);
  207. if (Num == 1) cout << "Автор успешно перезаписан." << endl;
  208. else cout << "Автор не найден!" << endl;
  209. system("pause");
  210. change(beg, user_autor, new_user_autor);
  211. cin.get();
  212. break;
  213. case 7://поиск
  214. {
  215. system("cls");
  216. int current = 1;
  217. switch (menu(current, items2, 4))
  218. {
  219. case 1://поск по автору
  220. system("cls");
  221. searchautor(beg);
  222. cin.get();
  223. break;
  224. case 2:
  225. system("cls");
  226. searchname(beg);//поиск по названию книги
  227. cin.get();
  228. break;
  229. case 3:
  230. searchjanr(beg);
  231. break;
  232. case 27:break;
  233. }
  234. break;
  235. }
  236. case 8://старые книги
  237. if (!beg)
  238. {
  239. MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  240. break;
  241. }
  242. old_book(*beg);
  243. break;
  244. case 9: return 0;
  245. }
  246. }
  247. return 0;
  248. }
  249.  
  250. //-----------------------------------------------------------------------------
  251. int change(book* beg, string& user_autor, string& new_user_autor)
  252. {
  253. book* temp = beg;
  254. while (temp != NULL)
  255. {
  256. if (temp->inf.autor == user_autor)
  257. {
  258. temp->inf.autor = new_user_autor;
  259. return 1;
  260. }
  261. else
  262. {
  263. temp = temp->next;
  264.  
  265. }
  266. }
  267. return 0;
  268. }
  269. //------------------------------------------------------------------------------
  270. void searchjanr(book* beg)
  271. {
  272. book* temp = beg;
  273. char fname[d_n];
  274. int fl = 0;
  275.  
  276. system("cls");
  277.  
  278. if (!beg)
  279. {
  280. MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  281. return;
  282. }
  283.  
  284. cout << "Введите название жанра для поиска" << endl;
  285. cin >> fname;
  286. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  287. cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
  288. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  289. while (temp)
  290. {
  291. if (fname == temp->inf.janr)
  292. {
  293. print(*temp);
  294. fl = 1;
  295. }
  296. temp = temp->next;
  297. }
  298. if (fl != 1)
  299. {
  300. cout << "Книги с таким жанром не найдено" << endl;
  301. }
  302. system("pause");
  303. }
  304. //------------------------------------------------------------------------------
  305. void searchname(book* beg)
  306. {
  307. book* temp = beg;
  308. char fname[d_n];
  309. int fl = 0;
  310.  
  311. system("cls");
  312.  
  313. if (!beg)
  314. {
  315. MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  316. return;
  317. }
  318.  
  319. cout << "Введите название книги для поиска" << endl;
  320. cin >> fname;
  321. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  322. cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
  323. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  324. while (temp)
  325. {
  326. if (fname == temp->inf.name)
  327. {
  328. print(*temp);
  329. fl = 1;
  330. }
  331. temp = temp->next;
  332. }
  333. if (fl != 1)
  334. {
  335. cout << "Книги с таким названием не найдено" << endl;
  336. }
  337. system("pause");
  338. }
  339. //-----------------------------------------------------------------------------
  340. void searchautor(book* beg)
  341. {
  342. book* temp = beg;
  343. int fl = 0;
  344. char fa[d_n];
  345. system("cls");
  346. if (!beg)
  347. {
  348. MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  349. return;
  350. }
  351. cout << "Введите автора для поиска" << endl;
  352. cin >> fa;
  353.  
  354. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  355. cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
  356. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  357. while (temp)
  358. {
  359. if (fa == temp->inf.autor)
  360. {
  361. print(*temp);
  362. fl = 1;
  363. }
  364. temp = temp->next;
  365. }
  366. if (fl != 1) {
  367. cout << "Книги с таким автором не найдено" << endl;
  368. }
  369. system("pause");
  370. }
  371. //-----------------------------------------------------------------------------
  372. void old_book(book beg)
  373. {
  374. book* temp = &beg;
  375. sort_data(&beg);
  376. system("cls");
  377.  
  378. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  379. cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
  380. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  381. for (int i = 0; i < 5; i++) {
  382. print(*temp);
  383. temp = temp->next;
  384. }
  385.  
  386. system("pause");
  387. return;
  388.  
  389. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  390. cin.get();
  391. }
  392. //-----------------------------------------------------------------------------
  393. void prosmotr(book* beg)
  394. {
  395. int k = 1;
  396. if (!beg)
  397. {
  398. cout << "список пустой" << endl;
  399. cin.get();
  400. return;
  401. }
  402. book* temp = beg;
  403. cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  404. cout << "|№| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
  405. cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  406. while (temp)
  407. {
  408. cout << "|" << k++ << "|";
  409. print(*temp);
  410. temp = temp->next;
  411.  
  412. }
  413. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  414. cin.get();
  415. }
  416. //-----------------------------------------------------------------------------
  417. book vvod_book()
  418. {
  419. book s;
  420. cout << "Введите автора:" << endl;
  421. while (1)
  422. {
  423. cin >> s.inf.autor;
  424. //if (atoi(s.autor)==0)
  425. if ((s.inf.autor[0] >= '0') && (s.inf.autor[0] <= '9'))
  426. break;
  427. cout << "Ошибка ввода!" << endl;
  428. }
  429. cout << "Введите название книги:" << endl;
  430. while (1)
  431. {
  432. cin >> s.inf.name;
  433. //if (atoi(s.name)==0)
  434. break;
  435. cout << "Ошибка ввода!" << endl;
  436. }
  437. cout << "Введите издательство:" << endl;
  438. while (1)
  439. {
  440. cin >> s.inf.izdatelstvo;
  441. //if (atoi(s.izdatelstvo) == 0)
  442. break;
  443. cout << "Ошибка ввода!" << endl;
  444. }
  445. cout << "Введите жанр:" << endl;
  446. while (1)
  447. {
  448. cin >> s.inf.janr;
  449. //if (atoi(s.janr) == 0)
  450. break;
  451. cout << "Ошибка ввода!" << endl;
  452. }
  453. cout << "Введите дату поступления:" << endl;
  454. cout << "Введите день:";
  455. while (1)
  456. {
  457. cin >> s.inf.d;
  458. if ((s.inf.d >= 1) && (s.inf.d <= 31))
  459. break;
  460. cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  461. }
  462. cout << "Введите месяц:";
  463. while (1)
  464. {
  465. cin >> s.inf.m;
  466. if ((s.inf.m >= 1) && (s.inf.m <= 12))
  467. break;
  468. cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  469. }
  470. cout << "Введите год:";
  471. while (1)
  472. {
  473. cin >> s.inf.g;
  474. if ((s.inf.g >= 1900) && (s.inf.g <= 2050))
  475. break;
  476. cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  477. }
  478. cout << "Введите стоимость книги:" << endl;
  479. cin >> s.inf.cost;
  480.  
  481. kol_el++;
  482. return s;
  483. }
  484. //-----------------------------------------------------------------------------
  485. void print(const book& s)
  486. {
  487. cout << s.inf.autor << setw(18 - (s.inf.autor).length()) << "|";
  488. cout << s.inf.name << setw(21 - (s.inf.name).length()) << "|";
  489. cout << s.inf.izdatelstvo << setw(19 - (s.inf.izdatelstvo).length()) << "|";
  490. cout << s.inf.janr << setw(17 - (s.inf.janr).length()) << "|";
  491. if (s.inf.d < 10) {
  492. cout << 0 << s.inf.d << ".";
  493. }
  494. else {
  495. cout << s.inf.d << ".";
  496. }
  497. if (s.inf.m < 10) {
  498. cout << 0 << s.inf.m << ".";
  499. }
  500. else {
  501. cout << s.inf.m << ".";
  502. }
  503. cout << s.inf.g << setw(9) << "|";
  504. cout << s.inf.cost << setw(16 - (s.inf.cost).length()) << "|" << endl;
  505.  
  506. }
  507. //--------------ф-я добавления или создания эл-та-------------------------------
  508. book* dob(book* end, const book& s)
  509. {
  510. book* newE = new book;
  511. *newE = s;
  512. newE->next = 0;
  513. newE->pred = end;
  514. end->next = newE;
  515. end = newE;
  516. return end;
  517. }
  518. //--------------создание первого эл-та------------------------------
  519. book* dob_first(const book& s)
  520. {
  521. book* beg = new book;
  522. *beg = s;
  523. beg->next = 0;
  524. beg->pred = 0;
  525. return beg;
  526. }
  527. //-----------------------------------------------------------------------------
  528. int read_file(string filename, book** beg, book** end)
  529. {
  530. cout << "Введите название файла" << endl;
  531. cin >> filename;
  532. ifstream fin(filename, ios::in);
  533. if (!fin) {
  534.  
  535. MessageBox(0, L"Невозможно открыть файл!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  536. return 0;
  537.  
  538. }
  539. book s;
  540. *beg = 0;
  541. fin.seekg(0, ios::beg);
  542. while (fin >> s.inf.autor)
  543. {
  544. fin >> s.inf.name;
  545. fin >> s.inf.izdatelstvo;
  546. fin >> s.inf.janr;
  547. fin >> s.inf.d;
  548. fin >> s.inf.m;
  549. fin >> s.inf.g;
  550. fin >> s.inf.cost;
  551.  
  552.  
  553. if (*beg) {
  554. *end = dob(*end, s);
  555. }
  556. else {
  557. *beg = dob_first(s); *end = *beg;
  558. }
  559.  
  560. kol_el++;
  561. }
  562. cout << "Считывание прошло успешно" << endl;
  563. cin.get();
  564. cin.get();
  565. return 0;
  566. }
  567. //-----------------------------------------------------------------------------
  568. int write_file(string filename, book* temp)
  569. {
  570. cout << "Введите название файла" << endl;
  571. cin >> filename;
  572. ofstream fout(filename, ios_base::app); // открытие файла
  573. if (!fout)
  574. {
  575. cout << "Не могу открыть файл для записи" << endl;
  576. return 1;
  577. }
  578. while (temp)// пока temp!=0 выводим эл-ты в файл
  579. {
  580. fout << temp->inf.autor << endl;
  581. fout << temp->inf.name << endl;
  582. fout << temp->inf.izdatelstvo << endl;
  583. fout << temp->inf.janr << endl;
  584. fout << temp->inf.d << endl;
  585. fout << temp->inf.m << endl;
  586. fout << temp->inf.g << endl;
  587. fout << temp->inf.cost << endl;
  588. temp = temp->next;
  589. }
  590. cout << "Данные сохранены в файле: " << filename << endl;
  591. cout << "==============================" << endl;
  592. cout << "Нажмите любую клавишу" << endl;
  593. cin.get();
  594. return 0;
  595. }
  596. //-----------------------------------------------------------------------------
  597. int write_file_binary(string filename, book* beg)
  598. {
  599. cout << "Введите название файла" << endl;
  600. cin >> filename;
  601. book* temp = beg;
  602. ofstream fout(filename + ".dat", ios::binary); // открытие файла
  603. if (!fout)
  604. {
  605. cout << "Не могу открыть файл для записи" << endl;
  606. return 1;
  607. }
  608. while (temp) {
  609. fout.write((char*)&temp->inf, sizeof temp->inf);
  610. temp = temp->next;
  611. }
  612. fout.close();
  613. cout << "Данные сохранены в файле: " << filename << endl;
  614. cout << "==============================" << endl;
  615. cout << "Нажмите любую клавишу" << endl;
  616. cin.get();
  617. return 0;
  618. }
  619.  
  620. // ==========ЧТЕНИЕ ИЗ БИНАРНОГО ФАЙЛА==========
  621. int read_file_binary(string filename, book** beg, book** end)
  622. {
  623. cout << "Введите название файла" << endl;
  624. cin >> filename;
  625. ifstream fin(filename + ".dat", ios::binary);
  626.  
  627. if (!fin) {
  628. MessageBox(0, L"Нет файла!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  629. return 1;
  630. }
  631.  
  632. fin.seekg(ios_base::beg);
  633. book* t = new book;
  634. t->next = NULL;
  635. t->pred = NULL;
  636. *beg = 0;
  637.  
  638. while (fin.read((char*)&t->inf, sizeof t->inf))
  639. {
  640. if (*beg)
  641. *end = dob(*end, *t);
  642. else {
  643. *beg = dob_first(*t);
  644. *end = *beg;
  645. }
  646. }
  647. fin.close();
  648. cout << "Чтене прошло успешно" << endl;
  649. cout << "==============================" << endl;
  650. cout << "Нажмите любую клавишу" << endl;
  651. return 0;
  652. }
  653.  
  654. //-----------------------------------------------------------------------------
  655. book* udal(book* beg)
  656. {
  657. book* temp;
  658. if (!beg)
  659. {
  660. cout << "список пустой" << endl;
  661. cin.get();
  662. return 0;
  663. }
  664. while (beg)
  665. {
  666. temp = beg;
  667. beg = beg->next;
  668. delete temp;
  669. }
  670. cout << "==============================" << endl;
  671. cout << "====удаление прошло успешно===" << endl;
  672. cout << "==============================" << endl;
  673. return beg;
  674. }
  675. //----------------------------------------------------------------
  676. void sort_data(book* beg)
  677. {
  678. book* temp_i = beg, * temp_j = beg;
  679. for (; temp_i; temp_i = temp_i->next)
  680. {
  681. for (temp_j = temp_i; temp_j; temp_j = temp_j->next)
  682. {
  683. if (temp_i->inf.g != temp_j->inf.g)
  684. {
  685. if (temp_i->inf.g > temp_j->inf.g)
  686. {
  687. swap(temp_i->inf, temp_j->inf);
  688. continue;
  689. }
  690. }
  691. else if (temp_i->inf.m != temp_j->inf.m)
  692. {
  693. if (temp_i->inf.m > temp_j->inf.m)
  694. {
  695. swap(temp_i->inf, temp_j->inf);
  696. continue;
  697. }
  698. }
  699. else if (temp_i->inf.d > temp_j->inf.d)
  700. {
  701. swap(temp_i->inf, temp_j->inf);
  702. continue;
  703. }
  704. }
  705. }
  706. cout << "Сортировка прошла успешно" << endl;
  707. system("pause");
  708. }
  709. //----------------------------------------
  710. void sort_cost(book** beg) {
  711. book* temp_i = *beg,
  712. * temp_j = *beg;
  713.  
  714. for (; temp_i; temp_i = temp_i->next) {
  715. for (temp_j = temp_i; temp_j; temp_j = temp_j->next) {
  716. if (stoi(temp_i->inf.cost) > stoi(temp_j->inf.cost)) {
  717. swap(temp_i->inf, temp_j->inf);
  718. }
  719. }
  720. }
  721.  
  722. cout << "Сортировка прошла успешно" << endl;
  723. system("pause");
  724. }
  725. // ==========ШАБЛОН ПЕЧАТИ МЕНЮ==========
  726. void print_menu(int sym, const string items[], const int N_ITEMS)
  727. {
  728. for (int i = 1; i <= N_ITEMS; i++)
  729. {
  730. SetColor(15, 8);
  731. gotoxy((width / 2) - 10, (height / 2) + i - 3); // ставим меню в центр
  732. if (i == sym)
  733. {
  734. SetColor(16, 3);
  735. }
  736. cout << items[i - 1] << endl;
  737. SetColor(15, 8);
  738. }
  739. }
  740. // ==========МЕНЮ==========
  741. int menu(int& active, const string items[], int num_el)
  742. {
  743. wint_t buf;
  744. while (1)
  745. {
  746. cls();
  747. print_menu(active, items, num_el);
  748.  
  749. buf = _getwch();
  750. switch (buf)
  751. {
  752. case up: // клавиша вверх
  753. if (active > 1) active--;
  754. break;
  755. case down: // клавиша вниз
  756. if (active < num_el) active++;
  757. break;
  758. case enter: // клавиша enter
  759. return active;
  760. case esc: // клавиша escape
  761. return -1;
  762. }
  763. }
  764. }
  765. // ==========УСТАНОВКА ЦВЕТА ТЕКСТА И ФОНА==========
  766. void SetColor(int text, int bg)
  767. {
  768. HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  769. SetConsoleTextAttribute(hStdOut, (WORD)((bg << 4) | text));
  770. }
  771. // ==========ПЕРЕМЕЩЕНИЕ КУРСОРА НА ВЫБРАННУЮ ПОЗИЦИЮ==========
  772.  
  773. void gotoxy(int xpos, int ypos)
  774. {
  775. COORD scrn;
  776. HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
  777. scrn.X = xpos; scrn.Y = ypos;
  778. SetConsoleCursorPosition(hOuput, scrn);
  779. }
  780. //=====================================
  781. wchar_t* UnicodeString(string input) {
  782. const char* orig = input.c_str();
  783. size_t origsize = strlen(orig) + 1;
  784. const size_t newsize = 100;
  785. size_t convertedChars = 0;
  786. wchar_t* wcstring = new wchar_t[newsize];
  787. mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
  788. return wcstring;
  789. }
  790. // ==========ОЧИСТКА ЭКРАНА БЕЗ МЕРЦАНИЯ==========
  791. void cls() {
  792. HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
  793. COORD cd;
  794. cd.X = 0;
  795. cd.Y = 0;
  796. SetConsoleCursorPosition(hd, cd);
  797. }
  798. // ==========УДАЛЕНИЕ==========
  799. book* delete_el(book* beg,int num_del)
  800. {
  801. book* temp;
  802. book* buf;
  803.  
  804. if (!beg) {
  805. MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  806. return 0;
  807. }
  808.  
  809. temp = beg;
  810.  
  811. cout << "Введите номер элемента,который хотите удалить" << endl;
  812. cin >> num_del;
  813.  
  814. // если один элемент в списке
  815. if (beg->next == 0) {
  816. delete temp;
  817. return 0;
  818. }
  819.  
  820. while (temp) {
  821. if (num_del == kol_el) { // если введённый номер совпал с шифром задания
  822. buf = temp->next;
  823.  
  824. // если удаляется второй элемент
  825. if (temp->pred == 0) {
  826. buf->pred = 0;
  827. delete temp;
  828. return buf;
  829. }
  830.  
  831. if (buf != 0) buf->pred = temp->pred; // если следующий элемент не 0
  832.  
  833. buf = temp->pred;
  834. buf->next = temp->next;
  835. delete temp;
  836. return beg;
  837. }
  838. temp = temp->next;
  839. }
  840. MessageBox(0, L"Произошла ошибка!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  841. return beg;
  842.  
  843. }
  844.  
  845. book* list(book* beg, int active, int page, int k)
  846. {
  847. book* temp = beg,
  848. * buf_temp = beg,
  849. * buf_el = beg;
  850.  
  851. int c = 0,
  852. key = 0,
  853. first_page = 2; // переменная для первой страницы, если это первая страница, тогда 1, в остальных случаях = 2
  854.  
  855. int num_del = 0; // номер для удаления
  856. k = 0;
  857. page = 1;
  858. active = 1;
  859.  
  860. while (1)
  861. {
  862. if (!beg)
  863. {
  864. MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  865. return beg;
  866. }
  867.  
  868. if (k != kol_el + 1 && first_page != 1)
  869. {
  870. cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  871. cout << "|№| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
  872. cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  873.  
  874. do {
  875.  
  876. // находим первый элемент с предыдущей страницы
  877. if (k % 5 == 0 && page != 1) {
  878. buf_el = temp;
  879.  
  880. for (int j = 0; j < 5; j++, temp = temp->pred) {
  881. buf_temp = temp->pred;
  882. }
  883. temp = buf_el;
  884. }
  885.  
  886. cout << "|" << ++k << "|";
  887. print(*temp);
  888. temp = temp->next;
  889. } while (temp && k % 5 != 0);
  890.  
  891. cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  892. }
  893.  
  894. c = _getwch();
  895. key = _getwch();
  896.  
  897. switch (key) {
  898. case right_btn:
  899. first_page = 2;
  900. if (k != kol_el + 1) {
  901. page++;
  902. system("cls");
  903. }
  904. break;
  905. case left_btn:
  906. if (page != 1) {
  907. system("cls");
  908. k -= 10;
  909. page--;
  910. temp = buf_temp;
  911. }
  912. else first_page = 1;
  913. break;
  914. case esc:
  915. break;
  916. }
  917. }
  918. }
Advertisement
Add Comment
Please, Sign In to add comment