Бях помолен за помощ при решаването на задача по информатика, която доколкото разбрах е давана на държавен изпит за специалност Математика и информатика във ФМИ- Пловдив (Факултет по математика и информатика към Пловдивския университет „Паисий Хилендарски“).
Може би е давана и на държавен изпит на студентите задочно обучение, специалност Информатика.
Ето я и самата задача:
Във вашето училище има математическа паралелка с прием след 7-клас .
Тази година кандидатстват N ученика (3<=N<=600). Балът е сума от оценки от теста, обща оценка от диплома и удвоена оценка от изпита по математика.
Приемат се K ученика (25<K<31).
Да се състави програмата, която:
1) Въвежда и контролира N.
2) Въвежда и контролира информацията за N ученика:
- три имена ;
- дата на раждане ;
- оценка от тест ;
- обща оценка от диплома;
- оценка о математика .
3) Класира първите K ученика.
4) Ако в края на класирането има ученици с еднакъв бал, то програмата ви трябва да ги класира (приеме) всичките , дори общият брой класирани (приети) ученици да стане повече от K.
5) Извежда информация за класираните (приетите) ученици и първите 10 резерви в низходящ ред.
Набързо скалъпих следващото решение.
Целта ми беше да е по-просто, макар и по-дълго.
Ако имаше копиращ конструктор, например, щяха да се спестят поне десетина реда код, но някои колеги не са запознати добре с това понятие, затова този конструктор е пропуснат.
Също така е добре да се избегне изчисляването на бала всеки път, когато се извика getRating().
Може вместо в динамичен масив, учениците да се пазят в свързан списък и да се сортират при самото добавяне на нов студент - сортиране чрез вмъкване.
Тези подобрения биха затруднили разбирането на кода, затова не са реализирани.
Внимание!
Кодът почти не е тестван и е напълно възможно да има грешки!
Ще се радвам ако има интерес от страна на читателите и с техните забележки подобрим решението на тази, иначе лесна задача.
Лесна, лесна, колко да е лесна? - Ами колкото за студент от 1-ви курс Информатика или ученик в 12 клас, специалност Информатика.
#include <iostream> #include <string> using namespace std; class Student { private: string name; string bornDate; double testMark; double diplomaMark; double mathMark; double rating; public: Student() { // Конструктор по подразбиране name = ""; bornDate = ""; testMark = 0; diplomaMark = 0; mathMark = 0; rating = 0; } void setName(string aName) { name = aName; } void setBornDate(string aBornDate) { bornDate = aBornDate; } void setTestMark(double aTestMark) { testMark = aTestMark; } void setDiplomaMark(double aDiplomaMark) { diplomaMark = aDiplomaMark; } void setMathMark(double aMathMark) { mathMark = aMathMark; } string getName() { return name; } string getBornDate() { return bornDate; } double getTestMark() { return testMark; } double getDiplomaMark() { return diplomaMark; } double getMathMark() { return mathMark; } double getRating() { return testMark + diplomaMark + 2*mathMark; } void enterData() { cout << "\nName:"; cin >> name; cout << "Born date:"; cin >> bornDate; do { cout << "Test mark:"; cin >> testMark; } while(testMark < 2 || testMark > 6); do { cout << "Diploma mark:"; cin >> diplomaMark; } while(diplomaMark < 2 || diplomaMark > 6); do { cout << "Math mark:"; cin >> mathMark; } while(mathMark < 2 || mathMark > 6); } void printStudent() { cout << "Name: " << name << "\n"; cout << "Born date: " << bornDate << "\n"; cout << "Test mark: " << testMark << "\n"; cout << "Diploma mark: " << diplomaMark << "\n"; cout << "Math mark: " << mathMark << "\n"; cout << "Rating: " << getRating() << "\n\n"; } }; void sort(Student* students, int n) { for(int i = 0; i < n-1; i++) { double maxRating = students[i].getRating(); int maxIndex = i; for(int j = i; j < n; j++) if(students[j].getRating() > maxRating) { maxRating = students[j].getRating(); maxIndex = j; } // Разменяме местата на студентите с индекси i и maxIndex Student temp; temp.setName(students[i].getName()); temp.setBornDate(students[i].getBornDate()); temp.setTestMark(students[i].getTestMark()); temp.setDiplomaMark(students[i].getDiplomaMark()); temp.setMathMark(students[i].getMathMark()); students[i].setName(students[maxIndex].getName()); students[i].setBornDate(students[maxIndex].getBornDate()); students[i].setTestMark(students[maxIndex].getTestMark()); students[i].setDiplomaMark(students[maxIndex].getDiplomaMark()); students[i].setMathMark(students[maxIndex].getMathMark()); students[maxIndex].setName(temp.getName()); students[maxIndex].setBornDate(temp.getBornDate()); students[maxIndex].setTestMark(temp.getTestMark()); students[maxIndex].setDiplomaMark(temp.getDiplomaMark()); students[maxIndex].setMathMark(temp.getMathMark()); } } int main() { int n; do { cout << "\nEnter 3<=N<=600:"; cin >> n; } while (n < 3 || n >600); Student* students = new Student[n]; // Заделяме памет за n на брой ученика for(int i = 0; i < n; i++) { students[i].enterData(); } sort(students, n); // Сортираме по бал, низходящо int k; do { cout << "\nEnter 25<K<31:"; cin >> k; } while (k < 26 || k >30); cout << "\nAccepted students:\n"; // Отпечатваме първите k на брой ученици, сортирани по бал в низходящ ред for(int i = 0; i < k && i < n; i++) students[i].printStudent(); int lastAccepted = 0; // Извеждаме останалите ученици, на които балът е равен на бала на последния редовно приет ученик for(int i = k; i < n && students[i].getRating() == students[k].getRating(); i++) { students[i].printStudent(); lastAccepted = i; } cout << "\nTen reserves:\n"; // Извеждаме първите 10 резерви for(int i = 1; i <= 10; i++) { if(lastAccepted + i >= n) break; // Учениците са свършили students[lastAccepted + i].printStudent(); } delete[] students; // Освобождаваме паметта за динамичния масив return 0; }
Коментари
Как за първокурсник? Аз в
Как за първокурсник? Аз в момента уча за държавния изпит и не разбирам почти нищо от тази задача.
Публикувай нов коментар