C 言語第 8 週コメント Q: arg の使い方を理解しておらず 難しく感じるようになった A: arg というのは何のことでしょう? 第 8 週の講義内では出て来なかったと思いますが? Q: C 言語でも統合開発環境はありますか?( 動作を少し確認したいときがあるため ) A: Windows

全文

(1)

1 / 6

C 言語 第 8 週 コメント

Q: arg の使い方を理解しておらず、難しく感じるようになった。 A: arg というのは何のことでしょう? 第8 週の講義内では出て来なかったと思いますが? Q: C 言語でも統合開発環境はありますか?(動作を少し確認したいときがあるため)

A: Windows だと Visual Studio, Eclipse, NetBeans 等が利用出来ます。第 2 週講義資料 のp.33 でも紹介していますので参考にしてください。 Q: for 文や if 文を組み合わせたプログラムをかくときにはあらかじめノートか何かにど ういう流れになるのかかいたりした方がいいですか。 A: 頭の中で整理が出来る範囲であれば、あえてノートに書き出さなくても、いきなりプロ グラムを書き始めてもそれほど困ることはありません。プログラムに慣れない間や、処理 が複雑で頭の中だけでは整理がつかない時は、フローチャートにして紙に書き出してみる 方が整理し易いので良いでしょう。 ただし、どのような場合でも、プログラムを見ればやっている事が分かるようにしてお かなければなりません。従って、処理があまりに複雑で、ノートに書き出したフローチャ ートを見ないと、プログラムを見ただけでは何をしているか分からないというのは困りも のです。やむを得ない場合は、デジカメやスキャナでノートを電子化するか、作図ツール や Office 等で清書した参考資料を、プログラムと一緒に保存しておきましょう。 これは第三者が見た場合に備えるという意味もありますが、人間の記憶は曖昧なのでし ばらく経つとプログラムを作った時の事をあまり詳細に思い出せないはずです。3 日後の自 分は他人だと思って、未来の自分に分かるようにプログラムに適切な注釈をコメントとし て記述しておくことを心がけてください。 プログラムは知的財産です。折角作ったプログラムは、必要になったら使い回せるよう に、同じような問題に対応する時に繰り返し同じようなプログラムを一から作らなくても 済むように、と言うことを心がけて整理しておきましょう。そうすることで、時間を無駄 にしなくて済みます。

フローチャートの書き方については、講義資料で、if, do-while, while, for, switch 文を 紹介している箇所や、教科書 pp110-118 を参考にしてください。

(2)

2 / 6 Q: 教科書の消化の仕方が分からない。 A: CD-ROM に演習用のプログラムが収録されています。それらのファイルについて、教 科書の各所で「~してください」とか「~になりましたか?」等の指示があるはずです。 それらの指示に従って、実際に変更を加えたプログラムをコンパイル・実行し動作を確認 することで、C 言語に対する理解を深めてください。 と言うか、教科書を少しは読んだのですか? Q: もう少し用語もしっかりおぼえたいです。 A: 分からない用語は、とりあえず教科書の索引や、web の検索で調べてみてください。ど うしても分からない用語については、コメントシート等で質問してもらえれば答えます。

