• ベストアンサー

結果の表示

よろしくお願いします。 プログラミングの勉強をしています。 座標上にx1、x2、y1、y2をとり、この2点間の距離が表示されるプログラムを作っています。 最終的には自分で座標を入力し、以下のように表示されることが目標です。 x1:0 y1:0 x2:1 y2:1 この2点間の距離は1.414214です。 次のように作ってみましたが、1.414・・・となるところが、0.0000・・・となってしまいます。どこを直したらよいでしょうか、お願いいたします。 #include <stdio.h> #include <math.h> main() { int x1 = 0, y1 = 0, x2 = 0, y2 = 0; double A = 0.0, dx = 0.0, dy = 0.0; A = sqrt(dx * dx + dy * dy); dx = x1-x2; dy = y1-y2; printf("x1:"); scanf("%d",&x1); printf("y1:"); scanf("%d",&y1); printf("x2:"); scanf("%d",&x2); printf("y2:"); scanf("%d",&y2); printf("この2点間の距離は%lfです\n", A); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

#include <stdio.h> #include <math.h> void main() { /* 俺はこの改行の方が落ち着く*/ int x1 = 0,y1 = 0,x2 = 0,y2 = 0; double A = 0.0,dx = 0.0,dy = 0.0; printf("x1:"); scanf("%d",&x1); printf("y1:"); scanf("%d",&y1); printf("x2:"); scanf("%d",&x2); printf("y2:"); scanf("%d",&y2); /* 処理順が滅茶苦茶。*/ dx = x1-x2; dy = y1-y2; A = sqrt(dx * dx + dy * dy); printf("この2点間の距離は%lfです\n", A); }

ichigo2007
質問者

お礼

いつもありがとうございます。 処理の順が違うんだろうと察しはついたのですが、いまいちそこがまだ理解できなくて、A = sqrt(dx * dx + dy * dy);だけをあちこち移動させてました。おかげさまで、今回も解決することができました。ありがとうございます。

その他の回答 (2)

回答No.3

>無意味な初期化 http://oshiete1.goo.ne.jp/qa3114398.html あー前回初期化したの、俺なんだよな、実は(汗 #警告出てても何かないと落ち着かなくてさ(汗 #でも根本的なところは前回から何も成長してないように見える

ichigo2007
質問者

お礼

すみませんね・・・ なるべく自分で作るようにと思って前回のを参照して作ってみましたが、やはり一人では限界がありまして・・・皆さんが親切に教えてくださるのでとても助かっています。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

Aを計算するのにdxとdyを使っているが,dxとdyの値はAの計算より後で行っている. そのため,dx,dyの初期値に対してAを計算している. 変数宣言の際に無意味な初期化をするからいけない. 初期化していなければ,コンパイルの際に警告が出た筈のコード.

ichigo2007
質問者

お礼

早々と回答いただき、ありがとうございます。 計算の順をいつも間違えてしまいます。いまいちまだ順番を理解していないようで、これからきちんと勉強して行きたいと思います。 ありがとうございました。

