プログラミング演習Ⅱ 第 8 回 マクロ・列挙体等 情報・知能工学系 山本一公

Slides:



Advertisements
Similar presentations
プログラミング演習Ⅱ 第 11 回 ポインタ(2) 情報・知能工学系 山本一公
Advertisements

第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第7回 データの基本型 情報・知能工学系 山本一公
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
6/26 前回復習 for文、while文による繰り返し計算
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
第13回 プログラミングⅡ 第13回
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
初年次セミナー 第2回 文字の出力.
第10回 プログラミングⅡ 第10回
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング 2 ファイル処理.
関数の定義.
プログラミング応用 printfと変数.
プログラミング演習(2組) 第8回
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング序論 2. n人のインディアン.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
知能情報工学演習I 第9回( C言語第3回) 課題の回答
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
知能情報工学演習I 第12回(後半第6回) 課題の回答
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
知能情報工学演習I 第8回( C言語第2回) 課題の回答
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
プログラミング演習I 2004年5月19日(第5回) 理学部数学科・木村巌.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
C言語 はじめに 2016年 吉田研究室.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング演習I 2003年7月2日(第11回) 木村巌.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
情報処理Ⅱ 第7回 2004年11月16日(火).
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
C言語講座 四則演算  if ,  switch 制御文.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

プログラミング演習Ⅱ 第 8 回 マクロ・列挙体等 情報・知能工学系 山本一公

前回の課題の解説・ポイント(1) 課題6-1 – プログラムそのものは特にどうということはない – 出力は全部 unsigned にキャスト –char / signed char / unsigned char : 1 byte –signed short int / unsigned short int : 2 byte –signed int / unsigned int : 4 byte –signed long int / unsigned long int : 8 byte –signed long long int / unsigned long long int : 8 byte –float : 4 byte –double : 8 byte –long double : 16 byte

前回の課題の解説・ポイント(2) 課題6-2 – 説明スライドの通り – 右シフトと左シフトを組み合わせることで回転を実 現する unsigned lrotate(unsigned x, int n) /* 左回転 */ { return (x > (sizeof(unsigned) * 8 – n)); } unsigned rrotate(unsigned x, int n) /* 右回転 */ { return (x >> n | x << (sizeof(unsigned) * 8 – n)); }

課題5の採点結果から 課題 5−2 – 今の関数呼び出しが初めてかどうか( W を直接返すか どうか)を判定するために、変数を用意すること自 体は正しい – その変数の初期値として 0 を代入しておき、その変数 が 0 なら初めての呼び出しなので、 1 を代入すれば良 いだけ – 呼ばれる度にその変数に 1 を加算する必要はない 初めてかどうかだけが判定できれば良いのだから 加算し続けると、そのうち 0 に戻ってしまって、予期せぬ不 具合が起きる可能性がある

課題6の採点結果から 課題 6−2 – ビット数を数える必要がある やり方は正しければ何でも良い – 大域変数 count を用意して、 count_bits() でカウ ントさせている人がいる この場合、 rrotate()/lrotate() より先に、 count_bits() が 一度呼び出されている必要がある – それをプログラマがやらないといけない 関数が独立していない。使うとき注意が必要にな る – 実装としてあまり好ましくない

今日の内容 教科書 pp.183 ~ 193, 198 ~ 205 – 再帰は来年になってから 関数形式マクロ – コンマ演算子 列挙体 – 列挙定数 入出力と文字 –getchar(), putchar(), EOF –JIS コード (ASCII コード )

関数形式マクロ(1) 関数っぽくマクロを書くことができます – 引数・返却値の型を気にしなくてもよい ただし、自動的に型が拡張されるので注意! – マクロなので、コンパイル時に展開される 通常、プログラムサイズ⇒大、速度⇒高 #define sqr(x) ((x) * (x)) /* 二乗を計算する関数形式マクロ */ … printf(“ その数の二乗は %d です。 \n”, sqr(nx));

