計算機言語
II第
1回
http://www.math.u-ryukyu.ac.jp/~suga/gengo/2018-2/01.pdf
1
講義情報とそれに関連すること
この講義は「計算機言語I」です. 登録許可コードは,j26nです. 前半は,テキスト
柴田望洋著, 新·明解C言語 入門編,ソフトバンククリエイティブ を利用し,前期の続きを講義します. 後半では,
奥村晴彦著, 改訂新版C言語によるアルゴリズム辞典,技術評論社 を参考に,様々なアルゴリズムとそのC言語への実装を解説します.
前期と同様,以下の参考文献は, 必要に応じて各自参考にしてください.
参考文献
[1] B. W. Kernighan, D. Ritchie著, The C Programminng Language 日本誤訳 石田晴久訳 プログラミング言語C第2版 共立出版
[2] S. Oualline著,岩谷宏訳, Practical C Programming 現実的なCプログラミング ソフトバンク [3] 藤原博文著, Cプログラミング診断室 技術評論社
[4] L. Baker 著,吉田弘一郎訳, C言語数学関数ハンドブック 技術評論社 [5] W. H. Press他著,丹慶勝市他訳, Numerical recipies in C 技術評論社
[6] B. W. Kernighan, R. Pike著,福崎俊博訳,プログラミング作法,アスキー, 2017年
[7] B. W. Kernighan, R. Pike著,石田晴久監訳,野中浩一訳, Unixプログラミング環境,アスキー, 1985年 [8] N. Wirth 著,片山卓也訳,アルゴリズム+データ構造=プログラム日本コンピュータ協会1979年 [9] Donald E. Knuth, The art of computer programing, vol 1 - vol 3 Addison-Wesley (アスキーから日
本語訳あり)
[10] K.Jensen, N. Wirth著,原田賢一訳, Pascal第4版 培風館
[11] A. W. Aho, B. W. Kernighan, P. J. Weinberger著, 足立高徳訳,プログラミング言語AWKアジソ ン ウェスレイ トッパン1988年
1
単位とテキストについて
単位はe-mailによるレポートで判定します. 問題は,配布テキストに書きます. 送り先は以下です.
配布プリントをanonymous ftpに置きます. 置き忘れていれば催促して下さい.
ftp://ftp.math.u-ryukyu.ac.jp/pub/gengo/2018-2
前期に述べたディレクトリ(フォルダ)を用いたファイルの整理や,コンパイラの使い方などは, 改めて解説 はしません. 忘れた場合は,上記のサイトからテキストを取ってきて,復習してください.
2 getchar()
テキスト8–5節(p. 228)から授業を始めます. テキストでは「文字」となっていますが,現実には, char型 の解説です.
getchar は 標 準 入 力 か ら 1 文 字 を 取 っ て く る の に 用 い る ラ イ ブ ラ リ 関 数 で す. 講 義 で 用 い て い る 処 理 系 で の 実 際 の 動 作 は, 呼 ば れ る ご と に 1Byte 毎 に 入 力 を 読 み 込 み ま す. す な わ ち, 日本語の漢字やかなは,たとえそれが1文字であっても, getchar()で取得することはできません. 以 前 に putchar()という標準出力に1文字を出力する関数を用いましたが,それの入力版です. 返り値は, int型です. 正常な入力では, char型(用いている処理系で1Bypte)の値を取得しますが,エラーやファイルの終わりを検 知したときには, EOF (End of File)というstdio.hでマクロ定義された値が返ります. この値がint型なの です. 従って, getchar()で取得する値を代入する変数型はintにする必要があります. EOF の値は, stdio.h でマクロ定義されており,−1とする処理系が多いですが,この値は処理系依存です(p.229 Column 8–3).
教科書list 8-8.cをコンパイル,実行してみてください. プログラムを見ればわかるように,標準入力を読ん
でそのまま出力するおうむ返しプログラムです. 実行させると,標準入力からの入力待ちになるので,キーボー ドから何か入力すると,それがおうむ返しで返されます. おうむ返しが起こるのが, Enterキーを押されたとき であるというのは,入力のバッファリングが理由です. また,このバファリングのおかげで,日本語を入力して もきちんと出力されます(p. 234, Column 8–4). EOFを受け取ると,処理が終わりますが, キーボードから それを入力するには, Ctrl – d を推します.
while文は多くの動作を1行に書いており,今の目で見ると感心しない記述ですが, Cのソースではこのよ
うな記述は多く見かけます. Kerighan – RitchieのCのバイブルにこのような記述があるからです.
このプログラムの実際の動作は,「1Byte毎に入力を読みそれをそのまま出力する」ですので,入出力のリダ イレクションを用いると,ファイルのコピーができます(p. 234, Column 8–4). 例えば,
./a.out < a.out > b
とすると, a.outと同じ内容のファイルb が作られます. ただし, cp コマンドと違い,ファイルモードは元の
ファイルとは異なります. chmodを用いて,上のように作ったファイルb を実行可能にすると, a.outと同じ 動作をするプログラムになります.
2
3
文字定数
Cのソースコードでは, シングルクォート’ で挟んだ1文字が文字定数になります. この文字定数は,その 処理系でプログラムを記述する際に用いられる文字に限られ,ほとんどの処理系では, Asciiコードの文字だけ です. 従って,日本語の漢字やかなは,シングルクォートで挟んで文字定数にすることはできません.
教科書p. 230, List 8-9をコンパイルし実行してみてください.
文字コード
教科書 p.232のJISコードと表記されているものは, JIS X 0201 1976と呼ばれる規格で,今では用い られていません. 計算機概論I で述べましたが,今はUTF-8と呼ばれるコードが,もっとも多く用いら れています. これは, 最上位ビットが0なら1Byte Asciiコードと解釈されます. (日本語のWindows だけは\を通貨の円記号¥を表記し,他のOSや言語とは異なる表記になります.)
Ascii コードについては, http://www.math.u-ryukyu.ac.jp/~suga/joho/2018/04/node2.html を参照してください. ほとんどのCの処理系は,このアスキーコードの値が文字定数として許容される 値です.
文字コードの値は数ですので「計算」を施すことだできます, . 例えば,’8’-’2’ = 6ですし,’9’ + 1 = ’:’
です. このことを利用してlist 8–9と同じ動作をするプログラムを書くと, list 8–10になります. コンパイル して実行してみてください.
文字コードの値(数値)を表示するプログラムが, list 8–11です. これも実行してみてください.
4
エスケイピング
教科書p. 234では, 拡張表記としてありますが, 実際にはエスケイピングです. C言語でも特別な意味を持
つ文字がいくつかあります. ’, ", \, ? の 4つです. " は文字列を指定するときに用います. ’ は文字定 数を表記するのに用います. ? は3項演算子の記号です. \は,タイトルにあるエスケイピングのための記号 です.
すなわち,これらの文字は, C のコンパイラに対して特別な意味を持つので,これらの文字そのものを扱う 際には, その意味を外す(escape する)必要があるのです. その方法は,\ に続けて記述するです. すなわち,
\’, \", \\, \?でその文字そのものを指すようになります.
これら以外にも, エスケイプシーケンス(escape sequence)と呼ばれる, Ascii 文字の制御部分(Ascii文字 表の左側の2列部分)を表記する方法が定義されています. よく用いられるのが,\n(改行)と\t(水平タブ)で す. 一覧表が. 教科書p. 235にありますので,見ておいてください.
レポート問題
(締め切り
: 10月
11日
(木
))• 教科書 p. 231,演習8–9. 件名: Enshu 8–9
• 教科書 p. 235,演習8–10. 件名: Enshu 8–10
3