- ベストアンサー
while文の判定について(C言語)
while文の判定についてです たぶんすごいつまらないミスなので時間の余っている方 ご指導ください<_ _> (自分ではいろいろ調べましたが原因がわかりません><、) returnやbreakを使わないで二分探索を終了させよとの問題で low-highで2ならばデータが見つかったとき 1ならば見つからなかったときという判定で whileで抜けさせたいのですがどうしても抜けません><、 論理演算子の使い方が間違っているのでしょうか? #include<stdio.h> #define N 10 int main(void) { static int a[]={2,3,4,11,31,50,55,70,77,80}; int key,low,high,mid; high=N-1; low=0; int i=0; printf("検索するdata ? :");scanf("%d",&key); ここです while((2!=(low-high)) || (1!=(low-high))){ mid=(low+high)/2; if(a[mid]==key){ low=mid+1; high=mid-1; } else if(a[mid]<key){ low=mid+1; } else{ high=mid-1; } } if(2==(low-high)){ printf("%2dは%2d番目にありました",key,mid); } else{ printf( "見つかりませんでした" ); } return 0; } while内でlow-highをprintfで出力しましたが2と1が出力されました
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
今の条件判定だと 「low-highが1ではない」か、「low-highが2ではない」間以下の処理を続けろと言うことなので、たとえばlow-highが1だと、「2」ではないので続けてしまいますし、low-highが2だと「1」ではないので処理を続けてしまいます。 whileは条件が成り立つ間と言うことなのでor条件だとどっちかが成り立てば処理を続けてしまいます。 この辺をゆっくり考えてみましょう。
その他の回答 (1)
- php504
- ベストアンサー率42% (926/2160)
while((2 != (low-high)) || (1 != (low-high))){ だとlow-highが2のときは(1 != (low-high))に該当しますしlow-highが1のときは(2 != (low-high))に該当します while((2 != (low-high)) && (1 != (low-high))){ ではないでしょうか
お礼
回答ありがとうございます<_ _> そうですよね・・・ !=で「そうでない間」というのがわかっていて ||では条件が満たされてしまいます--; 何故こういったことが解らないのか・・・ 自分が嫌になります><、 貴重な時間を割いてご指導して頂き 本当にありがとうございました<_ _>