0

私は、ユーザーが入力したデータに基づいて星 (*) のフィールドを表示するプログラムを作成することを任されました。コードは動作するようになりましたが、講師はコードを少なくとも 2 つの関数に入れるように求めました。ディスプレイバナー機能が動作していません。getData が実行され、ユーザーに値の入力を求めますが、入力後にプログラムが停止します。何がうまくいかないようですか?

#include <iostream>

using namespace std;

void displaybanner(int numrows=0, int numcolums=0, int numfields=0);

void getData(int numrows=0, int numcolumns=0, int numfields=0);

const char c = '*';



int main(void)
{
    getData();
    displaybanner();


}

void getData(int numrows,int numcolumns,int numfields)
{

    cout << "Welcome to the banner creation program!" << endl;

    cout << "Enter the number of rows (1 - 5) --> ";
    cin >> numrows;

    if(numrows<1 || numrows>5){
        cout << "Your entered value is outside the range!" << endl;
        cout << "Program will now halt..." << endl;
        exit(0);}


    cout << "Enter the number of columns (5 - 50) --> ";
    cin >> numcolumns;

    if(numcolumns<5 || numcolumns>50){
        cout << "Your entered value is outside the range!" << endl;
        cout << "Program will now halt..." << endl;
        exit(0);
    }

    cout << "Enter the number of rows (3 - 10) --> ";
    cin >> numfields;

    if(numfields<3 || numrows>10){
        cout << "Your entered value is outside the range!" << endl;
        cout << "Program will now halt..." << endl;
        exit(0);
    }

}

void displaybanner(int numfields, int numrows, int numcolumns)
{
for (int i = 0; i < numfields; i++) {
  for (int j = 0; j < numrows; j++) {
    for (int k = 0; k < numcolumns; k++) {
      cout << c;
    }
    cout << endl;
  }
  cout << endl << endl << endl;
}
}
4

2 に答える 2

2

関数内の一時/ローカル値のみを変更しているため、これは機能しません。これを修正するには、パラメーターを参照で渡す必要があります (ポインターまたは参照のいずれかを使用)。

最も簡単な方法は、おそらく変更などの参照を使用することです

void getData(int numfields, int numrows, int numcolumns)

void getData(int &numfields, int &numrows, int &numcolumns)

これにより、呼び出し元の関数に戻った場合でも、これらのパラメーターに対して行ったすべての変更が確実に保持されます。デフォルトのパラメーターを使用することはできませんが、パラメーターを介して値を返したい場合にのみ使用する必要があることに注意してください。

メイン関数は次のようになります。

int main(void)
{
    int fields, rows, cols;
    getData(fields, rows, cols);
    displaybanner(fields, rows, cols);
}
于 2012-11-09T17:16:18.970 に答える
0

のデフォルトの引数displaybannerはすべてゼロです。

void displaybanner(int numrows = 0, int numcolums = 0, int numfields = 0);

また、引数なしでメイン モジュールでこの関数を呼び出しているため、一連のループは実行されません (インデックス変数が 0 であり、それらの制限が 0 であるため)。これを機能させるには、引数を に渡すdisplaybannerか、デフォルトの引数を 0 より大きくします。

于 2012-11-09T17:18:52.773 に答える