/*THK Analytics用解析タグ*/

【プログラミング言語C】
第4章 「関数とプログラミング構造」
4.1 関数についての基本事項


 

これまででC言語の基本ルールは学びました。
これからは具体的なプログラムを作成しながら、実践で学びます。

一般的にプログラムは複数の機能を組み合わせて実現します。
(既に1章で学んだプログラムのそのような構造になっていましたね)

4.1 関数についての基本事項

関数については1.7章でも簡単に学習しています。

関数の基本

関数の定義はこのようになっています。

戻り値 関数名 (引数の宣言) {


return 数値;

}

関数を呼び出す際は、関数名(引数)呼び出します。
関数の結果はreturnで戻されます。

以下に例を示します。
この関数は引数nを二乗した結果を戻り値として返します。

int square (int n){

return n * n;

}

呼び出しは以下のように行います
int result = square(10);

resultには100が入ります。

戻り値の無い関数

戻り値が無い関数を定義する事も出来ます。
その場合、以下のように定義します

void 関数名 (引数の宣言) {

}

戻り値も引数も無い関数

戻り値も引数も無い関数を定義する事も出来ます。
その場合、以下のように定義します

void 関数名 () {

}

サンプルプログラム

プログラミング言語Cのサンプルプログラムを見てみましょう。
キーボードから入力した文字列の中に検索文字列が存在した場合、キーボードから入力した文字列を画面に表示するプログラムです。
以前説明したように、見やすく一部修正しています。

解説

基本になっているプログラムは1.9章で学習した文字配列のプログラムです。
ソースコードは次にように並んでいます。

・検索関数
・キーボードから1行を読み取る関数
・メイン関数

メイン関数

メイン関数から説明します。
char current_line[MAX_LINE];1行のデータを読み込むバッファを宣言しています。
バッファのサイズは1000になります。
char pattern[] = “abc";で検索する文字列を指定しています。

次はwhile(1)で無限ループを指定しています。
ループ内では、キーボードから1行読みこみ(get_line)、検索関数で読み込んだデータに検索文字列があるかを判定しています。

1行読みこみは1.9章で学習した文字配列のプログラムと全く同じですので説明はそちらを見てください。

検索関数では戻り値が0以上の場合に検索文字列が存在する示します。
その場合、検索対象文字列すべてを画面に表示し再度ループの先頭にもどりキー待ちとなります。

検索関数find

文字列の中に検索文字列が存在するかを確認する関数です。
引数s[]が調査対象文字列でpatt[]が検索文字列になります。
文字列なのでどちらも配列の最後は’\0’が入っている事を忘れないでください。

for (int i = 0; s[i] != '\0’; i++) {
最初のループは検索対象の文字列を先頭から調べます。
一般的にループはfor (int i = 0; i < 10; i++)のようにループ数を指定しますが、文字列の場合長さが分からないのでループ数の指定が出来ません。
文字列の場合、文字列の終端は必ず終端文字’\0’が入っている事に着目して s[i] != '\0’のようにします。
こうすることで終端文字が見つかるまでループを続けることが出来ます。

次のループ for (int j = 0; patt[j] != '\0’; j++) では検索文字列の取り込みループです。
こちらも同様ですね。

実際の比較はこちらのif文で行っています
if (patt[j] != s[i+j])
ポイントは s[i+j]。

流れを示すため、s[] = “123abc456″、patt[]="abc"として解説します。
最初はi=0、j=0ですのでpatt[j]=’a’、s[i+j]=’1’となります。
当然次のif文は偽ですのでfind_flagを0にしてjのループから抜けます。

ループを出ると最初にfind_flagが1であることをチェックしていますが、もちろん現在は0なので外側のiループに戻ります。
ここでiが+1されてi=1で先ほどと同様に比較まで進みますが、patt[j]=’a’、s[i+j]=’2’でif文が偽になります。

このようにして順に進み、i=3,J=0になった際にpatt[j]=’a’、s[i+j]=’a’となり初めてif文が真となりjループが先に進みます。
次はiは変更されないのでi=3,jはインクリメントされるのでj=1となりpatt[j]=’b’、s[i+j]=’b’となりこちらも真。
このようにして進みjループでpatt[j]=’\0’を見つけると(すなわち検索文字列が最後になると)jループを終了します。

jループに入る前にfind_flagは1になっていますので、if (find_flag == 1) の判定で真となり関数を終了します。
戻り値iは3を示しておりこれは調査対象文字列の先頭からi文字目が検索文字列と一致した事を示します。

 


 

 

 

C言語教室

Posted by taka