• 締切済み

goto を使わずに

VC++でプログラムを作ったんですが、上司からgotoは使うなとの指示があり困ってます。 なにせ、まだまだVC++になれてないし、かなりの初心者です。 C言語は学生のころ習いました。 if(a==0x0030){ //0による除算を回避するために0は入力不可とする(0ディバイト) int ret; //エラー画面出力 ret=AfxMessageBox("0は入力不可です。",MB_OK|MB_ICONEXCLAMATION);//入力が0の場合エラーを表示 goto end; } ・ ・ ・ end: //エラーがあった場合ここにとんで最初からやり直される ; } こんなかんじなのですが、なにか解決法ありませんか?

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.9

AfxMessageBox()使っているってことはMFCですね。 だったら、例外もありではないでしょうか? たとえば、MFCでCDialog派生で作って 入力値を0以上99以下に制限するなんてよくやりますよね。 100を入力しOKを押すと、メッセージボックスが表示される。 今回の処理と似ていませんか? 似通っているのだったら、似たように実装してもいいのでは? 例外でCException 派生を使えば、 ReportError()にメッセージボックス表示を任せることが可能です goto文は便利ですし、時には使った方がプログラムがすっきりすることもあります。 ただ、むやみに使いすぎるといわゆる"スパゲティ"ができかねませんので、使うときは慎重さが求められます。 (1重のループだったら、gotoよりもcontinueやbreakを使うべき。 1重のループでもswitchがあり、特定のcaseだけ脱出したい場合、 もしくは2重以上のループの場合、 フラグを用いる方法もあるが、一般にgotoで一気に脱出するほうがわかりやすいと思います)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.8

他の方も指摘されていますが、gotoを使う方がよい可能性がかなりあります。 省略部分次第ですね。

回答No.7

基本中の基本  for (;;) [   printf("数値を入力して下さい:");   scanf(…(略)…);   if (○○エラー判定) {    printf("○○エラーです。\n";   } else if (△△エラー判定) {    printf("△△エラーです。\n";   } else if (□□エラー判定) {    printf("□□エラーです。\n";   } else {    break;   }   printf("もう一度、");  }  (入力後の処理)

回答No.6

こんな感じ? for(;;){ 多分aに何かからデータを代入する。 if(a=='0'){ ret=AfxMessageBox("0は入力不可です。",MB_OK|MB_ICONEXCLAMATION); break;  else{   aが'0'では無い時の処理 } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

同じく全体像が見えないので解決法も分からないんだけど, ループ + continue とか break なんか, かなぁ. 「実は goto が最善」という可能性もないわけじゃない. もっとも, 「C を学んだ」人間が a==0x0030 なんて書いちゃだめだと思う. もっと素直に a=='0' と書くべき. あと, AfxMessageBox の返り値が不要なら変数に代入しなくていい.

masaya0221
質問者

お礼

回答有り難うございます。 やはりわかりにくいですよね・・・ 新しく書き直したんで見てみてください。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

省略されている部分がわからないとなんともいえないけど、 if(a==0x0030){ //0による除算を回避するために0は入力不可とする(0ディバイト) int ret; //エラー画面出力 ret=AfxMessageBox("0は入力不可です。",MB_OK|MB_ICONEXCLAMATION);//入力が0の場合エラーを表示 }else{ ・ ・ ・ } //エラーがあった場合ここにとんで最初からやり直される ; } とか。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

外側が見えないのでどうやって「最初からやり直し」ているのかにもよりますが、 if(a==0x0030){ // エラー処理 } else { // 通常処理 } とか。 初心者だというのならなおさら「安易にgotoを使わない」癖を今のうちに徹底して叩き込んでおくべきです。

  • Alice022
  • ベストアンサー率37% (3/8)
回答No.2

ソースコードの全体が良く分からないので、参考にならないかもしれませんが。 勉強課題のようなので、恐らくサブルーチンは考えずに、一つの関数内に処理を記述しているのでしょうか。 そうであれば、While文などを使用して判定し、エラーであれば最初の処理を繰り返させるロジックを考えた方が良いかもしれません。 これを考えるのに頭の中で良く分からないようでしたら、フローチャートで、この部分のロジックを考えてみると整理しやすいと思います。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

プログラムの全体像が良くわかりませんが、ループ構造内ならcontinue;で良いのでは?あるいは、入力と判定部分を関数にしてOKになるまで呼び出し側でループにするとか。gotoを使ったほうが分りやすい場合は良いですが、このぐらいの処理構造で使うのは止めましょう。 VC++以前にC言語の構造化プログラミングを勉強されたほうが良いですよ。

関連するQ&A

専門家に質問してみよう