• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メインルーチンとサブルーチンについて。)

メインルーチンとサブルーチンについて

このQ&Aのポイント
  • メインルーチンとサブルーチンについてご教授ください。例を示していただきたいです。
  • また、以下のURLのコードではなぜメインルーチンしか使っていないのでしょうか?ご教授ください。
  • URLからのコードの意味についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1529/2226)
回答No.9

>160のRETURNはどこに行くのでしょうか? サブルーチンを呼び出した"GOSUB 110"の直後へ戻ります。 実行順序を行番号で示すと以下のようになります。 10→20(GOSUB)→  110→140("奇数"とPRINT)→160(RETURN)→ 30→40(GOSUB)→  110→120("偶数"とPRINT)→160(RETURN)→ 50(ここで実行終了)

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • _kappe_
  • ベストアンサー率68% (1529/2226)
回答No.8

>そのGOSUBとRETURNは、どうやって使うのでしょうか? 「BASIC GOSUB RETURN 使い方」でネット検索すればいくらでもサンプルが出てきます。ただし、BASICは方言が激しいのでどのBASICを対象とするかによって書き方が違います。 簡単な例を挙げておきます。変数Nに整数を入れてから呼ぶと、Nが偶数か奇数かをPRINTするサブルーチンです。 10 N=3 20 GOSUB 110 30 N=10 40 GOSUB 110 50 END 100 REM Nが偶数か奇数かをPRINTするサブルーチン 110 IF MOD(N, 2) = 0 THEN 120 PRINT "偶数" 130 ELSE 140 PRINT "奇数" 150 END IF 160 RETURN

zasx1098
質問者

補足

160のRETURNはどこに行くのでしょうか?ご教授下さい。すみませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1529/2226)
回答No.7

>なぜ以下のURLでメインルーチンしか使っていないと言えるのでしょうか? リンク先のBASICプログラムにはGOSUB・RETURNがないからです。古いBASICの場合は、GOSUBでサブルーチンを呼び出し、サブルーチンからRETURNで戻ります。 回答No.6のprintf()の場合と同じようにMOD()やPRINTをサブルーチンと見なすことも不可能ではありませんが、そういうことを言う人はあまりいないと思います。 http://codepad.org/Oxfd5gz9の変換元っぽいですが、BASICでしたか。

zasx1098
質問者

補足

そのGOSUBとRETURNは、どうやって使うのでしょうか?ご教授下さい。すみません。

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1529/2226)
回答No.6

>なぜ、3だと言えるのでしょうか? ある程度のC言語の知識を持っている人がプログラムを読めばそうなることは予想できますし、実際にプログラムを実行してもprintf("%d\n",i+2);によって"3"が出力されるのを見ることができます。 >なぜ、出力が3になるのでしょうか? 逆にお尋ねしますが、printf("%d\n",i+2);の出力結果が"3"でないとしたら何が出力されると思っていますか? その辺を突き詰めていけば質問者さんが理解できていない部分が明確になるかもしれません。 main()の中の変数iの値はi=1;で初期化された後、printf("%d\n",i+2);を実行する段階まで変化していません。iの値が1のままなので当然i+2の値は3であり、printf()によって"3"が出力されます。 >sub 1 のiとmain ()のi は違う変数なのですよね? そうです。だから、sub_1()の中の変数iの値が++iによって2に変化してもmain()の中の変数iの値はその影響を受けず1のままなのです。 >サブルーチンとメインルーチンを使うものの例としてどんなのがあるのでしょうか? ちょっと見方を変えるとhttp://codepad.org/Oxfd5gz9のプログラムだってサブルーチンを使っているプログラムです。printf()というサブルーチンを使っています。printf()の定義が見えないところにある(C言語の標準機能として用意されているので、プログラマーは気にしなくていい)だけです。

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1529/2226)
回答No.5

