Obliczanie średniej ocen po odjęciu najwyższej i najniższej

0

Bardzo proszę o pomoc.
Obliczanie średniej ocen od 9 sędziów wykluczając ocenę najwyższą oraz najniższą. Ćwiczenie mówi aby nie używać array. Program działa, ale zastanawiam się czy jest jakoś prostszy sposób?

#include <iostream>
#include <iomanip>
using namespace std;
void getScores();
void findLowest();
void findHighest();
void finalScore();
float j1, j2, j3, j4, j5, j6, j7, j8, j9, lowestScore, highestScore;
float theScore = 0;
int main()
{
    char answer;
    do
    {
        getScores();
        findLowest();
        findHighest();
        finalScore();
        cout << "\nOneMoreTime (Y/N) : ";
        cin >> answer;
    } while (answer == 'Y' || answer == 'y');
    return 0;
}
void getScores()
{
    cout << "Enter nine judges' scores with one decimal: ";
    cin >> j1 >> j2 >> j3 >> j4 >> j5 >> j6 >> j7 >> j8 >> j9;
    
}
void findLowest()
{
    if ((j1 < j2) && (j1 < j3) && (j1 < j4) && (j1 < j5) && (j1 < j6) && (j1 < j7) && (j1 < j8)&& (j1 < j9)) {
    lowestScore = j1;
    }
    else if ((j2 < j1) && (j2 < j3) && (j2 < j4) && (j2 < j5) && (j2 < j6) && (j2 < j7) && (j2 < j8)&& (j2 < j9)) {
    lowestScore = j2;
    }
    else if ((j3 < j1) && (j3 < j2) && (j3 < j4) && (j3 < j5) && (j3 < j6) && (j3 < j7) && (j3 < j8)&& (j3 < j9)) {
    lowestScore = j3;
    }
    else if ((j4 < j1) && (j4 < j2) && (j4 < j3) && (j4 < j5) && (j4 < j6) && (j4 < j7) && (j4 < j8)&& (j4 < j9)) {
    lowestScore = j4;
    }
    else if ((j5 < j1) && (j5 < j2) && (j5 < j3) && (j5 < j4) && (j5 < j6) && (j5 < j7) && (j5 < j8) && (j5 < j9)) {
    lowestScore = j5;
    }
	else if ((j6 < j1) && (j6 < j2) && (j6 < j3) && (j6 < j4) && (j6 < j5) && (j6 < j7) && (j6 < j8) && (j6 < j9)) {
    lowestScore = j6;
    }
	else if ((j7 < j1) && (j7 < j2) && (j7 < j3) && (j7 < j4) && (j7 < j5) && (j7 < j6) && (j7 < j8) && (j7 < j9)) {
    lowestScore = j7;
    }
	else if ((j8 < j1) && (j8 < j2) && (j8 < j3) && (j8 < j4) && (j8 < j5) && (j8 < j6) && (j8 < j7) && (j8 < j9)) {
    lowestScore = j8;
    }
	else if ((j9 < j1) && (j9 < j2) && (j9 < j3) && (j9 < j4) && (j9 < j5) && (j9 < j6) && (j9 < j7) && (j9 < j8)) {
    lowestScore = j9;
    }
    
}
void findHighest()
{
    if ((j1 > j2) && (j1 > j3) && (j1 > j4) && (j1 > j5) && (j1 > j6) && (j1 > j7) && (j1 > j8)&& (j1 > j9)) {
    highestScore = j1;
    }
    else if ((j2 > j1) && (j2 > j3) && (j2 > j4) && (j2 > j5) && (j2 > j6) && (j2 > j7) && (j2 > j8)&& (j2 > j9)) {
    highestScore = j2;
    }
    else if ((j3 > j1) && (j3 > j2) && (j3 > j4) && (j3 > j5) && (j3 > j6) && (j3 > j7) && (j3 > j8)&& (j3 > j9)) {
    highestScore = j3;
    }
    else if ((j4 > j1) && (j4 > j2) && (j4 > j3) && (j4 > j5) && (j4 > j6) && (j4 > j7) && (j4 > j8)&& (j4 > j9)) {
    highestScore = j4;
    }
    else if ((j5 > j1) && (j5 > j2) && (j5 > j3) && (j5 > j4) && (j5 > j6) && (j5 > j7) && (j5 > j8) && (j5 > j9)) {
    highestScore = j5;
    }
	else if ((j6 > j1) && (j6 > j2) && (j6 > j3) && (j6 > j4) && (j6 > j5) && (j6 > j7) && (j6 > j8) && (j6 > j9)) {
    highestScore = j6;
    }
	else if ((j7 > j1) && (j7 > j2) && (j7 > j3) && (j7 > j4) && (j7 > j5) && (j7 > j6) && (j7 > j8) && (j7 > j9)) {
    highestScore = j7;
    }
	else if ((j8 > j1) && (j8 > j2) && (j8 > j3) && (j8 > j4) && (j8 > j5) && (j8 > j6) && (j8 > j7) && (j8 > j9)) {
    highestScore = j8;
    }
	else if ((j9 > j1) && (j9 > j2) && (j9 > j3) && (j9 > j4) && (j9 > j5) && (j9 > j6) && (j9 > j7) && (j9 > j8)) {
    highestScore = j9;
    }
}

    
void finalScore()
{
    theScore = ((j1 + j2 + j3 + j4 + j5 + j6 + j7+ j8 + j9) - (lowestScore + highestScore)) /7;
    cout << "The score is : " << setprecision(1) << fixed << theScore << endl;
}

