Как «пометить» номер массива строкой, используя структуру? - PullRequest
0 голосов
/ 29 ноября 2018

Итак, у меня есть цикл, который берет строку отформатированного ввода с именем и несколькими числами, и выполняет операцию для определения общего балла на основе этих чисел.В конце программы предполагается вывести наивысший балл, а также имя человека, набравшего балл.У меня есть переменная count, которая увеличивается каждый раз, когда она проходит цикл, чтобы подсчитать число предыдущих «общих баллов» в массив.В конце программы этот массив со всеми итогами сортируется от наивысшего к наименьшему, а затем выводится счет итогов [0] для отображения наивысшего балла.Мой вопрос заключается в том, какой самый простой способ получить имя, соответствующее этому номеру, в значение, которое может быть выведено в конце?

Я попытался создать структуру, а затем сделать этот массив частью структуры, но этоприносит много ошибок.Так вот мой код без попыток вывести имя, соответствующее наибольшему количеству баллов

 #include <iostream>
    #include <cmath>
    #include <string>
    #include <fstream>
    #include <algorithm>
    #include <functional>
    #include <iomanip>
    using namespace std;

    int main()
    {
        cout << "Name    " << "Diff   " << "Sorted scores                                      " << "Total" << endl;
        struct contestants
        {
            string name;
            double difficulty;
            double score1;
            double score2;
            double score3;
            double score4;
            double score5;
            double score6;
            double score7;
            double score8;
            double score9;
        };
        contestants person;

        ifstream divers ("m6dive.txt");
        int count = 0;



        double scoretotals[50];

        while (divers >> person.name >> person.difficulty >> person.score1 >> person.score2 >> person.score3 >> person.score4 >> person.score5 >> person.score6 >> person.score7 >> person.score8 >> person.score9)
        {


            double scores[9] = { person.score1, person.score2, person.score3, person.score4, person.score5, person.score6, person.score7, person.score8, person.score9 };

            std::sort(scores, scores + 9, std::greater< double >()); //sorts from max to min

            double total = (scores[1] + scores[2] + scores[3] + scores[4] + scores[5] + scores[6] + scores[7]) * person.difficulty; //computes score (total excluding min,max multiplied by score)

            //outputs name, difficulty, scores sorted and total
            cout << person.name << "\t" << std::setprecision(1) << fixed << person.difficulty << "\t" << scores[8] << "\t" << "\t" << scores [7] << " "<<  scores [6] << " " << scores[5] << " " << scores[4] << " " << scores [3] << " " << scores [2] << " " <<scores[1] << " " << scores [0] << "   " << total << endl;


            scoretotals[count] = total;
            count++;
        }

        std::sort(scoretotals, scoretotals + 50, std::greater< double >());
        cout << "Highest score is " << scoretotals[0];

    }

Вывод:

Name    Diff   Sorted scores                                      Total
Anne    2.0     8.0             8.0 8.5 8.5 9.0 9.0 9.0 9.5 9.5   123.0
Sarah   3.0     8.5             8.5 8.5 8.5 9.0 9.0 9.0 9.5 9.5   186.0
Jon     1.5     6.0             7.0 7.5 7.5 7.5 8.0 8.5 8.5 8.5   81.8
Highest score is 186.0
. . .

1 Ответ

0 голосов
/ 29 ноября 2018

Вместо хранения и сортировки scoretotals, сохранения и сортировки contestant * !!

Если вы добавите функцию для вычисления <, вы можете вызывать sort() со своей собственной структурой!

struct less_than_key {
    inline bool operator() (const contestant& c1, const contestant& c2)
    {
        //Consider making a different function to calculate totals to simplify this copy/paste!
        double c1_total = (c1.score1 + ... + c1.score9) * c1.difficulty;
        double c2_total = (c2.score1 + ... + c2.score9) * c2.difficulty;

        return (c1_total < c2_total);
    }
};

И затем вы можете сортировать по:

std::sort(people, people + 50, less_than_key());

После этого это будет так же просто, как вытащить первого человека и схватить его имя и общее количество!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...