第 6 回 C 言語

本日の内容


6-1. C言語とは

機械語

コンピュータは CPU がメモリ上のプログラムを読んで実行することで動作し ます。 CPU が実行できるプログラムを「機械語」「オブジェクトコー ド」などと呼びます。 機械語はコンピュータが解釈するため、0 と 1 の組合せ(2進法)により記述さ れます。 機械語を使って人間が直接プログラムするには、通常特定の 0 と 1 の列に対 して、覚えやすい記号(mnemonic ニーモニック)を割り振り、記号を組み合わ せ、あとでそれを 0 と 1 の列に変換します。 たとえば00000001 11011000という列は「AX レジスタに BX レジスタの値を 足す」という命令ですが、これに ADD AX,BX という記号を割り当 てます。 そして、プログラムを組む時は一旦 ADD AX,BX と記述しておき、 プログラムが完成した時にこの部分を00000001 11011000に戻すこ とで機械語のプログラムを完成させます。

記号は人間でも機械語に直せますが(これをハンドアセンブルと言います)、 もちろんコンピュータのプログラムでも直せます。 記号を機械語に直すプログラムをアセンブラと言います。 記号の組合せで書かれたプログラムは機械語と対応しますが、機械語そのもの ではありません。 記号の組合せる決まりをアセンブリ言語と言います。

高級言語

アセンブリ言語でプログラムを書く際、次のようなことが問題になります。

  1. CPU の仕組みを知らないと書くことができない
  2. メモリやプログラムの管理を自分でしなければならない
  3. 特定のことをさせる時、毎回複数の同じ手順が必要になる場合がある
  4. そもそも CPU の計算のし方と、人間の計算のし方が違う

このような問題点を解決するために、(1)機械語とは直接関係ない人間の記述しや すい記述法でプログラムを書き、(2)それをコンピュータが理解する仕組みを 実現する必要があります。

高級言語

機械語とは直接関係ない人間の記述しやすい記述法を高級言語と 言います。 代表的な高級言語には次のようなものがあります。

本講義では次のような理由から C 言語を学習します。

  1. インターネットなどでもっとも利用されている
  2. プログラミングの知識を学ぶのに向いている
  3. 他の言語を学習する際の基礎になる

処理系

高級言語をコンピュータが理解する仕組みを処理系と言います。 処理系には二種類あります。

解釈系(インタプリタ)

高級言語で書かれたプログラムを読んで解釈しながら動作するプログラムを インタプリタと言います。 代表的なインタプリタは BASIC, LISP, Prolog などがあります。 機械語を処理するのと比較すると実行速度は遅くなりますが、複雑な機能を持 つことができます。またプログラムの実行にはインタプリタが常に必要になり ます。またプログラムを部分的に実行させることが可能なため、開発がしやす いです。

翻訳系(コンパイラ)

高級言語で書かれたプログラムを機械語に翻訳するプログラムをコンパイ ラと言います。 高級言語で書かれたプログラムをソースプログラム原始プロ グラムと呼び、翻訳されたプログラムをオブジェクトプログラム と言います。 コンパイラはソースプログラムを機械語に直してから実行するため、実行速度 は速くなり、また実行時にはコンパイラは不要になります。 プログラムの中に一箇所でも誤りがあるとオブジェクトコードは生成されない ので、完成前にプログラムを実行することは難しいです。

6-2. GCC

インストール

本講義では C言語のコンパイラを使用します。 始めに gcc をインストールして下さい。

  1. gcc を授業用サーバーからダウンロードする
  2. 実行ファイルを実行すると、インストールが始まる。
  3. そのまま「Unzip」ボタンを押すと c:\gcc-2.95.2 にインストールされる。

インストールした gcc を使用するには、 使用する前に一回だけc:\gcc-2.95.2\mingw32 を入力する必要があります。

このパッケージをインストールすることで利用できるコマンドは次の通りです。 (c:\gcc-2.95.2\bin )

gcc:
C コンパイラ(構造型言語)
g++,c++:
C++ コンパイラ(オブジェクト指向言語)
g77:
FORTRAN コンパイラ(手続き型言語)
as:
アセンブラ
make:
プログラムの開発支援ソフトウェア
gdb:
デバッガ

gcc の使い方

本講義では、次のようにしてプログラムを作成、実行させます。

  1. Meadow などのテキストエディタで XXX.c という名前のソースファイルを 作る(例えばファイル名 test.c など)。
  2. コマンドプロンプトで gcc にソースファイルを読ませ、オブジェクトコー ドを作る。
    gcc test.c
    
  3. a.exe というオブジェクトコードができるので、それを次のようにして実 行する。
    .\a.exe
    

コマンドプロンプトの使い方

特殊キー

Ctrl+C を押すと、実行しているプログラムが停止します。 プログラムミスなどによりプログラムが止まらなくなった場合は、まず Ctrl-C を押してみてください。

カットバッファ関連

他のアプリケーションに表示されている文字列の入力

  1. 他のアプリケーションで「編集→コピー」などの操作で文字列をカットバッ ファにコピーする
  2. コマンドプロンプトの上のバーを右クリックして、「編集→貼り付け」

