本日の演習では,C言語の簡単なプログラムを入力し,実行してみる. 既にプログラミングについてよく知っている人には面白みがないかもしれないが,少しだけ我慢してほしい.
演習を始めるにあたって,最初にまず以下の作業を行ってほしい.
| 作業1 |
|
「コンピュータサイエンス入門」の演習で作成・利用するファイルを格納するために,専用のフォルダ(「ディレクトリ」と呼ぶことも多い)を作成せよ. 名前は何でも良いが,内容を表した命名を行うこと. |
C言語のプログラムを入力・実行する方法はいろいろある. 今日は,Mac OS X 標準搭載の統合開発環境 Xcode を使うことにする.
Xcode を起動するためには,Titech2006 → Developer → Applications → Xcode とたどり,Xcode のアイコンをダブルクリックする(下図を参照.ただし,皆さんの環境では見え方が若干違うかもしれない).
>
Xcode の起動時に,最初はいろいろ聞かれると思うが,あまり気にせずにデフォルトのボタン(「次へ」ボタンや「完了」ボタン)を押し続ける. Xcode が起動しても,メニューバーが変化する程度(アップルマークの右隣が Xcode になる)なので,注意して欲しい.
Xcode が起動したら,「ファイル」メニューから「新規プロジェクト...」を選択する. すると,下図のようなウィンドウが現れるので,Command Line Utility の Standard Tool を選択する.
すると,プロジェクトの名前と関連ファイルをどこに保存するかを聞いてくる. 一つのプログラムを作成するためには複数のファイルが必要になる. これらをまとめて管理する単位がプロジェクトである. 次の例では,プロジェクト名として hello を指定し,ファイルを作成するディレクトリ(フォルダ)として ~/CS/projects/hello/ を指定している. ただし,~/CS の部分は,作業1で作成したフォルダに対応するように指定すること.
ここで「完了」ボタンを押すと,おそらく ~/CS/projects/hello/ は存在しないけど新たに作ってよいか,と聞かれるので「作成」ボタンを押す.
その後に現れるウィンドウが,hello プロジェクトの全体像を表している.
この種の統合開発環境は本格的なプログラムを構築するために使われるため,初心者の演習では不要な部分が多い. 今日のところは,左側の「グループとファイル」は見なくて良い.
右側に並んだ,hello, hello.1, main.c のうち main.c がソースコード(人間が入力するプログラム)に対応する. この main.c をダブルクリックすると,Hello, World! と出力するプログラムが既に入力された状態で,エディタが立ち上がる. なお,この段階で現れるプログラムは,プロジェクト名とは無関係でいつも同じである.
ここで「ビルドして実行」ボタンを押すと,機械語へとプログラムが翻訳(コンパイル)され,続けて実行が行われる. そして,別のウィンドウが現れ,実行結果と付随する情報が表示される. 下の図で,「Hello, World!」の行だけがプログラムの本来の実行結果である. ここで本来の実行結果とは,このプログラムを単独のアプリケーションとして Xcode の 外側で実行した時の出力と考えてよい.
| 作業2 |
|
Xcode を使って Hello, World! と出力するプログラムが実行できることを確認する. |
Hello, World! と出力するプログラムで,実質的な仕事をしているのは次の部分のみである. 他の行については,今日のところは気にせずに,こういう呪文が必要なのだと思って欲しい.
printf("Hello, World!\n");
printf は,先週もインフォーマルに紹介したが,C言語のプログラムで計算結果等を出力するために用いられる. この例では,単に "Hello, World!\n" が出力される. ただし,実際の出力を見ると,ダブルクォート(")と \n は出力されておらず,微妙に異なっている.
この例の場合,printf により,たいていの文字は普通に出力されるが,特別な文字(列)については特別な扱いがなされる. まず,\n は改行を表している. つまり,printf は,Hello, World! と出力した直後に改行を行っている. 一方,ダブルクォートの方は全く出力されていない. C言語では,ダブルクォートで囲って,それが文字列データであることを表す. たとえば,123 は3桁の整数を表し,"123" は3文字の文字列を表す. この区別をつけない教育を今まで受けてきた人には難しいかもしれないが,C 言語ではこの両者を全く別のものと考える. ダブルクォートは,このように文字列データを識別するために用いられ,それ自信は文字列データの一部とは見なされない. 繰り返しになるが,"123" は3文字の文字列であり,5文字の文字列ではない.
独自のプログラムを作成するときには,先ほどのプログラムの printf の部分を書き直せばよい. 一例として,次のように書き直してみる.
printf("%d\n", 123 * 321);
Xcode のエディタの操作方法を細かくは解説しない. 簡単な編集操作であれば,一般的なエディタとだいたい同じように行える. なお,日本語環境では,バックスラッシュ(\)をうまく入力できない可能性がある. そのような場合には,option キーと通貨記号の円マーク(¥)のキーを同時に押すとよい.
編集後の画面イメージは次のようになる.
ここで再び「ビルドして実行」ボタンを押すと,コンパイルと実行が行われる.
さきほどの Hello, World! の実行結果が再度現れ,それに続く形で今回の実行結果が出現する. Hello, World! の代わりに出力された 39483 は 123 × 321 の計算結果である. C言語では,足し算と引き算は一般的な +, − の記号を使って表すが,掛算は *(アスタリスク),割り算は /(スラッシュ)を使って表す. したがって,123 * 321 は 123 × 321 を意味する. 一方,"%d\n" の部分は,計算結果の表示方法を指定する文字列である. ダブルクォートは,さきほどと同様に,これが文字列データであることを表している. %d は,10進数として整数を出力することを意味している. 整数の出力形式としてはこれが最もよく用いられる.
| 作業3 |
|
上の例の 123 * 321 相当する部分をいろいろ書き直して,整数の四則演算ができることを確認せよ. 括弧を使えば,複雑な式をいろいろ試すこともできるはず. |
プログラム中では変数を用いることもできる. 次のプログラム例では,x に 3,y に 5 を代入し,その後,x と y の間で加減乗除を行っている.
x = 3, y = 5 の左側に出現する int は,x, y が整数値をとることを表していると考えて,ほぼ間違いない. 演習用のコンピュータの場合,int は32ビットの整数(−231〜231−1 の範囲の整数)を表す.
なお,今までのプログラムと比較すると,// insert code here... の行が省略されている. 一般に,プログラム中に現れる // からその行の終わりまではコメントと呼ばれ,プログラムの実行に影響を与えない. これはプログラムを読む人間のためのものである.
| 作業4 |
|
変数を含む整数の四則演算ができることを確認せよ. |
C言語の変数は,数学で使う変数とある意味で似ているが,異なる点もあるので注意してほしい. C言語の変数は,計算の途中で値を変更できる たとえば,次のプログラムは,変数 x に最初は 0 を代入し,その後,1, 2 を順番に代入している. そして,代入が行われるたびにその時点での x の値を出力している. C言語のプログラムは,基本的に上から下に向かって順番に処理が行われる.
x が int(32ビットの整数)であることは一度宣言すれば十分であり,x = 1, x = 2 の左側には int が出現しない.
変数の値が計算途中で変化しうるため,以下のようなプログラムも許される.
数学では,x = x + 1 は矛盾した等式あるいは解のない方程式だが,C言語では,右辺の x + 1 をまず計算し,次にその計算結果を x に新しい値として代入することを意味する. したがって,x = x + 1 を一回実行するたびに x の値はちょうど 1 だけ増加する. 結局,x の値は,0, 1, 2 と変化していくので,この点に関する限り一つ前のプログラムと同じになる.
| レポート課題1(10/25 締切) |
|
次のプログラムが何を出力するか,実際に実行する前に自分の頭で考えよ. また,このプログラムに現れる s = s + x と x = x + 1 の繰り返しの回数を増やしていった時,出力がどのように変化するかもあわせて考えよ. よく考えた後,実際にプログラムを実行し,予想通りの結果になるかどうかを確認せよ. |
| レポート課題2(10/25 締切) |
|
レポート課題1と同様の考察および実行を次のプログラムに対しても行え. |