プロが教えるわが家の防犯対策術!

プログラミングで課題が出たのですがさっぱりわからないのでどなたか教えてください!


座標値 (x, y) を読み込み,点 (x, y) が 領域1または2に属すれば(境界を含む)1を出力し,それ以外(どちらの領域にも属さない)なら0を出力するプログラムを書きなさい.

領域1
7.0 ≦ x ≦ 21.2
-1.5 ≦ y ≦ 13.8

領域2
-12.4 ≦ x ≦ 10.0
-14.0 ≦ y ≦ -7.7


おそらくかなり見当違いなことをしていると思いますが、以下です。

#include <stdio.h>

int main(void)
{
double x, y;
scanf("%f%f\n",&x,&y);

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);
}

よろしくお願いします。

A 回答 (5件)

結論から言えば


scanf("%lf%lf", &x, &y);
です。
double 型に対する型指定子は、 printf() は、 "%f" scanf() は、"%lf" です。
また、当然のことながら、2つの変数に対しては、2つの型指定子が必要です。

最後に scanf() の型指定子に \n を含ませると、ダミーのエンター(これが、あとひとつの入力に見えるわけです)

"%lf" だけでは、2番目の変数に入力が行われないわけです。
    • good
    • 0
この回答へのお礼

ありがとうございます!
よくわかりました。
そしてちゃんとうまくいきましたっ。
本当に何度もお手数かけました…。

お礼日時:2008/05/24 17:21

うまくいかない場合は、それぞれの短い式の結果を確認するとか、入力された結果が確かにその通りか確認していけばいいと思います。



たとえば、No.3 の 「お礼」欄のプログラムは、scanf() の書式指定が間違っています。
このために、y にうまく値が入力できていないわけです。
    • good
    • 0
この回答へのお礼

何度も申し訳ありません。
%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ではうまくいきませんでした。

お礼日時:2008/05/24 13:35

No.2 です。



> ただ、領域2の座標でも0と出てしまいます…。

それはやはり括弧が必要ですね。
No.2 の回答に書いたように、条件の部分に括弧を入れてみてください。
(領域1の条件) || (領域2の条件)
です。

演算子の優先順位だけを考えていたので、もしかしたらいらないかなと思ったのですが、Cで括弧をつけずに並べた場合、&& が続くと、条件に一致しないところで評価は終わってしまうので、領域2の条件(というか、領域1でないもの)は、領域2のチェックはしてくれません。
それぞれの領域の条件を括弧でくくると、領域2も(領域1のチェックを失敗しても)チェックしてくれます。
    • good
    • 0
この回答へのお礼

素早い返信ありがとうございます。

括弧はつけてみたのですが、できませんでした。

#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 ;
と括弧をとってみたりもしましたが、やっぱりダメで…。
なぜなのでしょう…。

お礼日時:2008/05/24 09:23

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)
とする必要がありそうか気がします。

もしかしたら、こっちの括弧は不要かもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございました!

>Cでは、比較演算の結果は「整数値」の 1 or 0 になります。
>(最近のCではどうだったか?)
>ですから、printf() の第1引数は、 "%d\n" です。
とりあえずうまくいきました。とても助かりました><

ただ、領域2の座標でも0と出てしまいます…。

お礼日時:2008/05/23 19:07

(こんな方法もある、ということで・・)


 
《方法》
 ・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 );
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます!
ただ、C言語始めたばっかりの者で、私の理解を超えます…^^;
でも、さっぱり、というわけでもないので、参考にさせていただきます。
ありがとうございました^^

お礼日時:2008/05/23 18:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!