Advertisement
Guest User

lab4.cpp

a guest
Dec 14th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.51 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("clear");//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("read -p 'Нажмите Enter для продолжения...' var");//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(fileName, ".txt");//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. int b = (a[i].nameSt.length()) / 2;
  227. int c = (a[i].group.length()) / 2;
  228.  
  229. cout << "|" << setw(3) << i+1;
  230. cout << "|" << setw(30 + b) << a[i].nameSt;
  231. cout << "|" << setw(10 + c) << a[i].group;
  232. cout << "|" << setw(3) << a[i].day << "|" << setw(3) << a[i].month << "|" << setw(5) << a[i].year;
  233. cout << "|\n";
  234. }
  235.  
  236. cout << "-------------------------------------------------------------\n\n";
  237. }
  238. //3
  239. void sortSourceStudYear(Student a[], int size)
  240. {
  241. if (size == 0)
  242. {
  243. cout << "\n\tИсходный массив пуст.\n\n";
  244. return;
  245. }
  246.  
  247. for (int i = 0; i < size; i++)
  248. for (int j = 0; j < size; j++)
  249. {
  250. if (a[i].year <= a[j].year)
  251. {
  252. Student c = a[i];
  253. a[i] = a[j];
  254. a[j] = c;
  255. }
  256. }
  257.  
  258. cout << "\n\tСортировка исходного массива по году рождения в порядке убывания завершена.\n\n";
  259. }
  260. //4
  261. void sortSourceStudAge(Student a[], int size)
  262. {
  263. if (size == 0)
  264. {
  265. cout << "\n\tИсходный массив пуст.\n\n";
  266. return;
  267. }
  268.  
  269. for (int i = 0; i < size; i++)
  270. for (int j = 0; j < size; j++)
  271. {
  272. if (a[i].year < a[j].year)
  273. {
  274. Student c = a[i];
  275. a[i] = a[j];
  276. a[j] = c;
  277. }
  278. else if (a[i].year == a[j].year)
  279. {
  280. if (a[i].month < a[j].month)
  281. {
  282. Student c = a[i];
  283. a[i] = a[j];
  284. a[j] = c;
  285. }
  286. else if (a[i].month == a[j].month)
  287. {
  288. if (a[i].day < a[j].day)
  289. {
  290. Student c = a[i];
  291. a[i] = a[j];
  292. a[j] = c;
  293. }
  294. }
  295. }
  296. }
  297.  
  298. cout << "\n\tСортировка исходного массива по дате рождения в порядке убывания возраста завершена.\n\n";
  299. }
  300. //5
  301. void addStudent(Student *&a, int &size)
  302. {
  303. Student newStudent;
  304. string iniz;
  305.  
  306. cout << "\nВведите данные о новом студенте:\n";
  307. cout << "\tФамилия: ";
  308. cin >> newStudent.nameSt;
  309. cout << "\tИнициалы: ";
  310. cin >> iniz;
  311.  
  312. newStudent.nameSt += (" " + iniz);
  313.  
  314. cout << "\tГруппа: ";
  315. cin >> newStudent.group;
  316. cout << "\tДата рождения:\n";
  317. cout << "\t\tдень: ";
  318. cin >> newStudent.day;
  319. cout << "\t\tмесяц: ";
  320. cin >> newStudent.month;
  321. cout << "\t\tгод: ";
  322. cin >> newStudent.year;
  323.  
  324. Student *copy = new Student[size + 1];
  325.  
  326. for (int i = 0; i < size; i++)
  327. copy[i] = a[i];
  328.  
  329. delete [] a;
  330. a = 0;
  331.  
  332. copy[size++] = newStudent;
  333.  
  334. a = new Student[size];
  335.  
  336. for (int i = 0; i < size; i++)
  337. a[i] = copy[i];
  338.  
  339. delete [] copy;
  340.  
  341. cout << "\n\tЗапись добавлена.\n\n";
  342. }
  343. //6
  344. void deleteStudent(Student *&a, int &size)
  345. {
  346. if (size == 0)
  347. {
  348. cout << "\n\tИсходный массив пуст.\n\n";
  349. return;
  350. }
  351.  
  352. int number;
  353. char choice;
  354. bool exit = true;
  355.  
  356. outputDateToScreen(a, size);
  357.  
  358. while (true)
  359. {
  360. cout << "\nВведите номер удаляемой строки: ";
  361. cin >> number;
  362. number--;
  363.  
  364. if ((number < 0) || (number >= size))
  365. {
  366. cout << "\n\t!!! Нет такого номера!\n";
  367. system("read -p 'Нажмите Enter для продолжения...' var");//system("pause");
  368. }
  369. else
  370. break;
  371. }
  372.  
  373. cout << number+1 << " строка: " << a[number].nameSt << ' ' << a[number].group << ' ' << a[number].day << '.' << a[number].month << '.' << a[number].year << '\n';
  374.  
  375. while ( exit )
  376. {
  377. cout << "Удалить данный элемент? (Y,y,Д,д - да; N,n,Н,н - нет) -> ";
  378. cin >> choice;
  379. switch (choice)
  380. {
  381. case 'n':
  382. case 'N':
  383. //case 'н'
  384. //case 'Н'
  385. cout << "\n\tЗапись не удалена.\n\n";
  386. exit = false;
  387. break;
  388. case 'y':
  389. case 'Y':
  390. //case 'у'
  391. //case 'У'
  392. {
  393. Student *copy = new Student[size - 1];
  394.  
  395. int k = 0;//переменная счетчик
  396.  
  397. for (int i = 0; i < size; i++)
  398. if (number != i)
  399. copy[k++] = a[i];
  400. else
  401. continue;
  402.  
  403. delete [] a;
  404. a = 0;
  405.  
  406. a = new Student[--size];
  407.  
  408. for (int i = 0; i < size; i++)
  409. a[i] = copy[i];
  410.  
  411. delete [] copy;
  412.  
  413. cout << "\n\tЗапись удалена.\n\n";
  414.  
  415. exit = false;
  416.  
  417. break;
  418. }
  419. default:
  420. cout << "Пожалуйста, введите 'Y' или 'N'\n";
  421. system("read -p 'Нажмите Enter для повторного ввода...' var");
  422. }
  423. }
  424. }
  425. //7, 11
  426. void insertDateToFile(Student a[], int size)
  427. {
  428. if (size == 0)
  429. {
  430. cout << "\n\tМассив пуст.\n\n";
  431. return;
  432. }
  433.  
  434. char fileName[30];
  435.  
  436. cout << "\nВведите имя файла: ";
  437. cin >> fileName;
  438.  
  439. strcat(fileName, ".txt");//strcat_s(fileName, ".txt");
  440.  
  441. ofstream fout(fileName);
  442.  
  443. if (fout.is_open())
  444. cout << "\n\tФайл успешно открыт!\n";
  445. else
  446. {
  447. cout << "\n\tОшибка! Файл закрыт!\n";
  448. return;
  449. }
  450.  
  451. fout << "-------------------------------------------------------------\n";
  452. fout << "| № | Фамилия И. О. | Группа |Дата рождения|\n";
  453. fout << "-------------------------------------------------------------\n";
  454.  
  455. for (int i = 0; i < size; i++)
  456. {
  457. int b = (a[i].nameSt.length()) / 2;
  458. int c = (a[i].group.length()) / 2;
  459.  
  460. fout << "|" << setw(3) << i+1;
  461. fout << "|" << setw(30 + b) << a[i].nameSt;
  462. fout << "|" << setw(10 + c) << a[i].group;
  463. fout << "|" << setw(3) << a[i].day << "|" << setw(3) << a[i].month << "|" << setw(5) << a[i].year;
  464. fout << "|\n";
  465. }
  466.  
  467. fout << "-------------------------------------------------------------\n";
  468.  
  469. cout << "\t\tЗапись массива в файл " << fileName << " завершена.\n";
  470.  
  471. fout.close();
  472.  
  473. if ( !fout.is_open() )
  474. cout << "\tФайл успешно закрыт!\n\n";
  475. else
  476. {
  477. cout << "\tОшибка! Файл открыт!\n\n";
  478. return;
  479. }
  480. }
  481. //8
  482. void searchStudents(Student a[], int sourceSize, Student *&b, int &resultSize)
  483. {
  484. if (sourceSize == 0)
  485. {
  486. cout << "\n\tИсходный массив пуст.\n\n";
  487. return;
  488. }
  489.  
  490. if (b != 0)
  491. {
  492. delete [] b;
  493. b = 0;
  494. }
  495.  
  496. int minDay = 32, minMonth = 13, minYear = 20200;
  497.  
  498. for (int i = 0; i < sourceSize; i++)
  499. {
  500. if ((a[i].month >= 9) && (a[i].month <= 11))
  501. {
  502. if (a[i].year < minYear || a[i].year == minYear && (a[i].month < minMonth || a[i].month == minMonth && a[i].day < minDay))
  503. {
  504. minYear = a[i].year;
  505. minMonth = a[i].month;
  506. minDay = a[i].day;
  507. }
  508. }
  509. }
  510.  
  511. resultSize = 0;
  512.  
  513. for (int i = 0; i < sourceSize; i++)
  514. if ((a[i].month == minMonth) && (a[i].day == minDay) && (a[i].year == minYear))
  515. resultSize++;
  516.  
  517. b = new Student[resultSize];
  518.  
  519. int k = 0;
  520.  
  521. for (int i = 0; i < sourceSize; i++)
  522. if ((a[i].month == minMonth) && (a[i].day == minDay) && (a[i].year == minYear))
  523. b[k++] = a[i];
  524.  
  525. if (resultSize == 0)
  526. cout << "\n\tСтудеты не найдены.\n\n";
  527. else
  528. cout << "\n\tПоиск завершен.\n\n";
  529. }
  530. //9
  531. void sortSearchStudent(Student a[], int size)
  532. {
  533. if (size == 0)
  534. {
  535. cout << "\n\tВыходной массив пуст.\n\n";
  536. return;
  537. }
  538. for (int i = 0; i < size; i++)
  539. for (int j = 0; j < size; j++)
  540. {
  541. if (a[i].nameSt <= a[j].nameSt)
  542. {
  543. Student c = a[i];
  544. a[i] = a[j];
  545. a[j] = c;
  546. }
  547. }
  548.  
  549. cout << "\n\tСортировка выходного массива по фамилии студентов в алфавитном порядке завершена.\n\n";
  550. }
  551. //12
  552. void createScrollList(Student a[], int sourceSize, ScrollList *&b, int &scrollListSize)
  553. {
  554. if (sourceSize == 0)
  555. {
  556. cout << "\n\tИсходный массив пуст.\n\n";
  557. return;
  558. }
  559.  
  560. if (b != 0)
  561. {
  562. delete [] b;
  563. b = 0;
  564. }
  565.  
  566. int flag;
  567. ScrollList *copy = new ScrollList[sourceSize];
  568.  
  569. scrollListSize = 0;
  570.  
  571. for (int i = 0; i < sourceSize; i++)
  572. {
  573. flag = 0;
  574. for (int j = 0; j < scrollListSize; j++)
  575. {
  576. if (a[i].day == copy[j].day && (a[i].month == copy[j].month) && (a[i].year == copy[j].year))
  577. {
  578. copy[j].quantity++;
  579. flag = 1;
  580. }
  581. }
  582. if (flag == 0)
  583. {
  584. copy[scrollListSize].day = a[i].day;
  585. copy[scrollListSize].month = a[i].month;
  586. copy[scrollListSize].year = a[i].year;
  587. copy[scrollListSize].quantity = 1;
  588. scrollListSize++;
  589. }
  590. }
  591.  
  592. b = new ScrollList[scrollListSize];
  593.  
  594. for (int i = 0; i < scrollListSize; i++)
  595. b[i] = copy[i];
  596.  
  597. delete [] copy;
  598.  
  599. cout << "\n\tПеречень составлен.\n\n";
  600. }
  601. //13
  602. void outputScrollListToScreen(ScrollList a[], int size)
  603. {
  604. if (size == 0)
  605. {
  606. cout << "\n\tПеречень пуст.\n\n";
  607. return;
  608. }
  609.  
  610. cout << "------------------------------\n";
  611. cout << "| № |Дата рождения|Количество|\n";
  612. cout << "------------------------------\n";
  613.  
  614. for (int i = 0; i < size; i++)
  615. {
  616. cout << "|" << setw(3) << i+1;
  617. cout << "|" << setw(3) << a[i].day << "/" << setw(3) << a[i].month << "/" << setw(4) << a[i].year;
  618. cout << "|" << setw(10) << a[i].quantity;
  619. cout << "|\n";
  620. }
  621.  
  622. cout << "------------------------------\n\n";
  623. }
  624. //14
  625. void sortScrollListYear(ScrollList a[], int size)
  626. {
  627. if (size == 0)
  628. {
  629. cout << "\n\tПеречень пуст.\n\n";
  630. return;
  631. }
  632.  
  633. for (int i = 0; i < size; i++)
  634. for (int j = 0; j < size; j++)
  635. {
  636. if (a[i].year < a[j].year)
  637. {
  638. ScrollList c = a[i];
  639. a[i] = a[j];
  640. a[j] = c;
  641. }
  642. else if (a[i].year == a[j].year)
  643. {
  644. if (a[i].month < a[j].month)
  645. {
  646. ScrollList c = a[i];
  647. a[i] = a[j];
  648. a[j] = c;
  649. }
  650. else if (a[i].month == a[j].month)
  651. {
  652. if (a[i].day < a[j].day)
  653. {
  654. ScrollList c = a[i];
  655. a[i] = a[j];
  656. a[j] = c;
  657. }
  658. }
  659. }
  660. }
  661.  
  662. cout << "\n\tСортировка перечня дню рождению завершена.\n\n";
  663. }
  664. //15
  665. void sortScrollListQuantity(ScrollList a[], int size)
  666. {
  667. if (size == 0)
  668. {
  669. cout << "\n\tПеречень пуст.\n\n";
  670. return;
  671. }
  672.  
  673. for (int i = 0; i < size; i++)
  674. {
  675. for (int j = 0; j < size; j++)
  676. {
  677. if (a[i].quantity > a[j].quantity)
  678. {
  679. ScrollList change = a[i];
  680. a[i] = a[j];
  681. a[j] = change;
  682. }
  683. }
  684. }
  685.  
  686. cout << "\n\tСортировка перечня по количеству дат завершена.\n\n";
  687. }
  688. //16
  689. void insertScrollListToFile(ScrollList a[], int size)
  690. {
  691. if (size == 0)
  692. {
  693. cout << "\n\tПеречень пуст.\n\n";
  694. return;
  695. }
  696.  
  697. char fileName[30];
  698.  
  699. cout << "\nВведите имя файла: ";
  700. cin >> fileName;
  701.  
  702. strcat(fileName, ".txt");//strcat_s(fileName, ".txt");
  703.  
  704. ofstream fout(fileName);
  705.  
  706. if (fout.is_open())
  707. cout << "\n\tФайл успешно открыт!\n";
  708. else
  709. {
  710. cout << "\n\tОшибка! Файл закрыт!\n";
  711. return;
  712. }
  713.  
  714. fout << "------------------------------\n";
  715. fout << "| № |Дата рождения|Количество|\n";
  716. fout << "------------------------------\n";
  717.  
  718. for (int i = 0; i < size; i++)
  719. {
  720. fout << "|" << setw(3) << i+1;
  721. fout << "|" << setw(3) << a[i].day << "/" << setw(3) << a[i].month << "/" << setw(4) << a[i].year;
  722. fout << "|" << setw(10) << a[i].quantity;
  723. fout << "|\n";
  724. }
  725.  
  726. fout << "------------------------------\n";
  727.  
  728. cout << "\t\tЗапись массива в файл " << fileName << " завершена.\n";
  729.  
  730. fout.close();
  731.  
  732. if ( !fout.is_open() )
  733. cout << "\tФайл успешно закрыт!\n\n";
  734. else
  735. {
  736. cout << "\tОшибка! Файл открыт!\n\n";
  737. return;
  738. }
  739. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement