ふつうの言葉での記述 (附:小テストの解説)

正確には「図」ではないのだが, ふつうの言葉で手順を設計することも可能である. 寺田はふだんこの方法を使うことが多い. 上述の PAD とほぼ同じことを記述できる. たとえば上例の「1から10までの和」はこんな感じになる:
合計 ← 0

i を 1 から 10 までかえて
  合計 ← 合計 + i

合計を出力

ここで, 行頭に空白のある行(字下げ, という)は, その上の行の影響下にある(たとえば, 繰り返しの本体であるなど) ことを示している.

ふつうの言葉で記述する利点として, 特別な作図ツールをつかわなくても テキストエディタで設計作業ができることがある. また, PAD 同様, 上記の設計結果をプログラムに変換するのも非常に簡単である.

さて, この方法を使って, 前回の小テストの解法を紹介しておこう. ここでは, 「段階的に詳細化する」という方法でいく. まず, 全体の処理の大枠を決めて, それをだんだん詳細にしていくのである.

まず, 最初のステップ:


データを配列に読み込む
0 から 9 までの数値の出現回数をそれぞれ求める
出現回数が最多のものを求める
結果を出力する

つぎに, これらを詳細化する:
データの番号 j を 0 から 9 まで変えながら
  数値を一つ読み込み
  データ の j番目 ← 読み込んだ数値

数値 i を 0 から 9 まで変えながら
  i の出現回数 ← 0
  データの番号 j を 0 から 9 まで変えながら
    データ の j番目 が i だったら
      i の出現回数 ← i の出現回数 + 1

最多出現回数 ← 0
数値 i を 0 から 9 まで変えながら
  i の出現回数 > 最多出現回数 ならば
    最多出現回数 ← i の出現回数
    最多出現数値 ← i

最多出現数値と最多出現回数を出力する

「データ」や「i の出現回数」は配列にする必要があるので, その宣言などを追加すればプログラムが完成する.
#include <stdio.h>

int main();

int main(){
  int i;
  int j;
  int data[10];
  int occur[10];

  int max;
  int max_data;

  char line[80];

  for(j=0; j<10; j++){
    printf("data? ");
    gets(line);
    data[j] = atoi(line);
  }

  for(i=0; i<10; i++){
    occur[i] = 0;
    for(j=0; j<10; j++){
      if(data[j] == i){
	occur[i] ++;
      }
    }
  }

  max = 0;
  for(i=0; i<10; i++){
    if(occur[i] > max){
      max = occur[i];
      max_data = i;
    }
  }

  printf("%d occured %d times.\n", max_data, max);
}

このプログラムにはまだまだ工夫の余地がある. 「0 から 9 までの数値の出現回数をそれぞれ求める」 の部分は二重のループ構造にしているが, じつは一重ですむ. こんな感じ.
数値 i を 0 から 9 まで変えながら
  i の出現回数 ← 0

データの番号 j を 0 から 9 まで変えながら
  i ← データ の j番目
  i の出現回数 ← i の出現回数 + 1

するとこのループは, その前のデータ読み込みのループと 統合できて, さらにそうすると 配列data は不要になる… というぐあい.
[page 6] prev index next