1

**请不要直接答案或代码示例,这是我需要学习的功课。我正在寻求有关我需要开发的算法的帮助。

在为我的部分课堂作业提出解决方案时,我似乎遇到了逻辑错误,该程序涉及多个文件,但这是唯一相关的部分:

我有一个文件 PlayerStats ,其中包含篮球运动员的统计数据:

  • 篮板
  • 积分
  • 助攻
  • 制服 #

我最初的反应是创建一个while循环并将它们读入一个保存这些值的临时结构,然后创建一个合并函数,将临时结构的值与初始记录数组合并,够简单吗?

struct Baller
{
   //other information on baller
   int rebounds;
   int assists;
   int uniform;
   int points;
   void merge(Baller tmp); //merge the data with the array of records
}

//in my read function..
Baller tmp; 
int j = 0;
inFile << tmp.uniform << tmp.assists << tmp.points << tmp.rebounds
while(inFile){
    ArrayRecords[j].merge(tmp);
    j++;
    //read in from infile again
}

问题:文件的标识符之间可以有任意数量的空格,并且信息可以按任何顺序排列(省略统一编号,始终是第一个)。例如

PlayerStats 可能是

11 p3 a12 r5 //uniform 11, 3 points 12 assists 5 rebounds
//other info

或者

   11 p    3 r  5  a      12 //same exact values

我想出了什么


似乎无法想出一种算法来以正确的顺序从文件中获取这些值,我正在考虑以下几点:

inFile << tmp.uniform; //uniform is ALWAYS first
getline(inFile,str);  //get the remaining line
int i = 0;
while(str[i] == " ") //keep going until i find something that isnt space
    i++;

if(str[i] == 'p')  //heres where i get stuck, how do i find that number now?

else if(str[i] == 'a')

eles if(str[i] = 'r'
4

2 回答 2

1

做这样的事情:

int readNumber () {
  while isdigit (nextchar) -> collect in numberstring or directly build number
  return that number;
}
lineEater () {
  Read line
  skip over spaces
  uniform=readNumber ();
  haveNum=false;
  haveWhat=false;
  Loop until eol {
    skip over spaces
    if (isdigit)
      number=readNumber ();
      skip over spaces
      haveNum=true;
    else 
      char=nextChar;
      haveWhat=true;
    if (haveChar and haveNum) {
      switch (char) {
        case 'p' : points=number; break;
        ...
      }
      haveNum=false;
      haveWhat=false;
    }
  }

或者,如果您更雄心勃勃,请为您的输入编写语法并使用 lex/yacc。

于 2012-12-07T08:51:23.427 回答
1

如果您只检查一个字母,您可以使用switch语句而不是if / else,这样会更容易阅读。

您知道数字从哪里开始(提示:)str[i+1],因此根据您str[]的类型,您可以使用atoichar 数组std::stringstreamstd::string.

我很想给你一些代码,但你也说不要。如果您确实想要一些,请告诉我,我将使用一些代码编辑答案。

不要使用“合并”功能,而是尝试使用 anstd::vector这样您就可以只使用push_back您的结构而不是进行任何“合并”。此外,您的合并函数基本上是一个复制赋值运算符,由编译器默认创建(您不需要创建“合并”函数),您只需要用于=复制数据即可。如果你想在你的“合并”函数中做一些特别的事情,那么你应该重载复制赋值运算符而不是“合并”函数。简单的。

于 2012-12-07T08:53:24.997 回答