结构数组

时间:2012-06-17 22:51:22

标签: c++ arrays struct

我想将这些值硬编码到表中。当我尝试使用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

3 个答案:

答案 0 :(得分: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会员是一封信,您正在尝试为其分配一个字符串。不要在C ++中使用strcpy,而是使用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}
               };

答案 1 :(得分: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 ++教科书。

答案 2 :(得分:1)

首先,您需要正确定义table(顺便说一句struct的错误名称)。您尝试使用game来存储字符串,但只将其定义为单个char。您可能希望将其更改为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或者其他东西。