Държавен изпит по информатика

Бях помолен за помощ при решаването на задача по информатика, която доколкото разбрах е давана на държавен изпит за специалност Математика и информатика във ФМИ- Пловдив (Факултет по математика и информатика към Пловдивския университет „Паисий Хилендарски“).
Може би е давана и на държавен изпит на студентите задочно обучение, специалност Информатика.

Ето я и самата задача:

Във вашето училище има математическа паралелка с прием след 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;
}

Коментари

Как за първокурсник? Аз в

Как за първокурсник? Аз в момента уча за държавния изпит и не разбирам почти нищо от тази задача.

Публикувай нов коментар

  • Адресите на уеб-страници и e-mail адресите автоматично се конвертират в хипервръзки.
  • Разрешени HTML tag-ове: <a> <p> <span> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <tr> <td> <em> <b> <u> <i> <strong><font> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike> <caption>
  • Линиите и параграфите се прекъсват автоматично.
  • Mark language-dependent sections with == lc == where lc (or lc-xx) is a language code, other or all.

Повече информация за опциите на форматиране

CAPTCHA
3 + 2 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.