プログラミング演習Ⅱ 第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へ直接質問しに来ても構いません
© Copyright 2025 ExpyDoc