内容

C言語の基礎


コンパイル方法

プログラムのコンパイルは以下のように行なう。

> gcc filename.c

このようにコンパイルすると、a.outという実行ファイルが作成される。実行するには、

> a.out

で行なう。

次のようにコンパイルオプション-oを付けると作成される実行ファイル名を指定できる。

> gcc filename.c -o filename


標準入出力

printf関数

printf関数は画面にデータを出力する関数の一つである。printf関数の形式は次のとおりである。

printf(書式指定子, 1, 式2, , n);

書式指定子は”(ダブルコーテーション)で区切られた文字、記号の列であり、文字列、頭に%の付いた編集指定子、頭に\が付いたエスケープ文字で表す。
編集指定子には以下のようなものがある。

%d

intshort

%f

floatdouble

%c

char(文字)

%s

文字列

%と指定文字の間に桁数と小数点桁数(floatdoubleのときのみ)を指定できる。

<1>  printf("%6d", 543);  -->   _ _ _543

<2>  printf("%-5d", 543);  -->   543 _ _

<3>  printf("%05d", 543);  -->   00543

<4>  printf("%3.3", 34.56);  -->  _ 34.560

エスケープ文字は画面制御のための改行記号などを出力できる。エスケープ文字には以下のものがある。

\n

改行

\t

タブ

\b

バックスペース

\0

NULL

scanf関数

scanf関数は画面からデータを読み込む関数である。scanf関数の形式は次のとおりである。

scanf(書式指定子, &変数1, &変数2, , &変数n);

書式指定子はprintf関数と同じである。第2引数以降にデータを格納する変数に&を付けたものを指定する。&はアドレス演算子である。ここでは、scnaf関数での変数では必ず&を付けるものと考えておく。scanf関数の例を以下に示す。

int x;
float y;
scanf("%d %f", &x, &y);


流れの制御

if

if文は条件を判断し、実行の流れを分岐させる。if文の一般的な記述は以下のとおりである。

if(){
  文
}

if文は「式の値が真であれば文を実行し、偽であれば文を実行しないで次の文に制御を移す」働きをする。
式は一般的に論理式を用い、最も簡単な論理式は関係演算子を用いて
2つの算術式を結合して作られる。関係演算子は以下のものがある。

<

小さい

<=

小さいか等しい

>

大きい

>=

大きいか等しい

==

等しい

!=

等しくない

if文では論理演算子を用いて2つ以上の論理式を結合することができる。

!

否定(NOT)

&&

論理積(AND)

| |

論理和(OR)

if文の例を以下に示す。

if(a == b)

abと等しい

if(a > b)

abよりも大きい

if(a>b && c > b)

abよりも大きく、かつcbよりも大きい


switch

switch文は多分岐型の選択をする制御文である。switch文はswitchcaseの組み合わせで記述され、一般的な記述は以下のとおりである。

switch(){
  case 定数式1: 1; break;
  case 定数式2: 2; break;
       :
       :
  case 定数式n: n; break;
}

定数式は定数のみ、あるいは定数を演算子で結び付けたものである。括弧内に記述する式および定数式は、その結果がint型でないといけない。


switch
文の例を以下に示す。

switch(n){
  case 1:printf("1\n");
     break;
  case 2:printf("2\n");
     break;
  case 3:printf("3\n");
     break;
}


whileループ

while文は反復の制御をする文の一つである。while文の形式は次のとおりである。

while(){

  文

}

式には通常反復条件を論理式を用いて指定するが、一般の算術式でもかまわない。while文は、まず式を評価し、式の値が真である間は文を繰り返し実行する。式の値が偽となった時点で文の実行を中止し次の文に制御を移す。反復の開始時で式の値が偽であれば、文は1度も実行されない
以下に
while文の例を示す。

int i = 0;

while(i < 10){
  printf("%d\n", i);
  i++;
}


forループ

for文はwhile文と同様に特定回数だけ反復させる機能を持っている。for文の一般的な形を以下に示す。

for(1; 2; 式3){

  文

}

式1、式3には算術式、式2には論理式を示すのが一般的であるが、式2に算術式を適用してもかまわない。それぞれの式の働きは、式1は「カウンターの初期設定」、式2は「反復回数の指定」、式3は「カウンターの更新」である。例として1から10までの整数の和を求めるプログラムを示す。

total = 0
for(i = 1; i <=10; i++){
  total += i;
}


doループ

whileループとforループはループに入る前に反復条件が判定される「前置制御の反復」であるが、do文はループが1度実行された後の段階で反復条件が判定される「後置制御の反復」である。whileforループは1度もループを通らないことがあるが、doループは必ず1回はループを通る


do
ループの一般的な形を以下に示す。

do{
  文
}
while()


配列

多数のデータを取り扱うためには、多数のデータを効率よく格納し参照する方法が必要である。配列を用いることでこのような問題が解決できる。
配列は同じ型のデータを複数個一まとめにしたものである。配列の一般的な宣言方法の一例を以下に示す。

変数の型 配列名[要素数];

例:int array[5];

配列のどの要素を使うかはarray[2]のように要素番号を指定して行なう。ただし、要素番号は0から始まるため、例えば要素数5の配列は要素番号04となる

配列の宣言時にデータを入力するには

int array[5] = {1, 2, 3, 4, 5};

のように行なう。


2次元(多次元)配列

上の配列は1列に並んだ1次元配列である。配列は2次元に並んだ2次元配列を作成することもできる。2次元配列の宣言では、下に示すように配列のデータ型と配列名、2次元それぞれの方向の要素数を指定する。

変数の型 配列名[要素数] [要素数];

例:int array[5] [5];

配列のどの要素を使うかは1次元配列と同様に2次元それぞれの要素番号を指定して行なう。配列の宣言時にデータを入力するには

int array[2] [2] = {{1, 2},{3,4}};

のように行なう。

多次元配列も2次元配列と同様に要素数を[要素数]を増やすのみである。


関数

C言語のプログラムは関数を基本として構成される。ここでの関数は数学で用いられる関数と同じ概念であり、ある値を与えると何らかの処理を行いその結果を関数値として返すものである。関数を用いる利点は

  1. 関数単位でまとめることによりプログラムの見通しをよくできる。
  2. 関数は中身をよく知らなくても呼び出すだけで簡単に利用できる。
  3. よく使うものを関数にすることで、何度でも再利用できる。

等があげられる。
関数の一般的な形を下に示す。

関数のデータ型 関数名(引数1,, 引数n)


{
  文
}

:

int function(int x, int y)
{

  int z;
  z = x + y;
  return(z);
}

 

関数の返り値はreturn文を用い、返り値のデータ型は関数のデータ型で決まる。何も返り値が無い関数の場合void型を指定する。
ある関数を違う関数から呼び出す場合、通常呼び出す前に関数を宣言しなくてはいけない。

例:

#include<stdio.h>
/*
関数calcの宣言 */
int calc(int i);

main()
{

  int x;

  x = calc(1);

  printf("%d\n", x);
}

int calc(int i)
{

  int y;

  y = 2 * i + 1;

  return(y);
}