-1

ユーザー入力から配列を作成したい。ユーザー入力は次のようになります。

ID     Numbers
1 -3 2 -1 12 19 8
2  3 1 -3 2 19 5
3  7 4 1 7 9 3
4  9 12 4 6 -7 4

したがって、ID があり、その後に 6 つの数字があります。最大20個のIDを持つことができます。最初、私は次のようなものを持っていました

struct Prog 
{
    unsigned int ID;
    signed int num_1;
    signed int num_2;
    signed int num_3;
    signed int num_4;
    signed int num_5;
    signed int num_6;
};

そして、これを使用して、ターミナルとは別の関数で入力としてデータファイルを読み込みます。

for (;;)
{
cin >> Temp.ID >> Temp.num_1 >> Temp.num_2 >> Temp.num_3 >> Temp.num_4 >> Temp.num_5 >> Temp.num_6;
}

ただし、問題は、これらの ID/配列の最小/最大値を見つけようとすると、多くの異なる配列と要素で非常に混乱することです。

だから今私がやりたいことは次のようなものです:

struct Prog 
{
    unsigned int ID;
    static const int num_elements = 6;
    signed int numbers[num_elements];

};

その後、前の例のように for ループを 1 つ実行し、if ステートメントを 1 つ使用して値を比較することで、最小値/最大値を簡単に見つけることができます。

私の問題は、上記の新しい構造体を取得して、指定された上部のデータファイルを読み取り、それらをプログラムに保存して操作を実行する方法がわからないことです。どんな助けでも大歓迎です。

ありがとう。

編集: std からのベクトルまたは std からの最小/最大を使用せずに。

4

2 に答える 2

1

これはあなたが探しているものですか?


for (;;)
{
cin >> Temp.ID >> Temp.numbers[0] >> Temp.numbers[1] >> Temp.numbers[2] >> Temp.numbers[3] >> Temp.numbers[4] >> Temp.numbers[5];
}

多分


while(1)
{
  cin >> Temp.ID;

  for(int i = 0; i<Temp.num_elements; i++)
  {
    cin >> Temp.number[i];
  } 
}

これがあなたの質問に答えているかどうかはわかりませんが、少なくともいくつかの情報が得られます.

于 2013-02-21T16:14:15.740 に答える
1

まず、要素の数が変わる可能性がある場合、最も簡単な解決策は次を使用することstd::vectorです。

struct Prog
{
    int id;
    std::vector<int> num;
};

次に、オブジェクトを読み込む通常の方法は を使用すること>>です。ただし、この場合、実際の区切り文字がないため、 operator>>どこで停止するかわかりません。次善の策は、文字列を受け取るコンストラクターを用意し、クライアントが入力を区切る方法を知っていることを期待することです。何かのようなもの:

Prog::Prog( std::string const& toParse )
{
    std::istringstream parser( toParse );
    parser >> id;
    if ( ! parser ) {
        throw std::runtime_error( "no id" );
    }
    int element;
    while ( parser >> element ) {
        num.push_back( element );
    }
    if ( ! parser.eof() ) {
        //  Format error, before running out of data
        throw std::runtime_error( "format error" );
    }
}

これはコンストラクターであるため、エラーを報告する唯一の方法は例外です。(そして、おそらくそうあるべきexplicitです。)

最後に、複数作成したい場合があり、実際の入力は行指向です。

std::string line;
int lineNumber = 0;
while ( std::getline( input, line ) ) {
    ++ lineNumber;
    try {
        data.push_back( Prog( line ) );
    } catch ( std::runtime_error const& error ) {
        std::cerr << error.what() << " (line " << lineNumber << ")\n";
    }
}

ここでもいくつ期待できるかわからないため、 . にdata する必要がありstd::vector<Prog>ます。(予想される数がわかっている場合でも、`std::vector' を使用します。)

于 2013-02-21T16:36:28.297 に答える