2016-12-26 11 views
-2

私はプログラムを実行するときに問題があります。私が得た結果はvectorの値に対して "nan"です。正確には間違いはありません。メソッドdistanciasは正しい値を生成しますが、メソッドのバリオグラムは値 "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

ようこそスタックオーバーフロー。 [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を計算すると、その結果はおそらくプラスまたはマイナスの無限大になります。お互いに同じ符号の2つの無限を減算すると、結果は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コマンドラインを使用し、(有効に警告を使用してコードをコンパイルしてくださいオプション)。コンパイラは、これらの初期化されていない変数について警告します。

関連する問題