C言語プログラミングの初歩

まずやってみよう、話はそれからだ

  1. ホームディレクトリに作業用のディレクトリを作成する。名前は何でもよいが、とりあえずC_langとでもしておこう。
  2. Emacsを起動し、hello.cという名前でファイルを作成する(C-x C-f でファイル名を指定。作業用ディレクトリも指定する必要があることに注意)。
  3. 次のプログラムを入力する。\はキーボード上の¥で入力できる。学生証番号と名前のところは自分の名前にすること。
/*****
      g123456 Mitsuru Minakuchi
*****/
#include <stdio.h> #include <stdlib.h>
int main() { printf("Hello World!\n"); exit(0); }
  1. ファイルを保存する(C-x C-s)。
  2. ターミナルを開く。
  3. hello.cを作成した作業用ディレクトリに移動する(cdコマンド)。
  4. 次のコマンドを実行する。

gcc hello.c

  1. 【エラーメッセージが表示された場合】
    3に戻る。ほとんどの場合、hello.cの内容が3.と違っている箇所があることが原因。間違ってないかよく確認しよう。(エラーメッセージが間違いを探すヒントになっていることがある)
    【何も表示されずコマンドが実行できた場合】
    a.outというファイルが出来ていることを確認する(lsコマンド)。また、a.outがどのようなファイルかを確認する(fileコマンド)。
  2. 次のコマンドを実行する。Hello World!と表示されたらOK。

./a.out

プログラムとは何か

教科書1.1、1.2節参照。

プログラミング基本用語 その1

ソースプログラム source program
プログラミング言語で書かれたプログラム。単に「プログラム」と呼ぶと実行できるファイルと区別が付かなくなるので「ソース」を付けて呼ぶ。「ソース」「ソースコード」「ソースファイル」などと呼ばれることもある。
上記の例ではhello.cがソースプログラム。C言語のソースプログラムは.cの拡張子を付ける。

コーディング coding
ソースプログラムを作成すること。テキストエディタなら何でもよいが、ソースを書くのに便利なEmacsやviがよく使われる。

コンパイル compile
ソースプログラム(=人間が理解できる形式)を実行ファイル(=コンピュータが理解できる形式)に変換すること。
C言語の場合、コンパイル後にリンクという作業が必要だが、これらをまとめて単にコンパイルと言ってしまうことが多い。

コンパイラ compiler
コンパイルするためのプログラム。gccなど。

実行ファイル executable file
コンピュータがそのまま実行することのできるプログラム。ソースプログラムをコンパイルすることで作られる。実行方法は他のコマンドと同じ。
上記の例ではa.outが実行ファイル。

コンパイルエラー compile error
ソースプログラムの不備によりコンパイルできないこと。不備の原因はいろいろあるが、ほとんどがタイプミスである。
コンパイルエラーの場合、コンパイラはエラーメッセージを表示するので、ソースプログラムの不備を特定する参考になる。

コンパイルエラー対処法

心構えとして、ソースプログラムを作成してそのままコンパイルが通ることは奇跡である、くらいに思っておいた方が良い。数行のプログラムを作成すると必ず間違っているという話も昔からある。

プログラムの間違いを直すためにはコンパイラの力を借りるのが良い。文法の間違いはコンパイラが簡単に見つけてくれる。

C言語のコンパイラはあまり役に立つエラーメッセージを出さないことも多いが……
なお、文法の間違いでなく、文法上は間違いではないが実行させると意図したとおりにならないような間違いはコンパイラは発見できないことに注意。

練習
上記のプログラムで、;や"や)を削除したり、printfのスペルを間違えてみたときにどのようなエラーメッセージが表示されるか確認せよ。

コンパイラのエラーメッセージは残念ながら英語であるが、パタンは決まっているので、どのような間違いをしたらどのようなエラーがでるかを注意深く見ておくこと。

一度に沢山のエラーメッセージが出た場合は、まず最初の1個だけ見て、指摘されている行(およびその直前)をチェックし、間違いが見つかったら修正してみる。1つの間違いが沢山のエラーを誘発している場合がある。直してコンパイルして、またエラーが出たら直して、を繰り返せば良い。

Emacsで何行目かを確認するにはエコーラインを見る。あるいは、M-x goto-lineと入力し、カーソルを移動させたい行番号を入力する。

プログラミング基本用語 その2

コメント comment
ソースプログラム中で、コンパイラが解釈しないように指定してある部分のこと。つまり人間用のメモ書き。
C言語の場合、/*と*/で囲まれた部分、および//より右側の1行分がコメントとして扱われる。

プリプロセッサ命令
コンパイルする際に、まずプリプロセッサというプログラムにより前処理が行われる。このプリプロセッサに対して指示を行うための行。C言語ではソースコードの冒頭部に#で始まる行で指定する。#includeは<>内で指定したファイルをここに読み込め、という命令。;が最後に付かないことに注意。
stdio.hとstdlib.hはそれぞれ標準入出力(STanDard I/O)、標準ライブラリ(STanDard LIBrary)を使うためのヘッダファイル(ヘッダファイルの詳細はここでは省略)。
詳しくは教科書4.2.2節参照。

とりあえず現時点ではおまじないとして
#include <stdio.h>
#include <stdlib.h>
は必ず書いておくもの、と覚えておけば良い。

main関数
プログラムを実行する際のスタート地点となる関数。C言語ではソースコード全体でmain関数は1つだけ存在していなければならない。

