1

私は途方に暮れています。私はいくつかのことを試しましたが、プログラムの 90% が機能しています。実際、コンパイルして正常に動作します。私の出力は、文字の等級があるはずの非常に奇妙な文字です。

私たちの教科書にはこのような例はなく、探すのが非常に困難です。ある関数で文字の等級を返し、後で別の関数のテーブルで使用する必要があります。これどうやってやるの?

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

// function prototypes
void getData(string [], string [], int []);
char calculateGrade(char []);
void printResult(string [], string [], int [], char [], int);

int main()
{
    // define 4 parallel arrays
    const int NO_OF_STUDENTS = 5;
    string studentFNames[NO_OF_STUDENTS];
    string studentLNames[NO_OF_STUDENTS];
    int testScores[NO_OF_STUDENTS];
    char letterGrades[NO_OF_STUDENTS];

    // call getData() to populate three of the four parallel arrays
    getData(studentFNames, studentLNames, testScores);

    // call calculateGrade() to provide values for the fourth parallel array
    calculateGrade(letterGrades);

    // call printResult() to display report form the parralel arrays
    printResult(studentFNames, studentLNames, testScores, letterGrades, NO_OF_STUDENTS);

    return 0;
}

// function definition getData()
void getData(string fName[], string lName[], int scores[])
{
    // the follow arrays are used for test data (do not modify)
    string fNameTest[5] = {"Humpty", "Jack", "Mary", "Jack", "King"};
    string lNameTest[5] = {"Dumpty", "Horner", "Lamb", "Sprat", "Cole"};
    int scoresTest[5] = {59, 88, 100, 75, 60};


    // use a suitable loop to populate the appropriate "empty" arrays
    // with values from the three initialized test arrays
    for(int index = 0; index < 5; index++)
    {
        fName[index] = fNameTest[index];
        lName[index] = lNameTest[index];
        scores[index] = scoresTest[index];
    }
}

// function definition for calculateGrade()
char calculateGrade(char letter[])
{
    int score;
    char gradeLetter[5] = {'A', 'B', 'C', 'D', 'F'};

    //for(int i = 0; i < 5; i++)
    //{

        if(score > 89)
        {
            return gradeLetter[0];
        }
        if(score > 79)
        {
            return gradeLetter[1];
        }
        if(score > 69)
        {
            return gradeLetter[2];
        }
        if(score > 59)
        {
            return gradeLetter[3];
        }


        return gradeLetter[4];

    //}

}

// function definition for printResults()
void printResult(string lName[], string fName[], int score[], char letter[], int size)
{
    cout << setw(15) << left << "Student Name" << setw(9) << right << "Test Score" << " " << setw(5) << "Grade" << endl << endl;
    for(int index = 0; index < size; index++)
    {
        cout << setw(15) << left << (lName[index] + ", " + fName[index]);
        cout << setw(9) << right << score[index] << " " << setw(5) << letter[index] << endl;
    }
}

これがプログラムです。3 つの関数のみを使用する必要があり、定数やローカル変数を変更できないことに注意してください。後でこのプログラムを変更してファイルから読み取るようにするつもりだと思いますが、現時点ではそれは問題ではありません。

if/else if/else ステートメントで for ループを試してみたところ、スペード、ダイアモンド、および w が得られました。gradeLetter と testScores に配列を使用してみましたが、まだ意味不明です。

どんな助けでも大歓迎です。似たようなことがあったらすみません。このようなものを探すのは悪夢です。

4

3 に答える 3

1

あなたの代わりに次の方法を試してください。

// function definition for calculateGrade()
  void calculateGrade(const int NO_OF_STUDENTS, int *testScores, char *letter)
  {
     for(int i = 0; i < NO_OF_STUDENTS; i++)
     {

       if(testScores[i] > 89)
       {
           letter[i] = 'A';
       }
       else if(score > 79)
       {
           letter[i] = 'B';
       }
       else if(score > 69)
       {
           letter[i] = 'C';
       }
       else if(score > 59)
       {
           letter[i] = 'D';
       }
       else // As you are a beginner, try to always cover all the possibilities in an if chain, you'll thank me later
           printf("Please give a score greater than 59 for student number %d", i);


  }

次のように呼び出します。

calculateGrade(NO_OF_STUDENTS, testScores, letterGrades);

宿題なので、アスタリスクの意味と、値を返さない理由を説明します。

そして最後のアドバイスとして、後で言語をよりよく理解したときに、フィールドをクラスまたは構造体にグループ化してみてください (C++ ではほとんど同じです。これを確認してください。C++の構造体とクラスの違いは何ですか? diff の場合) 名、姓、およびスコアの配列の代わりに、次のような結果になります。

struct Student  
{
   string fName;
   string lName;
   int testScore;
}

Student students[NO_OF_STUDENTS];
于 2015-10-01T14:39:17.260 に答える
0

このコードはあまりよく書かれていませんが、簡単な修正として、char LetterGrades[]他の 3 つの配列を初期化したのと同じように、 を初期化することができます。だから、あなたはすることができます>

    char calculateGrade(char letter[])
{
    int score;
    char gradeLetter[5] = {'A', 'B', 'C', 'D', 'F'};

    for(int i=0; i<5; i++) {
        letter[i] = gradeLetter[i];
    }

        if(score > 89)
        {
            return gradeLetter[0];
        }
        if(score > 79)
        {
            return gradeLetter[1];
        }
        if(score > 69)
        {
            return gradeLetter[2];
        }
        if(score > 59)
        {
            return gradeLetter[3];
        }

        return gradeLetter[4];

    //}

}

出力はOKで、「A」、「B」、「C」などを出力します。もう1つ、printResult関数の記述が不十分です。これは何もしませんが、すべての配列を一覧表示するだけです (テストすると、スコア 59 が「A」になり、スコア 100 が「C」になることがわかります)。スコアと成績が、それを獲得した人に対応するようにコードを作成する必要があります。

于 2015-10-01T14:37:47.300 に答える
0

calculateGrade2 つの問題があります。

  1. コンパイラの警告からわかります。score初期化されていません
  2. 何も割り当てませんletter[]

あなたのプログラムのコンセプトは、各インデックスが学生を表すということです。したがって、必要なのは、インデックス (学生) のスコアを取得し、それをそのインデックス (学生) に割り当てることletterです。

そのためには、スコアと文字を取り込む必要があります。したがって、定義は次のようになりますvoid calculateGrade(int[], char[]);。に割り当てた成績表を返すのではなく、内部的にchar[]

于 2015-10-01T14:38:01.523 に答える