Cプログラミング入門 第1回


1.1 手始めに

 はじめに,技術的なことを話します。Cのプログラミングは,次のような 順序で行います。

やること使用するツール具体的にやること
1. 問題の提示  
2. 問題の解析your blain頭をしぼろう
3. プログラムを書くエディタ (mule) いつもどおりmuleを立ち上げ,
例えばp.7のようなプログラムを書く
4. プログラムをセーブするmule でC-x C-s 例えばファイル名"hello.c"でセーブ
かならず,.c の拡張子を付ける
5. コンパイルコンパイラ (gcc) gcc hello.c[return]で
コンパイルする。
6. 実行UNIX上 ./a.out [return]でプログラムが走る。

 こでコンパイルとは,C言語(人間が分かる言語)のファイルを コンピュータの言語に翻訳することです。C言語のファイルにエラーが なければ,a.out (実行形式ファイル)が生成され,すぐ実行できます。 エラーがあれば,メッセージが出てコンパイルが止まります。
 エラーが出てもファイルもワークステーションも壊れません。あわてずに, エディタ (mule)でプログラムを修正し,再度コンパイルをしましょう。

 ちなみに,この方法でできる実行形式ファイルの名前はすべてa.out です。 しかし,例えば上のプログラムの実行形式ファイルは, "hello" という 名前にしておいて, hello[return] でプログラムが走るようにしたほうが より良いでしょう。これを『オブジェクトを作成する』といいます。 オブジェクトを作成する場合は,-o オプションを用いて,

gcc -o オブジェクト名 ソースファイル名 [return]
でコンパイルすればよいです。

ちょっとひとこと
 エラー無くコンパイルができても,それで「プログラムが完成」では ありません。まだまだ,プログラムの中に『バグ』(プログラムのミス)が あるかも知れません。『バグ』を取る作業のことを「デバッグ」といいます。 デバックの方法には,
  1. プログラム中に printf 文などを埋め込んで,プログラムを実行させ, 任意の変数の値の変化を追いかける。
  2. 答の分かっているテストデータを用いてプログラムを実行させ, 予想される値が出るかどうかを調べる。
  3. 「デバッガ(デバッグ専用コマンド)」を用いる。Frontier ガイド '96の「付録D」参照。
があります。


 Cは関数{文と変数}と変数からなります。『文』とは,行なうべき 制御の過程(条件判断など)を指示するもの,『変数』は計算で使われる値を 格納するものです。一般にこれらが集まって,関数を形作ります。Cでいう 関数とは,普通の意味での関数の拡張です。
 普通の関数は例えば,

y=f(x);  f(x)=5x+3
などですが,これは, 『関数f(x)はxという入力に対して出力yを出す関数』 という意味です。こう考えると,「行数を数えるプログラム」は, 『一連の文章という入力に対して,行数を出力する関数』, 「y=sin x を a から b まで積分するプログラム」は 『a,b,dxを入力したときに y=sin x の積分値を出力する関数』と 考えることが出来ます。この意味で,『プログラムとは,多数の 簡単な機能を持つ関数を組み合わせた一つの関数』と,みなすことが出来ます。


< 問題 >
Hello world を印字する

 定版のプログラムです。その注意点は,以下のとおりです。

  1. Cのプログラムには,関数mainが一つだけ存在する。プログラムは 基本的には,mainだけを実行する。
  2. 今の場合,mainはパラメータのない関数です。これが()の意味です。 もし,パラメータを持つmain関数ならば,()の中にパラメータが 入ります。
  3. 関数の中味は{ }で囲まれた部分である。
  4. printf( )も関数である。
ちなみに,'\n'は'改行'です。ほかにも,'\t' (タブ) や '\0' (ヌル文字;Cの場合に文字列の最後に付ける)など,『目に見えないが 制御に関する文字』のことをエスケープ文字と呼びます。
 printf()でディスプレイに出力した後は原則として改行するので,最後に '\n'をつけるように。

★ 演習問題


1.2 変数と算術

 もう少し難しい問題をやりましょう。こんどは,

< 問題 >
摂氏=5/9(華氏-32)の公式を使って,温度を華氏から摂氏に 変換する

という問題です。ここではループ(繰り返し)を使用します。

p.11のプログラムの説明です。

#標準入出力のヘッダファイルを読み込む
/*コメント(プログラムの内容)/*

main() ←パラメータのないmain関数
{
変数を宣言する 
初期値を設定する
while (式){    ←後述
	文;
	}
}

 使用する変数については,必ず『宣言』を行います。これは『それぞれの 変数について,コンピューターのメモリ領域をどれだけ使用するか』 ということを,コンピュータに対して宣言することです。宣言には, つぎのようなものがあります。

int整数型(JAISTでは)4バイト 整数や文字の変数
float浮動小数点型(単精度)4バイト いわゆる実数の変数
double浮動小数点型(倍精度)8バイト 実数で精度の必要な変数
char文字型1バイト文字の変数

 関数内部で使う変数は,必ず関数の入口で初期値を設定します。

 ここでは,ループにはwhile文を使っています。while文は,()で 囲んだ式が「真」であれば『文』を実行し,また式に戻ります。式が 真である限りループが続きます。式が「偽」になるとループから 抜け出します。
 また,プログラムはどこで行変えなどをしても動きます。が,論 理構成が分かりやすいように,一定のやり方で字下げや行替えをします。

 ちなみに'='は「代入」という意味です。右の値を左の変数に代入せよ, という意味です。等式ではありません。等式(xとyが等しい)は x == y と書きます。同様に,

という論理演算子です。どれも,いわゆる算数の演算子ではありません。

 書式付出力は,桁数をそろえて出力する方法です。例えば関数printf() を用いて,

printf("%3d %6d \n", fahr, celsius)
と書きます。3とか6が桁数,dは整数ということを表します。上の例では, 「整数変数 fahr の内容を3桁で,整数変数 celsius の内容を6桁で, そのうしろに改行を出力せよ」となります。

ちょっと余談
 ちなみに,printf()はCの関数ではありません。Cには入力も出力も ないです。入出力のないプログラムというのは考えにくいですが……。 printf()は"stdio.h"のライブラリに含まれている関数です。そのため, いつもプログラムの最初で,標準入出力のヘッダファイルを #inclide<stdio.h>で読み込む必要があります。

 float(単精度浮動小数点型)版のプログラムは,ここでは説明しません。 見ておいてください。大きな違いは,

  1. int版では 5/9=0(整数の切り捨てだから)になるが,float版では 5.0/9.0=0.55555....となります。
  2. printfで,%6dが %6.2fなどになる。6.2の意味は整数部を6けた, 少数以下を2けたで表示ということである。f はもちろん float の 意味である。

★ 演習問題


1.3 for文

 for文もループの一つです。良く使用される書式は,

for (下限;上限;ステップ)
  文;
ですが,本来の書式は次のとおりです。
for (初期値;ループのテスト;再初期化)
  文;
Cのfor文はwhile文とほとんど同じなのです。ただ初期値(とステップ)を 明示するか否かの違いです。

★ 演習問題


1.4 記号定数

 制御に関する定数は,文中(特にループの中)に入れないように しましょう。記号定数にして,プログラムの頭に置くべきです。
 記号定数は一般には大文字で書き,定数であることを分かりやすく しましょう。また文の後に;がついていません。これは実行文でないことを 示しています。#define は,あくまでも「定義」であって「代入」では ないので,= は付きません。間違えないように。


次へ進む
C入門もくじへ
小矢野のホームページへ

このページの御感想・御意見は koyano@jaist.ac.jp まで。