関数形式マクロ(2) 副作用に注意 –sqr(a++) ⇒ (a++)*(a++) – 意図しない結果に! 引数・マクロ全体を () でくくろう! – 式を入れるとおかしなことに #define add(x,y) x + y … z = add(a, b) * add(c, d); ⇒ z = a + b * c + d; 意図しない結果に!

関数形式マクロ(3) “{“ と ”}” で囲んでブロックを作って、その中に 処理(複数の文)を書く 「手続き形式マクロ」とも呼ぶ 教科書では間違いの例として紹介されているが 、 if 文のブロックを ”{” と ”}” で囲まなかったのが問 題 この書き方自体が悪い訳ではない #define putsa(str) { putchar(’_a’); puts(str); }

コンマ演算子 “,” で式をつなぐと、一つの式になる – 左から順に評価される – これを利用して、先の例を常に問題が出ない ように書き直すことができる – 警報を発して文字列を表示するマクロ #define putsa(str) ( putchar(‘\a’), puts(str) )

関数形式マクロの 展開のされ方を見る コンパイルするときに、 gcc にオプションとし て ”-E” を与える –“gcc –E list8-1.c” のようにする – コンパイルされず、前処理 (preprocess) だけが行われ る C 言語ソースファイル中の ”#” で始まる行の処理( #define や #include )だけが行われる 関数型でもマクロなので「コンパイル前に文字 の置き換えが行われるだけ」なことに注意せよ

列挙体(1) 値の集合を表すデータ構造 – メンバーに順番に値が割り当てられる – 列挙定数は int 型 enum animal { Dog, Cat, Monkey, Invalid }; /* Dog = 0, Cat = 1, Monkey = 2, Invalid = 3 となる */ enum animal select(void) /* 返り値が enum 型 */ { int tmp; … return (tmp); /* 実際の返り値は int 型 */ }

列挙体(2) 列挙体メンバーは定数 –case 文で使える – 上手く使えれば便利 enum animal selected; do { switch (selected = select()) { case Dog : dog(); break; case Cat : cat(); break; case Monkey : monkey(); break; } while (selected != Invalid);

列挙定数 列挙定数は値を変えられる 途中でも変えられる 月名と月数の対応 enum animal { Dog = 1, Cat, Monkey, Invalid }; /* Dog = 1, Cat = 2, Monkey = 3, Invalid = 4 となる */ enum animal { Dog, Cat = 3, Monkey, Invalid }; /* Dog = 0, Cat = 3, Monkey = 4, Invalid = 5 となる */ enum month { January = 1, February, March, April, …, December };

入出力関数と EOF getchar() – 標準入力(キーボード)から1文字読み込む – 返却値は int 型。読み込んだ文字を返す – ファイルの終端かエラーで EOF を返す EOF: ファイルの終端( End of File )の意。 stdio.h 内で定義されている。 putchar() – 標準出力(端末画面)へ1文字書き込む – 返却値は int 型。書き込んだ文字を返す – エラーで EOF を返す

文字(1) 文字には「文字コード」という数値が 割り当てられている – 文字はコンピュータ内部では数値として 扱われている JIS コード表( p.200, Table 8-1 ) – アルファベット・半角カナと文字コードの 対応表 アルファベットの部分は ASCII コードと同じ

文字(2) 1文字をシングルクォートで囲むと 文字コード(数値)になる 拡張表記 –p.203, Table 8-2 –printf() や puts() の中でも使う ‘0’= 0x30, ‘1’= 0x31, ‘A’= 0x41, ‘a’= 0x61, ……

今週の課題 1. 教科書 p.187, 演習 8-3 のプログラムを作成せよ。 main 関数等も作成して、完成したプログラムを 作成すること。 gcc に ”-E” オプションを与えて、関数形式マク ロが正しく展開されていることを確かめること。 2. 教科書 p.205, 演習 8-8 のプログラムを作成せよ。 ※ヒント:基本的には、1文字ずつ読み込んで、 改行があったら数えている行数を増やせばよい。 行の途中で EOF は出ないと考えて良い ※キーボードから EOF を出すには ”Ctrl + D”

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

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