- ベストアンサー
サブルーチンってどういうこと?
こんばんわ。最近JSを勉強しだして、for文、whileやif、switchとやっと 書けるようになり。。。楽しくなってきました。 そこで質問なんですが、サブルーチンという言葉をよく耳にするのですが これは何にあたるものなのでしょうか?関数のことなのですか? どう言う時に使用するものなのでしょう・・・ 参考書などを読むと繰り返し使うときにサブルーチンを利用して・・・・ とかいてあるのですが、for文などに似た書き方があるのでしょうか? 言葉の意味すらわかってないかもしれません・・・すみません こんな初歩的な質問で・・・ どなたかこんな私にも教えるのがお上手な方、是非ご解答下さい・・ よろしくお願い致します。
- tariran
- お礼率62% (49/78)
- JavaScript
- 回答数5
- ありがとう数8
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
これは何もJavaScriptに限った話ではありませんが。。。 まず、プログラムの起動時に実行され始め、分岐やループなどの構文に従って流れていくプログラムの本流ともいえる部分を「メインルーチン」と呼びます。 さて、プログラムの中のあちこちに同じような処理をする部分があった場合、これを何度も記述するのは面倒ですので、次のようなことができます。 この同じような処理をメインルーチンから抜き出して別の場所に置き、この処理が必要になる度ここに飛んできて、処理が終わったら元の場所へ流れを戻す。 この抜き出された処理をメインルーチンに対して「サブルーチン」と呼ぶのです。 (「繰り返し使われる処理」などの記述から、forの親戚か?と思ったわけですよね。そうではないということです。) JavaScriptやCではサブルーチンの動作に汎用性を持たせるため、オプション的な要素「引数(ひきすう)」を与えることができ、また処理の結果を「戻値(もどりち)」として受け取ることができます。(機能的な面より、サブルーチンではなく関数と呼ばれます。) 例えば、円の面積をいくつも求めるプログラムにおいて r = 3 call MENSEKI print s : sub MENSEKI s = r * r * 3.14 end MENSEKI # サブルーチンの仕様に、メインが合わせなければならない。 と書く代わりに、 s = MENSEKI( 3 ) print s : function MENSEKI( r ) return( r * r * 3.14 ) end MENSEKI # メインからの呼びかけに、サブが応える。 のように書けます。 ※これはあくまで抽象的に書いただけで、何かのプログラム言語などではありません。
その他の回答 (4)
- leaz024
- ベストアンサー率75% (398/526)
JavaScriptの関数は次のように書きます。 function 関数名(仮引数) { 関数の処理 : return 値; } これを呼び出すには次のようにします。 関数名(実引数); ここで・・・ 「仮引数(かりひきすう)」とは関数の中だけで使える変数で、呼びだし側が「実引数(じつひきすう)」として指定した定数または変数の値が入ります。 関数内でreturnに指定された値は、関数を呼び出した側に渡されます。この値は a = 関数名(実引数); のように変数で受け取るとか、 document.write(関数名(実引数)); のように直接使うとか、計算式の中に値のひとつとして組み込むなどできます。 処理結果を必要としないのであれば、戻値を返す、受け取る必要はありません。
お礼
こんばんわ。詳しくご解答頂きました本当に 有難うございました。 とても助かり感謝しております。 有難うございました。
- ametsuchi
- ベストアンサー率31% (81/257)
皆さんが言われることは間違いではないですが、仮に一度しか使わないものでも、サブルーチン化します。 人間がパッと見てわかるのはせいぜい50行くらいと言われており、それを目安にサブルーチン分けします。 勿論、いい加減に分けるのではなく、意味のあるキチンとしたまとまり単位に分けるのです。「機能単位」と言っていいでしょう。 そうしないととんでもなく長ったらしいプログラムができてしまいます。 そうすると、 1)障害が多く発生する。 2)作業を分担できない。 3)理解しづらい。 4)開発工数が長くかかる。 のです。
お礼
こんばんわ。サブルーチンの利点、何の為に使うのか 良くわかりました。ありがとうございました。 早々のお返事感謝しております。
- arinko11
- ベストアンサー率0% (0/4)
こんばんわ サブルーチンについてですが、プログラムを作成する中で繰り返し使う処理を 別プログラムとして登録しておき、プログラム中で呼び出して使うことを サブルーチンと言います。同じ計算式を何度使用する様なときとかです。 まあ、プログラムに処理を全部書き込むとコンパイル(機械語:c言語とかのとこ)にするのが大変になるので別プログラムにします。 例としては、”call”文などで呼び出します(?これは、cobolの場合か・・・)こんなんでいいですか?わかりました?
補足
こんばんわ。早々のご解答ありがとうございます。 と言う事は・・、たとえば ある一つの関数を用いてPGをつくり((1)とする)それを、 違う関数の処理で、(1)の関数を書いて呼び出すというわけですね。 その(1)の関数は何回でも他の関数で呼び出す事ができる。。 ということですよね?(笑) あってるかな・・・
- tomco
- ベストアンサー率31% (6/19)
今は、やって居ませんのでハッキリした事は言えませんが昔、私がBASICで遊んで居たときには、サブルーチンと言うのは、同じプログラムの中で何度も同じ様な動作をするプログラムを(例えば、X+Y=?)使う時に一々同じプログラムをメインルーチンのそれぞれに書くのは能率的では有りませんし余計なメモリーを使うだけです。そこでサブルーチンとして(”計算”(X+Y))の様な式を書いて、そこに引数としてX,Yを添えて渡し、出された結果を受け取る 要するに何度も繰り返しやるような事は小さい一つのプログラムに任せて仕舞うと言うのがサブルーチンの役目です。
お礼
こんばんわ、早速のお返事感謝しております。 謎が解けました。ありがとうございました。
関連するQ&A
- サブルーチンからサブルーチンを呼び出す
#平均を求める,サブルーチンを使用 @dat=(1,2,3,4,5,6,7,8,9,10); $mean=&mean(@dat); print "mean="; print $mean; sub mean{ $sum=&sum(@dat); $n=@dat; $mean=$sum/$n; return($mean); } sub sum{ for($i=0;$i<$n;$i++){ $sum+=$dat[$i]; } return($sum); } Perlを勉強し始めたのですがサブルーチンの所で分からない所があるので教えていただけませんか? mean関数(Perlではmeanルーチンなどと呼ぶべきでしょうか?)の中でsum関数を呼び出してデータの合計を$sumに代入したいのですが,この場合だとうまく代入されていないようなのですが,何がよろしくないのでしょうか?
- ベストアンサー
- Perl
- プログラミング(自由課題)
プログラミングの勉強会で以下のような課題が出されたのですがなかなかいいアイディアが思い浮かびません。初心者にもあまり難しくないものは何かないでしょうか?あったら教えてください。 内容は自由であるが、必ず 『繰り返し』(for文またはwhile文) 『条件分岐』(if文またはswitch文) 『配列』 『関数』(main関数以外の自作の関数) を含むこと。 初めてプログラムを見た人にもわかる説明ができるようにしておくこと。
- ベストアンサー
- C・C++・C#
- サブルーチンやif分以外での中括弧
perlについて学習中で、現在フリーのスクリプトを見て勉強しております。 中括弧の使い方を教えて欲しいです。 sub test { print"OK"; } if ($test>1) { print"OK"; }else{ print"NG";} 上記のようにサブルーチンやif文での使い方は分かるのですが、フリーのスクリプトの中に単に中括弧を使用している部分がありました。 例) { ←この括弧 my(@new); for(0..3){if($tmp[$_]=~/jpg/){push(@new,$tmp[$_]);}} } 矢印の部分の部分の括弧ですが、これはどのような意味があるのでしょうか? よろしくお願いします。
- ベストアンサー
- Perl
- サブルーチン内のサブルーチン定義について
サブルーチン内で定義したサブルーチンで、思い通りにならない挙動で困っています。 'test'を10万回繰り返す文字列の生成を行い、その文字列長を表示する関数を funcA とします。その生成過程では、自分の関数内で宣言した再帰関数 funcB を呼び出します。 #! /usr/local/bin/perl use strict; my $time0; for(my $i=0; $i<10; $i++){ $time0 = times(); &funcA(); print((times() - $time0). "\n"); # funcAに掛かった時間 } sub funcA { my $buffer = ''; &funcB(1); print length($buffer) . " : "; # $buffer の文字列長 sub funcB{ my $n = shift; $buffer .= 'test'; return if($n==100000); funcB($n+1); } } この結果が、 400000 :3.063 0 :0.468 0 :0.594 0 :0.766 0 :0.859 0 :1.11 0 :1.187 0 :1.141 0 :1.343 0 :1.469 となり、初回以降 $buffer の長さが0となるのも不可解ですが、funcA の実行時間が増加していくのも理解できません. これを #! /usr/local/bin/perl use strict; my $time0; my $buffer; # 注1 $buffer をファイル内大域変数として宣言 for(my $i=0; $i<10; $i++){ $time0 = times(); &funcA(); print((times() - $time0). "\n"); } sub funcA { $buffer = ''; # 注2 レキシカル変数宣言をやめた &funcB(1); print length($buffer) . " : "; sub funcB{ my $n = shift; $buffer .= 'test'; return if($n==100000); funcB($n+1); } } とすると、結果は 400004 :3.188 400004 :0.234 [以降、上にほぼ同じ] と文字列長は正しいものの,初回以降のfuncA実行時間が極端に減ります. 内部ではどういうことが起こっているのでしょうか.
- ベストアンサー
- Perl
- サブルーティンの使い方。
サブルーティンの理解を深めるために、 階乗の計算をサブルーティンで行うプログラムを作りました。 自作のプログラムについて質問を二つしたいと思います。 1.一応、計算は出来るのですが、 定型的でないというか、無駄が多いというか、 何か違う気がするのです。 どこか変なところはありませんでしょうか? 2.エラーメッセージをどこにいれたらいいのかわかりません。 数字以外、(例えば文字)が入力されれば1が出力されるようにはしたのですが、 「これは数字ではありません」のようなエラーメッセージを出したいのです。 この場合はどこにどのように記述すればいいですか? 色々試してみたのですが、思い通りに動きませんでした。 みなさま、知恵をお貸しください。 ------------------------------------------- use strict; print "数字を入力してください。\n"; chomp( my $number = <STDIN> ); my $k_number = kaijo($number); print "入力された数字の階乗は$k_numberです。\n"; sub kaijo { my $number = shift @_; return undef if $number < 0; return 1 if $number == 0; my $kaijo = 1; for(my $i = $number; $i>1; $i--) { $kaijo *= $i; } return $kaijo; }
- 締切済み
- Perl
- サブルーチンの処理
すみませんが教えてください。 往年のF-BASICやN88などでは 10 INPUT A 20 IF A=1 then gosub 100 ELSE PRINT "Aは1ではありません!" 30 END 100 PRINT A 110 RETURN こんなふうだったかサブルーチンが使えたかと思います。 これをVB.NETでかくと Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim A As Integer A = TextBox1.Text If A = 1 Then ここにどういれたらいいでしょう Else MsgBox("Aは1ではありません") End If End Sub End Class になるとおもうのですが、Thenのあとサブルーチンへ飛ばせるのでしょうか? それとも根本的に考え方が違うのでしょうか? 初歩的な質問ですみませんが、Timer1.Enable = Trueを使った処理以外 入門書に載っていないので、どなたかお教えいただけませんでしょうか。
- ベストアンサー
- Visual Basic
- C言語で%を使わない余りの出し方
c言語で%を使わない余りの出し方の問題を出されたのですが、色々考えたのですが全くわかりません まず余りの限界(余りがどこまであるか)がどこまであるか。 そしてwhileかforを使って余りを出す方法を自分で考えたのですが全くできませんでした。 自分の中ではif文でaを余りとして(a==1 && a==2)など考えたりしました。 またこれはポインタも使わずavgr**なども使いません。 さらに発展した問題で if文、switch文、for文、while文を使わないで余りを出すというのが出てきました 情けないのですが、何かアドバイスがあれば教えていただきたいと思います
- ベストアンサー
- C・C++・C#
- サブルーチン、グローバル変数がわかりません。
2つの行列の計算をサブルーチン関数とグローバル変数を使って行いたいのですが、サブルーチン関数を宣言する為の、プロトタイプ宣言やプロトタイプ定義や、グローバル変数など、 調べてもよく理解できません。 とりあえず、二次元配列を用いたソースコードを書いてみました。 (1)14行目と23行目からのfor文、(2)40行目と51行目と62行目からのfor文を1つにまとめて、最初のプロトタイプ宣言は void 関数(double a[LINE][COLUMN] , double b{LINE][COLUMN] , double c[LINE][COLUMN]) ; にすればいいと思うのですが、 その後は、どのようにすればいいのでしょうか? あと、scanfも使って、aとbも入力できるようにしたいです。 1 #include <stdio.h> 2 3 #define LINE 3 4 #define COLUMN 3 5 6 int main(int argc, char *argv[]) 7 { 8 double a[LINE][COLUMN] ; 9 double b[LINE][COLUMN] ; 10 double c[LINE][COLUMN] ; 11 int i ; 12 int j ; 13 14 for(i= 0;i < LINE ; i++) 15 { 16 for(j = 0 ; j<COLUMN ; j++) 17 { 18 printf("A[%d][%d]=", i+1 , j+1 ); 19 scanf("%f", &a[i][j]); 20 } 21 } 22 23 for(i =0;i < LINE ; i++) 24 { 25 for(j = 0 ; j<COLUMN ; j++) 26 { 27 printf("B[%d][%d]=", i+1 , j+1 ); 28 scanf(" %f", &b[i][j]); 29 } 30 } 31 32 for(i =0;i < LINE ; i++) 33 { 34 for(j = 0 ; j<COLUMN ; j++) 35 { 36 c[i][j] = a[i][j] + b[i][j] ; 37 } 38 } 39 40 printf("\n行列A:\n"); 41 for(i =0;i < LINE ; i++) 42 { 43 for(j = 0 ; j<COLUMN ; j++) 44 { 45 printf("%10.5f" , a[i][j]) ; 46 } 47 48 printf("\n"); 49 } 50 51 printf("\n行列B:\n"); 52 for(i= 0;i < LINE ; i++) 53 { 54 for(j = 0 ; j<COLUMN ; j++) 55 { 56 printf("%10.5f" , b[i][j]) ; 57 } 58 59 printf("\n"); 60 } 61 62 printf("\nC(和):\n"); 63 for(i= 0;i < LINE ; i++) 64 { 65 for(j = 0 ; j<COLUMN ; j++) 66 { 67 printf("%10.5f" , c[i][j]) ; 68 } 69 70 printf("\n"); 71 } 72 return 0 ; 73 }
- 締切済み
- C・C++・C#
- mySQLで複雑な演算
すみません、ほんとうに初歩的な質問です。 例えばif文やwhile文のような複雑な演算処理が必要な場合 mySQLではどうすればいいんでしょうか? また、参考になるサイト等があったら教えてください。 mySQLはまったくわからず、if文が使えないというのも、 さんざん苦労したあげく、最近になってやっと知りました。 身近に聞ける人もいないので、本当に困っています。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
補足
こんばんわ。 ご解答ありがとうございます。例までお書きくださって感謝します。 そうなんです、繰り返し=FORの親戚?と思ってしまってました(笑) 謎が解けたような気がします。 一つ関数を用いてPGを書きその処理を他の関数でも使用したい場合 また同じように書くと能率が悪いのでそれをサブルーチンとして何度も 使用するということですね。なるほど・・・。 で、書き方なんですが、JSで調べてるとはVBとかでよくみる書き方 「sub~」というのは見当たらないのですが、特別な書き方があるのでしょうか? それともその関数のPGを変数にしてしまって、変数を書きこむのでしょうか? すみません。。初歩的な質問で・・・