Advertisement
pucheglazick

lab4.cpp

Dec 14th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3. #include <iomanip>
  4. #include <fstream>
  5. #include <Windows.h>
  6.  
  7. using namespace std;
  8.  
  9. struct Student
  10. {
  11. string nameSt;
  12. string group;
  13. int day;
  14. int month;
  15. int year;
  16. };
  17.  
  18. struct ScrollList
  19. {
  20. int day;
  21. int month;
  22. int year;
  23. int quantity;
  24. };
  25.  
  26. void readSourceDateFromFile(Student*& a, int& size);
  27. void outputDateToScreen(Student a[], int size);
  28. void sortSourceStudYear(Student a[], int size);
  29. void sortSourceStudAge(Student a[], int size);
  30. void addStudent(Student*& a, int& size);
  31. void deleteStudent(Student*& a, int& size);
  32. void searchStudents(Student a[], int sourceSize, Student*& b, int& resultSize);
  33. void sortSearchStudent(Student a[], int size);
  34. void insertDateToFile(Student a[], int size);
  35. void createScrollList(Student a[], int sourceSize, ScrollList*& b, int& scrollListSize);
  36. void outputScrollListToScreen(ScrollList a[], int size);
  37. void sortScrollListYear(ScrollList a[], int size);
  38. void sortScrollListQuantity(ScrollList a[], int size);
  39. void insertScrollListToFile(ScrollList a[], int size);
  40.  
  41. int main()
  42. {
  43. SetConsoleCP(1251);
  44. SetConsoleOutputCP(1251);
  45.  
  46. bool exit = true;
  47. int choice;
  48.  
  49. Student* sourceSt = 0;
  50. Student* searchSt = 0;
  51. ScrollList* scrollList = 0;
  52. int realSourceSize, realSearchSize, scrollListSize;
  53.  
  54. while (exit)
  55. {
  56. system("CLS");
  57.  
  58. cout << "1.\tВвести исходный массив из файла.\n";
  59. cout << "2.\tВывести исходный массив на экран.\n";
  60. cout << "3.\tСортировка исходного массива по дате рождения в порядке убывания возраста.\n";
  61. cout << "4.\tСортировка исходного массива по году рождения в порядке возрастания.\n";
  62. cout << "5.\tДобавить студента в исходный массив студентов.\n";
  63. cout << "6.\tУдалить студента в исходный массив студентов.\n";
  64. cout << "7.\tЗаписать исходный массив в файл.\n";
  65. cout << "8.\tНайти всех студентов, родившихся осенью (выходной массив).\n";
  66. cout << "9.\tВывести выходной массив на экран.\n";
  67. cout << "10.\tСортировка выходного массива по фамилии студентов в алфавитном порядке.\n";
  68. cout << "11.\tЗаписать выходной массив в файл.\n";
  69. cout << "12.\tСоставить перечень дней рождений.\n";
  70. cout << "13.\tВывести перечень на экран.\n";
  71. cout << "14.\tСортировка перечня по дню рождения в порядке возрастания.\n";
  72. cout << "15.\tСортировка перечня по количеству в порядке убывания.\n";
  73. cout << "16.\tЗапись перечня в файл.\n";
  74. cout << "0.\tВывод из программы.\n";
  75.  
  76. cout << "Введите пункт меню: ";
  77. cin >> choice;
  78. switch (choice)
  79. {
  80. case 0:
  81. exit = false;
  82. break;
  83. case 1:
  84. readSourceDateFromFile(sourceSt, realSourceSize);
  85. break;
  86. case 2:
  87. outputDateToScreen(sourceSt, realSourceSize);
  88. break;
  89. case 3:
  90. sortSourceStudAge(sourceSt, realSourceSize);
  91. break;
  92. case 4:
  93. sortSourceStudYear(sourceSt, realSourceSize);
  94. break;
  95. case 5:
  96. addStudent(sourceSt, realSourceSize);
  97. break;
  98. case 6:
  99. deleteStudent(sourceSt, realSourceSize);
  100. break;
  101. case 7:
  102. insertDateToFile(sourceSt, realSourceSize);
  103. break;
  104. case 8:
  105. searchStudents(sourceSt, realSourceSize, searchSt, realSearchSize);
  106. break;
  107. case 9:
  108. outputDateToScreen(searchSt, realSearchSize);
  109. break;
  110. case 10:
  111. sortSearchStudent(searchSt, realSearchSize);
  112. break;
  113. case 11:
  114. insertDateToFile(searchSt, realSearchSize);
  115. break;
  116. case 12:
  117. createScrollList(sourceSt, realSourceSize, scrollList, scrollListSize);
  118. break;
  119. case 13:
  120. outputScrollListToScreen(scrollList, scrollListSize);
  121. break;
  122. case 14:
  123. sortScrollListYear(scrollList, scrollListSize);
  124. break;
  125. case 15:
  126. sortScrollListQuantity(scrollList, scrollListSize);
  127. break;
  128. case 16:
  129. insertScrollListToFile(scrollList, scrollListSize);
  130. break;
  131. default:
  132. cout << "\n\tНет такого номера.\n";
  133. break;
  134. }
  135.  
  136. system("pause");
  137. }
  138.  
  139. delete[] sourceSt;
  140. delete[] searchSt;
  141. delete[] scrollList;
  142.  
  143. return 0;
  144. }
  145. //1
  146. void readSourceDateFromFile(Student*& a, int& size)
  147. {
  148. if (a != 0)
  149. {
  150. delete[] a;
  151. a = 0;
  152. }
  153.  
  154. char fileName[30];
  155. string iniz;
  156.  
  157. cout << "\nВведите имя файла: ";
  158. cin >> fileName;
  159.  
  160. strcat_s(fileName, ".txt");
  161.  
  162. ifstream fin(fileName);
  163.  
  164. if (fin.is_open())
  165. cout << "\n\tФайл успешно открыт!\n";
  166. else
  167. {
  168. cout << "\n\tОшибка! Файл закрыт!\n";
  169. return;
  170. }
  171.  
  172. size = 0;
  173.  
  174. while (!fin.eof())
  175. {
  176. string name, group;
  177. int day, month, year;
  178. fin >> name >> iniz >> group >> day >> month >> year;
  179. size++;
  180. }
  181.  
  182. fin.close();
  183.  
  184. size--;
  185.  
  186. a = new Student[size];
  187.  
  188. int i = 0;//счётчик (индекс массива)
  189.  
  190. ifstream Fin(fileName);
  191.  
  192. while (!Fin.eof())
  193. {
  194. if (i == size)
  195. break;
  196. Fin >> a[i].nameSt >> iniz >> a[i].group >> a[i].day >> a[i].month >> a[i].year;
  197. a[i].nameSt += (" " + iniz);
  198. i++;
  199. }
  200.  
  201. cout << "\t\tЗапись завершена.\n";
  202.  
  203. if (!Fin.is_open())
  204. cout << "\tФайл успешно закрыт!\n\n";
  205. else
  206. {
  207. cout << "\tОшибка! Файл открыт!\n\n";
  208. return;
  209. }
  210. }
  211. //2,9
  212. void outputDateToScreen(Student a[], int size)
  213. {
  214. if (size == 0)
  215. {
  216. cout << "\n\tМассив пуст.\n\n";
  217. return;
  218. }
  219.  
  220. cout << "-------------------------------------------------------------\n";
  221. cout << "| № | Фамилия И. О. | Группа |Дата рождения|\n";
  222. cout << "-------------------------------------------------------------\n";
  223.  
  224. for (int i = 0; i < size; i++)
  225. {
  226. cout << "|" << setw(3) << i + 1;
  227. cout << "|" << setw(30) << a[i].nameSt;
  228. cout << "|" << setw(10) << a[i].group;
  229. cout << "|" << setw(3) << a[i].day << "|" << setw(3) << a[i].month << "|" << setw(5) << a[i].year;
  230. cout << "|\n";
  231. }
  232.  
  233. cout << "-------------------------------------------------------------\n\n";
  234. }
  235. //3
  236. void sortSourceStudYear(Student a[], int size)
  237. {
  238. if (size == 0)
  239. {
  240. cout << "\n\tИсходный массив пуст.\n\n";
  241. return;
  242. }
  243.  
  244. for (int i = 0; i < size; i++)
  245. for (int j = 0; j < size; j++)
  246. {
  247. if (a[i].year <= a[j].year)
  248. {
  249. Student c = a[i];
  250. a[i] = a[j];
  251. a[j] = c;
  252. }
  253. }
  254.  
  255. cout << "\n\tСортировка исходного массива по году рождения в порядке убывания завершена.\n\n";
  256. }
  257. //4
  258. void sortSourceStudAge(Student a[], int size)
  259. {
  260. if (size == 0)
  261. {
  262. cout << "\n\tИсходный массив пуст.\n\n";
  263. return;
  264. }
  265.  
  266. for (int i = 0; i < size; i++)
  267. for (int j = 0; j < size; j++)
  268. {
  269. if (a[i].year < a[j].year)
  270. {
  271. Student c = a[i];
  272. a[i] = a[j];
  273. a[j] = c;
  274. }
  275. else if (a[i].year == a[j].year)
  276. {
  277. if (a[i].month < a[j].month)
  278. {
  279. Student c = a[i];
  280. a[i] = a[j];
  281. a[j] = c;
  282. }
  283. else if (a[i].month == a[j].month)
  284. {
  285. if (a[i].day < a[j].day)
  286. {
  287. Student c = a[i];
  288. a[i] = a[j];
  289. a[j] = c;
  290. }
  291. }
  292. }
  293. }
  294.  
  295. cout << "\n\tСортировка исходного массива по дате рождения в порядке убывания возраста завершена.\n\n";
  296. }
  297. //5
  298. void addStudent(Student*& a, int& size)
  299. {
  300. Student newStudent;
  301. string iniz;
  302.  
  303. cout << "\nВведите данные о новом студенте:\n";
  304. cout << "\tФамилия: ";
  305. cin >> newStudent.nameSt;
  306. cout << "\tИнициалы: ";
  307. cin >> iniz;
  308.  
  309. newStudent.nameSt += (" " + iniz);
  310.  
  311. cout << "\tГруппа: ";
  312. cin >> newStudent.group;
  313. cout << "\tДата рождения:\n";
  314. cout << "\t\tдень: ";
  315. cin >> newStudent.day;
  316. cout << "\t\tмесяц: ";
  317. cin >> newStudent.month;
  318. cout << "\t\tгод: ";
  319. cin >> newStudent.year;
  320.  
  321. Student* copy = new Student[size + 1];
  322.  
  323. for (int i = 0; i < size; i++)
  324. copy[i] = a[i];
  325.  
  326. delete[] a;
  327. a = 0;
  328.  
  329. copy[size++] = newStudent;
  330.  
  331. a = new Student[size];
  332.  
  333. for (int i = 0; i < size; i++)
  334. a[i] = copy[i];
  335.  
  336. delete[] copy;
  337.  
  338. cout << "\n\tЗапись добавлена.\n\n";
  339. }
  340. //6
  341. void deleteStudent(Student*& a, int& size)
  342. {
  343. if (size == 0)
  344. {
  345. cout << "\n\tИсходный массив пуст.\n\n";
  346. return;
  347. }
  348.  
  349. int number;
  350. char choice;
  351. bool exit = true;
  352.  
  353. outputDateToScreen(a, size);
  354.  
  355. while (true)
  356. {
  357. cout << "\nВведите номер удаляемой строки: ";
  358. cin >> number;
  359. number--;
  360.  
  361. if ((number < 0) || (number >= size))
  362. {
  363. cout << "\n\t!!! Нет такого номера!\n";
  364. system("pause");
  365. }
  366. else
  367. break;
  368. }
  369.  
  370. cout << number + 1 << " строка: " << a[number].nameSt << ' ' << a[number].group << ' ' << a[number].day << '.' << a[number].month << '.' << a[number].year << '\n';
  371.  
  372. while (exit)
  373. {
  374. cout << "Удалить данный элемент? (Y,y,Д,д - да; N,n,Н,н - нет) -> ";
  375. cin >> choice;
  376. switch (choice)
  377. {
  378. case 'n':
  379. case 'N':
  380. case 'н':
  381. case 'Н':
  382. cout << "\n\tЗапись не удалена.\n\n";
  383. exit = false;
  384. break;
  385. case 'y':
  386. case 'Y':
  387. case 'у':
  388. case 'У':
  389. {
  390. Student* copy = new Student[size - 1];
  391.  
  392. int k = 0;//переменная счетчик
  393.  
  394. for (int i = 0; i < size; i++)
  395. if (number != i)
  396. copy[k++] = a[i];
  397. else
  398. continue;
  399.  
  400. delete[] a;
  401. a = 0;
  402.  
  403. a = new Student[--size];
  404.  
  405. for (int i = 0; i < size; i++)
  406. a[i] = copy[i];
  407.  
  408. delete[] copy;
  409.  
  410. cout << "\n\tЗапись удалена.\n\n";
  411.  
  412. exit = false;
  413.  
  414. break;
  415. }
  416. default:
  417. cout << "Пожалуйста, введите 'Y' или 'N'\n";
  418. system("read -p 'Нажмите Enter для повторного ввода...' var");
  419. }
  420. }
  421. }
  422. //7, 11
  423. void insertDateToFile(Student a[], int size)
  424. {
  425. if (size == 0)
  426. {
  427. cout << "\n\tМассив пуст.\n\n";
  428. return;
  429. }
  430.  
  431. char fileName[30];
  432.  
  433. cout << "\nВведите имя файла: ";
  434. cin >> fileName;
  435.  
  436. strcat_s(fileName, ".txt");
  437.  
  438. ofstream fout(fileName);
  439.  
  440. if (fout.is_open())
  441. cout << "\n\tФайл успешно открыт!\n";
  442. else
  443. {
  444. cout << "\n\tОшибка! Файл закрыт!\n";
  445. return;
  446. }
  447.  
  448. fout << "-------------------------------------------------------------\n";
  449. fout << "| № | Фамилия И. О. | Группа |Дата рождения|\n";
  450. fout << "-------------------------------------------------------------\n";
  451.  
  452. for (int i = 0; i < size; i++)
  453. {
  454. fout << "|" << setw(3) << i + 1;
  455. fout << "|" << setw(30) << a[i].nameSt;
  456. fout << "|" << setw(10) << a[i].group;
  457. fout << "|" << setw(3) << a[i].day << "|" << setw(3) << a[i].month << "|" << setw(5) << a[i].year;
  458. fout << "|\n";
  459. }
  460.  
  461. fout << "-------------------------------------------------------------\n";
  462.  
  463. cout << "\t\tЗапись массива в файл " << fileName << " завершена.\n";
  464.  
  465. fout.close();
  466.  
  467. if (!fout.is_open())
  468. cout << "\tФайл успешно закрыт!\n\n";
  469. else
  470. {
  471. cout << "\tОшибка! Файл открыт!\n\n";
  472. return;
  473. }
  474. }
  475. //8
  476. void searchStudents(Student a[], int sourceSize, Student*& b, int& resultSize)
  477. {
  478. if (sourceSize == 0)
  479. {
  480. cout << "\n\tИсходный массив пуст.\n\n";
  481. return;
  482. }
  483.  
  484. if (b != 0)
  485. {
  486. delete[] b;
  487. b = 0;
  488. }
  489.  
  490. int minDay = 32, minMonth = 13, minYear = 20200;
  491.  
  492. for (int i = 0; i < sourceSize; i++)
  493. {
  494. if ((a[i].month >= 9) && (a[i].month <= 11))
  495. {
  496. if (a[i].year < minYear || a[i].year == minYear && (a[i].month < minMonth || a[i].month == minMonth && a[i].day < minDay))
  497. {
  498. minYear = a[i].year;
  499. minMonth = a[i].month;
  500. minDay = a[i].day;
  501. }
  502. }
  503. }
  504.  
  505. resultSize = 0;
  506.  
  507. for (int i = 0; i < sourceSize; i++)
  508. if ((a[i].month == minMonth) && (a[i].day == minDay) && (a[i].year == minYear))
  509. resultSize++;
  510.  
  511. b = new Student[resultSize];
  512.  
  513. int k = 0;
  514.  
  515. for (int i = 0; i < sourceSize; i++)
  516. if ((a[i].month == minMonth) && (a[i].day == minDay) && (a[i].year == minYear))
  517. b[k++] = a[i];
  518.  
  519. if (resultSize == 0)
  520. cout << "\n\tСтудеты не найдены.\n\n";
  521. else
  522. cout << "\n\tПоиск завершен.\n\n";
  523. }
  524. //9
  525. void sortSearchStudent(Student a[], int size)
  526. {
  527. if (size == 0)
  528. {
  529. cout << "\n\tВыходной массив пуст.\n\n";
  530. return;
  531. }
  532. for (int i = 0; i < size; i++)
  533. for (int j = 0; j < size; j++)
  534. {
  535. if (a[i].nameSt <= a[j].nameSt)
  536. {
  537. Student c = a[i];
  538. a[i] = a[j];
  539. a[j] = c;
  540. }
  541. }
  542.  
  543. cout << "\n\tСортировка выходного массива по фамилии студентов в алфавитном порядке завершена.\n\n";
  544. }
  545. //12
  546. void createScrollList(Student a[], int sourceSize, ScrollList*& b, int& scrollListSize)
  547. {
  548. if (sourceSize == 0)
  549. {
  550. cout << "\n\tИсходный массив пуст.\n\n";
  551. return;
  552. }
  553.  
  554. if (b != 0)
  555. {
  556. delete[] b;
  557. b = 0;
  558. }
  559.  
  560. int flag;
  561. ScrollList* copy = new ScrollList[sourceSize];
  562.  
  563. scrollListSize = 0;
  564.  
  565. for (int i = 0; i < sourceSize; i++)
  566. {
  567. flag = 0;
  568. for (int j = 0; j < scrollListSize; j++)
  569. {
  570. if (a[i].day == copy[j].day && (a[i].month == copy[j].month) && (a[i].year == copy[j].year))
  571. {
  572. copy[j].quantity++;
  573. flag = 1;
  574. }
  575. }
  576. if (flag == 0)
  577. {
  578. copy[scrollListSize].day = a[i].day;
  579. copy[scrollListSize].month = a[i].month;
  580. copy[scrollListSize].year = a[i].year;
  581. copy[scrollListSize].quantity = 1;
  582. scrollListSize++;
  583. }
  584. }
  585.  
  586. b = new ScrollList[scrollListSize];
  587.  
  588. for (int i = 0; i < scrollListSize; i++)
  589. b[i] = copy[i];
  590.  
  591. delete[] copy;
  592.  
  593. cout << "\n\tПеречень составлен.\n\n";
  594. }
  595. //13
  596. void outputScrollListToScreen(ScrollList a[], int size)
  597. {
  598. if (size == 0)
  599. {
  600. cout << "\n\tПеречень пуст.\n\n";
  601. return;
  602. }
  603.  
  604. cout << "------------------------------\n";
  605. cout << "| № |Дата рождения|Количество|\n";
  606. cout << "------------------------------\n";
  607.  
  608. for (int i = 0; i < size; i++)
  609. {
  610. cout << "|" << setw(3) << i + 1;
  611. cout << "|" << setw(5) << a[i].day << "/" << setw(2) << a[i].month << "/" << setw(4) << a[i].year;
  612. cout << "|" << setw(10) << a[i].quantity;
  613. cout << "|\n";
  614. }
  615.  
  616. cout << "------------------------------\n\n";
  617. }
  618. //14
  619. void sortScrollListYear(ScrollList a[], int size)
  620. {
  621. if (size == 0)
  622. {
  623. cout << "\n\tПеречень пуст.\n\n";
  624. return;
  625. }
  626.  
  627. for (int i = 0; i < size; i++)
  628. for (int j = 0; j < size; j++)
  629. {
  630. if (a[i].year < a[j].year)
  631. {
  632. ScrollList c = a[i];
  633. a[i] = a[j];
  634. a[j] = c;
  635. }
  636. else if (a[i].year == a[j].year)
  637. {
  638. if (a[i].month < a[j].month)
  639. {
  640. ScrollList c = a[i];
  641. a[i] = a[j];
  642. a[j] = c;
  643. }
  644. else if (a[i].month == a[j].month)
  645. {
  646. if (a[i].day < a[j].day)
  647. {
  648. ScrollList c = a[i];
  649. a[i] = a[j];
  650. a[j] = c;
  651. }
  652. }
  653. }
  654. }
  655.  
  656. cout << "\n\tСортировка перечня дню рождению завершена.\n\n";
  657. }
  658. //15
  659. void sortScrollListQuantity(ScrollList a[], int size)
  660. {
  661. if (size == 0)
  662. {
  663. cout << "\n\tПеречень пуст.\n\n";
  664. return;
  665. }
  666.  
  667. for (int i = 0; i < size; i++)
  668. {
  669. for (int j = 0; j < size; j++)
  670. {
  671. if (a[i].quantity > a[j].quantity)
  672. {
  673. ScrollList change = a[i];
  674. a[i] = a[j];
  675. a[j] = change;
  676. }
  677. }
  678. }
  679.  
  680. cout << "\n\tСортировка перечня по количеству дат завершена.\n\n";
  681. }
  682. //16
  683. void insertScrollListToFile(ScrollList a[], int size)
  684. {
  685. if (size == 0)
  686. {
  687. cout << "\n\tПеречень пуст.\n\n";
  688. return;
  689. }
  690.  
  691. char fileName[30];
  692.  
  693. cout << "\nВведите имя файла: ";
  694. cin >> fileName;
  695.  
  696. strcat_s(fileName, ".txt");
  697.  
  698. ofstream fout(fileName);
  699.  
  700. if (fout.is_open())
  701. cout << "\n\tФайл успешно открыт!\n";
  702. else
  703. {
  704. cout << "\n\tОшибка! Файл закрыт!\n";
  705. return;
  706. }
  707.  
  708. fout << "------------------------------\n";
  709. fout << "| № |Дата рождения|Количество|\n";
  710. fout << "------------------------------\n";
  711.  
  712. for (int i = 0; i < size; i++)
  713. {
  714. fout << "|" << setw(3) << i + 1;
  715. fout << "|" << setw(5) << a[i].day << "/" << setw(2) << a[i].month << "/" << setw(4) << a[i].year;
  716. fout << "|" << setw(10) << a[i].quantity;
  717. fout << "|\n";
  718. }
  719.  
  720. fout << "------------------------------\n";
  721.  
  722. cout << "\t\tЗапись массива в файл " << fileName << " завершена.\n";
  723.  
  724. fout.close();
  725.  
  726. if (!fout.is_open())
  727. cout << "\tФайл успешно закрыт!\n\n";
  728. else
  729. {
  730. cout << "\tОшибка! Файл открыт!\n\n";
  731. return;
  732. }
  733. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement