スライド4

プログラミング演習Ⅱ
第4回
配列(2)
情報・知能工学系
山本一公
[email protected]
課題1の採点結果から
• 学籍番号・氏名・プログラムの説明・実行結果
を忘れずに
• 最後にコンパイル・実行チェックを忘れずに
– 提出直前に修正してコンパイルできないまま提出、
なんてことがないように
• 課題1−1は、ほぼ問題無し
• 課題1−2
– 仕様を満たしていない
• fprintf()を使っていて、バイナリ出力になっていない
前回の課題の解説・ポイント
• 課題2-1
for (i = 0; i < 5; i++) vb[i] = va[5 - i - 1];
– “4-i”で良い
– 行列の要素数が“ N”なら、 “Nーiー1”
• 課題2-2
n
n次元ベクトル aと bの内積 : a, b   ai bi
i 1
innerprod = 0.0;
for (i = 0; i < n; i++) innerprod += a[i] * b[i];
– 初期化が必要
今日の内容
• 教科書 p.102~
• 配列
– 多次元配列(2次元配列)
• 配列の応用
– 素数を求めるプログラム
–
–
–
–
unsigned long
switch文じゃないところで使うbreak
for文のおさらい
コンマ演算子
多次元配列(1)
• 先週やった配列は1次元配列
• 配列の添え字を増やすと
mc[0][0]
多次元配列に!
mc[0][1]
mc[0][2]
mc[1][0]
mc[1][1]
mc[1][2]
– 2次元配列(行列)
/* int型で、配列名が mc で、2行3列の行列だったら */
int mc[2] [3];
– もっと次元を増やすことも可能
/* 厳密には「1次元配列の配列の配列」である */
int (((mc)[2]) [3])[4]; ←こういう書き方はしないけど
多次元配列(2)
• 初期化
/* 最初から値を入れておきたい */
int mc[2][3] = { {1, 2, 3}, {4, 5, 6} };
• ぱっと見、分かり易く
int mc[2][3] = { {1, 2, 3},
{4, 5, 6},
};
• 他にも
←余分にコンマを書いても良い
Fig.5-5を見よ
int mc[][3] = { {1, 2, 3}, {4, 5, 6} } ←最初の要素数は省略可
int mc[2][3] = { 1, 2, 3, 4, 5, 6 };
←途中の波括弧は省略可
int mc[2][3] = { {1, 2}, {4} }
←足りない要素は0で初期化される
素数を求める(1)
• アルゴリズムと実装の話
• 素数
– 1とその数自身以外に正の約数が存在しない
1より大きな自然数
– その数(no)を2~no-1で割ってみて、どの
数でも割り切れなかったら素数
• List 5-15
素数を求める(2)
• unsigned long
– 32ビットの符号なし整数
32
– 0~4,294,967,295 (2 -1)
– 今の処理系だとunsigned long longが使えるこ
とも
• break文
– switch文の中じゃなくても使える
– 一番近い(内側の)繰り返し文から抜ける
• for文、while文、do-while文
素数を求める(3)
• 2より大きい2の倍数は素数じゃない
– 奇数に対してのみ計算する
• for文で対象となる変数を2ずつ増やす
– List 5-16
• for文のおさらい
–
–
–
–
for文の制御 p.74, Fig.4-7
式1は、前処理がなければ省略可能
式2を省略すると、無限ループ
式3も、することがなければ省略可能
素数を求める(4)
• 3以上の素数は2の倍数で割り切れない
– 奇数だけで割ればよい
– List 5-17
• noより小さい素数での除算において
一度も割り切れることがなければ素数
– 素数の倍数で割り切れるのなら、その前に素数で割
り切れているはず
– 計算した素数を覚えておいて、素数で割る
– 配列 prime[] に素数を覚える
素数を求める(5)
• noの平方根以下の素数での除算において一度も
割り切れなければ素数
– n × m = m × n なので、noの平方根より大きい数で割
り切れるなら、その前に割り切れているはず
– List 5-19
• コンマ演算子
– 左から順番に演算
– 教科書の例では式は2つだが、もっと並べて書ける
– 式の値は一番右側の式
今週の課題
• 教科書 p.103, 演習5-7のプログラムを作成せよ。行列の
要素は整数型でよい。
• 課題3-1のプログラムを、行列のサイズ(行数、列
数)と行列の要素をキーボードから入力できるように拡
張せよ。
– 1つめの行列をn行×k列、2つめの行列をk行×m列と
し、結果の行列をn行×m列とせよ。
– 配列は#defineで定義した要素数で定義し、入力され
た行列のサイズがその数を越える場合には再入力さ
せるようにプログラムを作成せよ。
レポートについて
• 電子メールで提出
– 提出先は [email protected]
– Subjectを「プログラミング演習2 課題3提出
号・氏名 」とすること
– C言語ソースファイルを添付する
学籍番
• メールの本文には何も書かなくて良いです
– ソースファイルの頭にコメントで以下の情報を入れる
• 学籍番号・氏名
• プログラムの説明(どのように動くのか、工夫した点等)
• 実行結果(長い場合は一部)を貼る
– 提出締切は、10月31日(水) 12:00 (1週間後)
授業用Webサイト
• URL:
http://www.slp.cs.tut.ac.jp/~kyama/programming2/
– 課題のpdfファイルが置いてあります。
– 授業で使ったpptファイルを置いていきます。
• 質問メールは、以下のどちらかのアドレスまで
– [email protected][email protected]
• C-515へ直接質問しに来ても構いません