ここまで「変数」「ユーザからの入力」「IF」「ループ」をFortranで書いてきたが,これらはもちろんCでも書ける.どのように対応しているか簡単に述べる.
変数の型は次のとおりである.
FORTRANでの型名 | Cでの型名 | 意味 |
---|---|---|
INTEGER |
int |
整数 |
REAL |
float |
実数 |
REAL(8) |
double |
8バイト(高精度)実数 |
CHARACTER |
char[長さ+1] |
文字列 |
LOGICAL |
(注) |
論理型 |
(注意:「論理型」はデフォルトのC言語には存在しないがint型で代用できる)
変数宣言とそのプリントは…Fortranなら
となるところである.それをCでは次のように書く.ただし文字列に関してはもっと手抜きな方法もあるのだが,今回は教育目的?のためあまり横着しない版を掲載する.
実行結果
宣言は,プログラムの冒頭で「型名 変数名(,変数名...);の形で行なう.
char
型においては,その最大長さに1を加えたものをカッコの中で指定する.
各変数や定数は,直感的な記号を使って加減乗除や剰余などの演算ができる.
Cで厄介なのは文字列の代入・コピー・結合で,これはstrcpy
やstrcpy
を使う.
strcpy(str1,str2)
はstr2をstr1にコピーする(
str1<--str2). なぜstr1 = str2;
と書かないのか?これは後のお楽しみ.
strcat(str1,str2)
はstr1にstr2を付け加える.
strcat
やstrcpy
を用いる時には,プログラムの冒頭に
#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()
におけるこの&
の付け忘れ,あるいはつけすぎ,は初心者のうちは誰でもかならず一回はやってしまうミスである.なにしろ付け忘れてもコンパイルエラーにならない(ことが多い)のだ!
ユーザが入力した年がうるう年かそうでないか表示するプログラム.FORTRANだとこうだった.
Cではこうなる.
このように
else
以降)と4は,不要なときにはかかなくてもいい.
また,2ないし4が一文のみ(正確には,文の終わりを意味する「;」が一つのみ)の時には「{」と「}」は不要(上記にもそういう例がある.探してみよう).
if文のカッコの中に入る演算子は次のとおり.
記号 | 意味 |
---|---|
== | = |
!= | ≠ |
< | < |
> | > |
<= | ≦ |
>= | ≧ |
&& | かつ |
|| | または |
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