• ベストアンサー

このプログラムの修正箇所を教えていただけないでしょうか?

xとyをそれぞれ0から10まで1きざみで変え、そのすべてを組み合わせた平面上の11x11個の点(x,y)を考え、これらの点のうちで、原点が(6,6)、半径5の円の内側(円周上は除く)に含まれる点の数を出力するプログラム。 とりあえず、原点が(6,6),半径5の円の内側なので,原点(6,6)と点(x,y)との距離の2乗が5*5より小さいと考えました。 そこで私が考えたプログムなんですが、結果と照らし合わせたところ上手く計算が合いませんでした…。 #include <stdio.h> int main(void) { int x,y,h1=0,i1=0,j1=0,k1=0,l1=0,m1=0,n1=0,o1=0,p1=0,q1=0,r1=0,t=0; /*y=0の行について考える*/ for(x=0,y=0;x<=10;x++){ if((6-x)*(6-x) + (6-y)*(6-y)<=5*5) h1+=1; } /*y=1の行について考える*/ for(x=0,y=1;x<=10;x++){ if((6-x)*(6-x) + (6-y)*(6-y)<=5*5) i1+=1; } :(中略yを1ずつ増やして同じことの繰り返し) : : /*y=10の行について考える*/ for(x=0,y=10;x<=10;x++){ if((6-x)*(6-x) + (6-y)*(6-y)<=5*5) r1+=1; } t=h1+i1+j1+k1+l1+m1+n1+o1+p1+q1+r1; printf("%d",t); return(0); } 自分自身、初心者でかなりまどろっこしい書き方をしていると思います; ここで完全に自分では詰まってしまったので、計算が合うような修正箇所、簡潔な書き方、ヒント等をどなたかご教授いただけると幸いです。 よろしくお願いします。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

こういうことではないでしょうか。 #include <stdio.h> int main(void) {   int x, y, count = 0;      for (x = 0; x <= 10; x++)     for (y = 0; y <= 10; y++)       if ((x - 6) * (x - 6) + (y - 6) * (y - 6) <= 5 * 5)         count++;   printf("%d\n", count);   return 0; } (注)インデントのため、全角空白を使っています。

iriiri_001
質問者

お礼

非常に参考になりました。 私自身、もっと簡潔に書けるというのは頭でわかっていたのですが、 具体的にどのように書けば良いのかという点でつまずいていました。 この場合、for文を二重に使えば良いのですね。 大変ありがとうございました。

その他の回答 (2)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

>自分自身、初心者でかなりまどろっこしい書き方をしていると思います; そうですね。変数が多過ぎます。そして名前に意味がないので読めません。 変数の宣言とか置いておいて、最初におおまかな処理を書くとよいですよ。 int main() {  for ( int x = 0 ; x <= 10 ; x++ ) {   for ( int y = 0 ; y <= 10 ; y++ ) {    if ( x, y が題意の円に含まれる ) {     count++;    }   }  }  printf("%d\n", count); } あとは count を宣言/初期化して、「x, y が題意の円に含まれる」を関数として実装するだけです。

iriiri_001
質問者

お礼

なるほど、最初におおまかな処理を書くとわかりやすそうですね。 今後、実践するようにしてみます! 回答ありがとうございます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>       if ((x - 6) * (x - 6) + (y - 6) * (y - 6) <= 5 * 5) 失礼しました。円周上を含まないので、       if ((x - 6) * (x - 6) + (y - 6) * (y - 6) < 5 * 5) ですね。 (注)インデントのため、全角空白を使っています。

関連するQ&A