c言語によるプログラムの基本形

例(1)
#include < stdio.h >
void main(void)

     printf(”Hello World¥n”);


mainはc言語の予約語であり、プログラムの実行開始部分(メインルーチン)を示している。
大括弧  から 大括弧とじ  までがメインルーチンである。

 c言語では、記号がよく用いられる。大括弧 { と大括弧とじ } とは、それぞれ、Pascalのbeginとendとまったく同じ要領で用いられている。
FORTRANでは大括弧 { に対応するものは必ずしもないが、mainにおける大括弧とじ } はSTOP命令と思って差し支えない(大括弧は、以降の部分で再三現れるが、FORTRANのStop命令に対応しない大括弧とじも多く存在する)。

ここで、void は”無効”の意味である。
void main(void)とは、「このメインルーチンは、オペレーティングシステムからなんの情報も受け取らず、またオペレーティングシステムに何の値も返さない」という意味を示している(文字の色で、対応場所を示している)。詳細はサブルーチンの項目で説明する。


#include命令
c言語にはすでに多くの作業用命令(サブルーチン)が用意されている。画面への出力命令(printf)や、キーボードからの入力命令(scanf)も、コンパイラが用意しているサブルーチンであり、これを使うときには、サブルーチンの定義情報を知らなければならない。
#include命令は、自分のプログラムの先頭に、サブルーチンに関する情報ファイルであるヘッダーファイル(この場合stdio.h)を接続する命令である。

 使用方法:
#include <stdio.h>
#include <math.h>
読み込みたいヘッダーファイルを不等号記号で囲む。
複数のヘッダーファイルを読み込む場合には、行を変えて列挙する。#include命令は、十数行にわたってかかれる場合もある。

 .hのつくヘッダーファイルは、c言語には約50種類程用意されているが、この授業で用いるのはこの2種類だけである。

stdio.hは、標準的な入出力命令をはじめとするC言語の基本命令に関する情報が含まれているヘッダーファイルである。

またmath.hは、sin,cos,tan,sqrt(平方根),log,log10などを使いたい場合に、自分のプログラムに加える必要がある。

実は、不等号記号で囲むことには、「c言語のコンパイラが格納されているディレクトリの中の/includeというサブディレクトリから読み込め」という意味があり、stdio.hをはじめとするc言語がもともと用意しているヘッダーファイルを読み込むときのみの書き方である。

もし、自分が独自のヘッダーファイルを作って(たとえばmyheader1.hという名前にして)、それを自分のファイルに#includeしたい場合には、
#include ”myheader1.h”
のように、ダブルコーテーションで囲む。


printf  画面への出力命令。

使用法1:printf(”表示したい文章(文字列)”);
    画面に表示したい文章をダブルコーテーションで囲み括弧内に入れる。

使用法2:printf(”表示したい文章(文字列)¥n”);
    画面に文章を表示し、そのあと改行を行いたい場合には、¥nをつける。
    したがって、使用法1の例では、文章表示後改行はされない。

使用法1の例)
#include < stdio.h >
void main(void)
{
     printf("Hello ");
     printf("World\n");
}
実行結果


Hello World

使用法2の例)
#include < stdio.h >
void main(void)
{
     printf("Hello\n");
     printf("World\n");
}
実行結果


Hello
World

最も重要なセミコロン;の意味

重要:すべての実行命令や、定義文の末尾には、必ずセミコロン;をつける。
c言語のコンパイラは、セミコロンのところまでが1つの命令と解釈している。その間、命令の文字列が改行されているか否かは 全く意味を持っていない。

たとえば、コンパイラーが文法の誤りをチェックしていて、エラーが発見された場合には、通常、そのエラーを含む命令の行数とその内容を表示するが、 セミコロンをつけ忘れたしまったが故にエラーが生じた場合には、2行がつながっていると解釈した上でエラーのある行数を示すため、 必ずしも、エラーを含む行数を適切に表示しない場合が生じる(要するに、本当は5行目が間違っていても、上の4行目とつながっていると 解釈されているため、「4行目にエラーがある」と表示される場合がある)。

c言語では、セミコロンにより命令の終端を示しており、改行は特に意味を持っていない(ただし、C++では改行に意味を持つ場合がある)。

c言語には、FORTRANのように、何桁目以降に命令を書かなければならないという制約はない。したがって、プログラムを見やすく書くためには、プログラマ自身がそれなりの工夫をする必要がある。


変数の定義とprintf命令による数値の表示

例)

#include  < stdio.h >
void main(void)
{
     int   i,j,k;
     i=1; j=2;
     k=i+j;
     printf(" i=%d, j=%d, i+j=%d\n",i,j,k);
}

実行したときの画面表示
i= 1,j= 2,i+j= 3


変数の定義命令
pascalと同様に、c言語では、プログラム内で用いる変数をあらかじめ定義する必要がある。
int i,j,k; とすると、整数を記憶する変数(int型) i,j,kの3種類の変数が定義される。

変数名は31文字以内であれば何でもいい。
FORTRANのようにi〜nで始まる変数名が、暗黙の了解で整数型変数になるということはない。

このほか変数の種類には、記憶する数値の範囲によって、以下のようなものがある。
分類変数の型変数のビット長記憶できる数値の範囲備考
整数型
(数値表現について)
char8[bits]-128〜+127文字を記憶(ASCIIコード参照)
short16[bits]-32768〜+32767
int16[bits]

32[bits]
-32768〜+32767
(16ビットコンピュータの場合)
-231〜+231-1
(32ビットコンピュータまたはワークステーションの場合)
汎用
long32[bits]-231〜+231-1
unsigned char8[bits]0〜255符号なしchar型
unsigned short16[bits]0〜+65535符号なしshort型
unsigned int16[bits]

