2016-12-26 55 views
-2

我執行程序時出現問題,我得到的結果是vector的值爲「nan」。我不完全是錯誤所在。方法distancias會生成一個正確的值,但方法variogram不會生成期望值,而會生成值「nan」。請留下我的英語。類對象數組的值「nan」

#include <iostream> 
#include <math.h> 

//this program is to calculate the kriging puntual 
using namespace std; 

//// 
class Points{ 
    private: 
     float x; 
     float y; 
    public: 
     Points(float a,float b); 
     Points(); 
     float distancia(float x_1,float y_1); 
     float variogram(float h); 
     float valor_1(); 
     float valor_2(); 
     void show(void); 
}; 

Points::Points(){ 

} 
Points::Points(float a,float b){ 
    x=a; 
    y=b; 
} 
float Points::distancia(float x_1,float y_1){ 
    float d; 
    d=pow(pow((x-x_1),2)+pow((y-y_1),2),0.5); 
    return d; 
} 
float Points::variogram(float h){ 
    float v,c_0,c_1,a_1; 
    v=c_0+c_1*(1.5*(h/a_1)-0.5*pow((h/a_1),3)); 
    return v; 
} 
void Points::show(void){ 
    printf("%.2f,%.2f\n",x,y); 
} 
float Points::valor_1(){ 
    return x; 
} 
float Points::valor_2(){ 
    return y; 
} 


/////// 
int main(int argc, char** argv) { 
    float a_1,c_0,c_1;  //parameters of variogram 
    float c,d;    // position of point to determinate 
    float a,b;    //positions of all points except the point to  determinate 
    int i=0,n; 
    int j,k; 

    Points final;   //point to determinate 

    //this part is to enter the values of function sphere variogram 

    printf("Enter the paramters of sphere variogram\n"); 
    printf("Enter the value of c_0: "); 
    scanf("%f",&c_0); 
    printf("Enter the value of c_1: "); 
    scanf("%f",&c_1); 
    printf("Enter the value of a: "); 
    scanf("%f",&a_1); 

    //determinating the postion of final point 

    printf("Enter the position of the point to determinate: "); 
    scanf("%f,%f",&c,&d); 
    final=Points(c,d); 
    final.show(); 


    printf("Enter the name of points for the krigeage: "); 
    scanf("%i",&n); 
    Points punto[n]; 
    float vector[n]; 
    do{ 
     printf("Enter the position x,y of the point %i: ",i+1); 
     scanf("%f,%f",&a,&b); 
     punto[i]=Points(a,b); 
     punto[i].show(); 
     vector[i]=punto[i].variogram(punto[i].distancia(c,d)); 
     cout<<vector[i]<<endl; 
     i=i+1; 
    }while(i<n); 
return 0; 
} 
+0

歡迎來到Stack Overflow。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

爲什麼在C++中使用'printf' /'scanf'?你甚至不包括''。 – melpomene

回答

0

的問題是在以下功能:

float Points::variogram(float h){ 
    float v,c_0,c_1,a_1; 
    v=c_0+c_1*(1.5*(h/a_1)-0.5*pow((h/a_1),3)); 
    return v; 
} 

在這裏,你在聲明局部變量vc_0c_1a_1。這些值不會被初始化,它們可以包含任何東西。但是,它們不可能實際上等於零。所以當你計算h/a_1時,結果可能是正負無窮。當你用相同的符號減去兩個無窮大時,結果將是NaN

你應該做的是從main()傳遞值c_0c_1a_1的功能:

float Points::variogram(float h, float c_0, float c_1, float a_1){ 
    return c_0+c_1*(1.5*(h/a_1)-0.5*pow((h/a_1),3)); 
} 

... 

vector[i]=punto[i].variogram(punto[i].distancia(c,d), c_0, c_1, a_1); 

請打開了警告編譯代碼(如果你使用GCC,然後用-Wall命令行選項)。你的編譯器會提醒你這些未初始化的變量。