関連するQ&A

  • 虚数解の表示

    Ax^2+Bx+Cの形の二次関数の解を計算するプログラムです #include <stdio.h> #include <math.h> int main(void) { double a,b,c,d,x1,x2,real,image; printf("A="); scanf("%lf",&a); printf("B="); scanf("%lf",&b); printf("C="); scanf("%lf",&c); if(a==0){x1=-c/b; printf("X=%5.2lf\n",x1); } if(a!=0.0){d=sqrt(pow(b,2.0)-4*a*c); if(d<0.0){ real=(-b)/(2*a); image=sqrt(-d)/(2*a); printf("実数=%5.2lf\n",real); printf("虚数=±%lfi\n",image);} else if(fabs(d)<0.0){ x1=(-b)/(2*a); printf("X=%5.2lf\n",x1);} else if(d>0.0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("X1=%5.2lf\n",x1); printf("X2=%5.2lf\n",x2);} } return 0;} 判別式d<0、d>0、d=0で分けています 判別式dが負になるとき(虚数解の部分)はそのままではsqrtが使えないので、-dを入れてみたのですがうまくいきません どのように修正すればよいのかご教示願います よろしくお願いします

  • 二次関数の係数と切片 オーバーフローになってしまいます

    二次関数の通る、二つの座標(x1,y1)、(x2,y2)から y=ax+bの、aとbを求めるプログラムを目指して作ったのですが、 実行すると値がNANになってしまいます。 アドバイスしていただけないでしょうか? ソースです ↓ #include<stdio.h> double main(){ double x1,x2,y1,y2,a,b,a1,a2; printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("***RESULT***\n"); printf("y=%f x+ %f",a,b); a1=y1-y2; a2=x1-x2;      a=a1/a2; b=y1-a*x1; return 0; }

  • どこが悪いのか・・・

    初めまして、こんばんわ。 学校の課題で、二次方程式のXの解を求めるC言語のプログラムを作ったのですが 何故か巧く起動しません。 よくわかりません・・・。 是非、何処が悪いのか指摘していただくと嬉しいです。 /*2-10(su210.c)*/ #include <stdio.h> #include <math.h> main() { int a,b,c; float D,x,y; printf("a*x^2+b*x+c=0のときa.b.cを入力して下さい。\n"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("c="); scanf("%d",&c); if(a=0){ if(b=c=0) printf("xはすべての実数をとる。"); else{ if(c=0&&b!=0) printf("x=0"); else{ if(b=0&&c!=0) printf("解なし。"); else{ if(b!=0&&c!=0) {x=-c/b; printf("x=%f",x);} } } } } else{ if(a!=0){ D=b^2-4*a*c; if(D>0){ x=(-b+sqrt(D))/2/a; y=(-b-sqrt(D))/2/a; printf("判別式はD>0です。\n"); printf("x1=%f\n",x); printf("x2=%f\n",y);} else{ if(D=0){x=-b/2*a;printf("判別式はD=0です。\n");printf("x=%f",x);} else{ if(D<0){printf("判別式はD<0です。\n");printf("解なし。");} } } } } }

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

  • 数列の結果の表示

    いつもお世話になっています。 プログラミングの初心者で勉強中です。 初項1公差1の等差数列で、X項からY項までの和を求めるプログラミングを作っています。 次のようにプログラムを作ったのですが、結果の表示がうまくいきません。最後の第X項から第Y項までの数列の和は・・・のX項の部分がおかしな数字で出てきます。 間違っているところを教えていただけますか? #include<stdio.h> main() { int X = 1; int Y; int sum = 0; printf("第X項から:"); scanf("%d",&X); printf("第Y項まで:"); scanf("%d",&Y); while (X <= Y) { sum = sum + X; X = X + 1; } printf("初項1公差1の等差数列において、\n第%d項から第%d項までの数列の和は%dです。",X,Y,sum); }

  • Mapleで連立方程式の解が正常に出力されません

    こんにちは。 Windows2000でMaple7の環境です。 A(-1,-2),B(3,4),C(5,6)の△ABCの内心の座標を求めています。 各辺の直線の方程式を求めて点と直線間の距離の公式を使って内心の座標を求めようと試みたのですが何故か最後の連立方程式の解が4組も出力されてしまいます。これは何が原因なのでしょうか? x1=-1;y1=-2;x2=3;y2=4;x3=5;y3=6; subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y1=(y1-y2)/(x1-x2)*(x-x1)}); {y - 1 = 1/2 x - 1/2} subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y1=(y1-y3)/(x1-x3)*(x-x1)}); {y - 1 = 2 x - 2} subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y3=(y3-y2)/(x3-x2)*(x-x3)}); {y - 3 = -x + 2} d1:=abs((1/2*x-y-1/2))/((1/2)^2+(-1)^2)^(1/2); d1 := 1/5 | 1/2 x - y - 1/2 | sqrt(5) sqrt(4) d2:=abs((2*x-y-1))/((2)^2+(-1)^2)^(1/2); d2 := 1/5 | 2 x - y - 1 | sqrt(5) d3:=abs((x+y-1))/((1)^2+(1)^2)^(1/2); d3 := 1/2 | x + y - 1 | sqrt(2) solve({d1=d2,d2=d3,d3=d1},{x,y}); {y = 1/18*sqrt(5)*sqrt(2)+2/9, x = 8/9+1/18*sqrt(5)*sqrt(2)}, {y = -1/6*sqrt(5)*sqrt(2)-1/3, x = 1/6*sqrt(5)*sqrt(2)+1/3}, {y = 2/9-1/18*sqrt(5)*sqrt(2), x = 8/9-1/18*sqrt(5)*sqrt(2)}, {x = 1/3-1/6*sqrt(5)*sqrt(2), y = -1/3+1/6*sqrt(5)*sqrt(2)}

  • セグメンテーション違反

    穴掘り方というやり方で迷路を作っています。 とりあえずすこしだけ作ってみて実行したらセグメンテーション違反が起こってしまいました。 解説お願いします。 次のサイトを参考にしています。ttp://www.ced.is.utsunomiya-u.ac.jp/lecture/2009/prog/p3/kadai4/5.html #include<stdio.h> #include<stdlib.h> #include<time.h> #define A 51 #define B 51 /*51ラ51マスの迷路*/ void initialize(int *x,int *y,int map[A][B]);  /*最初のステージ作成と座標決定*/ int dig(int *x,int *y,int map[A][B]);   /*道を作る*/ int main(void) { int x,y;   /*現在の座標*/ int map[A][B];    initialize(&x,&y,map); dig(&x,&y,map); map[1][0] = 2; map[A-2][B-1] = 2; for(y=0;y<B;y++){ for(x=0;x<A;x++){ if( map[x][y] == 0){ printf(" "); }else if( map[x][y] == 1){ printf("■"); }else if( map[x][y] == 2){ printf("..") ; } } printf("\n"); } } void initialize(int *x,int *y,int map[A][B]) { int i,h; for(i=0;i<A;i++){ for(h=0;h<B;i++){ map[i][h]=1; } } do{ *x=rand()%A; *y=rand()%B; }while(*x!=0 && *x!=A-1 && *y!=0 && *y!=B-1); } int dig(int *x,int *y,int map[A][B]) { int r,c,dx,dy,count=0; do{ r = rand()%4; switch(r){     /*道を進める方向を決める*/ case 0: dx = 0; dy = -1; break; case 1: dx = -1; dy = 0; break; case 2: dx = 0; dy = 1; break; case 3: dx = 1; dy = 0; break;    } if(*x+dx*2 <= 0 || *y+dy*2 <= 0 || *x+dx*2 >= A-1 || *y+dy*2 >= B-1 || map[*x+dx*2][*y+dy*2] == 0){ c = 0; count++; if(count ==4){     /*4方向とも進めなかったらループを抜ける*/ break; } }else if(map[*x+dx*2][*y+dy*2] == 1){ map[*x+dx][*y+dy] = 0; *x = *x + dx*2; *y = *y + dy*2; c =1; } }while(c==0); }

  • C言語なうなんですが、コンパイルまでは行ったんですが、セグメントエラー

    C言語なうなんですが、コンパイルまでは行ったんですが、セグメントエラーを起こしてしまいます。初心者なのでどこがおかしいのかもわかりませんので、ご指摘いただけるとありがたいです。 以下がそれでゲソ。始点と終点を指定して線を描いてもらうプログラミングを目指す。 #include <stdio.h> #include "../Glib/Glib.h" int main(void) { int x1,y1,x2,y2; printf("直線の始点の座標(x1,y1)のx1,y1を、間にカンマ','を入れて入力してください。"); scanf("%d" ,"%d" ,&x1 ,&y1); printf("直線の終点の座標(x2,y2)のx1,y1を、間にカンマ','を入れて入力してください。"); scanf("%d" ,"%d" ,&x2 ,&y2); G_init(); G_open(800,600,"Draw Line"); G_show(); G_black(); G_fillrect(0, 0, 800, 600); G_flush(); printf("Return Key を押してください。\n"); getchar(); G_white(); G_fillrect(0, 0, 800, 600); G_rgb(0,0,8); void G_line(int x1, int y1, int x2, int y2); G_flush(); printf("Return key を何回か押すと終了します。\n"); getchar(); getchar(); G_close(); return (0); }

  • c言語 プログラミング(初心者)

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } return 0; }

  • 二点の座標から距離や角度を求めたいのですが、Matlab

    こんにちは、Matlabの初心者ですがよろしくお願いします。 ある座標、たとえば、A(x1, y1) B(x2, y2)があったとして、 この二点間の距離は、 sqrt((x2-x1)^2 + (y2-y1)^2) だと思いますが、もっと簡潔に求めることができる関数とかが導入されていたりしないかと思いました。AやBを定義しておいて、AとBだけを使うことができないかと思いました。 また、この二点を通る直線とX軸とがなす角度は、 atan(sqrt((y2-y1)^2)/sqrt((y2-y1)^2)) で求められるかと思いますが、これも同様にもっと簡潔な方法がないかと思いました。 いかがでしょうか。よろしくお願いします。