言語要素の概要:ここまでの内容をCで書いてみると

ここまで「変数」「ユーザからの入力」「IF」「ループ」をFortranで書いてきたが,これらはもちろんCでも書ける.どのように対応しているか簡単に述べる.

変数

変数の型は次のとおりである.

FORTRANでの型名 Cでの型名 意味
INTEGER int 整数
REAL float 実数
REAL(8) double 8バイト(高精度)実数
CHARACTER char[長さ+1] 文字列
LOGICAL (注) 論理型

(注意:「論理型」はデフォルトのC言語には存在しないがint型で代用できる)

変数宣言とそのプリントは…Fortranなら


となるところである.それをCでは次のように書く.ただし文字列に関してはもっと手抜きな方法もあるのだが,今回は教育目的?のためあまり横着しない版を掲載する.

実行結果


宣言は,プログラムの冒頭で「型名 変数名(,変数名...);の形で行なう.

char型においては,その最大長さに1を加えたものをカッコの中で指定する.

各変数や定数は,直感的な記号を使って加減乗除や剰余などの演算ができる.

Cで厄介なのは文字列の代入・コピー・結合で,これはstrcpystrcpyを使う.

strcpy(str1,str2)はstr2をstr1にコピーする( str1<--str2). なぜstr1 = str2;と書かないのか?これは後のお楽しみ.

strcat(str1,str2)はstr1にstr2を付け加える.

strcatstrcpyを用いる時には,プログラムの冒頭に

#include <string.h>
という文が必要になる.これは(HDDのどこかにある)string.hというファイルをこの場所に読み込むということを意味するが,実用的には,変数の宣言と同様の「関数の宣言」と考えてもさほど間違いではない.

目的とする機能を用いようとするとき,どんな#include文が必要になるのか?基本的に入出力関係は

#include <stdio.h>
(stdioはstandard I/Oの意味),文字列関係は
#include <string.h>
数学関係は
#include <math.h>
さまざまな小ネタに関しては
#include <stdlib.h>
なのだが,他にもたくさんある.これはいちいち覚えていられないかもしれない.しかし心配することはなく,Cの機能はすべてmanページが用意されているのである. ためしに上記strcpyをみてみよう.
% man strcpy
C Library Functions                                    string(3C)

NAME
     string, strcasecmp, strncasecmp,  strcat,  strncat,  strchr,
     strrchr,  strcmp, strncmp, strcpy, strncpy, strcspn, strspn,
     strdup, strlen, strpbrk, strstr, strtok, strtok_r,  - string
     operations

SYNOPSIS
     #include <string.h> (←安形注:ここ!)

(中略)

     char *strcat(char *s1, const char *s2);

(中略)

     char *strcpy(char *s1, const char *s2);
(後略)
冒頭SYNOPOSIS欄に,どのファイルを#includeしなければならないか書いてあるのが分かるだろう.

ユーザからの入力

FortranではREAD文だった.Cではscanf関数を用いる.下記はユーザの入力した値を二乗した値を表示するプログラムである.FORTRAN(再掲)だと


であったがCでは

となる.

実行結果例

% ./a.out
input number : 7
 square is : 49

scanf文は最低二つの引数をとる.最初の一つは文字列で,これはprintfと同様の書式指定である.この場合は"%d"であるので「整数の値を一つ読む」という意味になる.

二つ目以降の引数は,実際に読む変数を入れる…といいたいところだが実はそうではない.変数の値が格納されているメモリのアドレスを入れるのである.このアドレスを計算する記号が,nの前に入っている&である.

なお,今回のような単純な変数にはかならず&をつけるが,後に出てくるポインタだと&はいらない.

scanf()におけるこの&の付け忘れ,あるいはつけすぎ,は初心者のうちは誰でもかならず一回はやってしまうミスである.なにしろ付け忘れてもコンパイルエラーにならない(ことが多い)のだ!

IF文

ユーザが入力した年がうるう年かそうでないか表示するプログラム.FORTRANだとこうだった.


Cではこうなる.


このように

  1. 「if(条件式){」の行
  2. 条件式が成り立っているときに行なう命令の行
  3. 「 } else {」
  4. 条件式が成り立っていないときに行なう命令の行
  5. 「}」
とならべてゆく.なお,3(のelse以降)と4は,不要なときにはかかなくてもいい.

また,2ないし4が一文のみ(正確には,文の終わりを意味する「;」が一つのみ)の時には「{」と「}」は不要(上記にもそういう例がある.探してみよう).

if文のカッコの中に入る演算子は次のとおり.

記号 意味
==
!=
<
>
<=
>=
&& かつ
|| または
ということは,日常使う比較演算子の中では「≠」「AND」「OR」のみがFORTRANと違っている.なお,最後の二つはそれぞれの記号が二文字続いていることに注意.これを一文字だけ書いてもコンパイルエラーにならない(文法的には正しい)が,意味はまるで違ってくる.これまた初心者がよくやるミス.

ifは上記のように入れ子にできる.また,対応する中カッコわかりやすいようにインデントするのはもちろん鉄則.


カウンタ・ループ

	for( i = 0; i < n; i++){
		...
	}

for(最初一回だけの処理;ループ毎の続行条件; 各ループ終了時処理)と書いてループを実現する.かなり柔軟なループ制御ができる.

stepを2にするには,こうすればよい.

	for( i = 0; i < n; i += 2){
		...
	}

条件ループ

	for( ;;;){

		...

		if(...){
			break;
		}

		...

	}

ループ抜け出しはbreak,次の繰り返しに移るのはcontinue文を使う.

次は,ループが全く行われない可能性のある条件ループ.FORTRANのDO WHILEと同じ.

	while(ループ続行条件 ){
		...
	}

次は,ループが最低一回は行われる条件ループ.

	do{
		...
	}while (ループ続行条件)
AGATASHI