第5回 関数を使ってみよう

プログラムが複雑になってくる場合は、同じ動作の手続きは、部品化した方がすっきりします。フォートランの部屋にサブルーチンを使ってみようというコーナがありますが、残念ながらJavaScriptではサブルーチンを使えないみたいです。というかいまのところそれらしい命令文がみつかりません。そこで、フォートランの部屋で解説したサブルーチンを使ってみようのコーナーと同じ動作をするプログラムを関数を使って表現してみましょう。フォートランの場合、関数とサブルーチンの違いは、サブプログラム内で計算結果の値を複数引き渡すことが可能なのがサブルーチンであり、ひとつしか値が得られないのが関数です。どうやら、JavaScriptでも同じみたいです。ただし、関数を用いるとグローバル変数とローカル変数を区別できるところや、引数を指定できるところは似ています。

<SCRIPT language="JavaScript">
function shotokuzei(E,tbase,R,b){
total=0;
answer=0
for(i=0;i<=E;i++){
if(b[i]<tbase && tbase<=b[i+1]){
answer=total+(tbase-b[i])*R[i];
}
total+=(b[i+1]-b[i])*R[i];
}
return answer;
}
</SCRIPT>
<SCRIPT language="JavaScript">
wnum=5;
wage=1000;
men=4;
wb=new Array(0,180,360,660,1000,100000000);
wr=new Array(0.4,0.3,0.2,0.1,0.05);
s=2;
PR=new Array(0.07,0.02);
PB=new Array(0,500,10000000);
tnum=5;
b=new Array(0,330,900,1800,3000,1000000)
T=new Array(0.1,0.2,0.3,0.4,0.5);
answer=shotokuzei(wnum,wage,wr,wb);
wdeduction=answer;
LKY=65;
if (wdeduction<LKY) {wdeduction=LKY};
income=wage-wdeduction;
answer=shotokuzei(wnum,wage,PR,PB);
premi=answer;
if(wage>1000){premi=45};
KISO=38;
HAIGU=38;
FMEN=men-2;
if(FMEN<0){FMEN=0}
FUYOU=38*FMEN
if(men<2){HAIGU=0}
if(income<=1000) {HAIGU=HAIGU*2}
taxbase=income-(KISO+HAIGU+FUYOU+premi)
answer=shotokuzei(tnum,taxbase,T,b);
document.write(answer);
</SCRIPT>

上記のプログラムのfunctionの部分は、HTMLソースの<HEAD><HEAD>に囲まれた部分に挿入します。そして下側の部分は<BODY><BODY>に囲まれた部分に挿入します。
 基本的な計算手続きは、フォートランの部屋のプログラムとやはり同じなので、解説もそちらをみてくださいね。フォートランとの違いは、関数を使用した結果得られる値をメインプログラムに返すときに、引数ではなく
return answer;
のように戻り値を指定するところですね。
それから、配列変数へのデータセットの方法ですが、1行づつ指定することしかできないと思っていたのですが、実は

T=new Array(0.1,0.2,0.3,0.4,0.5);

のようにまとめて記述できることがわかりました。フォートランのDATA文に相当する部分ですね。このプログラムは給与収入1000万円、子ども2人の世帯の所得税を計算するプログラムですが、加工すれば確定申告にも使えます。入出力フォームを作成する予定です。しばらくお待ちください。今年の確定申告には間に合いそうもないですが・・・