LoginSignup
asaaaaaaaaaa114
@asaaaaaaaaaa114

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

構造体を用いたときのprintfがうまくいきません

・c言語です。
・以下のコードを実行したときに、i=2などが実行されずにこまっています。
・学校の課題で、三角形の面積などを求めるプログラミングの課題です。ファイルを読み込んでデータを構造体に入れて、そのデータをもとに計算するものです。
・ファイルは上3行がT1の座標、次の3行がT2の座標、下2行は関係ないです。
・初心者なのでご指摘お願いします。

-----もととなるデータ(ファイル名:triangle.dat)-----
0.0 0.0
1.0 1.0
0.0 -1.0
1.0 1.0
3.0 1.0
0.0 2.0
2.0 1.0
1.0 3.0

-----以下、コード-----
#include
#include
#include

typedef struct{//座標平面の一点を表す構造体
double x;
double y;
} Point;

typedef struct{
Point p[3];//三つの点を表す構造体
} Triangle;

double tri(Triangle dot){//三角形の面積を求める関数
return fabs((dot.p[0].x-dot.p[2].x)(dot.p[1].y-dot.p[2].y)-(dot.p[1].x-dot.p[2].x)(dot.p[0].y-dot.p[2].y))/2.0;
}

int main(void){
FILE *fp_in;
Point p[8];
Triangle dot;
struct Point;
double x,y;
int i,j;
fp_in = fopen("triangle.dat","r");//ファイルの読み込み
if(fp_in == NULL){
fprintf(stderr, "Can't open file\n");
exit(1);
}

for(i=0;i<8;i++){
    dot.p[i] = p[i];
}

printf("T1:");//三角形T1
for(i=0;i<3;i++){//ここのiがうまくいかないです。(i=0のみ表示される)
fscanf(fp_in,"%lf %lf",&p[i].x,&p[i].y);//ファイルの読み込み
printf("(%.1f,%.1f) ",p[i].x,p[i].y);//データの表示
if(i=2){
    printf("\n");
    printf("The area of a triangle T1: %.6lf\n",tri(dot));
}
}

printf("T2:");//三角形T2
for(i=3;i<6;i++){
fscanf(fp_in,"%lf %lf",&p[i].x,&p[i].y);
printf("(%.1f,%.1f) ",p[i].x,p[i].y);
if(i=5){
    printf("\n");
    printf("The area of a triangle T2: %.6lf\n",tri(dot));
}
}

fclose(fp_in);


return 0;

}

-----実行結果-----
T1:(0.0,0.0)
The area of a triangle T1: 0.000000
T2:(1.0,1.0)
The area of a triangle T2: 0.000000

-----理想の実行結果-----
T1:(0.0, 0.0) (1.0, 1.0) (0.0,-1.0)
The area of a triangle T1: 2.500000
T2:(1.0,1.0) (3.0, 4.0) (2.0, 6.0)
The area of a triangle T2: 5.000000

よろしくおねがいします。

0

2Answer

タグが C# になっていて間違ってます。訂正願います。また、他のタグ #for文 #構造体 の # は不要です。ここは X (旧ツイッター) でないのだから。

コードはマークダウン方式で書いてください。インデントもされてないコードはあなた自身も読む気がしないのでは?

0Like

Comments

  1. ご指摘ありがとうございます。
    見にくくて申し訳ありません。急いでいたのでコードをコピペしてしまいました。修正します。

printfがうまくいきません

printf自体が異常でなく、printfで考えていた計算結果が表示されない言う事ですね

まず

T1:(0.0, 0.0) (1.0, 1.0) (0.0,-1.0)
-The area of a triangle T1: 2.500000
+The area of a triangle T1: 0.500000
-T2:(1.0,1.0) (3.0, 4.0) (2.0, 6.0)
+T2:(1.0,1.0) (3.0, 1.0) (0.0, 2.0)
-The area of a triangle T2: 5.000000
+The area of a triangle T2: 1.000000

理想の実行結果が誤ってるように見えます。

-for(i=0;i<8;i++){
-    dot.p[i] = p[i];
-}
+//for(i=0;i<8;i++){
+//    dot.p[i] = p[i];
+//}

構造体Triangleの変数に変数pの中身を移動させたいのでしょう。
でも、まだ変数p[]が確定していないし、dot.p[]の領域は3個なのですが、8個コピーすることで、領域破壊してます。

    printf("T1:");//三角形T1
    for(i=0;i<3;i++){//ここのiがうまくいかないです。(i=0のみ表示される)
        fscanf(fp_in,"%lf %lf",&p[i].x,&p[i].y);//ファイルの読み込み
        printf("(%.1f,%.1f) ",p[i].x,p[i].y);//データの表示
-        if(i=2){
+        if(i==2){
            printf("\n");
+           dot.p[0] = p[0];
+           dot.p[1] = p[1];
+           dot.p[2] = p[2];
            printf("The area of a triangle T1: %.6lf\n",tri(dot));
        }
    }

    printf("T2:");//三角形T2
    for(i=3;i<6;i++){
        fscanf(fp_in,"%lf %lf",&p[i].x,&p[i].y);
        printf("(%.1f,%.1f) ",p[i].x,p[i].y);
-        if(i=5){
+        if(i==5){
            printf("\n");
+            dot.p[0] = p[3];
+            dot.p[1] = p[4];
+            dot.p[2] = p[5];
            printf("The area of a triangle T2: %.6lf\n",tri(dot));
    }
}

1.比較したい気持ちはわかりますが代入になってます。
2.dot.に変数pの中身をコピーしないといけないですよね。

どうでしょう。

0Like

Comments

  1. ご指摘ありがとうございます…!
    見にくくて申し訳ありませんでした。
    参考にさせていただきます。

Your answer might help someone💌