0

私は最初の教科書のC ++の割り当てに取り組んでいます。最高点と最低点を落とす配列からの基本的な計算です。実行するたびに、答えとして0が得られます。問題はメインまたは計算スコアにあると思います。これを見て数分かかることを厭わない人に感謝します。

#include <iostream>
using namespace std;

void printHeader(int judges);
void enterData (float scores[], int judges, float difficulty);
float calculateScore(float scores[], const int judges, float difficulty, int maxScore, int least);
int indexofLeast(float scores[], const int judges);
int indexofMax(float scores[], const int judges);

int main () {
    const int judges = 7;
    float scores [judges];
    float difficulty = 0;
    int maxScore = indexofMax(scores, judges);
    int least = indexofLeast(scores, judges);
    float finalscore = calculateScore(scores, judges, difficulty, maxScore, least);

    printHeader (judges);
    enterData (scores, judges, difficulty);  // get user input
    indexofLeast(scores, judges); // find lowest score 
    indexofMax(scores, judges); // find highest score
    calculateScore (scores, judges, difficulty, maxScore, least); // get final score
    cout << "The final score is " << finalscore << '\n';

    return 0;
}

void printHeader(const int judges) {
    cout << "This program calculates a divers score over" << judges << "judges" << endl;
}

void enterData(float scores[], const int judges, float difficulty) {
    for (int i = 0; i < judges; i++){
        cout <<"Enter score for judge " << i+1 << endl; 
        cin >> scores[i];
    }
    cout << "Enter difficulty: "<< endl;
    cin >> difficulty;
}

float calculateScore(float scores[], const int judges, float difficulty, int maxScore, int least) {
    float sum = 0;
        for (int i = 0; i < judges; i++) {
        sum += scores[i];
    }
    return (sum - scores[least] - scores[maxScore]) * difficulty * 0.6;
}

int indexofLeast(float scores[], const int judges) {
    int least = 0;
    for (int i = 1; i< judges; i++) {
        if (scores[i] < scores[least])
            least = i;
    }
    return least;
}

int indexofMax(float scores[], const int judges) {
    int maxScore = 0;
    for (int i = 1; i< judges; i++) {
        if (scores[i] > scores[maxScore]) 
            maxScore = i; 
        }
    return  maxScore;
}

予想される入力として、7 つのスコア (0 から 10 の間) を入力しました: 1、2、2、4、5、8、10 最高と最低の 1 と 10 を削除します。合計 = 21 1.2 と 4.0 の間の難易度: 3.0 したがって、21 * 3.0 * 0.6 = 37.8 期待される入出力に対して、実際には -0 を取得します

4

4 に答える 4

2

難易度をゼロに設定したため:

    float difficulty = 0;

そして、関数で宣言します

 void enterData(float scores[], const int judges, float difficulty)

つまり、値で取得します。したがって、値は変化せず、ゼロのままです。

難易度への参照を渡す必要があります。

 void enterData(float scores[], const int judges, float &difficulty)
于 2013-07-02T23:58:41.553 に答える
2

difficultyへの参照として渡す必要がありますenterData

void enterData(float scores[], const int judges, float &difficulty)
                                                       ^

問題は、ユーザーが入力した値が含まれていることを期待していることです。ゼロに初期化してから、 を呼び出しますenterData。しかし、その関数が戻ったとき、パラメーターはローカル変数だったので、値はまだゼロです。後で結果をdifficultyで乗算すると、結果は常にゼロになります。

参照を使用してユーザーが入力した値を返すと、問題が解決するはずです。構文的に変更する必要があるのは、&先ほど示したように関数定義に を追加することだけです。同じ方法で関数を呼び出します。

人に頼むのではなく、自分でコードを批判的に分析してテストするスキルを開発することをお勧めします。問題がスコア計算にあると思われる場合は、スコア計算に使用されるすべての値を簡単に表示し、そこから逆方向に作業することができます... つまり、「なぜ難易度がゼロなのか? どの時点でゼロになるのか?」


コメントで問題に対処するには、コードが間違った順序で処理を行っています。ユーザーがデータを入力した、戻り値を割り当てる必要があります。

const int judges = 7;
float scores [judges];
float difficulty = 0;

printHeader (judges);
enterData (scores, judges, difficulty);  // get user input

int maxScore = indexofMax(scores, judges);
int least = indexofLeast(scores, judges);
float finalscore = calculateScore(scores, judges, difficulty, maxScore, least);
于 2013-07-03T00:00:19.657 に答える
0

以前の回答をさらに詳しく説明すると、C/C++ で「=」がどのように機能するかを理解するという一般的なエラーに陥ったと思います。これは、代数のように変数を考えすぎることからよく見られます。

int maxScore = indexofMax(scores, judges);

これは、「maxScore」が何であるか、または今後どうなるかを説明するものではなく、値を割り当てます。#include を検討してください

int f(int n);  // some mathematical function.

int main(int argc, const char** argv)
{
   int a = 1;
   int b = f(a);
   a = 15;
   std::cout << "b = " << b << std::endl;
   return 0;
}

int f(int n) { return n * 2; } // f(n) = 2f

このプログラムは、「30」ではなく「2」を出力します。

int b = f(a);
// is equivalent to
int b;
b = f(a);

どちらの場合も、bその時点での f(a) の評価に基づいて値が割り当てられています。このポイントを超えて 'a' を変更しても効果はありません。

于 2013-07-03T01:08:21.350 に答える