>++iとは、どこでしょうか? sub_1()の中にprintf("%d\n",++i);という行があります。その++iのことです。 このprintf()で出力された結果が"2"なので、ここの変数iの値は++によって1から2に変わったことが分かります。 「++って何?」と思った場合はC言語の入門書を読んでください。 >main ()のほうのiの値は、1のままであることを示すとはどういうことでしょうか? main()の中のprintf("%d\n",i+2);の行で出力された結果が"3"でした。i+2の値が3なので、こちらのiの値はこの時点で1であることが分かります。 >末尾の}が欠落とは、どこの末尾でしょうか? 質問文にはreturn 0;の次の行に}がありません。 元の質問の回答No.8にはちゃんと}があります。

zasx1098
質問者

お礼

main()の中のprintf("%d\n",i+2);の行で出力された結果が"3"でした。なぜ、3だと言えるのでしょうか?ご教授下さい。すみませんが。なぜ、出力が3になるのでしょうか?sub 1 のiとmain ()のi は違う変数なのですよね?

zasx1098
質問者

補足

サブルーチンとメインルーチンを使うものの例としてどんなのがあるのでしょうか?後、メインルーチンしか使っていない理由がやっぱりよく分かりません。ご教授下さい。すみませんが。メインルーチン単体で使う場合とそうでない場合の違いとは何なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1529/2226)
回答No.4

質問文が分かりにくいです。 先頭の「これについてご教授ください。」の「これ」は何を指すのでしょうか。 >以下のURL、はなぜ、メンルーチンしか使っていないのでしょうか?ご教授下さい。 >Link: http://codepad.org/Oxfd5gz9 プログラムを書いた人が、サブルーチンを作る必要性を感じなかったからだと思います。考えられる理由の例を挙げておきます。 ・main()関数内の複数の場所で同じ処理を繰り返していればそれをサブルーチンとして切り分けるべきだが、そのような部分がない ・main()関数は54行で、サブルーチンを分けたくなるほど読みにくい長さというわけではない(このあたりの感覚は人によって異なります) 算法1とか算法2というコメントが見えるので、何かの本や教材に書かれている内容をプログラム化したものだろうかと想像できます。しかし、gotoを多用していて教科書的には良いプログラムではありません。あまり参考にしないほうがいいでしょう。 >これは、どう言う意味になるのでしょうか? sub_1()を使っているプログラムのほうは、特に意味のあるプログラムではありません。main()の中の変数iとsub_1()の中の変数iは名前が同じであっても別の変数であって、sub_1()の中の++iで変数の値を変更しても、main()のほうのiの値は変わらず1のままであることを示すための例だと思います。 末尾の}が欠落しているのを直して実行すると 1 2 3 という出力結果が得られます。このうち"2"はsub_1()内のprintf()で出力されたもの、"1"と"3"はmain()内の2ヶ所のprintf()で出力されたものです。

zasx1098
質問者

補足

sub_1()の中の++iで変数の値を変更しても、main()のほうのiの値は変わらず1のままであることを示すための例だと思います。 末尾の}が欠落しているのを直して実行すると ++iとは、どこでしょうか? main ()のほうのiの値は、1のままであることを示すとはどういうことでしょうか?それぞれどこのことか、何行目の所かご教授下さい。すみませんが。 また、末尾の}が欠落とは、どこの末尾でしょうか?これについてもご教授下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.3

サブルーチン sub_1 をメインルーチンから呼び出してますから サブルーチンとメインルーチンが使われています。 やってる事は値渡しされた変数のサブルーチン内での変更が呼び出し元の変数に影響を与えない事を確認するテストです。

zasx1098
質問者

補足

Link: http://codepad.org/Oxfd5gz9 で、#include<stdio.h> void sub_1(int i){ printf("%d\n",++i); } int main(void){ int i = 1; printf("%d\n",i); sub_1(i); printf("%d\n",i+2); return 0; これについてご教授下さい。すみませんが。これの意味は、どういう意味でしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

とりあえず メインルーチン サブルーチン あたりで検索して、各々が何をしているかを 勉強してみてください。 現状では、だれがどんなサンプルコードを提示しても 「これじゃわからん。例を示せ」となりそうで、 らちがあきません。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>後、以下のURL、はなぜ、メンルーチンしか使っていないのでしょうか? 使い捨てのプログラムで、作者が関数を分割する必要性を 感じなかったからでは? 推測。 あと、今回の提示コードの中身を知るには、 C言語の最低限の素養が必要です。 いつかの投稿でC言語の知識は皆無、とあったみたいなので、 まずは文法を覚えることから始めては?もし興味があるなら。