Q: 先生があらかじめ少し作成しているプログラムは int main や fprintf(stderr、 #include <stdlib.h> が使われていたりと教科書と少し違うところがありますが、特にプロ グラム的には違いがありますか?

A: プログラム的な違いと言うか、目で見て得られる結果的にはほぼ違いはありません。 しかし、printf は stdout (標準出力) に文字を出力するのに対して、fprintf を用いると、 第1 引数を stderr (標準エラー出力) に文字を出力します。これは、パイプやリダイレクト (第 3 週講義資料 pp.13-15 参照)の対象になりません。

main 関数の戻り値が void か int かという問題は、C 言語の正式な仕様では int です。 関数の終了時に正常終了なら 0 を、以上終了なら 0 以外を return 文で返すのが C 言語 の正しい作法ですが、教科書は、それを端折っています。 上記 main 関数の正式な作法に則り、main 関数が終了時に返す値は、数値を直接書く のではなく EXIT_SUCCESS 及び EXIT_FAILURE というマクロを利用しても良いこと になっています(K&R 第 2 版 p.318)。このマクロを使うと、プログラムを読んだ人に対し て、数値を直接書く場合に比べ、結果が成功か失敗かをより明確に伝えることが出来ます。 EXIT_SUCCESS、EXIT_FAILURE のマクロは stdlib.h 内で定義されています。つまり stdlib.h を include しておかなければ使うことが出来ません。このため、授業で用意して いる雛形のプログラムでは #include<stdlib.h> を追加しているのです。 Q: 課題はフィボナッチ数列の 2 問以外は分かりました。フィボナッチ数列の所を頑張った のですが、なぜか、Loop が繰り返されて、コマンドの右上のバツボタンを押しました。こ

(3)

3 / 6 の時バツボタンを押してもよいのですか?それ以外に強制終了(プログラムを!)(コマンド ではなく)する方法はありますか? A: まず、「コマンド」と言のは、コンピュータへの命令(command)のことなので、自分が コンパイルして作った実行ファイル(例えば print_0.exe 等)もいわゆるコマンドになりま す。この場合、正しくは、「コマンド ウインド」や「コマンド プロンプト」と言うのが正 しいでしょう。 Loop が繰り返されて終了出来ないプログラム、これは、繰り返し処理の終了条件に不備 があるため、無限ループになってしまった状態で、しばしば「無限ループにはまった」と か「暴走」した等々と、表現されます。 暴走したプログラムを終了させるために、コマンドプロンプトごと終了させてしまうと いうやり方は、特に問題はありませんが、わざわざコマンドプロンプトを開き直さないと いけないのでちょっと面倒です。

Microsoft 製の OS の場合 Windows が登場する以前に使われていた MS-DOS と呼 ばれる OS では、プロセス管理とかメモリ保護と呼ばれる OS の機能が十分に備わってい なかったため、このようなプログラムを走らせてしまった場合は、コンピュータのリセッ トボタンを押して再起動させる以外にプログラムを止める方法がありませんでした。 幸い現在使われている OS のほとんどは、プロセス管理やメモリ保護がしっかりと行わ れているので、プロセス(実行されているプログラムのこと)に終了信号を送れば、プログラ ムを強制終了させることが出来ます。 やり方はいくつかありますが、ターミナル(コマンドプロンプトや mintty 等)からプログ ラムを実行している場合は CTRL+C を叩くのが、最も簡単で一般的な方法です。 通常はこの方法で終了出来ますが、万が一終了出来ない場合は、Windows の場合、タス クマネージャーから実行中のプロセスを見つけて強制終了するという方法があります。タ スクマネージャーは、タスクバー(Windows の画面下部にある横棒)の何もない所を右クリ ックして「タスクマネージャーの起動」をクリックする(図 1)、SHIFT+CTRL+ESC を叩 く、CTRL+ALT+DEL を叩いて「タスクマネージャーの起動」を選択する等、いくつかの 方法があります。タスクマネージャーのプロセスのタブを開くと、現在実行されているプ ログラムの一覧が表示されるので、目的のプログラム(ここでは infiniteloop.exe)を選択し 「プロセスの終了」ボタンをクリックします(図 2)。すると、プロセスを終了して良いかど うか確認するダイアログが出てくるので、許可するとプロセスが終了します(図 3)。

(4)

4 / 6

図 1 タスクマネージャーの起動

(5)

5 / 6

図 3 プロセスの終了の確認

UNIX 系の OS では、Windows のタスクマネージャーからプロセスを強制終了させるの と同じ処理をターミナルから行うことが出来ます。これは、まず ps(1) コマンドを使い、 現在実行中のプロセス一覧を得ます。次に、目的のプロセスのPID (Process ID) を kill(1) コマンドに与えると、目的のプロセスを強制終了させることが出来ます。この操作で終了 出来ない場合は、-9 オプションで SIGKILL シグナルを送ることで強制終了させます。 Cygwin は UNIX を模倣した環境なのでこの方法も使うことが出来ます(図 4)。

$ ps

PID PPID PGID WINPID TTY UID STIME COMMAND 5108 3876 5108 2472 pty0 1001 Jun 5 /usr/bin/bash 5124 6800 5124 6828 pty2 1001 16:34:08 /usr/bin/ps 6800 7156 6800 6216 pty2 1001 Jun 9 /usr/bin/bash

7748 5108 7748 7752 pty0 1001 16:29:33 /home/kou/infiniteloop 7156 1 7156 7156 ? 1001 Jun 9 /usr/bin/mintty 3876 1 3876 3876 ? 1001 Jun 5 /usr/bin/mintty $ kill 7748 図 4 UNIX 系の環境(Cygwin)における強制終了 Q: 今日はまだ終わらせることの出来ていなかった演習を幾つか完成させることが出来ま した。それでも数個残っており、完成したものも周りの人達の助言などを得てどうにか完 成させたものなので、残りの演習を自分で完成させることが出来るか不安です。 A: 7 週、8 週で出した演習問題は、処理自体は本当に初歩的で簡単なものですので、少なく とも自力で解けるようにはしておいてください。友達に手伝ってもらったものについては、 改めて、自力で解いてみましょう。 7 週、8 週と 2 週に渡って、演習中心に組み立ててみましたが、コメントシートの内容か ら判断する限り意外と好評だったようで、プログラムが出来たこと、分かったことが、楽

(6)

6 / 6

しかった、嬉しかったというコメントがいくつか見られました。

題材的には、数学や日常生活で日頃から目にしている内容で、ぱっと見あまり面白そう ではない題材だったかもしれませんが、単純な処理をちょっとずつ追加して行くとだんだ ん複雑な処理が完成して行くパズル的な面白さを感じ取ってもらえたなら幸いです。

Updating...