2016-07-05 2 views
0

Здравствуйте все, что вы замечательные люди, простой вопрос здесь,Хотя цикл только один раз выполняя внутри цикла для

У меня есть немного кода здесь, чтобы вычислить уравнение наиболее подходящую линию. У меня возникают проблемы с циклом while, который вложен в цикл for. В настоящее время «while (points >> Xi >> 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; 
} 
+3

В первой итерации 'for' вы вводите' while' и читаете весь файл. После попытки чтения произойдет сбой, потому что вы никогда не будете повторно инициализировать/воссоздать поток «points». – SJuan76

+1

IOW, после выхода из цикла while (потому что выражение оценивается как 'false'), вы не сбрасываете переменные так, чтобы выражение было истинным. – SJuan76

+1

Вы хотите, чтобы вы каждый раз перечитывали с начала файла? –

ответ

2

Предполагая, что вы хотите перезапустить итерация-через-файл с нуля каждый раз, вам нужно seek the read cursor до вашего 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 должен делать здесь, поскольку вы никогда не используете его значение, кроме как для вывода отладки. Я мог бы предложить сбросить его значение до 0 на каждой итерации цикла for, если бы я знал, что он сделал. :)

+0

Я пробовал эти два дополнения, но он все еще работает только один раз. –

+0

Вот обновленный код с вашими предложениями, но все еще не работает: http://pastebin.com/2EY6kR7y, как говорится в комментарии, вывод из строки «cout <<» SSE: «- это каждая строка точек. txt, но только один раз –

+0

@LukeFowler: К сожалению, 'clear' должен наступить первым, иначе флаг EOF не позволит' seekg' что-либо делать (на C++ 03, по крайней мере) –

Смежные вопросы