• ベストアンサー

go toに変わるもの

Oh-Orangeの回答

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★回答者 No.2 です。追記。 ・goto 文に関するやり取りを見つけましたので読んでみて下さい。  http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=25&topic=11153→『なぜ「GOTO文」を使っては、いけないのですか?』  ↑  C言語ではなく VB だけど参考になるかな。 ・次の Web ページもどうぞ。  http://www.nurs.or.jp/~sug/soft/super/goto.htm→『Super Technique 講座~goto 文が有用な場合』  ↑  ここにある『多重脱出』は goto 文が有効であると私も思います。 ・良くループ文で break 命令は使われますが continue を使っている人(使いこなせている人が  あまり見かけません。時には有効な命令ですので continue 文も break 文も上手に使えるように  なりましょう。ちなみに私は  while ( … ){   if ( … ){     :    少々長い     :   }   else if ( … ){     :    少々長い     :   }   else if ( … ){     :    少々長い     :   }   else{     :    少々長い     :   }  }  という構文の場合は  while ( … ){   if ( … ){     :    少々長い     :    continue;   }   if ( … ){     :    少々長い     :    continue;   }   if ( … ){     :    少々長い     :    continue;   }     :    少々長い     :  }  という感じで continue 文を利用します。  あまり長い場合は関数やマクロ関数として分離することもあります。  また、条件式が定数式にできる場合には積極的に switch 文を利用します。 ・その他にも return 文がありますが、こちらも上手に利用すれば見やすいソースになります。  使いすぎると goto 文と同じくソースを醜くします。  return 文も出来る限り1箇所にまとめたいものです。 ・goto、break、continue、return を上手に利用するにはある処理を複数の処理で実際に書いてみます。  (1)for 文を使って書く  (2)while 文を使って書く  (3)do-while 文を使って書く  (4)if-if else-else 文を使って書く  (5)switch 文を使って書く  このような制御文を駆使して同じ処理を書き換えて見ます。  そして一番スッキリ見やすく、分かりやすくなるソースと処理を結ぶ付けて覚えていく。  もちろん時間に余裕がある場合に複数のパターンを考えて見ます。 最後に: ・今回の場合は do-while 文ですが if の条件の真偽を反転すると次のようにも書けます。  int main( void )  {   int a, b;      do {    scanf( "%d %d", &a, &b );        if ( !(条件式) ){ // 抜ける条件     break;    }   } while ( jump() != 1 ); // 戻り値で続行/抜ける      return 0;  }  このように if の条件式の真偽を反転する事でまたソースの記述や見易さなどが変ります。 ・以上。goto 文も時には便利ですよ。あまり使用頻度はありませんがね。

参考URL:
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%91%E3%82%B2%E3%83%86%E3%82%A3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0