コマンドプロンプト上の文字のコピー

  1. コマンドプロンプトの上のバーを右クリックして、「編集→範囲指定」
  2. 指定したい範囲をポインターでドラッグ
  3. コマンドプロンプトの上のバーを右クリックして、「編集→コピー」

再入力

直前に入力したコマンドは F3 キーで再入力できます。 ひと文字ずつ入力するには F1 キーを押します(F2, F4, INS, DEL キーも再入 力のための機能を持ちますが、ここでは省略します)。 また、上下矢印による、過去の入力の順次呼びだし、左右矢印による入力行の 編集などもできます(Windows 98SE では無理かも知れません)。

さまざまなコマンド

コマンドプロンプト(MS-DOSプロンプト)では、コマンド文字列の入力により、 さまざまな指示が出せます。

cd
カレントディレクトリの表示
cd ディレクトリパス
カレントディレクトリの変更
dir
カレントディレクトリに含まれているファイルやディレクトリの表示
dir /p
カレントディレクトリに含まれているファイルやディレクトリの表示 (量が多い場合、一画面ごとに表示が止まる)
type ファイル名
テキストファイルの表示
more < ファイル名
テキストファイルの表示 (量が多い場合、一画面ごとに表示が止まる)
del ファイル名
ファイルの消去(復元はできません)
ren 旧ファイル名 新ファイル名
ファイル名の変更
move ファイル名 転送先
ファイルの移動
copy ファイル名 転送先
ファイルのコピー
mkdir ディレクトリ名
ディレクトリの作成
rmdir ディレクトリ名
ディレクトリの消去(ディレクトリ内が空でないと実行できません)

演習6-1

次の指示に従ってコマンドを入れなさい。

  1. カレントディレクトリを c:\work にする。
  2. ディレクトリの内容を表示する。
  3. Meadow で、 c:\work の中に test.txt というファイル名のファイルを作 る。ファイルの中身は「abc」など適当に決める。
  4. ディレクトリの内容を表示する。
  5. test.txt の内容を画面に表示する。
  6. test.txt を c:\work\doc に移動して、 c:\work, c:\work\doc のそれぞ れの内容を確認して、移動が正しく行われたかどうかを確認する。
  7. カレントディレクトリを c:\work\doc に変更する。
  8. test.txt を消す。
ヒント
  1. cd c:\work
  2. dir
  3. Meadow で「Files → Open File...」を選択し、 test.txt を入力する (正しくインストールされている場合、デフォルトで c:\work の下にファイル が作られる)。 そして、「abc」などを打ち、「Files → Save Buffer」で保存する。
  4. 再びdir。 test.txt というファイルができている。
  5. type test.txt。先ほど Meadow で入力された文字が表示され れば良い。
  6. move test.txt doc をした後、dir で test.txt が存在せず、 dir docで test.txt が存在することを確認する。
  7. cd doc
  8. del test.txt

プログラムの作成とコンパイル、実行

次のプログラムを作り、コンパイルして実行するまでの手順を示します。

/* This program prints "Hello World!". */
#include <stdio.h>
main(){
  printf("Hello World!\n");
}
  1. Meadow で「Files → Open File」を選び、 hello.c というファイル名を 指定します(ファイル名は何でも良い)。
  2. ブラウザ上で上のプログラムをマウスでドラッグし、「編集→コピー」を 選びます。 そして、 Meadow の画面で「Edit → Paste」を選び、プログラムをコピーし ます。
  3. Meadow で「Files → Save Buffer」を選びセーブします。
  4. コマンドプロンプトを動かします。
  5. (もしやってなかったら)c:\gcc-2.95.2\mingw32 を実行しま す。
  6. カレントディレクトリを c:\work にします。
  7. gcc hello.cと打つと、 hello.c というプログラムがコンパ イルされ、オブジェクトファイル a.exe ができます。 ここでエラーが出た場合は、エラーの内容を良く読んで対処して下さい。
  8. .\a.exe と打つとプログラムが実行されます。

演習6-2

上記のプログラムを改造して、「Hello New World!」を表示するプログラムを 作りなさい。

演習6-3

次のプログラムをコンパイル、実行しなさい。

#include <windows.h>

int WINAPI WinMain(HINSTANCE progIns, HINSTANCE prevIns, LPTSTR cmdLine, int cmdShow)
{
    MessageBox(NULL, TEXT("Hello World!"), TEXT("Hello"), MB_OK);
    return 0;
}

演習6-4

演習6-3を改造して、画面に「Hello New World!」が表示されるようにしな さい。

演習6-5

次のプログラムを読んで、このプログラムが何をするか予想しなさい。 そして、プログラムをコンパイル、実行して、予想と一致するか調べなさい。

#include <stdio.h>
main()
{
  float a,b,c;
  a=2.0; b=3.0;
  c= a+b;
  printf("a=%f  b=%f a+b=%f\n",a,b,c);
}

演習6-6

演習6-5を改造して、a=5, b=2 に関して a+b, a-b, a*b, a/b をそれぞれ求めなさい。


坂本直志 <[email protected]>
東京電機大学工学部情報通信工学科