Я написал программу для вычисления значения хи-квадрат, используя данные. Тем не менее, мне нужно написать это так, чтобы моя программа могла не знать, сколько строк в текстовом файле, из которого она читает. Если я определяю свои точки структуры как точки thePoints [1000], (то есть больше, чем количество строк в файле), тогда вычисления не работают, и я получаю значения ‘nan’.
Вот моя программа:
#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;
}
Я приложил входной файл.текстовый файл
Любые мнения будут высоко оценены.
Если вы не знаете количество точек во время компиляции, вам следует использовать динамически распределенную память. Вы можете либо прочитать файл за два прохода, чтобы посчитать количество точек, а затем выделить память одновременно new
и заполняйте точки во время второго прохода, или вы можете использовать структуру данных для хранения ваших точек, которые могут расти по мере необходимости, пока вы читаете файл. Я бы посоветовал вам взглянуть на std :: vector из STL как отправную точку. Вот краткий пример использования 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 для удаления жестко закодированных 10.
Других решений пока нет …