スライド3

プログラミング演習Ⅱ
第3回
配列(1)
情報・知能工学系
山本一公
[email protected]
前回の課題の解説・ポイント
• 課題1-1
– 入力は scanf 関数
– fprintf 関数で出力
– cat コマンドで確認
• 課題1-2
– 入力は fscanf 関数
– “バイナリ形式で”と指定されているので、fwrite 関数
で出力
– List 13-10をそのまま正しく打ち込んで実行
今日の内容
• 教科書 p.87~
• 配列
– 1次元配列
• 配列の初期化
• 配列のコピー
• オブジェクト形式マクロ
• 代入式
– 式の評価と値、評価の順序
配列とは(1)
• 同じ型のオブジェクトの集まりを、番号
により管理できるようにしたデータ型
• どういうときに使うのか?
• 例えば
– テストの成績を出したい
• 合計点や平均点を出したい
– 学生は何人?
配列とは(2)
• 学生が5人だけだったら
– 変数は5個
– プログラムで書いても、苦ではない
• 学生が300人いたら
– 変数が300個!
• 300個の変数名を考えないといけない!
• ある変数名を別の変数名と間違えてはいけない!
– プログラムで書くのは大変 ⇒ 配列の出番!
• 他には
– 「ベクトル」を表すために使う
配列の宣言(1)
• 普通の変数の宣言は「型名 変数名」
/* int型で、変数名が vx だったら */
int vx;
• 配列は「型名 変数名[要素数]」
vc[0]
/* int型で、配列名が vc で、要素数が 5 だったら */
int vc[5];
vc[1]
– 注意:使える要素は0~要素数-1まで
vc[3]
• 言語によって違います
vc[2]
vc[4]
配列の宣言(2)
• 要素数は定数でなければいけない!
int n = 5;
int a[n];
/* エラー:要素数は定数でなければならない */
– こういう宣言はできない!
……ことになっている
– 最近のコンパイラ(gcc等)だとOKな場合も
– 処理系(コンパイラ)に依存するので、
なるべく書かないように
配列とfor文(1)
• 配列の各要素に、順番に数値を代入する
ことを考える
– 配列の要素数が少ないときは、力技でプログ
ラムが書ける
• p.90, List 5-2
– for文を使えば、効率良く書ける
• p.90, List 5-3
• 要素数が300になっても、同じように書ける
配列とfor文(2)
• List 5-3から抜粋
for (i = 0; i < 5; i++)
vc[i] = i + 1;
–
–
–
–
–
iが0のとき、vc[0] = 0 + 1 = 1
iが1のとき、vc[1] = 1 + 1 = 2
iが2のとき、vc[2] = 2 + 1 = 3
iが3のとき、vc[3] = 3 + 1 = 4
iが4のとき、vc[4] = 4 + 1 = 5
• 順番に数値が代入されている
– for文は、こういう人工データ作成用途に最適!
配列の初期化(1)
• 配列に最初から数値を入れておきたい
/* List 5-3で代入したものを最初から入れておきたい */
int vc[5] = {1, 2, 3, 4, 5};
– 順番に要素を並べる!
– 全体を“{“, “}”で囲む!
/* List 5-3で代入したものを最初から入れておきたい */
int vc[] = {1, 2, 3, 4, 5};
– 要素数は書かなくても良い!
• 要素数は自動的に初期化のデータ数になる!
配列の初期化(2)
• 初期化のデータ数は少なくても良い
/* List 5-3で代入したものを最初から入れておきたい */
int vc[5] = {1, 2, 3}; /* {1, 2, 3, 0, 0}と同じ */
– vc[3]とvc[4]は自動的に0に初期化される
(そういう決まりになっている)
• 多いのはダメ!エラーになる
/* List 5-3で代入したものを最初から入れておきたい */
int vc[5] = {1, 2, 3, 4, 5, 6, 7};
/* これはエラー */
配列の初期化(3)
• 要素数が多い配列で、要素を全部0.0に初
期化したい!というような場合
– p.91, List 5-4のようにすべき
int i;
double vd[300];
for (i = 0; i < 300; i++)
vd[i] = 0.0;
– for文を使って全ての要素に同じ数値を入れる
配列のコピー
• 配列 va を配列 vb にコピーしたい
int va[5], vb[5];
vb = va;
– というようなことは、できない!
– for文で要素ごとにコピーしましょう
int va[5], vb[5], i;
for (i = 0; i < 5; i++)
vb[i] = va[i];
• p.93, List 5-6を参照のこと
オブジェクト形式マクロ(1)
• p.96, List 5-9のようなプログラムを作った
– 作ったときの学生の数は5人
– 学生の人数が増えた!8人になった!
– 「5」を「8」に変更したい!
– でも、printf文の中の”5”は”8”に変えてはいけ
ないから、エディタの一括置換は使えない
• 全部目で見てチェックしなきゃいけない!
• プログラムが何千行もあったら、すごく大変だ!
オブジェクト形式マクロ(2)
• こんなときにマクロを使おう!
#define STUDENTNUMBER 5
int tensu[STUDENTNUMBER];
– “#define”で定義する
• ”#”で始まるものは全部コンパイラへの命令(”#include”も)
– 大文字で定義する(慣習)
• プログラムの中で使える変数みたいなもの
– 利点
• 何の数値か分かりやすくなる!
• 変更が容易になる!
• プログラムの間違いが減る!
式の評価、式の値
• 式はその値を評価することができる
int x = 2;
xは? ⇒ 2
• 代入式でも評価できる
int x = 2, y;
y = x; ⇒ 式の値は? ⇒ y の型と値 ⇒ 2
– 代入式の値は左辺の変数の型と値
評価の順序
• それぞれの変数の値はいくらになる?
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))));
–
–
–
–
最初eに10が代入される
”e=10”という式の値は10
その式の値がdに代入されて、d=10になる
以下繰り返しで、全ての変数の値は10になる!
今週の課題
1. 教科書 p.93, 演習5-4のプログラムを作成せよ。
2. 2つの n 次元ベクトル x, y をキーボードから入
力し、それらの内積を求めて表示するプログラ
ムを作成せよ。次元数 n は”#define”を使って適
当な値をプログラム内で定義すること。なお、
内積の定義は以下の通り。


x   x1 , x2 , , xn , y   y1 , y2 , , yn 
n
   T
x , y  x  y  x1 y1  x2 y2    xn yn   xi yi
i 1
レポートについて
• 電子メールで提出
– 提出先は [email protected]
– Subjectを「プログラミング演習2 課題2提出
号・氏名 」とすること
– C言語ソースファイルを添付する
学籍番
• メールの本文には何も書かなくて良いです
– ソースファイルの頭にコメントで以下の情報を入れる
• 学籍番号・氏名
• プログラムの説明(どのように動くのか、工夫した点等)
• 実行結果(長い場合は一部)を貼る
– 提出締切は、10月24日(水) 12:00 (1週間後)
授業用Webサイト
• URL:
http://www.slp.cs.tut.ac.jp/~kyama/programming2/
– 課題のpdfファイルが置いてあります。
– 授業で使ったpptファイルを置いていきます。
• 質問メールは、以下のどちらかのアドレスまで
– [email protected][email protected]
• C-515へ直接質問しに来ても構いません