PIBogdanov

Група студенти

Jan 5th, 2024
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <Windows.h>
  5. #include <conio.h>
  6. #include <algorithm>
  7. #include <locale>
  8.  
  9. // Тези макраси са премахнати, защото се получават конфликти със съвпадащите имена на функциите от библиотеката "algorithm"
  10.  
  11. #undef min
  12. #undef max
  13.  
  14. const int MAX_STUDENTS = 25; // Максималният възможен брой студенти в група по условие
  15.  
  16. const int DISCIPLINES = 6; // Броят дисциплнити
  17.  
  18. const char EXIT = 27; // Константа за изход
  19.  
  20. // Структура, която пази данните на студентите
  21.  
  22. struct Student
  23. {
  24.     std::string studentName;
  25.  
  26.     std::string facultyNumber;
  27.    
  28.     float points[DISCIPLINES] { 0, 0, 0, 0, 0, 0 };
  29.  
  30.     float grades[DISCIPLINES] { 0, 0, 0, 0, 0, 0 };
  31. };
  32.  
  33. void mainMenu(); // Главно меню
  34.  
  35. void inputFacultyNumbersAndPoints(Student students[], int& studentsCount); // Въвеждане на факултетни номера и точки по шесте дисциплини
  36.  
  37. void convertPointsToGrades(Student students[], int studentsCount); // Преобразуване на точките в оценки
  38.  
  39. void consultationMenu(Student students[], int studentsCount); // Меню за справка
  40.  
  41. void printExcellentStudents(const Student students[], int studentsCount); // Извеждане на отличниците в групата
  42.  
  43. void searchForAStudentByAnInputtedFacultyNumber(const Student students[], int studentsCount); // Търсене на студент по зададен факултетен номер
  44.  
  45. void printGroup(const Student students[], int studentsCount); // Извеждане на списък с всички студенти. (Име, факултетен номер, оценка от всяка от шесте дисциплини и точки)
  46.  
  47. int inputStudentsCount(int& studentsCount); // Въвеждане на броя студенти
  48.  
  49. int studentsWithAnExcellentMarkCount(const Student students[], int studentsCount); // Намиране на броя отличници
  50.  
  51. char input(); // Въвеждане на символ от клавиатурата
  52.  
  53. void hideConsoleCursor(); // Скриване на курсора в конзолата
  54.  
  55. int main()
  56. {
  57.     setlocale(LC_ALL, "Bulgarian"); // Чрез тази функция помагаме на компилатора да разпознава кирилица
  58.  
  59.     hideConsoleCursor();
  60.  
  61.     mainMenu();
  62.  
  63.     return 0;
  64. }
  65.  
  66. void mainMenu()
  67. {
  68.     Student students[MAX_STUDENTS];
  69.  
  70.     int studentsCount = 0;
  71.  
  72.     char choice;
  73.  
  74.     do
  75.     {
  76.         system("cls"); // Изчистване на конзолата
  77.  
  78.         std::cout << "Главно меню:\n\n";
  79.  
  80.         std::cout << "1. Въвеждане на факултетни номера и точки\n";
  81.         std::cout << "2. Преобразуване на точките в оценки\n";
  82.         std::cout << "3. Справки\n";
  83.         std::cout << "4. Извеждане на информация за групата\n";
  84.         std::cout << "0. Изход\n\n";
  85.  
  86.         /*
  87.         std::cout << std::setw(104) << "Вашият избор е: ";
  88.         std::cin >> choice;
  89.         */
  90.  
  91.         std::cout << "За да изберете, трябва да натиснете от вас избрано копче от клавиатурата.";
  92.         choice = input();
  93.  
  94.         switch (choice)
  95.         {
  96.         case '1': inputFacultyNumbersAndPoints(students, studentsCount); break;
  97.  
  98.         case '2': convertPointsToGrades(students, studentsCount); break;
  99.  
  100.         case '3': consultationMenu(students, studentsCount); break;
  101.  
  102.         case '4': printGroup(students, studentsCount); break;
  103.  
  104.         case '0':
  105.                     /*
  106.                         Еквивалентен е и този вариант "exit(0);".  
  107.                         Чрез тази функция можем да прекратим програмата и с подадения параметър показваме как е завършила програмата.
  108.                         В случая е използвана константата "EXIT_SUCCESS", която има стоност 0, и чрез нея програмата завършва без грешки
  109.                     */
  110.  
  111.                     exit(EXIT_SUCCESS);
  112.  
  113.         default:
  114.                     std::cout << "\n\nГрешен избор. Моля, опитайте отново.\n";
  115.            
  116.                     std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  117.            
  118.                     while (input() != EXIT);
  119.            
  120.                     break;
  121.         }
  122.     } while (choice != 0);
  123. }
  124.  
  125. void inputFacultyNumbersAndPoints(Student students[], int& studentsCount)
  126. {
  127.     system("cls");
  128.  
  129.     /*
  130.         Функцията min() връща стойността на променливата с по-малка стойност от другата.
  131.         Вместо нея, може да се използва операторът null coalescing,
  132.         пример "studentsCount = studentsCount < MAX_STUDENTS ? studentsCount : MAX_STUDENTS;".
  133.     */
  134.  
  135.     studentsCount = std::min(inputStudentsCount(studentsCount), MAX_STUDENTS);
  136.  
  137.     std::cout << "\n";
  138.  
  139.     for (size_t i = 0; i < studentsCount; i++)
  140.     {
  141.         std::cout << "Студент " << i + 1 << ":\n";
  142.  
  143.         std::cout << "Име: ";
  144.  
  145.         /*
  146.             Функция за въвеждане на string-ове. Разликата на тази функция от оператора "cin" е, че приема целия ред, тоест,
  147.             ако използваме "cin" и въведем "Hello, world!", променливата ще приеме само "Hello," и следващата променлива,
  148.             откоято се нуждаене от въвеждане, ще приеме стойността "world!".
  149.         */
  150.  
  151.         std::getline(std::cin >> std::ws, students[i].studentName);
  152.  
  153.         std::cout << "Факултетен номер: ";
  154.         std::cin >> students[i].facultyNumber;
  155.  
  156.         std::cout << "\n";
  157.  
  158.         for (size_t j = 0; j < DISCIPLINES; j++)
  159.         {
  160.             do
  161.             {
  162.                 std::cout << "Точки по дисциплина " << j + 1 << " (от 30 до 100): ";
  163.                 std::cin >> students[i].points[j];
  164.             } while ( (students[i].points[j] < 30) || (students[i].points[j] > 100) );
  165.         }
  166.  
  167.         std::cout << "\n";
  168.     }
  169.  
  170.     std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  171.  
  172.     while (input() != EXIT);
  173. }
  174.  
  175. void convertPointsToGrades(Student students[], int studentsCount)
  176. {
  177.     system("cls");
  178.  
  179.     for (size_t i = 0; i < studentsCount; i++)
  180.     {
  181.         for (size_t j = 0; j < DISCIPLINES; j++)
  182.         {
  183.             if ( (students[i].points[j] >= 30) && (students[i].points[j] < 55) )         // Слаб 2
  184.             {
  185.                 students[i].grades[j] = 2.0f;
  186.             }
  187.  
  188.             else if ( (students[i].points[j] >= 55) && (students[i].points[j] < 62) )    // Среден 3
  189.             {
  190.                 students[i].grades[j] = 3.0f;
  191.             }
  192.  
  193.             else if ( (students[i].points[j] >= 62) && (students[i].points[j] < 75) )    // Добър 4
  194.             {
  195.                 students[i].grades[j] = 4.0f;
  196.             }
  197.  
  198.             else if ( (students[i].points[j] >= 75) && (students[i].points[j] < 89) )    // Много Добър 5
  199.             {
  200.                 students[i].grades[j] = 5.0f;
  201.             }
  202.  
  203.             else if ( (students[i].points[j] >= 89) && (students[i].points[j] <= 100) )  // Отличен 6
  204.             {
  205.                 students[i].grades[j] = 6.0f;
  206.             }
  207.            
  208.             // "Слаб 2" по условие е от 30 до 49 точки, а "Среден 3" е от 55 точки, следователно трябва да е от 30 до 55 точки
  209.         }
  210.     }
  211.  
  212.     std::cout << "Точките са преобразувани в оценки.\n\n";
  213.  
  214.     std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  215.  
  216.     while (input() != EXIT);
  217. }
  218.  
  219. void consultationMenu(Student students[], int studentsCount)
  220. {
  221.     char choice;
  222.    
  223.     do
  224.     {
  225.         system("cls"); // Изчистване на конзолата
  226.  
  227.         std::cout << "Меню за справка:\n\n";
  228.  
  229.         std::cout << "1. Извеждане на отличниците\n";
  230.         std::cout << "2. Търсене на студент по зададен факултетен номер\n";
  231.         std::cout << "0. Изход\n\n";
  232.  
  233.         std::cout << "За да изберете, трябва да натиснете от вас избрано копче от клавиатурата.";
  234.         choice = input();
  235.  
  236.         switch (choice)
  237.         {
  238.         case '1': printExcellentStudents(students, studentsCount); break;
  239.  
  240.         case '2': searchForAStudentByAnInputtedFacultyNumber(students, studentsCount); break;
  241.  
  242.         case '0': return;
  243.  
  244.         default:
  245.                     std::cout << "\n\nГрешен избор. Моля, опитайте отново.\n";
  246.  
  247.                     std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  248.  
  249.                     while (input() != EXIT);
  250.  
  251.                     break;
  252.         }
  253.     } while (choice != 0);
  254. }
  255.  
  256. void printExcellentStudents(const Student students[], int studentsCount)
  257. {
  258.     system("cls");
  259.  
  260.     if (studentsWithAnExcellentMarkCount(students, studentsCount) == 0)
  261.     {
  262.         std::cout << "Няма отличници в тази група!\n";
  263.  
  264.         std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  265.  
  266.         while (input() != EXIT);
  267.  
  268.         return;
  269.     }
  270.  
  271.     const int studentsWithAnExcellentMark = studentsWithAnExcellentMarkCount(students, studentsCount);
  272.  
  273.     float* averageGrades = new float [studentsWithAnExcellentMark];
  274.  
  275.     for (size_t i = 0; i < studentsWithAnExcellentMark; i++)
  276.     {
  277.         averageGrades[i] = 0.0f;
  278.     }
  279.  
  280.     int* indexesOfTheStudentsWithAnExcellentMark = new int [studentsWithAnExcellentMark];
  281.  
  282.     for (size_t i = 0; i < studentsWithAnExcellentMark; i++)
  283.     {
  284.         indexesOfTheStudentsWithAnExcellentMark[i] = -1;
  285.     }
  286.  
  287.     float totalGrades;
  288.  
  289.     float averageGrade = 0.0f;
  290.  
  291.     for (size_t i = 0; i < studentsCount; i++)
  292.     {
  293.         totalGrades = 0.0f;
  294.  
  295.         for (size_t j = 0; j < DISCIPLINES; j++)
  296.         {
  297.             totalGrades += students->grades[j];
  298.         }
  299.  
  300.         averageGrade = totalGrades / DISCIPLINES;
  301.  
  302.         if (averageGrade >= 5.5f)
  303.         {
  304.             for (size_t z = 0; z < studentsCount; z++)
  305.             {
  306.                 if ( (averageGrades[z] == 0.0f) && (indexesOfTheStudentsWithAnExcellentMark[z] == -1) )
  307.                 {
  308.                     averageGrades[z] = averageGrade;
  309.  
  310.                     indexesOfTheStudentsWithAnExcellentMark[z] = i;
  311.                 }
  312.             }
  313.         }
  314.     }
  315.  
  316.     std::cout << "В групата има " << studentsWithAnExcellentMark << (studentsWithAnExcellentMark == 1 ? " отличник" : " отличници") << ".\n\n\n";
  317.  
  318.     for (size_t i = 0; i < studentsWithAnExcellentMark; i++)
  319.     {
  320.         std::cout << "Име на студент: " << students[indexesOfTheStudentsWithAnExcellentMark[i]].studentName << "\n";
  321.  
  322.         std::cout << "Факултетен номер: " << students[indexesOfTheStudentsWithAnExcellentMark[i]].facultyNumber << "\n";
  323.  
  324.         std::cout << "Средната оценка от шесте дисциплини е " << averageGrades[i] << ".\n\n";
  325.     }
  326.  
  327.     std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  328.  
  329.     while (input() != EXIT);
  330. }
  331.  
  332. void searchForAStudentByAnInputtedFacultyNumber(const Student students[], int studentsCount)
  333. {
  334.     searchFacultyNumber:
  335.  
  336.     system("cls");
  337.  
  338.     std::string searchFacultyNumber;
  339.     std::cout << "Въведете факултетен номер за търсене: ";
  340.     std::cin >> searchFacultyNumber;
  341.  
  342.     bool isFound = false;
  343.  
  344.     std::cout << "\n\nТърсене ....\n\n\n";
  345.  
  346.     for (size_t i = 0; i < studentsCount; i++)
  347.     {
  348.         if (searchFacultyNumber == students[i].facultyNumber)
  349.         {
  350.             std::cout << "Намерено е съвпадение за факултетния номер: " << searchFacultyNumber << "\n";
  351.  
  352.             std::cout << "\n\nИме на студент: " << students[i].studentName << "\n\n";
  353.  
  354.             for (size_t j = 0; j < DISCIPLINES; j++)
  355.             {
  356.                 std::cout << "Дисциплина " << j + 1 << " ==> Оценка: " << (students[i].grades[j] == 0 ?
  357.                     "Все още точките не са преобразувани в оценка" : std::to_string(students[i].grades[j]))
  358.                     << " | Точки: " << students[i].points[j] << "\n";
  359.             }
  360.  
  361.             isFound = true;
  362.  
  363.             break;
  364.         }
  365.     }
  366.  
  367.     if (!isFound)
  368.     {
  369.         std::cout << "Студент с факултетен номер " << searchFacultyNumber << " не е намерен.\n";
  370.     }
  371.    
  372.     char choice;
  373.    
  374.     do
  375.     {
  376.         std::cout << "\n\nЖелаете ли да въведете друг факултетен номер?\n\n";
  377.  
  378.         std::cout << "1. Да\n";
  379.         std::cout << "2. Не\n\n";
  380.  
  381.         std::cout << "За да изберете, трябва да натиснете от вас избрано копче от клавиатурата.";
  382.         choice = input();
  383.        
  384.         if (choice == '1')
  385.         {
  386.             goto searchFacultyNumber;
  387.         }
  388.  
  389.         else if (choice == '2')
  390.         {
  391.             break;
  392.         }
  393.  
  394.         else
  395.         {
  396.             std::cout << "\n\nГрешен избор. Моля, опитайте отново.\n";
  397.  
  398.             std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  399.  
  400.             while (input() != EXIT);
  401.         }
  402.     } while (choice != 2);
  403.  
  404.     std::cout << "\n\n\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  405.  
  406.     while (input() != EXIT);
  407. }
  408.  
  409. void printGroup(const Student students[], int studentsCount)
  410. {
  411.     system("cls");
  412.  
  413.     std::cout << "Списък със студенти и техните резултати:";
  414.  
  415.     std::cout << "\n\n-----------------------------------------\n\n";
  416.  
  417.     for (size_t i = 0; i < studentsCount; i++)
  418.     {
  419.         std::cout << "Име на студент: " << students[i].studentName << "\n";
  420.  
  421.         std::cout << "Факултетен номер: " << students[i].facultyNumber << "\n\n";
  422.  
  423.         for (size_t j = 0; j < DISCIPLINES; j++)
  424.         {
  425.             std::cout << "Дисциплина " << j + 1 << " ==> Оценка: " << (students[i].grades[j] == 0 ? "Все още точките не са преобразувани в оценка" : std::to_string(static_cast<int>(students[i].grades[j]))) << " | Точки: " << students[i].points[j] << "\n";
  426.         }
  427.  
  428.         std::cout << "\n-----------------------------------------\n\n";
  429.     }
  430.  
  431.     std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  432.  
  433.     while (input() != EXIT);
  434. }
  435.  
  436. int inputStudentsCount(int& studentsCount)
  437. {
  438.     std::cout << "Въведете брой студенти (минимум 1 | максимум " << MAX_STUDENTS << "): ";
  439.     std::cin >> studentsCount;
  440.  
  441.     while ( (studentsCount < 1) || (studentsCount > MAX_STUDENTS) )
  442.     {
  443.         std::cout << "\n\nБроят студенти не може да бъде с размер " << studentsCount << ". Моля въведе нов брой студенти.\n\n";
  444.  
  445.         std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
  446.  
  447.         while (input() != EXIT);
  448.  
  449.         system("cls");
  450.  
  451.         std::cout << "Въведете брой студенти (минимум 1 | максимум " << MAX_STUDENTS << "): ";
  452.         std::cin >> studentsCount;
  453.     }
  454.  
  455.     return studentsCount;
  456. }
  457.  
  458. int studentsWithAnExcellentMarkCount(const Student students[], int studentsCount)
  459. {
  460.     float totalGrades;
  461.  
  462.     float averageGrade = 0.0f;
  463.  
  464.     int studentsWithAnExcellentMark = 0;
  465.  
  466.     for (size_t i = 0; i < studentsCount; i++)
  467.     {
  468.         totalGrades = 0.0f;
  469.  
  470.         for (size_t j = 0; j < DISCIPLINES; j++)
  471.         {
  472.             totalGrades += students[i].grades[j];
  473.         }
  474.  
  475.         averageGrade = totalGrades / DISCIPLINES;
  476.  
  477.         if (averageGrade >= 5.5f)
  478.         {
  479.             studentsWithAnExcellentMark++;
  480.         }
  481.     }
  482.  
  483.     return studentsWithAnExcellentMark;
  484. }
  485.  
  486. char input()
  487. {
  488.     return _getch();
  489. }
  490.  
  491. void hideConsoleCursor()
  492. {
  493.     HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  494.  
  495.     CONSOLE_CURSOR_INFO cursorInfo;
  496.     GetConsoleCursorInfo(consoleHandle, &cursorInfo);
  497.     cursorInfo.bVisible = false;
  498.     SetConsoleCursorInfo(consoleHandle, &cursorInfo);
  499. }
Add Comment
Please, Sign In to add comment