C++ :: Aufgabe #348

2 Lösungen Lösungen öffentlich

Turmspringen/Wasserspringen (Punktewertung)

Anfänger - C++ von JKooP - 02.04.2021 um 09:28 Uhr
Bei internationalen Wettkämpfen bewerten in Einzelwettbewerben sieben Wettkampfrichter die Sprünge.
Jeder vergibt pro Sprung 0 bis 10 Punkte, mit Schritten von halben Punkten.
Die zwei höchsten und niedrigsten Wertungen werden gestrichen.
Die verbleibenden drei Wertungen werden addiert und das Ergebnis mit dem Schwierigkeitsgrad multipliziert.
Das Endresultat entspricht der erzielten Punktzahl des Springers.

Beispiel 1:
Schwierigkeitsgrad: 2,1
Punkte: 7,5 | 7,5 | 7,0 | 8,0 | 8,0 | 7,5 | 8,5
Gestrichen: 7,5 | 7,5 | 7,0 | 8,0 | 8,0 | 7,5 | 8,5
Wertung: 7,5 + 7,5 + 8,0 = 23 * 2,1 = 48,3

Beispiel 2:
Schwierigkeitsgrad: 1,6
Punkte: 7,5 | 7,5 | 7,5 | 7,5 | 7,5 | 7,5 | 7,5
Gestrichen: 7,5 | 7,5 | 7,5 | 7,5 | 7,5 | 7,5 | 7,5
Wertung: 7,5 + 7,5 + 7,5 = 22,5 * 1,6 = 36

Erstelle eine Methode/Funktion, mit der die obige Aufgabenstellung gelöst werden kann.

Viel Spaß

Lösungen:

vote_ok
von felixTheC (1200 Punkte) - 13.04.2021 um 21:40 Uhr
Quellcode ausblenden C-Code
#include <iostream>
#include <numeric>

#define JUDGES 7

using std::cin;
using std::cout;

void get_judges_points(float *judge_points);
float calculate_total_points(float *judge_points, float &difficulty);

int main()
{
    float difficulty;

    /*
     * Remove comments for some interactivity
     *
     * auto *judge_points = new float[7];
     * get_judges_points(judge_points);
     *
     * cout << "What was the difficulty? ";
     * cin >> difficulty;
     */

    difficulty = 2.1;
    auto *judge_points = new float[JUDGES]{7.5, 7.5, 7.0, 8.0, 8.0, 7.5, 8.5};

    const float result = calculate_total_points(judge_points, difficulty);

    cout << "Rating for competitor: " << result << std::endl;

    delete [] judge_points;
    return 0;
}

void get_judges_points(float *judge_points)
{
    for(int i=0; i < JUDGES; ++i)
    {
        float x;
        cout << "Judge #" << i << " your points please. ";
        cin >> x;
        judge_points[i] = x;
    }
}

float calculate_total_points(float *judge_points, float &difficulty)
{
    float total = 0;

    // null the two minimums instead of deletion
    std::sort(judge_points, judge_points + JUDGES, [](float a, float b){ return (a < b); });
    judge_points[0] = 0;
    judge_points[1] = 0;

    // null the two maximums instead of deletion
    std::sort(judge_points, judge_points + JUDGES, [](float a, float b){ return (a > b); });
    judge_points[0] = 0;
    judge_points[1] = 0;

    total = std::accumulate(judge_points, judge_points + JUDGES, total);

    return total * difficulty;
}

vote_ok
von JKooP (18090 Punkte) - 24.04.2021 um 20:08 Uhr
C++ 17
Erste Lösung nur zum Berechnen der Gesamtpunkte.
Quellcode ausblenden C-Code
double get_result(vector<double> points, double diff_level) {
    auto sum_points{ 0.0 };
    sort(points.begin(), points.end());
    for (size_t i = 2; i < 5; i++)
        sum_points += points[i];
    return sum_points * diff_level;
}

Die zweite Lösung zeigt auch die gestrichenen bzw. gewerteten Punkte.
Quellcode ausblenden C-Code
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;

void diving_result(vector<double> points, double diff_level) { 

    auto sum_points{ 0.0 };
    vector<double>rated{};

    sort(points.begin(), points.end());

    cout << "Gestrichen:\t";
    for (size_t i = 0; i < 7; i++) 
        if (i < 2 || i > 4)
            cout << setprecision(2) << fixed << points[i] << " | ";
        else {
            sum_points += points[i];
            rated.push_back(points[i]);
        }

    cout << "\nGewertet:\t";
    for(const auto& r : rated)
        cout << r << " | ";
    cout << "\nResultat:\t" << sum_points << " * " << diff_level << " = " << sum_points * diff_level << endl;
}

int main()
{
    vector<double> points{ 7.5, 7.5, 7.0, 8.0, 8.0, 7.5, 8.5 };
    auto diff_level{ 2.1 };
    diving_result(points, diff_level);
}