Presentation is loading. Please wait.

Presentation is loading. Please wait.

情報・知能工学系 山本一公 kyama@tut.jp プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公 kyama@tut.jp.

Similar presentations


Presentation on theme: "情報・知能工学系 山本一公 kyama@tut.jp プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公 kyama@tut.jp."— Presentation transcript:

1 情報・知能工学系 山本一公 kyama@tut.jp
プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公

2 前回の課題の解説・ポイント 課題1-1 課題1-2 入力は scanf 関数 fprintf 関数で出力 cat コマンドで確認
入力は fscanf 関数 “バイナリ形式で”と指定されているので、fwrite 関数で出力 List 13-10をそのまま正しく打ち込んで実行

3 今日の内容 教科書 p.87~ 配列 1次元配列 配列の初期化 配列のコピー オブジェクト形式マクロ 代入式 式の評価と値、評価の順序

4 配列とは(1) 同じ型のオブジェクトの集まりを、番号により管理できるようにしたデータ型 どういうときに使うのか? 例えば
テストの成績を出したい 合計点や平均点を出したい 学生は何人?

5 配列とは(2) 学生が5人だけだったら 学生が300人いたら 他には 変数は5個 プログラムで書いても、苦ではない 変数が300個!
300個の変数名を考えないといけない! ある変数名を別の変数名と間違えてはいけない! プログラムで書くのは大変 ⇒ 配列の出番! 他には 「ベクトル」を表すために使う

6 配列の宣言(1) 普通の変数の宣言は「型名 変数名」 配列は「型名 変数名[要素数]」 注意:使える要素は0~要素数-1まで
普通の変数の宣言は「型名 変数名」 配列は「型名 変数名[要素数]」 注意:使える要素は0~要素数-1まで 言語によって違います /* int型で、変数名が vx だったら */ int vx; vc[0] /* int型で、配列名が vc で、要素数が 5 だったら */ int vc[5]; vc[1] vc[2] vc[3] vc[4]

7 配列の宣言(2) 要素数は定数でなければいけない! こういう宣言はできない! ……ことになっている
最近のコンパイラ(gcc等)だとOKな場合も 処理系(コンパイラ)に依存するので、 なるべく書かないように int n = 5; int a[n]; /* エラー:要素数は定数でなければならない */

8 配列とfor文(1) 配列の各要素に、順番に数値を代入することを考える 配列の要素数が少ないときは、力技でプログラムが書ける
p.90, List 5-2 for文を使えば、効率良く書ける p.90, List 5-3 要素数が300になっても、同じように書ける

9 配列とfor文(2) List 5-3から抜粋 順番に数値が代入されている iが0のとき、vc[0] = 0 + 1 = 1
for (i = 0; i < 5; i++) vc[i] = i + 1;

10 配列の初期化(1) 配列に最初から数値を入れておきたい 順番に要素を並べる! 全体を“{“, “}”で囲む! 要素数は書かなくても良い!
要素数は自動的に初期化のデータ数になる! /* List 5-3で代入したものを最初から入れておきたい */ int vc[5] = {1, 2, 3, 4, 5}; /* List 5-3で代入したものを最初から入れておきたい */ int vc[] = {1, 2, 3, 4, 5};

11 配列の初期化(2) 初期化のデータ数は少なくても良い 多いのはダメ!エラーになる
vc[3]とvc[4]は自動的に0に初期化される (そういう決まりになっている) 多いのはダメ!エラーになる /* List 5-3で代入したものを最初から入れておきたい */ int vc[5] = {1, 2, 3}; /* {1, 2, 3, 0, 0}と同じ */ /* List 5-3で代入したものを最初から入れておきたい */ int vc[5] = {1, 2, 3, 4, 5, 6, 7}; /* これはエラー */

12 配列の初期化(3) 要素数が多い配列で、要素を全部0.0に初期化したい!というような場合 p.91, List 5-4のようにすべき
for文を使って全ての要素に同じ数値を入れる int i; double vd[300]; for (i = 0; i < 300; i++) vd[i] = 0.0;

13 配列のコピー 配列 va を配列 vb にコピーしたい というようなことは、できない! for文で要素ごとにコピーしましょう
p.93, List 5-6を参照のこと int va[5], vb[5]; vb = va; int va[5], vb[5], i; for (i = 0; i < 5; i++) vb[i] = va[i];

14 オブジェクト形式マクロ(1) p.96, List 5-9のようなプログラムを作った 作ったときの学生の数は5人
学生の人数が増えた!8人になった! 「5」を「8」に変更したい! でも、printf文の中の”5”は”8”に変えてはいけないから、エディタの一括置換は使えない 全部目で見てチェックしなきゃいけない! プログラムが何千行もあったら、すごく大変だ!

15 オブジェクト形式マクロ(2) こんなときにマクロを使おう! “#define”で定義する 大文字で定義する(慣習) 利点
”#”で始まるものは全部コンパイラへの命令(”#include”も) 大文字で定義する(慣習) プログラムの中で使える変数みたいなもの 利点 何の数値か分かりやすくなる! 変更が容易になる! プログラムの間違いが減る! #define STUDENTNUMBER 5 int tensu[STUDENTNUMBER];

16 式の評価、式の値 式はその値を評価することができる 代入式でも評価できる 代入式の値は左辺の変数の型と値 int x = 2;
int x = 2, y; y = x; ⇒ 式の値は? ⇒ y の型と値 ⇒ 2

17 評価の順序 それぞれの変数の値はいくらになる? 式の評価は右から 最初eに10が代入される ”e=10”という式の値は10
その式の値がdに代入されて、d=10になる 以下繰り返しで、全ての変数の値は10になる! int a = 1, b = 2, c = 3, d = 4, e = 5; a = b = c = d = e = 10; int a = 1, b = 2, c = 3, d = 4, e = 5; a = (b = (c = (d = (e = 10))));

18 今週の課題 教科書 p.93, 演習5-4のプログラムを作成せよ。
2つの n 次元ベクトル x, y をキーボードから入力し、それらの内積を求めて表示するプログラムを作成せよ。次元数 n は”#define”を使って適当な値をプログラム内で定義すること。なお、内積の定義は以下の通り。

19 レポートについて 電子メールで提出 提出先は prog2@slp.cs.tut.ac.jp
Subjectを「プログラミング演習2 課題2提出 学籍番号・氏名 」とすること C言語ソースファイルを添付する メールの本文には何も書かなくて良いです ソースファイルの頭にコメントで以下の情報を入れる 学籍番号・氏名 プログラムの説明(どのように動くのか、工夫した点等) 実行結果(長い場合は一部)を貼る 提出締切は、10月24日(水) 12:00 (1週間後)

20 授業用Webサイト URL: http://www.slp.cs.tut.ac.jp/~kyama/programming2/
課題のpdfファイルが置いてあります。 授業で使ったpptファイルを置いていきます。 質問メールは、以下のどちらかのアドレスまで C-515へ直接質問しに来ても構いません


Download ppt "情報・知能工学系 山本一公 kyama@tut.jp プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公 kyama@tut.jp."

Similar presentations


Ads by Google