2

私は独学で C++ を学んでおり、教科書の問題を解いています。これまで、データ型、宣言、表示、代入、対話型入力、選択 (if-else)、繰り返し (for/while ループなど)、関数、配列などの基本について説明してきました。私はポインターで何もしていませんが、それらが何であるかは知っています...

私はこの問題に遭遇しました:

真偽テストの答えは次のとおりです。 TTFF T. 各行が 1 つのテストで提供された答えに対応する 2 次元の答えの配列が与えられた場合、2 次元の配列とテストの数を受け入れる関数を記述します。パラメータとして、各テストの成績を含む 1 次元配列を返します。(各質問は 5 点の価値があるため、最高評点は 25 です。) 次のデータを使用して関数をテストします。

ここに画像の説明を入力

私の理解では、C++ 関数は配列を返すことができません。少なくとも、これはこのフォーラムの他の投稿で読んだことです。これは正しいです?もしそうなら、私はまだポインターをカバーしていないので、彼らはあなたがこの問題をどのように行うことを期待していますか. 私が可能かもしれないと思った他の唯一の方法は、参照によって配列を渡すことです....しかし、質問の幹は、関数には2つの引数しかないと言っているので、そのメソッドは除外されたのではないかと思いました。そのメソッドは、変更する配列である 3 番目の引数を必要とするため、暗黙的に返されます。

私はいくつかのコードを持っていますが、正しくありません (私の calcgrade 関数だけが機能する必要があります)。先に進む方法がわかりません。ありがとうございました!!

#include<iostream>

// Globals
const int NROW = 6, NCOL = 5;
bool answers[NCOL] = {1, 1, 0, 0, 1};
bool tests[][NCOL] = {1, 0, 1, 1, 1,
                      1, 1, 1, 1, 1,
                      1, 1, 0, 0, 1,
                      0, 1, 0, 0, 0,
                      0, 0, 0, 0, 0,
                      1, 1, 0, 1, 0};
int grade[NROW] = {0};

// Function Proto-Types
void display1(bool []);
void display2(bool [][NCOL]);
int calcgrade(bool [][NCOL], int NROW);


int main()
{


    calcgrade(tests, NROW);
    display2(tests);

    return 0;
}

// Prints a 1D array
void display1(bool answers[])
{
    // Display array of NCOL
    for(int i = 0; i < NCOL; i++)
        std::cout << std::boolalpha << answers[i] << std::endl;
    return;
}

// Print 2d Array
void display2(bool answers[][NCOL])
{
    // Display matrix:  6x5
    for(int i = 0; i < NROW; i++)
    {
        for(int j= 0; j < NCOL; j++)
        {
            std::cout << std::boolalpha << answers[i][j] << std::endl;
        }
        std::cout << std::endl;
    }

    return;
}

int calcgrade(bool tests[][NCOL], int NROW)
{

    for(int i = 0; i < NROW; i++)
    {
        for(int j = 0; j < NROW; j++)
        {
            if(tests[i][j]==answers[j])
                grade[i] += 5;
        }
        printf("grade[%i] = %i", i, grade[i]);
    }

    return grade;
}
4

4 に答える 4

1

テストの数を 2 番目のパラメーターとして渡す場合は、実際にはテストの数を知っていることを意味するため、 を使用する必要はありませんvector。動的に割り当てられた配列を返すことができます ( または を使用new) malloc

コードは次のようになります。

int* calcgrade(bool tests[][NCOL], int NROW){
  int* array = new int[NROW];
  for(int i=0;i<NROW;i++)
    array[i] = calculatedGrade;
  return array;
}
于 2013-11-10T02:41:01.890 に答える
0

これを行う別の方法は、メイン関数で Answer 配列を作成し、それを T/F 配列と共に採点関数に渡すことです。次に、採点関数は Answer 配列で動作でき、何も返す必要さえありません。

基本的に、関数で配列を渡すときは、実際には配列へのポインターを渡しているので、参照によって渡されたかのようにそれらを操作できます (そうでした)。

準擬似コードの例:

void getGrades( const int answerVector, int gradeVector ) {
    // code that computes grades and stores them in gradeVector
}
于 2013-11-22T14:05:47.493 に答える
0

あなたはできる:

  • あなたが言ったように、動的に割り当てられた配列へのポインターを返し、
  • 静的配列を含む単語で構造体型を作成し、 C++ リファレンスstructで詳細を読んで、型の構造体を引数として返す/取ることができます。
于 2013-11-10T02:08:52.900 に答える