2017-11-23 4 views
0

私は与えられたデータを使ってカイ二乗値を計算するプログラムを書いた。しかし、私のプログラムは、それが読み込んでいるテキストファイルにいくつの行があるのか​​分からないように記述する必要があります。構造点をポイント[1000](つまり、ファイル内の行数よりも大きい)として定義すると、計算が機能せず、最終的に 'ナノ'値になります。私は、入力ファイルを添付している読み込み中のデータテキストファイルにいくつの行が含まれているかを事前に知らないために、C++でプログラムを書く方法を教えてください。


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


//define my own data structure 
struct point { 
    double x; 
    double y; 
    double s; 
    double w; 
    double wx; 
    double wy; 
    double wxy; 
    double wxx; 
    double wmxcy; 
}; 


//main program 
int main() { 

    //array of point 
    point thePoints[11]; 
    int i = 0; 

    //open a file to read in 
    ifstream myFile ("xys.data.txt"); 

    //check if it opened successfully 
    if (myFile.is_open()) { 

     //file is open 
     //read it in 
     while (!myFile.eof()) { 

      //whilst we are not at the end of the file 
      myFile >> thePoints[i].x >> thePoints[i].y >> thePoints[i].s; 
      //increment i 
      i++; 
     } 

     //close the file 
     myFile.close(); 
    } 

    // something went wrong 
    else { 
     cout << "Error opening file!\n"; 
     exit(1); 
    } 

    // data is now in an array of point structures 

    //set the summation variables to zero - sets an initial value for the rest of the appropriate array to then be added onto 
    double Sw = 0; 
    double Swxx = 0; 
    double Swxy = 0; 
    double Swx = 0; 
    double Swy = 0; 
    double xsq = 0; 


    //create an array for w 
    for (int j = 0; j <= 10; j++){ 
     thePoints[j].w = 1/(pow((thePoints[j].s),2)); 

    //sum over all w i.e. create an array for Sw 
     Sw += thePoints[j].w; 

    //create an array for wx 
     thePoints[j].wx = (thePoints[j].w) * (thePoints[j].x); 

    //sum over all wx i.e. create an array for Swx 
     Swx += thePoints[j].wx; 

    //create an array for wy 
     thePoints[j].wy = (thePoints[j].w) * (thePoints[j].y); 

    //sum over all wy i.e. create an array for Swy 
     Swy += thePoints[j].wy; 

    //create an array for wxy 
     thePoints[j].wxy = (thePoints[j].w) * (thePoints[j].x) * (thePoints[j].y); 

    //sum over all wxy i.e. create an array for Swxy 
     Swxy += thePoints[j].wxy; 

    //create an array for wxx 
     thePoints[j].wxx = (thePoints[j].w) * (thePoints[j].x) * (thePoints[j].x); 

    //sum over all wxx i.e. create an array for Swxx 
     Swxx += thePoints[j].wxx; 
    } 

    printf("%6.2f, %6.2f, %6.2f, %6.2f, %6.2f\n", Sw, Swx, Swy, Swxy, Swxx); 

    //caluculate a value for D 
    double D = ((Sw * Swxx) - (Swx * Swx)); 

    //calculate a value for m 
    double m = ((Sw * Swxy) - (Swx * Swy))/D; 

    //calculate a value for dm 
    double dm = sqrt(Sw/D); 

    //calculate a value for c 
    double c = ((Swy * Swxx) - (Swx * Swxy))/D; 

    //calculate a value for dc 
    double dc = sqrt(Swxx/D); 

    //calculate chi-squared value, xsq = Sw(((m * x) + c - y)^2) 
    for (int j = 0; j < i; j++){ 
     thePoints[j].wmxcy = (thePoints[j].w * (pow(((m * thePoints[j].x) + c - thePoints[j].y),2))); 

    //sum over all chi-squared 
    xsq += thePoints[j].wmxcy; 
    } 

    //prints all of the results of the data 
     printf("The equation of the line for the data is y = %6.2f x + %6.2f.\n", m, c); 
     printf("The gradient, m, has an associated error of %6.2f.\n", dm); 
     printf("The y intercept, c, has an associated error of %6.2f.\n", dc); 
     printf("The data has a chi-squared value of %6.2f.\n", xsq); 

    return 0; 
} 

: はここに私のプログラムです。 txt file

ご意見は大歓迎です。

+2

http://en.cppreference.com/w/cpp/numeric/math/nan、https://en.m .wikipedia.org/wiki/NaN –

+2

[なぜ 'while(myFile.eof())'が間違っているのですか?](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition -considered-wrong) – Barmar

+0

問題を再現するサンプル入力データなしで問題を特定するのは難しいかもしれません。 –

答えて

0

コンパイル時にポイント数がわからない場合は、動的に割り当てられたメモリを使用する必要があります。ファイルを2回読み取ってポイント数をカウントし、newで一度にメモリを割り当てて、2回目のパスでポイントを入力するか、またはデータ構造を使用して必要に応じてポイントを格納することができますあなたがファイルを読んでいる間。私はSTLからstd :: vectorを見てみることをお勧めします。 std :: vectorを使った簡単な例です。

//vector of point 
std::vector<point> thePoints; 

//open a file to read in 
ifstream myFile ("xys.data.txt"); 

//check if it opened successfully 
if (myFile.is_open()) { 

    //file is open 
    //read it in 
    while (!myFile.eof()) { 
     point aPoint; 

     //whilst we are not at the end of the file 
     myFile >> aPoint.x >> aPoint.y >> aPoint.s; 

     //add a point to the vector of points 
     thePoints.push_back(aPoint); 
    } 

    //close the file 
    myFile.close(); 
} 

thePoints.size()でポイント数を取得できます。すべてのforループを更新して、ハードコードされたコードを削除するようにしてください。

関連する問題