0

私は、与えられたチェスの数字でいくつのセットを作ることができるかを計算するための基本的なチェスプログラムを書いています。データファイル:

4
22 3 5 6 2 0
1 1 1 1 1 1
8 4 4 4 1 2
5 3 3 3 0 2

コード:

#include <iostream>
#include <fstream>
#include <vector>

int main
(int argc, char *argv[])
{
    std::fstream data_file;
    size_t i, k;
    std::vector<long> chess;
    long t, n;

    data_file.open("U1.txt", std::ios::in);

    data_file >> n;

    for (i = 0; i < n; i++)
        chess.push_back(0);

    for (i = 0; i < n; i++) {
        for (k = 0; k < 6; k++) {
            data_file >> t;
            std::cout << t << " ";
            chess[k] += t;
        }
        std::cout << std::endl;
    }

    data_file.close();

    for (int i = 0; i < 6; i++)
        std::cout << chess[i] << " ";
    std::cout << std::endl;

    data_file.open("U1rez.txt", std::ios::out);
    data_file << n;
    std::cout << n << std::endl;
    data_file.close();

    return EXIT_SUCCESS;
}

出力:

22 3 5 6 2 0 
1 1 1 1 1 1 
8 4 4 4 1 2 
5 3 3 3 0 2 
36 11 13 14 3 4 
4

5行目の36、11、13、14の直後の最終結果で34が得られるのはなぜですか?テスト値を出力すると、正しい数値が得られたように見えますが、ベクトルコンテナーにそれらを追加すると、何かがひどく間違っています。

4

2 に答える 2

5
for (i = 0; i < n; i++)
    chess.push_back(0);

。。。

    for (i = 0; i < n; i++) {
    for (k = 0; k < 6; k++) {
        data_file >> t;
        std::cout << t << " ";
        chess[k] += t;
    }
    std::cout << std::endl;
}

ここでは、ベクトル内のn(= 4)の場所を初期化しましたが、ここでは、追加の問題を引き起こしているベクトルチェスのインデックス4と5にアクセスしています。

于 2012-05-04T08:55:11.413 に答える
1

無関係なことに、Cによって課せられたルールのいくつかを手放すと、C++をより簡単に使用できるようになります。

  • C ++ APIは、スコープ限定のリソース管理を使用します。つまり、宣言されたスコープの最後でデストラクタが呼び出されたときにクラスがこれを行うため、ここでファイルハンドルを明示的に閉じる必要はありません。
  • 実際に改行std::cout << "\n"std::cout << std::endl挿入してバッファをフラッシュするつもりがない限り、をお勧めします。多くのC++プログラマーは今でもを使用printfしており、個人的には、C++のIOに対する醜い標準ソリューションよりもはるかにエレガントだと思います。気軽に使用してprintfください。
  • for (size_type i = 0; ... ; ...)メソッドの最初ではなく、使用されている場所(たとえば)で変数を宣言すると、コードの管理と読み取りが簡単になりますか?これにより、コンパイラーは一時変数のスコープに関するより多くの情報を持っているため、レジスターの使用法についてより適切な選択を行うことができます。

C ++ 11のいくつかの機能を次に示します。これらの機能により、時間を節約することもできます。

  • 自動型推論:コンパイラーが変数の型を推論できる場合、明示的に指定する必要はありません。代わりに使用できますauto(例auto x = parse_data();)。
  • 範囲-対象:グローバル定義を提供するコンテナー(標準コンテナーなど)を操作している場合はbegin()end()次の代わりに:

typedef typename container_type::const_iterator iter;
for (iter i = begin(container), iter l = end(container); i != l; ++i) { ... }

あなたはこれを行うことができます:

for (const auto& x : container) { ... }

時間を節約できる簡単なヒントをいくつか紹介したいと思います。

于 2012-05-04T09:42:39.083 に答える