2011-06-24 12 views
3

私は、新しい(を使用して)コースの数を入力するように促す簡単なGPA電卓を作成しようとしています。これに続いて、コースの数に依存するforループがあり、ユーザーにクラスのグレードとクレジットの数を入力するように要求されます。プログラムはループとエラーを完了します。助けてください。ここでは、コード(私の初めてところで、このフォーラムのサイトを使用して)です:基本的なC++ベースのGPA計算機とシムの使用の支援

#include <iostream> 
#include <conio.h> 
using namespace std; 

int main(){ 
    cout<<"Welcome to the GPA calculator"; 
    cout <<endl; 
    cout<<"Please enter the number of courses you wish to calculate : "; 
    int*numberOfCourses = new int; 
    cin>>*numberOfCourses; //must dereference as it is a pointer and I AM SETTING variable. 
    char grade, *credits= new char; 
    int gradesOfPerson = 0; 
    int*score = new int; 
    int j = 0; 
    int i = 0; 
    int*cumulativeScore= new int; 

    while(i< *numberOfCourses){ 
    cout <<"Please enter the credits of your " <<(i+1) <<" course. " ; 
    cin >>*credits; 
    cin.get(); 
    cout << "Please enter your grade :"; 
    cin>>(grade); 
    cout <<endl; 
    switch (grade){ 
    case 1: if (grade=='A'){ 
     *score = 4; 
     break; } 
    case 2: if (grade=='B'){ 
     *score = 3; 
     break; } 
    case 3: if (grade=='C'){ 
     *score = 2; 
     break; } 
    case 4: if (grade=='D'){ 
     *score = 1; 
     break; } 

    case 5: if (grade=='D'){ 
     *score = 1; 
     break; } 
    case 6: if (grade =='E'){ 
     *score = 0; 
     break; 
     } 
     } 
    gradesOfPerson = ((*score)*(*credits)); 
    cumulativeScore += gradesOfPerson; 
    i++; 
    } 
int gpa = (*cumulativeScore)/(*numberOfCourses); 
cout <<"Your GPA is : " <<gpa; 
delete numberOfCourses, credits, score, cumulativeScore; 
} 

それは間違って何を言うのは難しいエラーを見ずに

+0

このプロジェクトでは動的割り当て( 'new')は必要ありません。すべてのスコアを一度に格納する必要がある場合は、動的配列が必要です(ただし、 'std :: vector'が詳細を処理するのに最適です)。しかし、GPAを計算するには、総クレジット。 'new'と' delete'をスキップします。 –

答えて

0

(DEV C++を使用して)貧しいインデントのため申し訳ありませんが、最初に一見すると、gpa行(int gpa = (*cumulativeScore)/(*numberOfCourses);)でエラーが発生していない場合は、将来的に発生する可能性があります。 gpadoubleである必要があります。

2

あなたのコードにはいくつかの問題がありますが、私はそれらを指摘して落胆しているとは思わないと思います。あなたが相対初心者だと仮定すると、これはかなり良いです。

主な問題は、次の行である:

cumulativeScore += gradesOfPerson; 

。 cumulativeScoreをポインタと宣言しました。データ自体ではなく、興味のあるデータのアドレスを保持しています。あなたは

*cumulativeScore += gradeOfPerson 

またはcumulativeScore整数変数作る(あなたはポインタとしてそれを使用するすべての場所を変更する)にこれを変更する必要がありますどちらか。

別の重要な間違いは、のswitch文にあります。

case 4: if (grade == 'D') { 
// logic to execute if grade is 'D' 
} 
break; 

この操作を行います:代わりのようなもので

case 'D': 
// logic to execute if grade is 'D' 
break; 

次に、あなたは実行の開始時に、それが何かを含めることができるため、0に*cumulativeScoreを初期化する必要があります。

最後に、*scoreは文字ではなく数字でなければなりません。数値として解釈される文字'4'の値は、実際には4ではありません。そのように扱うため、エラーが発生しています。その他の問題についてはhttp://www.asciitable.com/

(実際にあなたのプログラムが失敗することはありませんが、ベストプラクティスではありません):参考のため、ここではASCII文字コードのリストを参照してください

  • ご利用をポインタが奇妙です - 単純に正規変数を割り当てるのはなぜですか? gradegradesOfPersoni、およびjでこれを行いました。どのようにすればよいか分かります。残りの変数をポインタにする理由は何ですか?
  • conio.hを含めないでください。まず第一に、そこに宣言されている関数を使用していません。第二に、それは非標準であり、ほとんどのプラットフォームでは利用できません。
  • さらにエラー処理を行う必要があります。ユーザは分かりやすいグレードの文字を入力していますか?彼らが入力するコースの数が確実であることを確認していますか?等々。

最後に、Microsoft Visual C++のExpressバージョンを無料で入手できます。これは積極的に維持されており、Dev-C++よりも光年が先です(1つには、コードを正しくインデントするのに役立ちます):

幸運を祈る!このラインで

1

cumulativeScore += gradesOfPerson; 

cumulativeScoreはポインタであるため、それが指している場合、この行は移動します。おそらく、書きたい:

*cumulativeScore += gradesOfPerson; 

それがクラッシュした理由はcumulativeScoreを指していた場所を移動したためであり、後のあなたはそれを逆参照しようとしたときに、それが無効なメモリを指しました。

0

脇に、あなたのdeleteステートメントがひどく壊れています。あなたが一度に複数の変数を削除することはできません、この

delete numberOfCourses, credits, score, cumulativeScore; 

は、実際にこれだけcumulativeScoreの割り当てが解除されます、その左側を破棄C++コンマ演算子を使用しています。