-1

これらの値をテーブルにハードコーディングしたいだけです。2D配列を使おうとすると、文字や整数を処理する際に問題が発生します。構造体を実行すると、これまでのところこれがありますが、情報が列に分割されておらず、そのようにフォーマットする方法がわかりません。(最初は3行しか実行しませんでした。それらを機能させると、残りは同じになります)

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

typedef struct table
{
    std::string game;
    int year;
    float rating;
    int num_voters;
}t;

void processTab(t*);
int main()
{
t tabl[2] = {0,0};
int i;
processTab(tabl);
for(i=0; i<2; i++)
{
         std::cout << "Game: " << setw(20) << tabl[i].game;
         std::cout << "\tYear: " << setw(4) << tabl[i].year;
         std::cout << "\tRating: " << fixed << setprecision(2) << tabl[i].rating;
         std::cout << "\tVoters: " << setw(6) << tabl[i].num_voters;
 }

system("pause");
return 0;
}
void processTab(t*tab)
{
 (tab[0].game, "twilight struggles");
 tab[0].year = 2005;
 tab[0].rating = 8.226;
 tab[0].num_voters = 10690;

 (tab[1].game, "Agricloa");
 tab[1].year = 2007;
 tab[1].rating = 8.17;
 tab[1].num_voters = 23738;

(tab[2].game, "Puerto Rico");
 tab[2].year = 2002;
 tab[2].rating = 8.163;
 tab[2].num_voters = 27433;

 }

Table Data:
Game (0)            Year (1)  Rating (2)  Num Voters (3)
Twilight Struggle   2005      8.226       10690
Agricola            2007      8.17        23738
Puerto Rico         2002      8.163       27433
Through the Ages    2006      8.153       8137
Power Grid          2004      8.02        21655
Le Havre            2008      7.972       9258
Eclipse             2011      7.968       3194
Brass               2007      7.911       5814
Dominion: Intrigue  2009      7.895       10889
Caylus              2005      7.878       13878
4

3 に答える 3

4

あなたが探していると思うのは<iomanip>

#include <iomanip>

std::cout << "Game: " << setw(20) << tabl[i].game;
std::cout << "\tYear: " << setw(4) << tabl[i].year;
std::cout << "\tRating: " << fixed << setprecision(3) << tabl[i].rating;
std::cout << "\tVoters: " << setw(6) << tabl[i].num_voters;
std::cout << std::end;

注:
setwものを書き出すときにパディングを追加するため、常に少なくとも特定の幅
setprecision で、表示
fixedする小数点以下の桁数を指定して、浮動小数点が科学表記法を使用し ないようにします

あなたのgameメンバーは文字であり、それに文字列を割り当てようとしています。strcpyC++ では使用せず、std::string代わりにクラスを使用してください。

#include <string>
struct table
{
    std::string game;
    int year;
    double rating;
    int num_voters;
};

避けてくださいusing namespace std;。多くの名前空間を持つ複雑なコードに到達する場合、これらの数文字は、混乱を避けるために支払うべき小さな代償です。
回避endl: 遅いバッファをフラッシュします。改行だけが必要な場合は、'\n'.
また、新しい初期化構文を使用してリストを初期化できます。

std::vector<table> tbal = { 
                 {"twilight struggles  ", 2005, 8.226, 10690},
                 {"Agricola            ", 2007, 8.17 , 23738},
                 {"Puerto Rico         ", 2002, 8.163, 27433}
               };
于 2012-06-17T23:00:19.257 に答える
2

簡単な答え:std::vector生の配列ではなく、 を使用してください。

以下は、私ができる限り元のコードに近いものであり、最小限の数の新機能を紹介しています。

#include <assert.h>         // assert
#include <iostream>         // std::cout, std::endl
#include <stddef.h>         // ptrdiff_t
#include <string>           // std::string
#include <utility>          // std::begin, std::end
#include <vector>           // std::vector
using namespace std;

typedef ptrdiff_t       Size;

template< class Container >
Size countOf( Container& c ) { return end( c ) - begin( c ); }

struct Game
{
    string  game;
    int     year;
    double  rating;
    int     num_voters;
};

void initialize( vector<Game>& games )
{
    assert( countOf( games ) == 0 );
    games.resize( 3 );

    games[0].game = "twilight struggles";
    games[0].year = 2005;
    games[0].rating = 8.226;
    games[0].num_voters = 10690;

    games[1].game = "Agricloa";
    games[1].year = 2007;
    games[1].rating = 8.17;
    games[1].num_voters = 23738;

    games[2].game = "Puerto Rico";
    games[2].year = 2002;
    games[2].rating = 8.163;
    games[2].num_voters = 27433;
}

int main()
{
    vector<Game> games;

    initialize( games );
    for( int i = 0; i < countOf( games ); ++i )
    {
        cout << i << endl;
        cout <<"\tGame: " << games[i].game << endl;
        cout<<"\tYear: " << games[i].year << endl;
        cout<<"\trating: " << games[i].rating << endl;
        cout<<"\tnum voters: " << games[i].num_voters << endl;
    }
}

ブレース初期化子など、データをより直接的に宣言する方法があります。C++ の教科書を調べてください。

于 2012-06-17T23:19:05.847 に答える
1

tableまず、 (ちなみに、 a の悪い名前struct) を正しく定義する必要があります。文字列を格納するためにを使用しようとしていますgameが、それを単一の として定義していcharます。std::stringおそらく、代わりに a に変更したいと思うでしょう。

operator<<次に、オーバーロードされた形式でフォーマットを行い、参照を型として取得することをお勧めしますtable。@MooingDuck はすでに書式設定自体を十分にカバーしているため、ほとんどの場合、それをどのようにパッケージ化するかが問題になります。

std::ostream &operator<<(std::ostream &os, table const &t) { 
    os << "Game: " << setw(20) << t.game;
    os << "\tYear: " << setw(4) << t.year;
    os << "\tRating: " << fixed << setprecision(2) << t.rating;
    return os << "\tVoters: " << setw(6) << t.num_voters;    
}

それに伴い、ほとんどの場合tabl、配列からstd::vector<table>次のように変更する必要があります。

std::vector<tabl> tabl;

次に、テーブルの処理は次のようになります。

std::copy(tabl.begin(), tabl.end(), std::ostream_iterator<table>(std::cout, "\n"));

もう1つの小さな詳細: という名前の2つのまったく異なる/別個の機能があるようですprocessTab。おそらく、それらの少なくとも 1 つの名前を変更する必要があります。それらをちらりと見ただけで、おそらくinitializeTableその順序で1つまたは何かを呼び出します。

于 2012-06-17T23:11:59.987 に答える