-6

私はc++クラスの最終プロジェクトに取り組んでいます。手順は明確ではありませんが、どちらの場合も、コードをコンパイルしましたが、何も出力されません。私のコードを確認して、不足しているものを教えてください。彼女が求めているのは次のとおりです。


このプログラムには、tryとcatchを使用したエラートラップが含まれます。

ユーザー入力を取得する各関数にスローを入れ、メジャー0が入力された場合は文字列「BadMajor」をスローします。入力機能は、以下の2、4、7で指定されています。

次のようにグローバル構造を作成します。

struct Student 
{ 
       char Name[30]; 
       float GPA; 
       int Major; 
};
  1. 主にその構造の2つのインスタンスを作成します。それらをS1およびS2と呼びます。

  2. StudentDataという名前の関数を作成して呼び出します。S2=StudentData(S1); //これは関数の呼び出しです関数はパラメータとして構造体への参照を受け取り(プロトタイピングはこれを処理します)、構造体への参照を返します。ユーザーからデータを取得するには、coutsとcinsを使用します。テストの目的で、GPAが3.5、メジャーが2になるようにS1のデータを変更します。ユーザーからデータを取得するためにcinを使用するため、ユーザーであり、これらの値を入力するだけです。関数の呼び出し後、S1とS2の両方に同じデータが含まれます。

  3. メインでは、coutを使用して構造体S1およびS2に格納されているデータを印刷します。

  4. S2へのポインタを引数としてChangeDataという名前の関数を呼び出します。ChangeData(&S2); //これは関数の呼び出しです。GPAが3.0、メジャーが1になるようにS2のデータを変更します(これらの値をテストに使用します…)

  5. メインに戻り、coutを使用して構造体S2に格納されているデータを印刷します。

  6. 次に、mainに2つの構造体の配列を作成します。配列Studentsを呼び出します。

  7. 関数GetStudentsを作成します。この関数は、要素の数を表す配列とintを受け取ります(2)。関数で、データをループし、cin、cin.getline、およびcoutステートメントを使用してユーザーから3つのフィールドすべてを取得します。このように整理します。

for(...........){cout prompt to user cin.getline for name cout prompt to user cin for GPA cout promp to user cin for Major cin.ignore(1); }

問題は、数値のcinがキーボードバッファにENTERキーを残すことです。これは、cinやその他の数値では問題ありませんが、文字列では問題ないため、自分で削除する必要があります。cin.ignoreがこれを処理する必要があります。

  1. mainから関数GetStudentsを呼び出します。

  2. GetStudentsと同じ引数を受け取る関数PrintStudentsを作成します。生徒の配列を2行、生徒ごとに1行で印刷します。

これが私のコードです:

#include<iostream>
#include<iomanip>

using namespace std;

//Global variable to determine size of name
const int Name_Size = 30;

//Structure
struct Student
{
    char Name[30];
    float GPA;
    int Major;
};

//Function Prototypes
Student* studentData(Student &S1);
Student* changeData(Student &S2);
Student getStudent(Student array[], int size);
Student printStudents(Student array[], int size);

int main()
{
    Student S1; // structure instance called S1.
    Student S2; // structure instance called S2.

    Student student[2]; //array of 2 structures.

    S2 = *studentData(S1); //Calls the studentData function.

    changeData(S2); //Calls the changeData function.

    getStudent(&S1, 2); //Calls the getStudent function.

    printStudents(&S1, 2); //Calls the printStudents function.

    system("pause");
    return 0;
}

//Function Definitions

//studentData function
Student* studentData(Student &S1)
{
        cout << "Student 1" << endl;
        cout << "_________" << endl;
        cout << "Name: " << S1.Name << endl;
        cout << "GPA: " << S1.GPA << endl;
        cout << "Major: " << S1.Major << endl;
        cout << endl;

    if (S1.Major == 0)
    {
        throw "Bad Major!\n";
    }
    else 
        return &S1;
}

Student* changeData(Student &S2)    // Changes the data.
{
        cout << "Name: " << S2.Name << endl;
        cout << "GPA: " << S2.GPA << endl;
        cout << "Major: " << S2.Major << endl;

    if (S2.Major == 0)
    {
        throw "Bad Major!\n";
    }
    else 
        return &S2;     
}

Student getStudent(Student array[], int size) //Function and loop to receive the array and an int representing the number of elements(2). 
{
    for (int index = 0; index < size; index++)
    {
        cout << "Please enter students full name: ";  
        cin.getline(array[index].Name, 30);
        cout << "Please enter students GPA: ";
        cin >> array[index].GPA;
        cout << "Please enter students major: ";
        cin >> array[index].Major;
        cin.ignore(1);
    }
    if (array[1].Major == 0 || array[2].Major == 0)
    {
        throw "Bad Major!\n";
    }
    else
        return array[size];
}

Student printStudents(Student array[], int size)
{
    for (int index = 0; index < size; index++)
    {
        cout << array[index].Name << "  " << array[index].GPA << "  " << array[index].Major << endl;
        return array[size];
    }
}
4

1 に答える 1

0

関数を呼び出すための構文を確認します。

S2 = *studentData(S1);

関数は「*」なしで呼び出されると思います。

S2 = studentData(S1);

あなたのプログラムにはもっとこのようなものがあるかもしれません。

編集1:参照による受け渡し、渡された参照へのポインタの戻り

プログラムをさらに詳しく調べると、関数は参照によって渡された変数をstudentData受け取ります。これは、この関数に渡された元の変数を直接変更できることを意味します。関数の最後で、この変数へのポインターを返します。一種の冗長。 Student

同様にchangeData()

また、要件#2に従って、関数StudentDataはポインターではなく参照を返す必要があります。宣言は次のようになります。

Student& StudentData(Student& any_student);

要件ごとの関数のスペルに注意してください。

于 2012-11-28T01:32:45.303 に答える