-1

我只想将这些值硬编码到一个表中。当我尝试使用二维数组时,我遇到了处理字符和整数的问题。当我做一个结构时,到目前为止我有这个,但它没有将信息分成列,我不知道如何格式化它。(我一开始只做了 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成员是一个字母,您正试图为其分配一个字符串。不要strcpy在 C++ 中使用,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. 您可能想将其更改为 a std::string

然后您可能希望在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"));

另一个小细节:您似乎有两个完全不同/独立的功能,都名为processTab. 您可能希望至少重命名其中一个。只是瞥了一眼他们,我可能会initializeTable按这个顺序打电话给一个或什么。

于 2012-06-17T23:11:59.987 回答