プログラミングで課題が出たのですがさっぱりわからないのでどなたか教えてください!
座標値 (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);
}
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
結論から言えば
scanf("%lf%lf", &x, &y);
です。
double 型に対する型指定子は、 printf() は、 "%f" scanf() は、"%lf" です。
また、当然のことながら、2つの変数に対しては、2つの型指定子が必要です。
最後に scanf() の型指定子に \n を含ませると、ダミーのエンター(これが、あとひとつの入力に見えるわけです)
"%lf" だけでは、2番目の変数に入力が行われないわけです。
No.4
- 回答日時:
うまくいかない場合は、それぞれの短い式の結果を確認するとか、入力された結果が確かにその通りか確認していけばいいと思います。
たとえば、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ではうまくいきませんでした。
No.3
- 回答日時:
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 ;
と括弧をとってみたりもしましたが、やっぱりダメで…。
なぜなのでしょう…。
No.2
- 回答日時:
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と出てしまいます…。
No.1
- 回答日時:
(こんな方法もある、ということで・・)
《方法》
・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言語始めたばっかりの者で、私の理解を超えます…^^;
でも、さっぱり、というわけでもないので、参考にさせていただきます。
ありがとうございました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- 物理学 示すように,真空中の直交座標系を考える。y平面に平行な つ領域Iと領域Iがあり,軸上の領域Iと領域I 1 2023/06/25 14:46
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 数学 東大過去問 最大と最小 私の答案にご指導ください 1 2023/02/20 15:05
- 数学 2変数関数 難題 2 2023/02/14 15:01
- 数学 東大過去問 最大と最小 5 2023/02/18 13:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# あまりわかりません。 複素数$c$を具体的に定めた複素写像写像$f_c(z)$に対して、原点を含む領 4 2022/10/25 09:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mallocについて
-
newしないオブジェクトについて
-
allocってなんですか?
-
stringの最大サイズ
-
ビットをローテートするプログ...
-
C言語 mallocとfreeについて
-
アンマネージド関数でのメモリ...
-
Win32APIでのメモリ管理について
-
C言語に関する質問
-
アセンブラでのメモリの動的確...
-
ヒープメモリの解放について
-
メモリの動的確保(大容量)に...
-
プログラムが途中で強制終了し...
-
64ビットと32ビットの違い
-
VC++6.0 MFC ダイアログバーを...
-
ExcelVBAで質問です。離れた二...
-
c言語
-
C言語 配列の長さの上限
-
パイソンの
-
_tcscpy_s(wcscpy_s)の第二引数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mallocについて
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
Accessで、メモリを開放するタ...
-
malloc呼び出し時のセグメンテ...
-
ヒープ領域の限界値設定
-
スタック破壊の上手な見つけ方...
-
C言語 mallocとfreeについて
-
指定したメモリアドレスの値の...
-
stringの最大サイズ
-
16進ダンプのプログラム
-
入れ子になった構造体について
-
64ビットと32ビットの違い
-
free関数で動作が止まる
おすすめ情報