32[bits]
0〜+65535
(16ビットコンピュータの場合)
0〜+232-1
(32ビットコンピュータまたはワークステーションの場合)
符号なしint型
unsigned long32[bits]0〜+232-1符号なしlong型
実数型 float32[bits]-2+127〜-2-128,0.0,+2-128〜+2+127単精度実数型
double64[bits]-2+1023〜-2-1024,0.0,+2-1024〜+2+1023倍精度実数型

 ある計算を行ったのち、この数値の範囲を超えてしまった場合にはオーバーフロー(桁あふれ)となり、計算結果がおかしくなったり(整数型変数の場合)、計算が中止される(実数型変数の場合)場合がある。

一般的に用いる変数は、整数であればint、実数であればdouble。

(c言語に用意されているsin,cosなどの関数は、すべてdouble型の数値を返すように設定されている)


変数の定義例

#include  < stdio.h >
void main(void)
{
    int  a,b,c;
    int  meiji,densi;     /* 変数名の長さは31文字長まで */
    char  zyouhou;
    double  ss,co;

      :
}
注釈(コメント)の書き方

プログラムの実行には影響を与えず、プログラムの説明を書き加えておきたい場合、 c言語では、/* コメント文 */のように書く。

コメント文の例)

#include < stdio.h >
void main(void)
{
     int i,j,k; /*
     int meiji, denshi;
     char zyouhou; */
     double ss,co;
     :
}

この場合、赤い字の部分がすべて注釈文となり、int型変数meijiとdenshi、およびchar型変数zyouhouが定義されなくなる。

ちなみに、C++では、//と書けば、それ以降、改行されるまで注釈文となる(C++では、この点で改行に意味を持ってしまっている)。


printf文のフォーマット(書式設定)

 printf文は、メッセージを画面に表示するだけではなく、変数が記憶している数値を表 示するときにも用いる。そのためには、ダブルコーテーション”で囲まれた部分に、文法に従っ た書式のフォーマットを記述する。

printf(”i=%d j=%d i+j=%d¥n”,);
この場合、変数iは赤い字の%dの部分に、変数jは緑色の%dの部分に、また変数kは青い色の%dの部分に、それそれ表示される。
これ以外のi=や j=、 i+j=は、文字列の扱いとなり、ただ表示される。

この%dは、int型変数を表示する場合に用いる書式記号である。
表示したい変数の型に合わせて、%で始まる書式記号は使い分ける必要がある。これを間違うと、まったく意図に反した数字が表示されることがあ る。

また、%dなど、%ではじまる記号は、表示したい変数の個数と同じ数だけ、フォーマット文の中に記述する必要がある。

注意:ccをはじめとするコンパイラは、フォーマット文の中の不整合(表示したい変数の個数だけ%記号があるか否か、表示したい変数の型にあった%記号(下表参照)が使われているか否かなど)について、エラーチェックしてくれないので、プログラム作成者が注意しなければならない。

%記号の種類
種類用途
%dint型、short型変数を10進数で表示
%6dint型、short型変数を10進数で表示。
ただし符号を含んで全体を6桁で表示。
%ld
(%エル ディー)
long型変数を10進数で表示
%xint型、short型変数を16進数(アルファベット部分は小文字)で表示
%Xint型、short型変数を16進数(アルファベット部分は大文字)で表示
%oint型、short型変数を8進数(アルファベット部分は小文字)で表示
%ffloat型変数を10進数で表示
%10.7ffloat型変数を10進数で表示。
ただし全体の桁数は10桁、小数点以下は7桁で表示する。
%lf
(%エル エフ)
double型変数を10進数で表示
%20.15lfdouble型変数を10進数で表示
ただし全体の桁数は20桁、小数点以下は15桁で表示する。
%cchar型変数に記憶されている数値に対応したASCIIコードにより文字(1文字)を表示。
%schar型配列変数に記憶されている文字列を表示。
文字列の終端はNULL文字(数値の零)で示す。
配列のどれかにNULL文字がなければならない。
%p各変数のポインタを表示。


配列変数

 上記の変数は、変数1つにつき、1つの数値を記憶するものである。これに対して、行列や数 列など、複数の数値列をまとめて記憶したい場合には、配列変数を用いる。
これは、FORTRANのDIMENSION命令や、Pascalのarray命令に対応しているが、c言語では特別な書き方を必要としない。

使用例4

#include   < stdio.h >
void main(void)
{
    int  a,b,c[100];
    double  vdata[1000];
    double  dd[20][10];
    double  ee[20][30][40];
    
    
}

 配列の次元数は1次元(c[100],vdata[1000])、2次元(dd[20][10])、 および3次元(ee[20][30][40])の3種類。カギ括弧内の数字を変えることによっ て、まったく別の変数を扱うことになる。

注意:カギ括弧内にはいる数値の範囲は、次の要領となる。

  1. c[100]と定義した場合:c[0],c[1],…,c[99]の合計100個が用意される。
  2. dd[20][10]の場合:dd[0][0],dd[0][1],…,dd[19][9]の合計200個が用意される。
  3. 変数定義できる配列は、3次元配列までであり、もしそれ以上の次元数のものが必要となる場合には、プログラム的に解決する必要がある(かなり高レベル)。
  4. FORTRAN77以降およびPascalでは、括弧内の数値に負数を入れることを許可できるが、c言語ではそれができないので、その必要に迫られた場合にはプログラム的に解決する必要がある。

使用例5

#include  < stdio.h >
void main(void)
{
    int   i;
    double  a[10];
    a[0]=0.0;  a[1]=1.0;  a[2]=2.0;
    i=1;
    printf("a[%d]=%lf\n",i,a[i]);
}

実行結果

a[ 1]=1.0000