2016-06-30 18 views
1

structを使用して2点の中間点を見つけるプログラムを作成しようとしています。しかし、floatを印刷しようとすると、出力は常にゼロになり、print intのときは常に最も近い整数(端数が必要な場合)になります。だから、どうすれば分数を印刷することができるのでしょうか? (たとえば、出力が1.5などの数値になる場合)端数を印刷する方法

#include <stdio.h> 
#include <stdlib.h> 

struct point{ 
     int x; 
     int y; 
}; 

struct rect{ 
     struct point pt1; 
     struct point pt2; 
}; 

struct point makepoint(int x, int y){ 
     struct point temp; 

     temp.x = x; 
     temp.y = y; 
     return temp; 
} 

int main() 
{ 

    struct rect screen; 
    struct point middle; 
    struct point makepoint(int, int); 

    int XMAX, YMAX; 
    XMAX = YMAX = 0; 

    screen.pt1 = makepoint(0,0); 
    printf("Enter the x axis: "); 
    scanf("%d",&XMAX); 
    printf("Enter the y axis: "); 
    scanf("%d",&YMAX); 
    screen.pt2 = makepoint(XMAX,YMAX); 
    middle = makepoint((screen.pt1.x + screen.pt2.x)/2,(screen.pt1.y + screen.pt2.y)/2); 

    printf("x = %f, ",middle.x); 
    printf("y = %f\n",middle.y); 



    return 0; 
} 
+0

'int'型変数を使って' 1.5'を表すことはできません。 'struct point 'の' x'と 'y'メンバーは型であるため、' struct point'型のオブジェクトを使って '1.5'を取り込むことはできません。 –

答えて

3

「非整数」の計算は絶対にありません。

(screen.pt1.x + screen.pt2.x)/2はすべて整数です。何かをフロートにする必要があります。以下のような:AATはコメントで指摘するように(screen.pt1.x + screen.pt2.x)/2.0

、あなたはint型に山車を保存するために期待しているように見えるので、あなたはおそらく浮かぶの代わりに、int型ストアにpointを変更する必要があります。

+0

しかし、それでも結果を格納するには 'double'や' float'が必要です:OPは 'makepoint()'のパラメータも変更する必要があります。 – AAT

0

最初の場所では、あなたのPoint構造体がintとしてxyを記憶している、

ので、このラインのmiddle = makepoint((screen.pt1.x + screen.pt2.x)/2,(screen.pt1.y + screen.pt2.y)/2);

とにかく二つの整数座標を有するものです。

ですから、二つのものに変更する必要があります。分割する際、他の答えは を述べたように(screen.pt1.x + screen.pt2.x)/2.0のように、floatに数値を変換する代わりに、暗黙の構造体のintPoint

  • キャスト/のストアfloat

  • 0

    ここには2つの問題があります。

    まず、middle.xmiddle.yを整数として宣言されます。

    struct point{ 
         int x; 
         int y; 
    }; 
    

    あなたはフロートとして宣言する必要があります。

    次に、middle.xおよびmiddle.yが整数値に設定されています。

    C演算子/は少し奇妙です:両方の引数が整数である場合、結果は整数である、あなたのケースでは、のような計算を行うよう:(screen.pt1.x + screen.pt2.x)/2または(screen.pt1.y + screen.pt2.y)/2はあなたに整数を与える(端数切捨て)。解決策は、少なくとも1つの引数を浮動小数点数にすることです。たとえば、浮動小数点数のうちの1つを浮動小数点にキャストするか、2ではなく2.0(浮動小数点数)を使用します。


    ただ、興味深い事実:

    printf("x = %f.2, y = %f.2\n",middle.x,middle.y); 
    

    あなたが出力をしたいと言うには:あなたのケースでは、あなたのprintf文を作ることができますので、あなたが実際に、あなたが望むどのように多くの小数点以下の値Cを伝えることができます小数点第2位まで正確にすること。規則hereのリストを見つけることができます。

    0

    ここで問題となるのは、浮動小数点数にしたいと思ったときに中間点を整数として保持することです。整数で数学を行うと、整数になります。あなたのプログラムの実行を1秒間で済ませましょう。

    私たちは、2つのポイント、1つは(0,0)に、もう1つは設定したポイントにします。 (1,1)

    申し訳ありませんが、実際のところ、私たちの出力は0.5、0.5となります。しかし、整数計算を行うときは、最も近いものに切り捨てます。そう...

    - 整数の世界では(1 0)/ 2 = 0 ...

    私はあなたが変更したい部分はこのだと思う:これに

    struct point{ 
         int x; 
         int y; 
    }; 
    

    struct point{ 
         float x; 
         float y; 
    }; 
    

    と、この:

    struct point makepoint(int x, int y){ 
         struct point temp; 
    
         temp.x = x; 
         temp.y = y; 
         return temp; 
    } 
    

    をこれに入れる:

    struct point makepoint(float x, float y){ 
         struct point temp; 
    
         temp.x = x; 
         temp.y = y; 
         return temp; 
    } 
    

    浮動小数点数を入力している間に整数を入力できます。

    希望すると便利です。

    関連する問題