1 / 20

プログラミング演習 Ⅱ 第 3 回 配列(1)

プログラミング演習 Ⅱ 第 3 回 配列(1). 情報・知能工学系 山本一公 kyama@tut.jp. 前回の課題の解説・ポイント. 課題1-1 入力は scanf 関数 fprintf 関数で出力 cat コマンドで確認 課題1-2 入力は fscanf 関数 “ バイナリ形式で ” と指定されているので、 fwrite 関数で出力 List 13-10 をそのまま正しく打ち込んで実行. 今日の内容. 教科書 p.87 ~ 配列 1 次元配列 配列の初期化 配列のコピー オブジェクト形式マクロ 代入式 式の評価と値、評価の順序.

tim
Télécharger la présentation

プログラミング演習 Ⅱ 第 3 回 配列(1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

  6. 配列の宣言(1) • 普通の変数の宣言は「型名 変数名」 • 配列は「型名 変数名[要素数]」 • 注意:使える要素は0~要素数-1まで • 言語によって違います /* int型で、変数名が vxだったら */ intvx; vc[0] /* int型で、配列名が vcで、要素数が 5 だったら */ intvc[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 • 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文は、こういう人工データ作成用途に最適! for (i = 0; i < 5; i++) vc[i] = i + 1;

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

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

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

  13. 配列のコピー • 配列 vaを配列 vbにコピーしたい • というようなことは、できない! • for文で要素ごとにコピーしましょう • p.93, List 5-6を参照のこと intva[5], vb[5]; vb = va; intva[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 inttensu[STUDENTNUMBER];

  16. 式の評価、式の値 • 式はその値を評価することができる • 代入式でも評価できる • 代入式の値は左辺の変数の型と値 int x = 2; 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ファイルを置いていきます。 • 質問メールは、以下のどちらかのアドレスまで • kyama@tut.jp • prog2@slp.cs.tut.ac.jp • C-515へ直接質問しに来ても構いません

More Related