2000.7.26 関谷
C言語の文の文法的な説明でなく、「何をどうしようとしているのか」が分かるように書くこと。そして、これで、コーディングが出来る程度に詳しいこと。
例1)C言語のソースプログラムから、機械的に作成した「詳細流れ図」は、それを使って、元のC言語でのコーディングが出来るが、それぞれの文が何をしようとしているのか(その意味)が分からない。従って、右側に、流れ図でしようとしていることの説明(コメント)を付ける必要がある。
(ただし、反復の記号で、その仕様を正確に書いている場合です。反復の詳細な仕様を省略したら、コーディングできない。)
例2)『forループを作る。』←これを見ても、何をするのかも分からないし、まして、C言語のプログラムは書けない。
どんな課題を、誰が、どのようにプログラムしたのかが分かるようにすること。
特に、ソースプログラムの本文で、その右側に説明をコメントで追加すると良いと思う。
『テキストの解答例などを参照した時、それぞれの文の意味(目的)を日本語でコメントにして追加すれば、そのプログラムの理解ができたことになる。』(7/26:15:35追記)
「C言語のソースプログラムの様式について」を参照してほしい。
(R:\sekiya\アプリケーション演習\Cプログラミング\C_style.txt)
実行結果をソースの最後に追加したときには、その部分をコメントにすること。
和は、対応する成分の和を成分とする。 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}};
素数とは、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を素数として表示する。
テキストの回答例のように、配列を使わないやりかたのほかに、配列を使ったやり方もある。
(阿部義幸さんのレポート)。配列の方が、定義式を反復するだけで、単純である。(スカラ変数の場合の、変数の入れ換えをしなくて良いため。)
ただし、20000以下の時には、どの程度の配列を用意すべきかが分かりにくい。
正の整数を素数の積に分解すること。例 126= 2*3*3*7 アルゴリズムは、素数の積を求めるのを利用することになる。 1)まず、nを2で割り切れなくなるまで、繰り返し割っていき、2を表示する。 2)割る数を3として、同じことを繰り返し、4,5,6。。と続ける。 割る数をaとして、√n>aの間繰り返す。 (以下は、7/26正午に追加したものだが、今日の課題とはしない。)
並べ替えの手順は、一番簡単な選択ソートでよい。テキストの解答例では、比較してその都度、最小値と入れ替えている。小生のプログラム例(R:\sekiya\アプリケーション演習\Cプログラミング\sort_df.c)では、比較の最後に入れ替えをしている。(入れ替えの回数が少なくできるため)。
データの準備は、テキストでは、乱数(演習3−8参照)を使っている。ソート後の表示のほかに、並べ替えの前とソートの途中にも、データを表示すると良い。
以上