0

私は現在C++の関数について学んでいますが、現在は関数が主なものである宿題に取り組んでいます。奇妙な値を取得する

現在、私は、プロセスのすべての操作を独自の関数に分割してグレード計算機を作成しようとしています。

ここでは、コードです:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <stdlib.h> 

using namespace std; 

void getHWGrades(int homeworks[], int size) 
{ 
    cout << "\nEnter the grades, out of 100 points, for the 9 homeworks you completed." << endl; 
    cout << "Note that Homework 10 is given to you for free, but is the same grade \nas homework 9.\n" << endl; 

    for (int i = 0; i < 9; i++) 
    { 
     cout << "Homework " << i + 1 << ": "; 
     cin >> homeworks[i]; 

     while (homeworks[i] > 100 || homeworks[i] < 0) 
     { 
      cout << "Invalid grade, input homework grade again: "; 
      cin >> homeworks[i]; 
     } 
    } 
    homeworks[9] = homeworks[8]; 
    cout << "Homework 10: " << homeworks[9]; 
} 

double quizAverage() 
{ 
    double quizPts; 

    cout << "Input your in class quiz average: "; 
    cin >> quizPts; 
    return quizPts; 
} 

double labAverage() 
{ 
    double labPts; 

    cout << "Input your lab average: "; 
    cin >> labPts; 
    return labPts; 
} 

double teamProject() 
{ 
    double teamPts; 

    cout << "Input your team project grade: "; 
    cin >> teamPts; 
    return teamPts; 
} 

int exam1() 
{ 
    int exam1Pts; 

    cout << "Input your exam1 grade: "; 
    cin >> exam1Pts; 
    return exam1Pts; 
} 

int exam2() 
{ 
    int exam2Pts; 

    cout << "Input your exam2 grade: "; 
    cin >> exam2Pts; 
    return exam2Pts; 
} 

double hwAverage(int homeworks[], int size) 
{ 
    double total = 0; 
    double homeworkAverage = 0; 

    for (int i = 0; i < size; i++) 
    { 
     total = total + homeworks[i]; 
    } 

    homeworkAverage = (total*1.0)/10; 
    return homeworkAverage; 
} 


double currentPoints(double& quizPts, double& labPts, double& teamPts, double& homeworkAverage, int& exam1Pts, int& exam2Pts) 
{ 
    double totalPts = ((quizPts/100.0) * 10) + ((labPts/100.0) * 10) + ((teamPts/100.0) * 15) + ((homeworkAverage/100.0) * 20) + ((exam1Pts/100.0) * 10) + ((exam2Pts/100.0) * 15); 
    cout << "\nYour current points (out of the 80 total available), stand at: " << totalPts; 
    return totalPts; 
} 

double currentAverage(double& totalPts) 
{ 
    double availableAverage = totalPts*(100.0/80); 
    cout << "\nYour current average is: " << availableAverage; 

    return availableAverage; 
} 

int main() 
{  
    // keep the console from closing in visual studio 
    char charer; 

    double totalPts; 

    double quizPts, labPts, teamPts, homeworkAverage; 
    int exam1Pts, exam2Pts; 

    const int ARRAY_SIZE = 10; 
    int hwArray[ARRAY_SIZE]; 
    getHWGrades(hwArray, ARRAY_SIZE); 

    quizAverage(); 
    labAverage(); 
    teamProject(); 
    exam1(); 
    exam2(); 

    currentPoints(quizPts, labPts, teamPts, homeworkAverage, exam1Pts, exam2Pts); 
    currentAverage(totalPts); 

    cin >> charer; 
} 

私は機能currentPointscurrentAverageに嘘を信じている私の問題は、私は-5.09078e+61としておよびcurrentAverage機能とフォローアップ結果として、このtotalPts出力を実行したときにということですが、 availableAverage-1.157e+62と出力されます。

私は、問題が関数から関数への値をどのように渡しているのか(これは私が正しくやっているとは思わない)と関係していると確信しています。

この問題の修正方法を教えてください。

ありがとうございます。

+0

'double quizPts、labPts、teamPts、homeworkAverage;'これらは、 'currentPoints'関数を呼び出すとすべて初期化されません。 – PaulMcKenzie

+0

問題を自分で理解し、他の人が手助けできるようにするためにまず行うべきことは、関連するコアに減らすことです。私はすべての127行が問題に寄与しているのではないかと思う。例えば、 'quizAverage()'のようなグローバルな状態を変更しない関数や、戻り値を無視する関数を安全に削除することができます。 – Heinrich

+0

未定義の値を関数currentPointに渡します。あなたはquizPts = quizAverage()のように割り当てなければなりません。 labPts = labAverage(); ....そして、totalPts = currentPoints(quizPts、labPts、teamPts、homeworkAverage、exam1Pts、exam2Pts)。 – user1438832

答えて

0

あなたはこのように、currentPoints()関数からの戻り値を格納する必要があります。

totalPts = currentPoints(quizPts、labPts、teamPts、homeworkAverage、exam1Pts、exam2Pts); currentAverage(totalPts);

理由は、currentPoints()のローカル変数としてtotalPtsを宣言しました。

"ローカル変数には機能範囲のみがあり、メイン関数"には未定義です。

は、他のすべての機能 (quizAverage、labAverage、teamProject、exam1、exam2、hwAverage、currentAverage)

私は願ってい

、この問題を解決するためにこれを行います!

+0

ありがとう!それとNicolas Defranouxのポストがトリックをしました! – Xankar

0

問題は機能に関するものではなく、変数に関するものです。

のは、例えばquizPtsを見てみましょう:mainメソッドで

、あなたはこの変数を宣言したが、その後、あなたはcurrentPointsに送信する前に、それを何もしません。したがって、これは未定義の値を持ちます(未定義はしばしばCの中でランダムのように見えます)。

quizAverageで使用する他の変数quizPtsは同じ名前ですが、コンパイラでは同じではありません。あなたのメインで

試してみてください。

quizPts = quizAverage();

+0

ご清聴ありがとうございます! – Xankar

0

あなたは、私がこの問題を修正するに行くかどう

を尋ねましたか?

答えは「お気に入りのIDEに「ウォッチ」ウィンドウを開いた状態でデバッグツールを使用する」です。

コードを再読み込みするだけではエラーを見つけるのは非常に難しいですが、デバッガでは各時点で変数のすべての値を見ることができます。具体的には、この例では、変数には最初からガベージ値があり(初期化されていない)、この値は決して変更されません。

このアプローチを使用すると、このSOの質問を書くのに必要な時間よりもずっと時間がかかることがあります。私はこれが将来あなたの時間を節約するのに役立つことを願っています。

+0

うわー、それを知らなかった。それを教えてくれてありがとう。 – Xankar

0

問題は、quizPtsやlabPtsなどの変数に値を格納せずに使用することです。あなたの場合、関数の戻り値を対応する変数に格納してから使用する必要があります。たとえば、次のステートメントと同じ操作を行います。 quizPts = quizAverage();

関連する問題