Определить, какая из школ получила больше призовых мест
Помогите пожалуйста разобраться с задачей: На олимпиаде по программированию на участников были заполнены данные: фамилия, номер школы, занятое место. Определить школы, учащиеся которых заняли призовые места. Определить, какая из школ получила больше призовых мест. Я написал код, но у меня не получается определить какая из школ получила больше призовых мест, программа выводит нули.
Код:
#include <iostream>
#include <string>
using namespace std;
int i, k,j;
struct olimp
{
string secondname;
int school;
int place;
};
struct School
{
int schoolnumber;
int p;
};
int main()
{
int num=0;
int M;
cin >> M;
olimp* data1 = new olimp[M];
School Schooltwp[10];
for (int i = 0; i < M; i++)
{
cin.ignore();
cout << "Student " << i + 1 << ":\n";
cout << "name: ";
cin >> data1[i].secondname;
cout << "School: ";
cin >> data1[i].school;
cout << "Place: ";
cin >> data1[i].place;
}
cout << "input M numbers";
for (int i = 0; i < M; i++)
{
cin >> Schooltwp[i].schoolnumber;
}
for (int i = 0; i < M; i++)
{
if ((data1+i)->place <= 3)
{
for ( j = 0; j < M; j++)
{
if (data1[i].school==Schooltwp[j].schoolnumber)
{
Schooltwp[j].p++;
break;
}
}
}
}
for (int i = 0; i < M; i++)
{
if (data1[i].school == Schooltwp[j].schoolnumber)
{
if (Schooltwp[j].p > num)
{
num = Schooltwp[j].p;
}
}
cout << "winner:" << num <<"\n";
}
}
Ответы (1 шт):
Автор решения: VoS13
→ Ссылка
int i,j,k;глобальные переменные здесь лишние;- 2 структуры в данном задании лишние, т.к. для выполнения задания хватит одной -
olimp. В ней будет достаточно информации для решения задачи; - Поле
pне инициализировано, в ней мусор, после инкремента мусор соответственно. Это к вопросу почему вытекают нули, как результат:
if (data1[i].school==Schooltwp[j].schoolnumber)
{
Schooltwp[j].p++;
break;
}
Поле p никогда не будет больше num. Соответственно num всегда будет равно 0
if (Schooltwp[j].p > num)
{
num = Schooltwp[j].p;
}
- Не стал возиться, переделал, код рабочий, всё подписал комментариями, добавил конструкторы(нужны чтобы не вводить каждый раз данные):
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
const unsigned int M = 7; // Размерность массива;
struct Participant {
// Сonstructors:
// Default:
Participant() : secondname(""), schoolNumber(0), place(0) {};
// With parameters:
Participant(const string secondname, const unsigned int schoolNumber, const unsigned int place) : Participant() {
this->secondname = secondname;
this->schoolNumber = schoolNumber;
this->place = place;
}
string secondname;
unsigned int schoolNumber;
unsigned int place;
};
void PrintPupils(const Participant (&arr)[M]); // Вывод участников на экран;
int main()
{
setlocale(LC_ALL, "");
// Массив учеников, участвующих в олимпиаде;
Participant Schooltwp[M] = {
Participant("Иванов", 1555, 4),
Participant("Петров", 2314, 6),
Participant("Сидоров", 1714, 3),
Participant("Загайнов", 319, 5),
Participant("Терпилин", 705, 1),
Participant("Буладзе", 999, 7),
Participant("Глухов", 1714, 2),
};
// Заполнение вручную:
/*for (int i = 0; i < M; ++i) {
cout << "Student " << i + 1 << endl;
cout << "Sirname: ";
cin >> Schooltwp[i].secondname;
cout << "School: ";
while (!(cin>> Schooltwp[2].schoolNumber)) {
cin.clear();
while (cin.get() != '\n');
cout << "Некорректный ввод!!!" << endl;
cout << "School: ";
}
cout << "Place: ";
while(!(cin>>Schooltwp[i].place)||Schooltwp[i].place<1||Schooltwp[i].place>M){
cin.clear();
while (cin.get() != '\n');
cout << "Некорректный ввод!!!" << endl;
cout << "Place: ";
}
cout << endl;
}*/
// Вывод участников на экран:
PrintPupils(Schooltwp);
// Сортировка участников по занятому месту в порядке возрастания:
for (size_t i = 0; i < M; ++i) {
size_t smallestIndex = i;
for (size_t j = i + 1; j < M; ++j) {
if (Schooltwp[j].place < Schooltwp[smallestIndex].place) {
smallestIndex = j;
}
}
//std::swap(Schooltwp[i], Schooltwp[smallestIndex]);
Participant _temp = Schooltwp[i];
Schooltwp[i] = Schooltwp[smallestIndex];
Schooltwp[smallestIndex] = _temp;
}
// Вывод участников на экран после сортировки по занятому месту:
PrintPupils(Schooltwp);
// Поиск учащихся, занявших призовые места:
for (size_t i = 0; i < M; ++i) {
if (Schooltwp[i].place < 4) {
cout << "Ученик " << Schooltwp[i].secondname << " из школы № " << Schooltwp[i].schoolNumber << " занял " << Schooltwp[i].place << " место;" << endl;
}
}
// Определить, какая из школ получила больше призовых мест:
for (size_t i = 0, count = 1; i < 4; ++i) {
for (size_t j = i + 1; j < 4; ++j) {
if (Schooltwp[i].schoolNumber == Schooltwp[j].schoolNumber) {
++count;
}
}
if (count > 1) {
cout << "Больше призовых мест получила школа # " << Schooltwp[i].schoolNumber << "; " << count << " призовых мест;" << endl;
break;
}
if (i == 3 && count == 1) {
cout << "Призовые места заняли разные школы." << endl;
}
}
system("pause");
return 0;
}
// Functions:
// Вывод участников на экран:
void PrintPupils(const Participant (&arr)[M]) {
for (size_t i = 0; i < M; ++i) {
if (arr[i].secondname != "" || arr[i].schoolNumber != 0 || arr[i].place != 0) {
cout << "Student " << i + 1 << endl;
cout << "Sirname: " << arr[i].secondname << endl;
cout << "School: " << arr[i].schoolNumber << endl;
cout << "Place: " << arr[i].place << endl << endl;
}
}
cout << "//////////////////////////////////////////////////////////////////////////" << endl;
}
P.S.: Если ответ полезен, нажмите пожалуйста соответствующую кнопку