関連するQ&A

  • 再帰呼び出し

    アッカーマン関数の値を出力するプログラム #include void main(void); int ack(int,int); void main(void) { int x,y,i; printf(" data(x) = "); scanf("%d",&x); printf(" data(y) = "); scanf("%d",&y); i = ack(x,y); printf("Ackerman = %d\n",i); } int ack(int a,int b) { int k; if (a == 0) k = b+1; else if (b == 0) k = ack(a-1,1); else k = ack(a-1,ack(a,b-1)); return (k); } この関数を呼び出した回数も出力するようにしたいのですが、どうしたらいいのでしょうか?

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • 中央値をもとめる

    このプログラムだとたとえば 1、100、99を入力したときに間違った値を出します。どうすればいいでしょうか?おねがいします。 #include <stdio.h> int main(void) { int a, b, c, m; int max; printf("1個目の数値:"); scanf("%d", &a); printf("2個目の数値:"); scanf("%d", &b); printf("3個目の数値:"); scanf("%d", &c); max = a; if(max < b) max = b; if(max <= c) m = max; printf("%d, %d, %d の中央値は%dです。\n", a, b, c, m); }

  • if文で困っています。

    define A 5 void main(void) int i; scanf("%d", &i); if (i <= A){ このような形をつくったのですが、if文のところで質問があります。 「数字をいくつか入力し、その入力したデータ数が5つより少ないときに・・・」というようなプログラムにしたいのですが、この場合、「入力した数値が5.0以下であるときに・・・」というプログラムになっているのではないかと、困っています。どちらが正しいのでしょうか?

  • 間違いが存在するみたいなんですが・・・

    以下のプログラム、 間違いが存在するみたいなんですが、 MicrosoftVisualC++ でコンパイルしてみても エラー、警告ともに0でちゃんと実行できました。 本当に間違いが存在するでしょうか? #include <stdio.h> int Testfunc(int InputData) { int Ret; if(InputData<100){ Ret=InputData*2; } retrun Ret; } void main() { int InputData; int OutputData; printf("整数入力"); scanf("%d", &InputData); OutputData=Testfunc(InputData); printf("%d\n", OutputData); }

  • またプログラムの修正おねがいします。

    キーボードから出力した3つの整数について、以下の判定を行い 判定結果を出力するプログラムを作成する。 全部同じ 2つ同じ バラバラ * 論理演算子を使わないこと。 * インデントを正しくつけること。 #include<stdio.h> void main(void) { int a,b,c; printf("a --->"); scanf("%d",$a); printf("b --->"); scanf("%d",$b); printf("c --->"); scanf("%d",$c); if(a==b){ if(b==c){ printf("全部同じ\n"); } } else if(a!=b){ if(b==c){ printf("2つ同じ"); } else if(a==c){ printf("2つ同じ"); } else{ printf("バラバラ"); } } } 最近c言語を習ったばっかりなのでわからないとこだらけです。よろしくお願いします。

  • JavaにはなぜGO TO 命令がないのでしょうか?

    皆さん教えて下さい。私はCOBOLを長年手がけ、最近Javaを勉強している者です。 JavaにはなぜGO TO 命令がないのでしょうか? IF ネストというのは、わかりにくく、私は昔から嫌っておりました。 ところがJavaにはGO TO 命令が無いため、いやでもIF ネストを使わねばならないようです。 それともわかりやすく効率的なコーディングが別にあるのでしょうか?? 3択の問題で、下記AはJavaの教科書的コーディングです。3択だからまだしも複雑になると、IFネストはわかりにくいと私は思います。 下記Bはわかりやすいですが、無駄な処理が発生し、良くないコーディング例です。 下記CはCOBOLコ-ディングで、GO TOが使えるため、人間が読んでわかりやすく、処理効率もいいです。 ●この点Javaをやっている皆さんどうお考えですか??? ------------------------------------------------------------------------------------ A<教科書的サンプル> if(a > 0){ System.out.println("aは正の値です。"); }else if(a == 0){ System.out.println("aはゼロです。"); }else{ System.out.println("aは負の値です。"); } ------------------------------------------------------------------------------------ B<if ネストを嫌った サンプル> if(a > 0){System.out.println("aは正の値です。");} if(a == 0){System.out.println("aはゼロです。");} if (a < 0){System.out.println("aは負の値です。");}   処理効率悪く、良くないプログラム例 ------------------------------------------------------------------------------------ C<COBOL なら> IF a  >  0 DISPLAY "aは正の値です。"    GO TO OWARI. IF a  =  0 DISPLAY " aはゼロです。"   GO TO OWARI. IF a <  0 DISPLAY " aは負の値です。" . OWARI. .    GO TO 命令がある故に効率的 IF 構文の終わりと、OWARI の後ろにピリオドがあります。 ------------------------------------------------------------------------------------

    • ベストアンサー
    • Java
  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • AIZU ONLINE JUDGEについて

    明らかに正常なコードなのに答えが間違っているとされます。 #include<stdio.h> int main(void) { int a, b, c, N, i; scanf("%d",&N); for (i = 0; i < N; i++) { scanf("%d %d %d", &a, &b, &c); int A = a*a; int B = b*b; int C = c*c; if ((A + B == C) || (B + A == C )|| (C + A == B)) { printf("YES\n"); } else { printf("NO\n"); } } return 0; } これはvisual studio では通りました。 ちなみにこのコードは自分のものと酷似していますが、これはAIZU的にはOKだそうです。 #include <stdio.h> int main(void) { int a, b, c, n, i; scanf("%d",&n); for (i = 0; i < n; ++i) { scanf("%d %d %d", &a, &b, &c); if ((a*a + b*b == c*c) || (b*b + a*a == c*c) ||( c*c + a*a == b*b)) printf("YES\n"); else printf("NO\n"); } return 0; } この違いはなんでしょうか?

  • 1以上の自然数を2つ(それぞれa,b)読み込み、

    a/bの値を少数を使った表現で画面に書き出すプログラムを作成するんですが、 #include <stdio.h> int main(void) {int a,b; double n; scanf("%d", &a); scanf("%d", &b); n=a/b; printf("%d ",n); return 0;} で実行しても、a、bに何を入れても0になっていしまいます。どこが違っているでしょうか?