while循环只在for循环中执行一次

时间:2016-07-05 09:30:40

标签: c++

大家好,你们这里很容易提问,

我在这里有一些代码来计算最佳拟合线方程。我遇到了嵌套在for循环中的while循环问题。目前,"而(点>>>> Yi)"只运行一次,然后(我猜)当它到达文档的末尾时,它不会重复自己。怎么能让它重复1000次?不能使用数组,我们还没有在课堂上教过这些数据;(。

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

double measureSSE(double m, double b, double Xi, double Yi)
{
    return (Yi - ((m * Xi) + b)) * (Yi - ((m * Xi) + b));
}

int main()
{
    double Xi = 0, Yi = 0;
    double m  = 0, b  = 0;
    double dm = 0, db = 0;
    double SSE = 0;

    ifstream points("points.txt");

    if(points.is_open())
    {
        for(int counter = 0; counter < 1000; counter++)
        {
            while(points >> Xi >> Yi)
            {
                dm += -2 * Xi * (Yi - (m * Xi) - b);
                db += -2 *      (Yi - (m * Xi) - b);

                m -= .01 * dm;
                b -= .01 * db;

                SSE += measureSSE(m, b, Xi, Yi);
            }

            cout << "SSE: " << SSE << endl;
        }

        cout << "Final Model: y = " << m << "x + " << b << endl;

        points.close();
    }
    else cout << "Unable to open file." << endl;
}

1 个答案:

答案 0 :(得分:2)

假设您希望每次都从头开始重新启动迭代文件,您需要在while循环之前seek the read cursor,以便即使之前的运行达到EOF也能正常工作。您还需要首先清除EOF标志(除非您正在编写C ++ 11或更高版本,其中已为您完成此操作)。

当您重新输入从流中提取时预测的while循环时,该语言没有任何特殊规则可以为您执行此操作。

    for(int counter = 0; counter < 1000; counter++)
    {
        // Clear EOF flag, and revert to the beginning of the stream
        points.clear();
        points.seekg(0);

        // Extract all "points" from the file
        while(points >> Xi >> Yi)

我不太清楚SSE应该在这里做什么,因为除了调试输出之外你从未真正使用它的值。如果我知道它做了什么,我可能会建议在0循环的每次迭代时将其值重置为for。 :)