Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <string>
- #include <Windows.h>
- #include <conio.h>
- #include <algorithm>
- #include <locale>
- // Тези макраси са премахнати, защото се получават конфликти със съвпадащите имена на функциите от библиотеката "algorithm"
- #undef min
- #undef max
- const int MAX_STUDENTS = 25; // Максималният възможен брой студенти в група по условие
- const int DISCIPLINES = 6; // Броят дисциплнити
- const char EXIT = 27; // Константа за изход
- // Структура, която пази данните на студентите
- struct Student
- {
- std::string studentName;
- std::string facultyNumber;
- float points[DISCIPLINES] { 0, 0, 0, 0, 0, 0 };
- float grades[DISCIPLINES] { 0, 0, 0, 0, 0, 0 };
- };
- void mainMenu(); // Главно меню
- void inputFacultyNumbersAndPoints(Student students[], int& studentsCount); // Въвеждане на факултетни номера и точки по шесте дисциплини
- void convertPointsToGrades(Student students[], int studentsCount); // Преобразуване на точките в оценки
- void consultationMenu(Student students[], int studentsCount); // Меню за справка
- void printExcellentStudents(const Student students[], int studentsCount); // Извеждане на отличниците в групата
- void searchForAStudentByAnInputtedFacultyNumber(const Student students[], int studentsCount); // Търсене на студент по зададен факултетен номер
- void printGroup(const Student students[], int studentsCount); // Извеждане на списък с всички студенти. (Име, факултетен номер, оценка от всяка от шесте дисциплини и точки)
- int inputStudentsCount(int& studentsCount); // Въвеждане на броя студенти
- int studentsWithAnExcellentMarkCount(const Student students[], int studentsCount); // Намиране на броя отличници
- char input(); // Въвеждане на символ от клавиатурата
- void hideConsoleCursor(); // Скриване на курсора в конзолата
- int main()
- {
- setlocale(LC_ALL, "Bulgarian"); // Чрез тази функция помагаме на компилатора да разпознава кирилица
- hideConsoleCursor();
- mainMenu();
- return 0;
- }
- void mainMenu()
- {
- Student students[MAX_STUDENTS];
- int studentsCount = 0;
- char choice;
- do
- {
- system("cls"); // Изчистване на конзолата
- std::cout << "Главно меню:\n\n";
- std::cout << "1. Въвеждане на факултетни номера и точки\n";
- std::cout << "2. Преобразуване на точките в оценки\n";
- std::cout << "3. Справки\n";
- std::cout << "4. Извеждане на информация за групата\n";
- std::cout << "0. Изход\n\n";
- /*
- std::cout << std::setw(104) << "Вашият избор е: ";
- std::cin >> choice;
- */
- std::cout << "За да изберете, трябва да натиснете от вас избрано копче от клавиатурата.";
- choice = input();
- switch (choice)
- {
- case '1': inputFacultyNumbersAndPoints(students, studentsCount); break;
- case '2': convertPointsToGrades(students, studentsCount); break;
- case '3': consultationMenu(students, studentsCount); break;
- case '4': printGroup(students, studentsCount); break;
- case '0':
- /*
- Еквивалентен е и този вариант "exit(0);".
- Чрез тази функция можем да прекратим програмата и с подадения параметър показваме как е завършила програмата.
- В случая е използвана константата "EXIT_SUCCESS", която има стоност 0, и чрез нея програмата завършва без грешки
- */
- exit(EXIT_SUCCESS);
- default:
- std::cout << "\n\nГрешен избор. Моля, опитайте отново.\n";
- std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- break;
- }
- } while (choice != 0);
- }
- void inputFacultyNumbersAndPoints(Student students[], int& studentsCount)
- {
- system("cls");
- /*
- Функцията min() връща стойността на променливата с по-малка стойност от другата.
- Вместо нея, може да се използва операторът null coalescing,
- пример "studentsCount = studentsCount < MAX_STUDENTS ? studentsCount : MAX_STUDENTS;".
- */
- studentsCount = std::min(inputStudentsCount(studentsCount), MAX_STUDENTS);
- std::cout << "\n";
- for (size_t i = 0; i < studentsCount; i++)
- {
- std::cout << "Студент " << i + 1 << ":\n";
- std::cout << "Име: ";
- /*
- Функция за въвеждане на string-ове. Разликата на тази функция от оператора "cin" е, че приема целия ред, тоест,
- ако използваме "cin" и въведем "Hello, world!", променливата ще приеме само "Hello," и следващата променлива,
- откоято се нуждаене от въвеждане, ще приеме стойността "world!".
- */
- std::getline(std::cin >> std::ws, students[i].studentName);
- std::cout << "Факултетен номер: ";
- std::cin >> students[i].facultyNumber;
- std::cout << "\n";
- for (size_t j = 0; j < DISCIPLINES; j++)
- {
- do
- {
- std::cout << "Точки по дисциплина " << j + 1 << " (от 30 до 100): ";
- std::cin >> students[i].points[j];
- } while ( (students[i].points[j] < 30) || (students[i].points[j] > 100) );
- }
- std::cout << "\n";
- }
- std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- }
- void convertPointsToGrades(Student students[], int studentsCount)
- {
- system("cls");
- for (size_t i = 0; i < studentsCount; i++)
- {
- for (size_t j = 0; j < DISCIPLINES; j++)
- {
- if ( (students[i].points[j] >= 30) && (students[i].points[j] < 55) ) // Слаб 2
- {
- students[i].grades[j] = 2.0f;
- }
- else if ( (students[i].points[j] >= 55) && (students[i].points[j] < 62) ) // Среден 3
- {
- students[i].grades[j] = 3.0f;
- }
- else if ( (students[i].points[j] >= 62) && (students[i].points[j] < 75) ) // Добър 4
- {
- students[i].grades[j] = 4.0f;
- }
- else if ( (students[i].points[j] >= 75) && (students[i].points[j] < 89) ) // Много Добър 5
- {
- students[i].grades[j] = 5.0f;
- }
- else if ( (students[i].points[j] >= 89) && (students[i].points[j] <= 100) ) // Отличен 6
- {
- students[i].grades[j] = 6.0f;
- }
- // "Слаб 2" по условие е от 30 до 49 точки, а "Среден 3" е от 55 точки, следователно трябва да е от 30 до 55 точки
- }
- }
- std::cout << "Точките са преобразувани в оценки.\n\n";
- std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- }
- void consultationMenu(Student students[], int studentsCount)
- {
- char choice;
- do
- {
- system("cls"); // Изчистване на конзолата
- std::cout << "Меню за справка:\n\n";
- std::cout << "1. Извеждане на отличниците\n";
- std::cout << "2. Търсене на студент по зададен факултетен номер\n";
- std::cout << "0. Изход\n\n";
- std::cout << "За да изберете, трябва да натиснете от вас избрано копче от клавиатурата.";
- choice = input();
- switch (choice)
- {
- case '1': printExcellentStudents(students, studentsCount); break;
- case '2': searchForAStudentByAnInputtedFacultyNumber(students, studentsCount); break;
- case '0': return;
- default:
- std::cout << "\n\nГрешен избор. Моля, опитайте отново.\n";
- std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- break;
- }
- } while (choice != 0);
- }
- void printExcellentStudents(const Student students[], int studentsCount)
- {
- system("cls");
- if (studentsWithAnExcellentMarkCount(students, studentsCount) == 0)
- {
- std::cout << "Няма отличници в тази група!\n";
- std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- return;
- }
- const int studentsWithAnExcellentMark = studentsWithAnExcellentMarkCount(students, studentsCount);
- float* averageGrades = new float [studentsWithAnExcellentMark];
- for (size_t i = 0; i < studentsWithAnExcellentMark; i++)
- {
- averageGrades[i] = 0.0f;
- }
- int* indexesOfTheStudentsWithAnExcellentMark = new int [studentsWithAnExcellentMark];
- for (size_t i = 0; i < studentsWithAnExcellentMark; i++)
- {
- indexesOfTheStudentsWithAnExcellentMark[i] = -1;
- }
- float totalGrades;
- float averageGrade = 0.0f;
- for (size_t i = 0; i < studentsCount; i++)
- {
- totalGrades = 0.0f;
- for (size_t j = 0; j < DISCIPLINES; j++)
- {
- totalGrades += students->grades[j];
- }
- averageGrade = totalGrades / DISCIPLINES;
- if (averageGrade >= 5.5f)
- {
- for (size_t z = 0; z < studentsCount; z++)
- {
- if ( (averageGrades[z] == 0.0f) && (indexesOfTheStudentsWithAnExcellentMark[z] == -1) )
- {
- averageGrades[z] = averageGrade;
- indexesOfTheStudentsWithAnExcellentMark[z] = i;
- }
- }
- }
- }
- std::cout << "В групата има " << studentsWithAnExcellentMark << (studentsWithAnExcellentMark == 1 ? " отличник" : " отличници") << ".\n\n\n";
- for (size_t i = 0; i < studentsWithAnExcellentMark; i++)
- {
- std::cout << "Име на студент: " << students[indexesOfTheStudentsWithAnExcellentMark[i]].studentName << "\n";
- std::cout << "Факултетен номер: " << students[indexesOfTheStudentsWithAnExcellentMark[i]].facultyNumber << "\n";
- std::cout << "Средната оценка от шесте дисциплини е " << averageGrades[i] << ".\n\n";
- }
- std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- }
- void searchForAStudentByAnInputtedFacultyNumber(const Student students[], int studentsCount)
- {
- searchFacultyNumber:
- system("cls");
- std::string searchFacultyNumber;
- std::cout << "Въведете факултетен номер за търсене: ";
- std::cin >> searchFacultyNumber;
- bool isFound = false;
- std::cout << "\n\nТърсене ....\n\n\n";
- for (size_t i = 0; i < studentsCount; i++)
- {
- if (searchFacultyNumber == students[i].facultyNumber)
- {
- std::cout << "Намерено е съвпадение за факултетния номер: " << searchFacultyNumber << "\n";
- std::cout << "\n\nИме на студент: " << students[i].studentName << "\n\n";
- for (size_t j = 0; j < DISCIPLINES; j++)
- {
- std::cout << "Дисциплина " << j + 1 << " ==> Оценка: " << (students[i].grades[j] == 0 ?
- "Все още точките не са преобразувани в оценка" : std::to_string(students[i].grades[j]))
- << " | Точки: " << students[i].points[j] << "\n";
- }
- isFound = true;
- break;
- }
- }
- if (!isFound)
- {
- std::cout << "Студент с факултетен номер " << searchFacultyNumber << " не е намерен.\n";
- }
- char choice;
- do
- {
- std::cout << "\n\nЖелаете ли да въведете друг факултетен номер?\n\n";
- std::cout << "1. Да\n";
- std::cout << "2. Не\n\n";
- std::cout << "За да изберете, трябва да натиснете от вас избрано копче от клавиатурата.";
- choice = input();
- if (choice == '1')
- {
- goto searchFacultyNumber;
- }
- else if (choice == '2')
- {
- break;
- }
- else
- {
- std::cout << "\n\nГрешен избор. Моля, опитайте отново.\n";
- std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- }
- } while (choice != 2);
- std::cout << "\n\n\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- }
- void printGroup(const Student students[], int studentsCount)
- {
- system("cls");
- std::cout << "Списък със студенти и техните резултати:";
- std::cout << "\n\n-----------------------------------------\n\n";
- for (size_t i = 0; i < studentsCount; i++)
- {
- std::cout << "Име на студент: " << students[i].studentName << "\n";
- std::cout << "Факултетен номер: " << students[i].facultyNumber << "\n\n";
- for (size_t j = 0; j < DISCIPLINES; j++)
- {
- std::cout << "Дисциплина " << j + 1 << " ==> Оценка: " << (students[i].grades[j] == 0 ? "Все още точките не са преобразувани в оценка" : std::to_string(static_cast<int>(students[i].grades[j]))) << " | Точки: " << students[i].points[j] << "\n";
- }
- std::cout << "\n-----------------------------------------\n\n";
- }
- std::cout << "\n\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- }
- int inputStudentsCount(int& studentsCount)
- {
- std::cout << "Въведете брой студенти (минимум 1 | максимум " << MAX_STUDENTS << "): ";
- std::cin >> studentsCount;
- while ( (studentsCount < 1) || (studentsCount > MAX_STUDENTS) )
- {
- std::cout << "\n\nБроят студенти не може да бъде с размер " << studentsCount << ". Моля въведе нов брой студенти.\n\n";
- std::cout << "\nНатиснете бутона \"ESCAPE\", за да се върнете назад.";
- while (input() != EXIT);
- system("cls");
- std::cout << "Въведете брой студенти (минимум 1 | максимум " << MAX_STUDENTS << "): ";
- std::cin >> studentsCount;
- }
- return studentsCount;
- }
- int studentsWithAnExcellentMarkCount(const Student students[], int studentsCount)
- {
- float totalGrades;
- float averageGrade = 0.0f;
- int studentsWithAnExcellentMark = 0;
- for (size_t i = 0; i < studentsCount; i++)
- {
- totalGrades = 0.0f;
- for (size_t j = 0; j < DISCIPLINES; j++)
- {
- totalGrades += students[i].grades[j];
- }
- averageGrade = totalGrades / DISCIPLINES;
- if (averageGrade >= 5.5f)
- {
- studentsWithAnExcellentMark++;
- }
- }
- return studentsWithAnExcellentMark;
- }
- char input()
- {
- return _getch();
- }
- void hideConsoleCursor()
- {
- HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
- CONSOLE_CURSOR_INFO cursorInfo;
- GetConsoleCursorInfo(consoleHandle, &cursorInfo);
- cursorInfo.bVisible = false;
- SetConsoleCursorInfo(consoleHandle, &cursorInfo);
- }
Add Comment
Please, Sign In to add comment