1

このコードでは、ほぼ正しいと思いますが、必要な方法を計算していません。コードは、単一のグレードで2番目のグレードが高い場合にのみ、1番目のグレードを無視する必要があります。

これが私が作成したコードですが、プログラムを実行すると、その値に関係なく、常に2年生が計算されます。

double ComputeGPA()
    {
        if (Count == 0) return 0;
        bool bForgiven = false;
        int nCourseCount = 0;
        int i;
        double gpa = 0.0;
        double gpaToAdd;
        for (i = 0; i < this.Count; i++)
        {
            gpaToAdd = 0.0; 
            Course c = this[i]; 
            gpaToAdd = GradePoints(c.Grade);
            if (c.Grade == null || c.Grade == "W") continue;
            if (bForgiven == false)
            {
                int nRep = FindCourse(c.Number, i + 1);
                if (nRep > 0)
                {
                    Course x = this[i + 1];
                    if(GradePoints(this[nRep].Grade > GradePoints(c.Grade)))
                        gpaToAdd = GradePoints(x.Grade); 
                    // This means we forgive only one grade
                    bForgiven = true;
                    continue;
                }
            }
        gpa = gpa + GradePoints(c.Grade);
        nCourseCount++;
    }
    //If we've forgiven a grade , we divide by one less course
    gpa = (nCourseCount > 0) ? gpa / nCourseCount : 0.0;
    return gpa;
}

私はそれを操作するためにこれらの関数も持っています:

public int FindCourse(int Number, int nStart)
       {
           int i;
           for (i = nStart; i< this.Count; i++)
           {
               Course c = this[i];
               if (c.Number == Number) return i;
           }
           return -1; // Signifies no course was found
       }

public int FindCourse(int Number)
{
    return FindCourse(Number, 0);
}

これが機能することを可能にする構成は何ですか?

ありがとう、トラビス

ここにいくつかのテスト入力があります:

TestTranscript();
    }
    static void TestTranscript()
    {
        Transcript trans = new Transcript();
        trans.Add(new Course(1, 3113, "A", false));
        trans.Add(new Course(1, 3232, "A", false));
        trans.Add(new Course(1, 4212, "A", false));
        trans.Add(new Course(1, 3113, "F", false));
        trans.Add(new Course(1, 4220, "A", false));
        trans.Add(new Course(1, 4234, "A", false));
        trans.Add(new Course(1, 4300, "A", false));
        TranscriptForm frm = new TranscriptForm("Test Transcript", trans);
        frm.ShowDialog();
        MessageBox.Show("GPA is computed to be " + trans.GPA.ToString());
    }

そして、これらは文字ごとの対応する値です。

 public static double GradePoints(string grade)
    {
        switch (grade)
        {
            case "A":
            case "A+":
                return 4.0;
            case "A-":
                return 3.7;
            case "B+":
                return 3.3;
            case "B":
                return 3.0;
            case "B-":
                return 3.7;
            case "C+":
                return 2.3;
            case "C":
                return 2.0;
            case "C-":
                return 1.7;
            case "D+":
                return 1.3;
            case "D":
                return 1.0;
            case "D-":
            default:
                return 0.0;
        }
    }
4

3 に答える 3

1

Chris Shain のコメントに加えて、この部分は私には奇妙に見えます。

 Course x = this[i + 1];
 if(GradePoints(this[nRep].Grade > GradePoints(c.Grade)))
   gpaToAdd = GradePoints(x.Grade); 

なぜ i+1 なのか - それはリストの次のコースであり、必ずしも同じコース番号ではないのですか? gpaToAdd の方が良いグレード (this[nRep].Grade) であるべきではありませんか?

于 2012-07-06T17:43:15.727 に答える
0

間違った計算が発生する原因となっている 2 つの問題があります。

1)他の人が述べたように、continueステートメントは問題です。ここで重要なのは、その項目をスキップするときにのみ継続 (および bForgiven を設定) したいということです。つまり、次のように if ステートメントに含める必要があります。

if (GradePoints(trans[nRep].Grade) > GradePoints(c.Grade))
{
    gpaToAdd = GradePoints(x.Grade);
    // This means we forgive only one grade
    bForgiven = true;
    continue;
}

2)次の行で「this」をループしています

for (i = 0; i < this.Count; i++)

後で、この行で同じ「c.Number」の別のグレードを検索します

int nRep = FindCourse(c.Number, i + 1);

問題は、後の (リスト内の) 番号を探していて、以前のレコードと比較しないことです。そのため、最初の「3113」(レコード 0) に到達すると、2 番目の番号 (レコード 3) を見つけて比較します。ですが、レコード 3 に到達すると、レコード 4 から検索を開始するため、最初のレコードが見つかりません。

これに対する修正は、FindCourse が最初から現在まで検索するためです。この例では、このようにレコード 0 ではなくレコード 3 でヒットをトリガーします。

public int FindCourse(int Number, int nCurrent)
{
    int i;
    for (i = 0; i < nCurrent; i++)
    {
        Course c = this[i];
        if (c.Number == Number) return i;
    }
    return -1; // Signifies no course was found
}

注: これには、このように i+1 ではなく i で呼び出す必要があります。

int nRep = FindCourse(c.Number, i);
于 2012-07-06T17:47:25.047 に答える
0

フロー制御の問題のようです。continue声明に関する私のメモを参照してください。

for (i = 0; i < this.Count; i++)
    {
        gpaToAdd = 0.0; 
        Course c = this[i]; 
        gpaToAdd = GradePoints(c.Grade);
        if (c.Grade == null || c.Grade == "W") continue;
        if (bForgiven == false)
        {
            int nRep = FindCourse(c.Number, i + 1);
            if (nRep > 0)
            {
                Course x = this[i + 1];
                if(GradePoints(this[nRep].Grade > GradePoints(c.Grade)))
                    gpaToAdd = GradePoints(x.Grade); 
                // This means we forgive only one grade
                bForgiven = true;

                // This will restart the for loop at the next item, 
                // presumably skipping whatever code you left out
                // below
                continue; 
            }
        }

    // Something else is going on down here that you didnt show us-
    // my guess is something like:
    gpa = gpaToAdd + gpa;
    // but it is getting skipped when a grade is forgiven

続行はここに文書化されています: http://msdn.microsoft.com/en-us/library/923ahwt1(v=vs.80).aspx

于 2012-07-06T17:34:56.957 に答える