- ベストアンサー
while文のデータの終わり
C言語なんですが 購入合計金額を求めるプログラムで、 1回のプログラム実行で、続けて何回でも計算を行い、 えんぴつの購入数に999を入力すると計算を終了するようなプログラムを作りたいのですが、 #include <stdio.h> main() { int a,b,c,goukei; a=b=c=0; while(a!=999){ printf("商品をいくつ買いますか??\n"); printf("えんぴつ = "); scanf("%d",&a); printf("消しゴム = "); scanf("%d",&b); printf("ボールペン = "); scanf("%d",&c); goukei=a*100+b*150+c*200; printf("合計購入価格は%d円です\n\n",goukei); } } 上のようなソースを作ったのですが えんぴつのところに999を入力してもプログラムが終了せずに続いてしまいます… 試行錯誤してもうまくいきません。 どこが間違っているのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
while文は()内の条件式が満たされていれば、{}の命令文をreturnやbreak、continueなどで中断されない限り、全て実行します。 なので"えんぴつ"に999を入力すると最後の命令文である"合計購入価格は…"を出力した後で条件式を判断してwhileを抜けることになります。 akka99ei8cmさんのコードをなるべく活かしたままで修正を行うとすると、入力値をaにscanfした直後にif(a==999)の判断を行い、breakでwhileを抜けるようにしてください。 その場合、whileの条件式は無駄になるので削除した方がいいでしょう。
その他の回答 (4)
- kyofu-chan
- ベストアンサー率23% (109/464)
No. 1 ですが、きちんと全部読んでいませんでした (while の中だけ見ていました)。 無視してください。
お礼
ご協力ありがとうございました!
- -izayoi-
- ベストアンサー率45% (48/105)
プログラムが終了しないというのは、「えんぴつ」に999を入力した後に「消しゴム」~「合計購入価格は…」が一通り出力されるということでしょうか?(このソースだと、そのような動きになると思うのですが・・) 無限に終わらないということでは無いですよね? 「えんぴつ」に999を入力したら即座に終了するようにしたいのでしたら、「scanf("%d",&a);」の直後にif文などで終了判定することになります。 (つまり、whileでの終了判定には向かない題材ですね。)
お礼
回答ありがとうございます。 説明不足でした、すいません。 「えんぴつ」に999を入力した時点で終了させたかったのです。 教えてくださった通りにif文を加えると、 ちゃんと即座に終了しました。 ご協力ありがとうございました!
- ultraCS
- ベストアンサー率44% (3956/8947)
このソースで、終わるはずですが、処理系は何をお使いですか。あるいは、その処理系でint型は長さを明示しないときにshortかlongかなども確認してください。shortだと、999*100の時点でオーバーフローです。 今、MSC6.0でちょろっとやってみると、ちゃんと終わりましたよ。ただ、このころのintは2バイトなので、あっさりオーハーフローしました。
お礼
すみません、説明不足でした…。 ちゃんと終わるのですが、えんぴつの時点で 終了させるようにしたかったのです。 ご解答ありがとうございました!
- kyofu-chan
- ベストアンサー率23% (109/464)
a がインクリメントされてないようですが。
お礼
丁寧な説明ありがとうございます。 とても理解しやすかったです。 説明不足だったのですが、「えんぴつ」の時点で終了させたかったのです。 教えてくださった通りに書いてみると ちゃんと動作しました。 ありがとうございました。