2000年7月29日更新(新規アップロード)
  関谷トップページへ アプリケーション演習トップページへ 作者へのメッセージ

集中実習3日目 C言語プログラミング 演習(3)

 2000.7.26 関谷

1.レポート 演習(2)を見てのコメント

1.1 アルゴリズム(流れ図・文章)

 C言語の文の文法的な説明でなく、「何をどうしようとしているのか」が分かるように書くこと。そして、これで、コーディングが出来る程度に詳しいこと。

 例1)C言語のソースプログラムから、機械的に作成した「詳細流れ図」は、それを使って、元のC言語でのコーディングが出来るが、それぞれの文が何をしようとしているのか(その意味)が分からない。従って、右側に、流れ図でしようとしていることの説明(コメント)を付ける必要がある。
  (ただし、反復の記号で、その仕様を正確に書いている場合です。反復の詳細な仕様を省略したら、コーディングできない。)

 例2)『forループを作る。』←これを見ても、何をするのかも分からないし、まして、C言語のプログラムは書けない。

   

1.2 ソースプログラムへのコメントの追加

 どんな課題を、誰が、どのようにプログラムしたのかが分かるようにすること。
特に、ソースプログラムの本文で、その右側に説明をコメントで追加すると良いと思う。
 『テキストの解答例などを参照した時、それぞれの文の意味(目的)を日本語でコメントにして追加すれば、そのプログラムの理解ができたことになる。』(7/26:15:35追記)
「C言語のソースプログラムの様式について」を参照してほしい。
(R:\sekiya\アプリケーション演習\Cプログラミング\C_style.txt)
 実行結果をソースの最後に追加したときには、その部分をコメントにすること。

2.今日の演習問題への補足説明

2.1 行列の和、積(演習3−13,14)

 和は、対応する成分の和を成分とする。 c[i][j] = a[i][j] + b[i][j]
 (行数と列数が等しいこと。)

 積は、行ベクトルと列ベクトルの内積を成分とする。(aの列数nとbの行数が等しいこと。)

              n
   c[i][j] = Σ  a[i][k] * b[k][j]
             k=1

プログラムでは、行のループ、列のループ(、内積のループ)を行うことになる。
行数や列数は、変数にしておき、最初に定数を代入することにすると、一般的に使える。
行列は、2次元の配列になるが、その初期化は、次のようにしても良い。
int a[][3] ={ {1, 1, 1}, {1, 2, 3}, {5, 3, 1}};

2.2 2から100までの素数を求める(演習3−15)

 素数とは、1と自分自身しか約数を持たない正の整数をいう。
 アルゴリズムとしては、「エラストテネスのふるい」がある。
[A] フラグを最初に1にセットしておき、素数でなければリセット(0に)するのだが、それは2から順番にフラグが1の整数(素数)についてn/2まで、その倍数のとき。

[B] 一番簡単な方法は、定義どうりに、「1からn/2までの整数(割る数)で割って、割り切れたら素数でない。」とすれば良い。(以下では、字下げのタブが8文字となっているが、エディタでは4文字に設定するのが良い。)

1)調べる数nのループ(n:2から100まで反復し、終端で+1)
	1.1) スイッチswを素数とセットする(sw=1;)
	1.2) 割る数jのループ(j:2からn/2まで反復し、終端で+1)
		1.2.1)  割り切れた(n%j==0)なら
			1.2.1.1)スイッチswをリセットする(素数でない:sw=0;)
			1.2.1.2) このループを中断する(break;)
	1.3) スイッチが素数(sw==1)なら、調べる数nを素数として表示する。

2.3 20個のフィボナッチ数、20000以下のフィボナッチ数(演習3−16、17)

 テキストの回答例のように、配列を使わないやりかたのほかに、配列を使ったやり方もある。
(阿部義幸さんのレポート)。配列の方が、定義式を反復するだけで、単純である。(スカラ変数の場合の、変数の入れ換えをしなくて良いため。)
 ただし、20000以下の時には、どの程度の配列を用意すべきかが分かりにくい。

2.4 任意の整数の素因数分解(演習3−18)

 正の整数を素数の積に分解すること。例 126= 2*3*3*7
  アルゴリズムは、素数の積を求めるのを利用することになる。
  1)まず、nを2で割り切れなくなるまで、繰り返し割っていき、2を表示する。
  2)割る数を3として、同じことを繰り返し、4,5,6。。と続ける。
   割る数をaとして、√n>aの間繰り返す。
 
(以下は、7/26正午に追加したものだが、今日の課題とはしない。)

2.5 整数データの並べ替え(3−19:大きいもの順、3−20:小さいもの順)

 並べ替えの手順は、一番簡単な選択ソートでよい。テキストの解答例では、比較してその都度、最小値と入れ替えている。小生のプログラム例(R:\sekiya\アプリケーション演習\Cプログラミング\sort_df.c)では、比較の最後に入れ替えをしている。(入れ替えの回数が少なくできるため)。
 データの準備は、テキストでは、乱数(演習3−8参照)を使っている。ソート後の表示のほかに、並べ替えの前とソートの途中にも、データを表示すると良い。


以上