1

Ale durne ćwiczenie...

nie używaj zmiennych globalnych :​/ Jak nie chcesz przekazywać wielu argumentów, zdefiniuj strukturę

Możesz użyć std::max z std::initializer_list

auto max = std::max({j1, j2, j3, j4, j5, j6, j7, j8, j9});
3

Mógłbyś dodawać wszystko do sumy, po drodze trackować min i max i przed dzieleniem przez 7 odjąć trackowane min i max, np tak:

auto min{ std::numeric_limits<double>::max() };
auto max{ std::numeric_limits<double>::min() };
auto sum{ 0. };

for(auto i = 0; i < 9u; ++i)
{
    double current;
    std::cin >> current;
    sum += current;
    if(current < min)
    {
        min = current;
    }
    if(current > max)
    {
        max = current;
    }
}

sum -= min;
sum -= max;

std::cout << sum / 7;
0
lexlabels napisał(a):

Bardzo proszę o pomoc.
Obliczanie średniej ocen od 9 sędziów wykluczając ocenę najwyższą oraz najniższą. Ćwiczenie mówi aby nie używać array. Program działa, ale zastanawiam się czy jest jakoś prostszy sposób?

Tak, std::vector

0

Nie mogę sobie poradzić z tym ćwiczeniem.
Wiem, że niepoprawnie używam rozwiązania @stryku ale na tym etapie nie rozumiem co robię źle. Proszę o pomoc...

#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;
void getScores();
double j1, j2, j3, j4, j5, j6, j7, j8, j9;
int main()
{
    char answer;
    do
    {
        getScores();
        cout << "\nOneMoreTime (Y/N) : ";
        cin >> answer;
    } while (answer == 'Y' || answer == 'y');
    return 0;
}
void getScores()
{
    cout << "Enter nine judges' scores with one decimal: ";
    cin >> j1 >> j2 >> j3 >> j4 >> j5 >> j6 >> j7 >> j8 >> j9;
    auto min{ std::numeric_limits<double>::max() };
    auto max{ std::numeric_limits<double>::min() };
    auto sum{ 0. };
    for(auto i = 0; i < 9u; ++i)
    {
        double current;
        std::cin >> current;
        sum += current;
        if(current < min)
        {
        min = current;
            
        }
        if(current > max)
        {
        max = current;
            
        }
        
    }
 
sum -= min;
sum -= max;
 
cout << sum / 7;
 
}
0
auto max = std::max({j1, j2, j3, j4, j5, j6, j7, j8, j9});//znajdujesz maksimum
auto min = std::min({j1, j2, j3, j4, j5, j6, j7, j8, j9});//znajdujesz minimum

//sumujesz ze sobą wszystko, odejmując znalezione min i max, po czym uśredniasz
double result = (j1 + j2 + j3 + j4 + j5 + j6 + j7 + j8 + j9 - min - max) / 7;

o takie coś chodzi.

0

Czy error: no matching function for call to ‘min()’ wynika z jakichś braków?

0

Może wynikać z braku

#include <algorithm>

albo niepoprawnej/niejednoznacznej nazwy min - lepiej użyć std::min()

1

Może też wynikać z braku C++11, ale wtedy koniecznie dodaj, bo mamy już końcówkę 2018!

1 użytkowników online, w tym zalogowanych: 0, gości: 1