While循环只在for循环内执行一次

While loop only executing once inside of for loop

本文关键字:循环 一次 for While 执行      更新时间:2023-10-16

大家好,很简单的问题,

我这里有一些代码来计算最佳拟合直线方程。我在for循环中嵌套的while循环遇到了麻烦。我怎样才能让它重复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;
}

假设您希望每次都从头开始重新启动遍历文件,那么您需要在while循环之前查找读游标,以便它即使在上一次运行达到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应该在这里做什么,因为你从来没有实际使用它的值,而不是调试输出。如果我知道for循环的作用,我可能会建议在每次迭代时将其值重置为0。:)