zasx1098
質問者

補足

サブルーチンを使う時ってどんな時なのでしょうか?プログラムと、その意味についてご教授下さい。すみませんが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • メインルーチンとサブルーチンについて。

    これについてご教授下さい。例を示していただきたいです。後、以下のURL、はなぜ、メンルーチンしか使っていないのでしょうか?ご教授下さい。 Link: http://codepad.org/Oxfd5gz9

  • 【c++】2進数の表示が上手くいきません

    サブ関数を利用して、-15~15までの値を1刻みで10進数16進数8進数2進数を表示するプログラムを作っているのですが悩んでいます。 以下のようにやってるのですがデバッグが上手くいきません。 どこが悪いのでしょうか? #include<stdio.h> void sub(int a) { int i,wc; for(i=31;i>=0;i--) { wc=(a>>i)&0x01; if(i%4==3) printf(" "); printf("%1d",wc); } printf("\n"); return; } int main(void) { int wc,a,s,j,b; printf("10進数,16進数,8進数,2進数\n"); for(s=-15;s<=15;s++) { printf("%d %x %o \n",s,s,s); printf("%d\n",sub(a)); } return 0; } 初心者なのでありえない間違えがあるかと思います。 ご教授お願いしますm(_ _)m

  • サブ関数、メイン関数

    C言語の質問です! ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください! #include<stdio.h> #include<stdlib.h> #include<process.h> void kakezan(void); void answer(void); void hanrei(void); int a,b,c; int main() { printf("やめるときは、100と入力してください。\n");   while(1){ kakezan(); answer(); hantei(); } return 0; } void kakezan(void) { a=rand() %10; b=rand() %10; printf("%d×%d=",a,b); } void answer(void) { scanf("%d",&c); if(c==100) exit(0); } void hantei(void) { if(c==a*b) printf(">>正解\n"); else printf(">>不正解\n"); printf("\n"); return; } 一応考えてみたのですが、 ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・   このプログラムであっているのでしょうか??

  • C言語の参照はずしについて

    ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

  • getchar()について 教えてください。

    visual studio 2010 professinalで以下のソースをデバッグして ”続行するには何かキーを押してください!”  で待機させたいのですが getchar()一個だけでは実現しません。   2個重ねるとOKです。どうしてでしょうか。  -------------- 以下のようにscanf関数がなければokということは突き止めたのですが、、、。  ご教授ください。 #include <stdio.h> int main(void) { int i; printf("なにか数字を入力してください。\n"); scanf("%d",&i); printf("今あなたが入力した数字は%dです。\n",i); printf("続行するには何かキーを押してください!"); getchar(); //getchar(); return 0; } ---------------------------------------------------------------- int main(void) { printf("続行するには何かキーを押してください!"); getchar();   return 0; }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • グローバル変数の初期化のタイミング

    #include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?

  • 正確なあ値でしょうか!?

    http://codepad.org/cBK5A67i を使って以下をコンパイルしたところ! No.1 #include <stdio.h> void kansuu(); int main() { kansuu(); return 0; } void kansuu() { printf("kansuu de hyouji\n"); No.2 }  #include <stdio.h> void kansuu(); int main() { kansuu(); } void kansuu() { printf("kansuu de hyouji\n");   return 0; } 以上の  コンパイルの結果はNo.1、No.2とも  kansuu de hyouji  となりました。    No.2の結果は   正確な値でしょうか  それともバグでしょうか?  よろしくお願いします。

  • pow

    「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; }

画面が青いまま何もできない
このQ&Aのポイント
  • 質問文章全体の100文字程度の要約文を3つ作成し、文章の内容をまとめてください。
  • 昔使っていたPCを娘が使うように出してみました。しかし、起動できず初期化しました。再起動後、画面が青くなり矢印だけが動く状態になりました。解決策を教えてください。
  • NEC 121wareのパソコン本体で、再起動後に青い画面が表示されて矢印の操作しかできなくなりました。どうすればいいですか?
回答を見る