mainの後の()は関数であることを示す記法。mainの前のintはmain関数がint型(整数型)の値を返すことを示しているが省略可能。関数の範囲は{から}までとなる。

printf関数
標準出力に文字列を出力(表示)する関数。上記の例では文字列("と"で囲まれた文字)をそのまま表示させている。

練習:表示されるメッセージをHello World!から違うものに変えてみよう。

exit関数
プログラムを終了させる関数。()内にはプログラムを実行させた元(この場合はシェル)に通知する(単に「返す」と言う)値を書く。0は慣例として、正常にプログラムが終了したことを意味する。
詳しくは教科書p.13を参照。

関数 function
プログラムの構成単位。プログラムを理解しやすくする、同じ処理を使い回す、などの目的で作られる。printfやexitのように汎用の関数として提供されているものもある。

本演習では自分で関数を作る方法まではやらない予定。

その他

実行時の./

プログラムを実行させる際に./a.outとしているが、これは「カレントディレクトリにあるa.out」という意味である(.はカレントディレクトリを表す)。a.outだけではダメな理由は、シェル(bash)はコマンドを入力すると環境変数PATHに指定してあるディレクトリを探しに行くが、OSXの標準状態ではPATHにカレントディレクトリが含まれていないため(間違いを起こしにくくするため?)。設定でPATHに./を追記すると./と書かなくてもよくなる(方法は自分で調べてください)。

実行ファイル名

何も指定せずにコンパイルすると自動的にa.outとなるが、どのソースコードでも同じ名前になるといろいろと不都合なので、gccコマンドの-oオプションで、作られる実行ファイル名を指定できる。例えば

gcc -o hello hello.c

とすると、実行ファイル名はhelloとなる。原則的にソースコードの拡張子よりも前の名前と同じにしておくのが混乱がなくてよいだろう。

大文字と小文字

C言語のソースコードでは大文字と小文字は別物として扱われるので注意。

全角文字

C言語のソースコードではいわゆる全角文字は基本的に使えない。コメントと文字列("と"で囲まれた部分)は使うことができる。それ以外の場所に全角文字が書かれているとコンパイルエラーとなる。

表示されない全角スペース、半角英数字と字形が同じ全角英数字は特に注意。

練習:先ほどのプログラムに全角文字を入れてコンパイルし、エラーメッセージを確認しよう。

現段階で積極的に日本語を扱うプログラムを作成する必要は無いので、間違いを減らすためにもプログラミングする際には日本語入力モードに切り替えないようにすればよい。

文字列と\n

C言語では文字列を指定するためには"(ダブルクォーテーションマーク)で囲む。
文字列中、\と文字の組み合わせで特殊な指定を行う(エスケープシーケンス escape sequence)。
\nは改行を指定する記法である。他、文字列中で"を使いたい場合は\"のように書く。\自体を使いたい場合は\\と書く。

\と¥

元々は\であった文字コードに日本語環境では¥記号が割り当てられているため、表示環境によっては¥と表示されたり、日本語キーボードでは¥になっている。さらにややこしいことに、Unicodeでは¥という記号が\とは別に用意されていて、これらは別の文字コードになっている。

書籍やWebページなどによっては¥と表記されているものもあるが、英数入力モードで¥キーを押して入る文字、と思っておけば良い。上記のUnicodeの問題のため日本語入力モードで¥と入力したり、\に変換したりすると見た目は同じでも別の文字コードになっている場合があるので注意。

統合開発環境

OSXではプログラムを開発するためのツールとしてXcodeが提供されている。Xcodeは統合開発環境と呼ばれるような、プログラム作成を支援する高度なツールであるが、本演習で扱うような初歩中の初歩的なプログラムを学習する上では強力すぎて「鶏を割くに焉んぞ牛刀を用いん」、つまり、そんなに凄いものを使っても振り回されるだけで本質的な勉強にならないので、本講義では(多分他のプログラミング演習でも)使わないことを推奨する。

なお、.cの拡張子のファイルをFinder上でダブルクリックするとXcodeで開いてしまうので、Finderの設定で開くアプリをEmacs(あるいはお気に入りのエディタ)に変更しておくとよい。変更方法は過去の資料の「Finder上でC言語ソースプログラムを開く時の振る舞いの調整」の項を参照のこと。
(とは言えFinderを使っている時点でダメである。ターミナルとEmacsだけで作業すれば何も問題ない。)

プログラミングの手順おさらい

  1. ソースプログラムを作成する
  2. コンパイルする
  3. コンパイルエラーが出たら1に戻って修正する
  4. 実行して意図したとおりに実行できるか確認する。意図したとおり実行されない場合は1に戻って修正する
  5. できあがり♪

ソースプログラムを書いただけではプログラムを作成したとは呼べない。意図通り実行できることを確認して初めて完成である。

もちろん、意図していなかった不具合が後からみつかることは日常茶飯事である。

本日の課題

実行すると"I am 自分の名前(ローマ字表記で良い)."と表示されるプログラムを作成せよ。
例:I am Mitsuru Minakuchi.
多少のアレンジはwelcomeである。

ソースプログラムの冒頭にはコメントで学生証番号と名前を記入しておくこと(こちらもローマ字表記で良い)。

ソースプログラムをmoodleで提出すること。
実行ファイルではない!! なお、実行ファイルを提出した場合は採点の対象外とする。
また、ファイル名の最後に~が付いているものを間違って提出しないように注意。
(Emacsは自動的にバックアップファイルを元のファイル名に~を付けた名前で作成する)

期限:5/15 24:00まで