ここでは、C言語の基礎について説明します。
C言語の雛形
C言語は大枠としては以下のように記述します。
#include<stdio.h>
int main(void){
ここに処理内容を記述する
return 0;
}
この雛壇を元にして、説明をします。
変数と配列
変数について
変数とはいわゆる、値を入れるための箱のようなものです。
その変数はどのようなタイプ(型)であるのかを宣言する必要があります。
ここでは、まず2つの変数型を知ればいいです。
int型→ 整数型(1,2,3といった整数を入れる時に使う)
char型 → 文字型(a,b,cといった文字を入れる時に使う)
int a;
char b;
ここで、文章の最後には、必ずセミコロン;を付けます。
これらの変数に数字や文字を代入する時は「=」を使います。
int x = 1;
char y = essan;
char z = 'K';
ここで、1文字のみを代入する時は、引用符「'」で囲みます。
配列について
変数をいくつか定義する時、それをまとめるものが配列といいます。
まとめた時、データの値を要素といい、データの数を要素数(サイズ)といいます。サイズは0番目から始まり、1番目、2番目、3番目と続きます。
int x[配列数]= {データ};
以下のようにして書いた場合
また、配列にはインデックス番号が割り振られていて、先頭より0、1、2と割り振られています。その定義した配列より、値を表示したい場合は、以下のように記述します。
配列名[インデックス番号];
例えば、配列をこのように定義した場合、
int x[5] = {1,2,3,4,5}
定義した配列にある値を表示させたい時は、以下のようになります。
x[0]=1、x[1]=2 、x[2]=3、x[3]=4 、x[4]=5
関数について
メイン関数とサブルーチンについて
関数とは入力した値x(引値)を入れると出力された値y(戻り値)が出て来る機能をいいます。
C言語における関数の雛壇は以下のようになります。
関数の型 関数名(引数1, 引数2,…, 引数n)
{
変数の定義;
処理内容;
return 戻り値;
}
C言語ではmain関数を本体にしてプログラムを実行しますので、必ず
int main(void){
変数の定義;
処理内容;
return 0;
}
と書きます。また、プログラムを終了するときは0を返すことになっているので、戻り値は0にします。
メイン関数とは別に関数を書く時は、必ず関数の前に宣言しておく必要があり、それをプロトタイプ宣言といいます。なので、全体的な雛壇は以下のようになります。
#include<stdio.h>
関数の型 関数名(引数1, 引数2,…,引数n)
int main(void){
変数の定義;
処理内容;
return 0;
}
関数の型 関数名(引数1, 引数2,…, 引数n)
{
変数の定義;
処理内容;
return 戻り値;
}
変数の型 関数名(引数1, 引数2,…,引数n) がプロトタイプ宣言になります。
ここで、main関数をメインプログラム(メインルーチン)といい、それ以外の関数をサブプログラム(サブルーチン)といいます。
サブルーチンを実行する際は、プロトタイプ宣言を書いた上でメインルーチンの中で以下のような事を書きます。
関数名(引数1, 引数2,…,引数n);
ここで、引数の変数型とサブルーチンの変数型は一致しておく必要があります。
ここで例文を示します。
#include<stdio.h>
int sum(int x,int y);
int main(void)
{
int a,b;
sum(a,b);
}
int sum(int x , int y)
{
int z;
z = x+y;
return z;
}
まず、サブルーチンを使うので、プロトタイプ宣言「int sum(int x,int y);」を書きます。
次にメイン関数の中に変数aとbを用意します。
次に実行したい関数を書いています。ここではsum関数を使いたいので「sum(a,b);」と書きます。
最後にサブルーチン「int sum(int x, int y){ }」について書きます。
ここでは、メイン関数にある変数aとbの値がサブルーチンでの入力値であるxとyの値となります。
次に、xとyに値を入れるとzという値が出力され、zの値がメイン関数の中にある「sum(a,b);」の値となります。
ヘッダーファイルについて
最後に、この一文の意味について説明します。
#include <stdio.h>
main関数の前には本来使いたい関数をプロトタイプ宣言する必要があります。
C言語には出力関数としてprintf、入力関数としてscanfが用意されています。その入出力する関数の内容はファイルstdio.h内にて記述されます。また、そのファイルはヘッダーファイルとなっているので、”.h” と拡張子を書きます。
ここで “stdio” の意味は,”standard I/O” (standard input/output) です。studioではありません。日本語に訳せば「標準入出力」であり、”.h” は,ヘッダファイルの拡張子です。
つまり、
#include<ファイル名>
と冒頭で書く事で指定されたファイルが読み込まれ、記述されたプログラムにファイルの内容が展開されて、関数を使えるようになります。また、入出力したい時、サブルーチンを書く必要もなくなります。
つまり、プロトタイプ宣言した関数をひとまとめにしたのがinclude文であると言えます。これを書く事で、サブルーチンなしで関数を使えるようになるといえるでしょう。
関数printfについて
関数printfは以下のようにして記述します。
printf("書式文字列",変数);
ここで変数は省略できます。なので、
printf("この値は%dです",a);
とすると、変数aを10進数の整数で表示されます。ここで%dとは10進数の整数で表示せよという意味を持ち、これを変数仕様といいます。
以上を読むと、以下の例文の意味がわかると思います。
#include<stdio.h>
int sum(int x,int y);
int main(void)
{
int a = 1;
int b = 2;
int c = sum(a,b);
printf("値は%dになります",c);
return 0;
}
int sum(int x, int y)
{
int z;
z = x+y;
return z;
}
制御文について
if文について
if文は条件分岐をする際の構文であり、条件に応じて実行する処理を変更します。
この文は、以下のように記述します。
if(条件式)
{
条件式が真の時の処理内容
}
else
{
条件式が偽の時の処理内容
}
例文
#include<stdio.h>
int main(void)
{
int a = 3;
if(x>0)
{
printf("これは自然数です");
}
else
{
printf("これは自然数ではありません");
}
return 0;
}
この場合はaに代入された値が自然数だと「これは自然数です」と表示され、そうでない場合は「これは自然数ではありません」と表示されます。
for文について
for文は繰り返し処理をする際に用いられる構文であり、以下のようにして記述されます。
for(初期値;繰り返し処理をする条件;処理した後の処理)
{
繰り返し処理をする内容
}
説明すると、まず初期値の所で変数と繰り返し処理をする際の一番最初の値を設定します。
それから「繰り返し処理をする条件」に当てはめ、条件式を満たした場合に「繰り返し処理をする内容」を実行し、その次に「処理した後の処理」に入ります。
それから「繰り返し処理する条件」にあてはめ、その条件を満たしたら、また「繰り返し処理をする内容」を実行し、その次に「処理した後の処理」に入ります。
それを繰り返し条件をする条件を満たさなくなるまで継続します。
つまり、
初期値→繰り返し処理をする条件→繰り返し処理をする内容→処理した後の処理→繰り返し処理をする条件→繰り返し処理をする内容→処理した後の処理・・・
とループをしていくということです。
#include<stdio.h>
int main(void)
{
int i ;
int sum = 0 ;
for( i=1 ; i<=10 ;i++)
{
sum = sum + i ;
}
printf("1から10までの値は%dです" , sum);
return 0;
}
この場合は55と表示されます。
ポインタについて
ポインタとは、ポインタ変数と呼ばれる変数を用いて他の変数の場所を指し示すものです。ここで、ポインタ変数とはメモリ上のアドレスを値をして代入できる変数です。このことについてこれから説明します。
ポインタ変数について
ポインタ変数は、以下のようにして宣言します。
変数の型 *変数名;
つまり、変数にアスタリスクを付けることでポインタ変数であることを宣言しています。このアスタリスクを間接演算子といい、ポインタ変数が示す内容を間接的に表示できます。
もし変数xについて
int *x;
と宣言した場合、xにはアドレスが代入されます。
ここで、宣言以外でアスタリスクを使う場合は、アドレスが示す変数の値を示すことになります。
アドレスの参照
ある変数xを宣言すると、変数xが配置されるアドレスはコンパイラが勝手に決めます。そのアドレスは何かを尋ねる時は、以下のようにして宣言します。
&変数名;
つまり&に変数名につける事で、例えば変数xについて、&xはxのアドレスそのものを表していると言えるでしょう。
例文
#include<stdio.h>
int main(void){
double x = 2.71; /*変数xの定義 */
double *y; /*ポインタ変数yの定義 */
y = &x; /*ポインタ変数yへ変数xのアドレスを代入 */
printf("変数xのアドレスは%pです",y);/*ポインタ変数yを表示 */
printf("変数xの中身は%fです",*p); /*ポインタ変数yが示す中身を表示 */
return 0;
}
ポインタと配列
配列名は、配列の先頭要素があるアドレスを表ます。
つまり、
int a[];
としたとき、a[0]の要素のアドレスを表すことになります。
ここで、配列の先頭要素以降のアドレスを表すには、ポインタを加算していきます。
int a[] ;
int *p = a+1 ;
このとき、2番目の要素のアドレスを表す事になります。
また、以下のように書く事もできます。
int a[] ;
a[1] = *(a+1);
構造体について
構造体とは何か
構造体とは、複数の型のデータを一つにまとめたものであり、構造体を構成する要素をメンバといいます。
構造体の書式は以下のようにして表します。
struct 構造体タグ{
型 メンバ名;
型 メンバ名;
…
};
ここで、この構造体に付けられる名前を構造体タグといいます。構造体はメイン関数の前で定義をします。
関数の中で構造体を利用する際は、以下のようにして変数を用意します。
struct 構造体タグ 変数名;
例文をここに表ます。
struct seiseki{
int number; /*学籍番号*/
char name[20]; /*氏名*/
char subject[20]; /*科目名*/
int score; /*点数*/
};
ここでは、seisekiが構造体タグであり、numberやnameなどがメンバです。この構造体を使った変数を用意する場合は以下のようになります。
struct seiseki essan;
ここで、構造体のデータが入った変数がessanとなります。
typedefを用いた構造体について
先ほどの例文ではseisekiと名付けた構造体タグを使いましたが、この別名を用意する場合は、以下のような書式にします。
typedef struct 構造体タグ{
型 メンバ名;
型 メンバ名;
…
}別名;
つまり、先ほどの例文の場合は以下のようになります。
typedef struct seiseki{
int number; /*学籍番号*/
char name[20]; /*氏名*/
char subject[20]; /*科目名*/
int score; /*点数*/
}NEMber;
こうすると、構造体のデータが入った変数を用意するとき、essanを変数名として
NEMber essan
とでき、typedefを使わなかった時と比べて使う文字数を減らすことができます。
構造体の参照について
構造体にあるメンバを呼び出したいときは、以下のようにします。
構造体の変数名.メンバ名
ここで、「.」はドット演算子といいます。
例文において、構造体のデータが入った変数essanの場合、学籍番号を呼び出したい時は以下のようにします。
essan.number;
このような事を生かした例文が以下のようになります。
#include <stdio.h>
typedef struct {
int no; /* 学生番号 /
char name[20]; / 氏名 /
double average; / 平均値 */
} SEISEKI;
int main(void)
{
int i;
SEISEKI student1 = { 5, "SHU", 83.5 };
SEISEKI student2[20] = {
{ 1, "ESSAN", 78.6 },
{ 2, "ZEMZEM", 57.3 },
{ 3, "MATSUNOKI", 66.4 },
};
printf("%d %s %5.1f\n\n", student1.no, student1.name, student1.average);
for (i = 0; i < 3; i++) {
printf("%d %s %5.1f\n",
student2[i].no, student2[i].name, student2[i].average);
}
return 0;
}
参考文献
やさしく学べるC言語入門[第2版] 皆本晃也 サイエンス社
Cの絵本 株式会社アンク 翔泳社
http://www9.plala.or.jp/sgwr-t/c/sec16.html