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