Определить, какая из школ получила больше призовых мест

Помогите пожалуйста разобраться с задачей: На олимпиаде по программированию на участников были заполнены данные: фамилия, номер школы, занятое место. Определить школы, учащиеся которых заняли призовые места. Определить, какая из школ получила больше призовых мест. Я написал код, но у меня не получается определить какая из школ получила больше призовых мест, программа выводит нули.

Код:

#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
  1. int i,j,k; глобальные переменные здесь лишние;
  2. 2 структуры в данном задании лишние, т.к. для выполнения задания хватит одной - olimp. В ней будет достаточно информации для решения задачи;
  3. Поле 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;
            }
  1. Не стал возиться, переделал, код рабочий, всё подписал комментариями, добавил конструкторы(нужны чтобы не вводить каждый раз данные):
#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.: Если ответ полезен, нажмите пожалуйста соответствующую кнопку

→ Ссылка