- ベストアンサー
制御文について
制御文について伺います。 --------------- while(kyori != 0){ printf("距離を入力してください->"); scanf("%d", &kyori ); //入力距離が0km以下の場合はエラー if(kyori < 0) { printf("0km以上を入力して下さい。"); return; } ・ ・処理 ・ 処理終了 --------------- 1.while(kyori != 0)の箇所で kyoriに0が入力されるまで 処理を繰り返すようにしてあります。 「0」が入力されると、 処理を実行してしまってから終了をするんですが 「0」が入力された時点で 終了するにはどうすればいいですか? 2.if(kyori < 0) の箇所で -を入力した時はエラーを出力するようにしてあるんですが returnだと、処理そのものが処理してしまいます。 -を実行した時は、処理を実行させずに if(kyori < 0) の位置に戻したい場合は どの様にすればいいですか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
while(kyori){ printf("距離を入力してください->"); scanf("%d", &kyori); if(kyori == 0){ break; }else if(kyori < 0){ printf("0km以上を入力して下さい。"); continue; } } ※補足 break文…ループを抜けます。 continue文…ループの先頭処理に戻ります。 goto 文を使った方法もありますが、C言語で goto 文を使うのは好ましくないとされています。 ※おまけ この場合、while(kyori != 0) の部分は、while(kyori) と省略して書くことができます。 PCの立場に立ってその気持ちを考えてあげると、こっちの書き方のほうが少し気持ちいいみたい。 (「ソースの最適化」といいます)
その他の回答 (2)
- dotdecool
- ベストアンサー率30% (35/113)
私も詳しい訳ではないのですが、最適化は「おまけ情報」です。 最適化は、解りやすく言うと、省略するって事かな。 人間の目から見たというようりは、コンピュータがソースを元に解析して計算するという観点に立った上での話です。 まあ最適化しなかったからといって、動かなくなる訳ではないので、通常、特に意識する必要はありません。 言語に慣れてきたら、「俺だったらこうする!」的な自己満的なものです。 最適化にもイロイロ手法はあるのですが、質問内容を例に挙げると、 while文の条件式(別にif文でもfor文でも条件式なら何でもいいですが)の部分に着目して下さい。 (kyori != 0) とありますよね? これはコンピュータからみたら、およそ次のようなステップを踏んで判断するものと思われます。 1.左辺の変数 kyori の値を見る 2.右辺の 0 の値を見る 3.比較文が != なので、1.で引っ張った値と2.で引っ張った値が等しくないかどうか判別する 4.等しかった場合は条件が「偽」なので条件文全体の結果値は「0」、等しくなかった場合は条件が「真」なので条件文全体の結果値は「非0」 5.非0の場合のみ、{} 内の処理を続ける… しかし、これを最適化して、(kyori) とだけ書いてみて下さい。 1.コンピュータは変数 kyori の値を参照する 2.その値が「0」の場合だったら「偽」となるので、{} 内の処理を続行しない、「非0」の場合だったら「真」となるので、{} 内の処理を続行する。 これだけで済むのです。 つまり最適化前の式は、比較演算という余計な計算をしなければならないのに対し、 最適化後の式は、変数値そのものがダイレクトに条件となっています。 ややこしくなりましたが、伝わったでしょうか? まあ最初のうちはそんなの考えなくてもいいですよ。結果は同じですし。 それに現代の高速化された大容量のコンピュータなら、最適化しても実行速度に全くと言っていいほど影響しませんし、 現代のコンパイラなら勝手に最適化してコンパイルしてくれるので、やっぱり意識する必要はありません。 美しいソースを!とこだわる真に質実剛健なサムライの魂を持つプログラマーのみが気にすればいい話です。
お礼
素早いご回答誠にありがとうございました。 大変に参考になりました。
- EUR
- ベストアンサー率61% (29/47)
1.0を入力された場合は、強制終了break;を行います。 2.if(kyori < 0)の位置ではなく、while(kyori != 0){の位置に戻すのでは・・・? if(kyori < 0)のelseで処理を記述します。 while(kyori != 0){ printf("距離を入力してください->"); scanf("%d", &kyori ); //↓追加します↓ if (kyori == 0) { break; } //↑追加しました↑ //入力距離が0km以下の場合はエラー if(kyori < 0) { printf("0km以上を入力して下さい。"); return; //↓変更します↓ } else { //↑変更しました↑ ・ ・処理 ・ 処理終了
お礼
ご返事有り難うございました。 大変に参考になりました。
補足
ご返事有り難うございました。 大変に参考になりました。 ところで、「ソースの最適化」というのは どういうことか もう少し具体的に教えて頂けませんか?