4 基本的なプログラミング手法

 プログラムを書くときにしばしば遭遇するのが

 である。


4.1 個数を数える

 いくつかのデータの中から条件に合うデータが幾つあるかを数えるには、次のような処理を行う。
 
 N=0; 

 for( ) または while( ) 
 { 

    if( 条件 ) 
       N=N+1

 }

個数を数えるための変数(カウンター)を用意しこれを0クリアしておく 
 
 

繰返し処理の中で、もし数える必要があれば 
カウンタを1増やす(カウントアップ

 
 カウンターのクリアは繰返し処理の前に書く。繰返し処理の中に入れてしまうと、毎回クリアされ、カウントアップしない。
 上記の N=N+1N++ と書くこともできる。JavaScript(C言語やJavaでも同じ)ではカウントアップとカウントダウン用に特別な命令の書き方が用意されている。
 
カウントアップ
変数++ または ++変数  ( 変数 = 変数 + 1 と同じ )
カウントダウン
変数-- または --変数  ( 変数 = 変数 - 1 と同じ )

 
 
例題4−1
 試験の点数データを入力し、60点以上なら点数と「合格」という文字を、そうでなければ点数と「不合格」という文字を表示する。この処理を10人分繰り返し、 「合格」と 「不合格」の人数を数えて表示するプログラムを作成しなさい。
 
<SCRIPT LANGUAGE="JavaScript">
    var p, i, c1, c2;
    c1=0;  c2=0;     // カウンター c1,c2 のクリア
    for ( i=1; i<=10; i++ )  // 10人分繰返す
    {
        p = eval(prompt("点数入力", ""));
        if ( p>=60 )
        {
            document.write(p, " 合格<BR>");
            c1++;            //合格のカウントアップ
        }
        else
        {
            document.write(p, " 不合格<BR>");
            c2++;           //不合格のカウントアップ
        }
    }
    document.write("合格者", c1 , "人<BR>");
    document.write("不合格者", c2 , "人<BR>");
</SCRIPT>
 


4.2 合計を求める

 繰返し処理の中で入力したデータや計算結果の総和(合計)を求めるには、次のような処理を行う。
 
 S=0; 

 for( ) または while( ) 
 { 

    a=入力データ や 計算結果 
    S=S+a

 }

合計値を記憶しておくための変数(例えばS)を 用意し、これを0クリアしておく 
 
 

繰返し処理の中で入力したデータや計算結果 
(例えばa)を変数Sに足し込む(累計する) 

繰返し処理が終了した時の変数Sの内容が 
合計値である

 
 合計値を記憶しておくための変数のクリアは繰返し処理の前に書く。繰返し処理の中に入れてしまうと、毎回クリアされ、累計できない。
 上記の S=S+aS+=a と書くこともできる。JavaScript(C言語やJavaでも同じ)では変数をある値で加減乗除するための特別な命令の書き方が用意されている。
 
加算
変数名 += a  ( 変数名 = 変数名 + a と同じ )
減算
変数名 -= a  ( 変数名 = 変数名 - a と同じ )
乗算
変数名 *= a  ( 変数名 = 変数名 * a と同じ )
除算
変数名 /= a  ( 変数名 = 変数名 / a と同じ )

 
例題4−2
 何名かのクラスで試験を行った。各学生の点数を入力し、合格者(60点以上)だけの平均点を求め、表示しなさい。もし合格者が1人もいなかった場合は「合格者なし」と表示しなさい。なお、学生の人数もデータとして入力するものとする。
 
<SCRIPT LANGUAGE="JavaScript"> 
    var  n,i,p,c,sum,h; 
    c=0;        // カウンター c (合格者の人数)のクリア 
    sum=0;     // 合計値 sum (点数の合計)のクリア 
    n=eval(prompt("学生数を入力して下さい" , "")); 
    for ( i=1; i<=n; i++ )   // n人分繰返す。 
    { 
        p = eval(prompt("点数を入力して下さい", "")); 
        if ( p>=60 )         // もし合格なら 
        { 
           sum+=p;          // 点数を累計する 
           c++;              // 人数を数える 
        } 
    }          // 繰返しが終了したら合格者の人数と点数の合計が確定する 
    if ( c>0 ) 
    { 
        h=sum/c;             // 平均計算をする 
        document.write("合格者の平均点は", h , "<BR>"); 
    } 
    else 
        document.write("合格者なし<BR>"); 
</SCRIPT> 
 

4.3 最大値、最小値を調べる

 繰返し処理の中で入力したデータや計算結果の最大値を求めるには、次のような処理を行う。
 
 M= −9999; 

 for( ) または while( ) 
 { 

    a=入力データ や 計算結果 
    if ( a > M ) 
      M=a

 }

仮の最大値を記憶しておく変数(例えばM) 
を用意しこれに絶対にありえない小さな値を入れておく 
 

繰返し処理の中で入力したデータや計算結果(例えばa)と仮の最大値Mとを比較し、aのほうが大きければMをaで置き換える

繰返し処理が終了した時の変数Mの内容が最大値である

 最小値を求めるときは、仮の最小値を記憶しておく変数Mに絶対にありえない大きな値を入れておき、データや計算結果のほうが小さければ置き換えるようにすればよい。
 

例題4−3
 何名かのクラスで試験を行った。各学生の点数を入力し、最高点と最高得点者は何番目の学生かを調べ、表示しなさい。なお、学生の人数は不定であり、負の点数データが入力されたとき繰返しを終了するものとする。
  
<SCRIPT LANGUAGE="JavaScript"> 
    var  i,p,M,im; 
    M=-1;     // 仮の最大値として負の値を初期設定する
               //(負の点数はありえないので)

    im=0;      // 「最高得点者は何番目の学生か」を記憶させる変数 
    i=0;       // 入力したデータが何番目のものであるかを数え上げる
               // カウンターのクリア 

    while( true ) // 条件が常に yes であるため無限に繰返す
    {
       p = eval(prompt("点数を入力して下さい", "")); 
       if ( p<0 ) break;  // もし、入力データpが負なら、繰返し処理から抜け出す
       i++;               // 入力データが何番目のものであるか数え上げる 
       if ( p>M )     // もし以前までの最高点よりも大きな値が現れたら 
       { 
          M=p;        // 最高点を新しい値で置き換える 
          im=i;        // 「何番目」という値も置き換える 
       } 

    }          // 繰返しが終了したら最高点と最高点者は何番目かが確定する 
    document.write("最高点は", M , "点<BR>"); 
    document.write("最高得点者は", im , "番目の学生<BR>"); 
</SCRIPT>
 
 


【参考】 読み易いプログラムになるよう記述を工夫する

  1. 適切なコメントを記述する。
    // の右側に記述したものを注釈(コメント)といい、何を書いても命令とは見なされない。(無視される)
     注釈はJavaScriptで書いた処理の内容が解りにくいときに、日本語などでこれを説明する目的で使用する。
     例題4-3の右側の欄には説明文を書いているが、これを注釈として記述すると次のようになる。
        var  i,p,M,im; 
        M=-1;     // 仮の最大値として負の値を初期設定する
                   //(負の点数はありえないので)

        im=0;      // 「最高得点者は何番目の学生か」を記憶させる変数 
    使用される場面
    • まとまった処理単位毎(例えばこの課題であれば各設問毎)に処理の内容を記述する。
      (コメントを読むだけで大まかな処理の流れが分かるように)
       
    • 主要な変数や配列には、その用途を記述する。
       var H(50);    // ○○表の格納領域
       
    • 処理内容が分かり難い命令には補足説明を記述する。
      (ただし、無意味なコメントは逆効果)
       A = … … … ;  // 数式△△の計算
     
    // ○○データの読み込み
      

    命令の記述
    // △△の処理
      

    命令の記述
    // □□データの画面表示
      

    命令の記述
  2. プログラムをインデントして構造をわかりやすくする。
    if文やfor文の処理内容を一定文字数(通常は2,4,8文字)だけ空白を開けて記述すると、 「どの部分が判別手順での処理内容なのか」、「繰り返されるのはどの部分」かがわかりやすくなる。 これをインデント(字下げ)という。
    • 処理の流れが連続手順となる箇所は行頭を揃える。
       
    • if文の条件がYesの時、および、Noの時に実行する処理範囲の命令は字下げする。
      処理範囲が終わったら字下げを戻す。
       
    • for文の繰返し範囲の命令は字下げする。
      処理範囲が終わったら字下げを戻す。

    ポイント:

    • if文やfor文の処理範囲内は連続手順である。
    • ifやforが多重になった場合はその分だけインデントする。
    • 間違ったインデントを行うと、プログラムを読む人が間違って理解する(プログラムはインデントにかかわらず同じ動作をする)。
    • 正しくインデントされていれば、プログラムの始まりのインデント位置(右の例では上から2行目)と、終りのインデント位置が同じくなる。
     
  3. 1行に1命令の記述を原則とする。 ただし、以下の場合は例外。
    • 処理内容が対等で、実行順序に依存しない場合は1行に複数の命令を並べてよい。
    a=10; b=20; 2つの命令は伴に値を代入する処理で、どちらの命令を先に実行しても結果は同じなのでOK
    a=10; b=a+20; 2つの命令は処理内容が異質で、実行する順序により結果が異なるでNG
    • 1つの命令が長すぎて読み難くなる場合は複数行に分ける。
    document.write("○○○○○○○", X, "△△△△△△", Y, "□□□□□□□□□", Z);
        
    document.write("○○○○○○○", X,
            "△△△△△△", Y,
            "□□□□□□□□□", Z);
    注意: 命令語の綴りの途中や文字列定数の途中で改行するとエラーになる。
    エラー発生する例:
    document.
    write("○○○○○○○", X, "△△△△△△", Y, "□□□□□□□□□", Z);
    document.write("○○○○○○○", X, "△△△
    △△△", Y, "□□□□□□□□□", Z);