- ベストアンサー
座標値を読み込んで領域に含まれているかどうかを判定するプログラム
- 座標値を読み込み,指定の領域に含まれているかどうかを判定するプログラムです。
- プログラミングで課題が出たのですがさっぱりわからないのでどなたか教えてください!
- 質問者さんは指定の領域に座標値が含まれているかどうかを判定するプログラムの作成に悩んでいます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
結論から言えば scanf("%lf%lf", &x, &y); です。 double 型に対する型指定子は、 printf() は、 "%f" scanf() は、"%lf" です。 また、当然のことながら、2つの変数に対しては、2つの型指定子が必要です。 最後に scanf() の型指定子に \n を含ませると、ダミーのエンター(これが、あとひとつの入力に見えるわけです) "%lf" だけでは、2番目の変数に入力が行われないわけです。
その他の回答 (4)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
うまくいかない場合は、それぞれの短い式の結果を確認するとか、入力された結果が確かにその通りか確認していけばいいと思います。 たとえば、No.3 の 「お礼」欄のプログラムは、scanf() の書式指定が間違っています。 このために、y にうまく値が入力できていないわけです。
お礼
何度も申し訳ありません。 %lfではなく%fということでしょうか? アドバイスどおり領域を単純?にしてやってみたところ、 (aとbの式をかえました) #include <stdio.h> int main(void) { double x, y; int a, b; scanf("%f\n", &x,&y); a = ( x >= 0 && x <= 10.0 && y >= 0 && y <= 10.0 ); b = ( x >= -10.0 && x <= -1.0 && y >= -10.0 && y <= -1.0 ); printf("%d\n", a || b ); } これだと、領域2でもうまくいきました。 しかし、例えば、 ↓ a = ( x >= 1.0 && x <= 10.0 && y >= 0 && y <= 10.0 ); b = ( x >= -10.0 && x <= -1.0 && y >= -10.0 && y <= -1.0 ); とすると、途端に領域2では0となってしまいます。 ですのでもちろん元の領域に指定してもうまくいきません。 また、 scanf("%lf\n", &x); scanf("%lf\n", &y); と別々にやると、3つ入力するよう要求されますが、これは普通なのでしょうか? ちなみに↑これでやると、3つ目に入力した値に関わらずうまくいきます。 %fではうまくいきませんでした。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.2 です。 > ただ、領域2の座標でも0と出てしまいます…。 それはやはり括弧が必要ですね。 No.2 の回答に書いたように、条件の部分に括弧を入れてみてください。 (領域1の条件) || (領域2の条件) です。 演算子の優先順位だけを考えていたので、もしかしたらいらないかなと思ったのですが、Cで括弧をつけずに並べた場合、&& が続くと、条件に一致しないところで評価は終わってしまうので、領域2の条件(というか、領域1でないもの)は、領域2のチェックはしてくれません。 それぞれの領域の条件を括弧でくくると、領域2も(領域1のチェックを失敗しても)チェックしてくれます。
お礼
素早い返信ありがとうございます。 括弧はつけてみたのですが、できませんでした。 #include <stdio.h> int main(void) { double x, y; scanf("%lf\n", &x,&y); printf("%d\n", ( x >= 7.0 && x <= 21.2 && y >= -1.5 && y <= 13.8 ) || ( x >= -12.4 && x <= 10.0 && y >= -14.0 && y <= -7.7 ) ); } こうやったり、 #include <stdio.h> int main(void) { double x, y; int a, b; scanf("%lf\n", &x,&y); a = ( x >= 7.0 && x <= 21.2 && y >= -1.5 && y <= 13.8 ); b = ( x >= -12.4 && x <= 10.0 && y >= -14.0 && y <= -7.7 ); printf("%d\n", a || b ); } これもやってみましたが無理でした。 ↑の2つめの方で、 a = x >= 7.0 && x <= 21.2 && y >= -1.5 && y <= 13.8 ; b = x >= -12.4 && x <= 10.0 && y >= -14.0 && y <= -7.7 ; と括弧をとってみたりもしましたが、やっぱりダメで…。 なぜなのでしょう…。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
printf("%f\n", x >= 7.0 && x <= 21.2 && y>= -1.5 && y <= 13.8 || x >= -12.4 && x <= 10.0 && y >= -14.0 && y <= -7.7); 考え方としてはおもしろいと思います。 Cでは、比較演算の結果は「整数値」の 1 or 0 になります。 (最近のCではどうだったか?) ですから、printf() の第1引数は、 "%d\n" です。 あと、 && と || は演算子としての優先順位が同じなので、「領域1」または「領域2」であれば、 ( x >= 7.0 && x <= 21.2 && y>= -1.5 && y <= 13.8) || (x >= -12.4 && x <= 10.0 && y >= -14.0 && y <= -7.7) とする必要がありそうか気がします。 もしかしたら、こっちの括弧は不要かもしれません。
お礼
ありがとうございました! >Cでは、比較演算の結果は「整数値」の 1 or 0 になります。 >(最近のCではどうだったか?) >ですから、printf() の第1引数は、 "%d\n" です。 とりあえずうまくいきました。とても助かりました>< ただ、領域2の座標でも0と出てしまいます…。
- yama5140
- ベストアンサー率54% (136/250)
(こんな方法もある、ということで・・) 《方法》 ・X,Yともに境界値が4つある。 ・これをひとつずつ判定し、条件に合ったらフラグたてる。 Yで使用 Xで使用 8ビット 0000 0000 「領域」 2211 2211 ABCD EFGH 《結果》 領域1:xx11 xx11 0x33(16進) 領域2:11xx 11xx 0xCC(16進) 領域3:1111 1111 (おまけ◆) ---------------------------------------------- #include <stdio.h> void main() { float x, y; // 型注意 unsigned char cFlg = 0x00; int iKekka = 0; scanf( "%f%f", &x, &y ); if( x >= 7.0 ) cFlg |= 0x01; // H if( x <= 21.2 ) cFlg |= 0x02; // G if( x >= -12.4 ) cFlg |= 0x04; // F if( x <= 10.0 ) cFlg |= 0x08; // E if( y >= -1.5 ) cFlg |= 0x10; // D if( y <= 13.8 ) cFlg |= 0x20; // C if( y >= -14.0 ) cFlg |= 0x40; // B if( y <= 0.0 ) cFlg |= 0x80; // Aおまけ( 7.5, -1.0 )◆ // if( y <= -7.7 ) cFlg |= 0x80; // A if( 0x33 == ( cFlg & 0x33 ) ) iKekka += 1; if( 0xCC == ( cFlg & 0xCC ) ) iKekka += 2; printf( "(%4.1f,%4.1f)は、%d 領域です[%02X]。\n", x, y, iKekka, cFlg ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
お礼
アドバイスありがとうございます! ただ、C言語始めたばっかりの者で、私の理解を超えます…^^; でも、さっぱり、というわけでもないので、参考にさせていただきます。 ありがとうございました^^
お礼
ありがとうございます! よくわかりました。 そしてちゃんとうまくいきましたっ。 本当に何度もお手数かけました…。