【问题标题】:Averaging data from 2 input files in c++ stuck in a loopc++中2个输入文件的平均数据陷入循环
【发布时间】:2013-10-18 16:58:43
【问题描述】:

我似乎陷入了代码中某个地方的无限循环,但我找不到在哪里。我正在为一门课做作业,要求我平均 2 组学生(2 个输入文件)的分数并将结果输出到 results.out。我被困在某个地方,需要知道下一步该往哪里看。我已经复制了我的代码和下面的两个输入文件。截至目前,我的 results.out 文件中没有任何内容。

我的代码:

#include <iostream>
#include <fstream>
using namespace std;

int main()    
{
    char courseID1;     //Course Letter
    char courseID2;
    int count = 1,
        sum = 0,
        sum2 = 0,
        k = 0,
        score;
    ifstream group1;    //Input stream for group1
    ifstream group2;    //Input stream for group2
    ofstream results;   //Output stream for the results

    //Open the input files
    group1.open("group1.dat");
    group2.open("group2.dat");

    //Open the output file
    results.open("results.out");

    while (count <= 5)
    {
        //Read the class ID
        group1 >> courseID1;
        group2 >> courseID2;
        sum = 0;
        k = 0;

        group1 >> score;
        while(score != -999)
        {
            k = k + 1;
            sum = sum + score;
        }

        float avg1 = (float)sum/k;
        k = 0;
        sum2 = 0;
        score = 0;
        group2 >> score;
        while (score != -999)
        {
            k = k + 1;
            sum = sum + score;
        }

        float avg2 = (float)sum2/k;

        results << "CourseID\tGroup No.\tCourse Average" << endl << endl;
        results << courseID1 << "\t1" << avg1;
        results << "\t\t2" << avg2 << endl << endl;

        count++;
    }

return 0;
} //end of main

group1.dat

A 80 100 50 10 32 90 89 100 23 50 -999
B 80 90 80 94 90 34 23 63 23 80 90 -999
C 10 30 20 10 90 50 89 23 90 68 90 10 60 90 73 35 90 -999
D 34 80 45 89 90 n23 90 12 34 90 84 100 90 59 -999
E 100 83 93 20 63 -999

group2.dat

A 20 75 40 25 80 89 100 60 -999
B 80 50 70 19 10 18 80 90 90 26 -999
C 100 30 20 40 90 50 18 90 90 45 90 80 70 30 35 40 -999
D 80 85 45 92 10 90 24 90 23 65 72 90 34 100 -999
E 95 100 88 98 69 -999

这是输出的样子:

courseID Group No. Course Average
    A          1        80.50
               2        82.75

    B          1        78.00
               2        75.35

编辑:

在将 while 循环更改为

后,我现在得到了这个结果
while( (group >> score) && score != -999)

我的 result.out 看起来像这样:

CourseID    Group No.   Course Average

A   162.4       20

CourseID    Group No.   Course Average

B   167.9091        20

CourseID    Group No.   Course Average

C   154.5882        20

CourseID    Group No.   Course Average

D   167.6       20

CourseID    Group No.   Course Average

D   1-NaN       20

我该如何解决这个问题?

【问题讨论】:

  • 你试过调试器吗?

标签: c++ loops fstream


【解决方案1】:

你的 while 语句:

while (score != -999){
    k = k + 1;
    sum = sum + score;
}

你永远不会修改'score'的值,从而创建一个无限循环。

【讨论】:

    【解决方案2】:

    您应该在闭括号之前在循环内添加group1 &gt;&gt; score。像这样的:

    group1 >> score;
    while(score != -999)
    {
        k = k + 1;
        sum = sum + score;
        group1 >> score;
    }
    

    第二个循环也是这样


    这看起来更好:

    while( (group >> score) && score != -999 )
    {
        k = k + 1;
        sum = sum + score;
    }
    

    【讨论】:

    • 我现在得到的结果如下所示: CourseID Group No. Course Average A 162.4 20 CourseID Group No. Course Average B 167.9091 20 CourseID Group No. Course Average C 154.5882 20 CourseID Group No.课程平均 D 167.6 20 CourseID 组号课程平均 D 1-NaN 20
    • 您的第二个建议不仅看起来更好,而且实际上是正确的。第一个建议(就像他的代码中的所有内容一样)使用&gt;&gt; 的结果,而不检查它是否成功。这意味着输入中最轻微的错误(例如 'O' 而不是 '0')也会使代码陷入无限循环。
    • 您说它实际上是正确的评论让我明白了这一点。非常感谢。
    【解决方案3】:
    while (score != -999)
        {
            k = k + 1;
            sum = sum + score;
        }
    

    你陷入了这个循环。仅当score == -999 并且您未在此循环中的任何位置修改score 的值时,循环才会退出。

    始终使用调试器。您会很快找到程序卡住的地方。

    【讨论】:

      【解决方案4】:

      我猜,是这样的:

      do
      {
          group1 >> score;
          k = k + 1;
          sum = sum + score;
      } while (score != -999);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多