プログラミング論 第十九回 ・よく使う処理は関数にしよう-2 ・標準ライブラリ関数(文字列の処理) 本日の内容 戻り値のない関数 グローバル変数 標準ライブラリ関数とは? 文字列の処理 – 文字列の代入 – 文字列の長さを求める – 文字列の比較 – 文字列の連結 返り値のない関数 返り値がない関数の場合は,関数宣言時の返 り値の型はvoidで宣言をします (ensyu48.c) #include <stdio.h> void putd(int); int main(void) { int dt=100; putd(dt); return 0; } void putd(int a) { printf("%d\n",a); } 関数の型宣言 はvoid型となる 関数が値を返さない =return文がない 演習:よく間違う例 ensyu49.cは,変数xと変数yの値を交換 するプログラムとして作ってみたものです。 実行して,変数値が交換できることを確 認しなさい。 ensyu50.cは,交換の機能をswapという 関数で実現しようとしたものです。しかし, これでは変数値が交換されません。この 理由を考えなさい。 グローバル変数 関数内で宣言された変数はローカル変数と呼 ばれ,その関数内でのみ有効です。 同じ名前の変数があったとしても,異なる関数 内で宣言されていれば,「違う家に住んでいる 同姓同名の人」という扱いになり,まったく別の 変数,と言うことになります。 ただし,関数の外,プリプロセッサの位置で宣 言された変数は「グローバル変数」と呼ばれ, どの関数からでも共通して利用できる変数にな ります。 ensyu51.cで確認しましょう。 グローバル変数 #include <stdio.h> double r; グローバル変数 double pi=3.141592; double menseki(void); double ensyu(void); この値を共通 int main(void) に利用できる { double c, s; printf("r="); scanf("%lf",&r); c=ensyu(); s=menseki(); printf("ensyu=%f, menseki=%f\n",c,s); return 0; } double ensyu(void) { return 2*r*pi; } double menseki(void) { return r*r*pi; } 共通に利用できる 演習 int型引数一つを受け取り,その数値の階 乗を計算する関数int kaijo(int n)を完成 させなさい(ensyu52.c)。 グローバル変数を用いることによりデータ 交換を可能にした関数void swap(void) を完成させなさい(ensyu53.c)。 標準ライブラリ関数とは? プログラムは,いろんな処理を「関数」という単 位で行っています。 先週は,いくつかの関数を自作して利用する方 法を勉強しました。 しかし,C言語には,普段よく使う処理があらか じめ関数として用意されています。 printf,scanf,などです。 これらの関数を「標準ライブラリ関数」と呼びま す。 標準ライブラリ関数とは? どこで定義 #include <stdio.h> されているの int main(void) これが標 でしょう??{ double f( double x) double x,y; 準ライブラ リ関数です { double y; printf("x=?"); これは自作 scanf("%lf", &x); の関数です y = x*x+3*x+2; y = f(x); return y; } printf("y=%f\n",y); } ここで定義(説明)されています 標準ライブラリ関数とは? #include <stdio.h> printf( ・・・・ ) { int main(void) ・・・・・ { ・・・・・ } double f( double x) double x,y; ここで定義scanf( ・・・・ ) { { されている double y; printf("x=?"); ・・・・・ のです!!} scanf("%lf", &x); y = x*x+3*x+2; y = f(x); return y; } printf("y=%f\n",y); } 標準ライブラリ関数とは? printf()やscanf()などの標準ライブラリ関数は, 「ヘッダファイル」の中に種類毎に整理して保存 されています。 printf()やscanf()は,入出力に関する関数なの で,そのような関数を集めた,「stdio.h」という ヘッダファイルの中にその定義(説明)が書いて あります。 そのヘッダファイルを「include(含む)」処理する と,そのヘッダファイルの中にある関数が使え る,という訳です。 stdioは,STanDard Input Outputの略で,「標 準入出力」という意味になります。 文字列の処理 C言語には,文字列を処理するための便利な関 数が用意されています。 これらの関数は,「string.h」というヘッダーファ イルに定義されているので,これをincludeして 利用します。 次のような関数があります。 – – – – 文字列の代入(コピー) 文字列の長さを求める 文字列を比較する 文字列を連結する 文字列の処理 文字列の代入(コピー) char型では,1文字しか扱えません。 a char a; a=‘C’; ‘C’ 配列にすると文字列が入力出来ますが・・ char a[4]; h a m a a[0] a[1] a[2] a[3] 文字列の処理 文字列の代入(コピー) その入力方法は一文字ずつになってしまい, char a[4]; a[0]=‘h’; a[1]=‘a’; a[2]=‘m’; a[3]=‘a’; hama h a m a a[0] a[1] a[2] a[3] なかなか面倒です。。。 文字列の処理 文字列の代入(コピー) ところが,string.hにあるstrcpy()関数を使 うと,簡単に文字列の代入ができます! hama char a[4]; strcpy(a,”hama”); h a m a a[0] a[1] a[2] a[3] 文字列の処理 文字列の代入(コピー) ensyu54.cで関数strcpyの動作を確認し ましょう。 文字列の処理 文字列の長さを求める 文字列の長さ(文字数)を求める時は, strlen( )関数を用います。 strlen( )関数は,返り値として文字数を返 します。 ensyu55.cで動作を確認しましょう。 文字列の処理 文字列の長さを求める それでは,文字列の長さを求める関数を自分で 作ってみましょう。 ヒント – 文字列の最後には,’\0’が保存されています。 – ‘\0’を発見するまで文字をカウントしていけばよいこ とになります。 – 次のスライドのフローチャートを参考に考えてみま しょう。 ensyu56.cを完成させてください。 文字列の処理 文字列の長さを求める n=0; i=0; No s[i] !=‘\0’ Yes n++; i++; printf(“文字数=%d\n”,n); 文字列の処理 文字列を比較する 2つの文字列を比較する時は,strcmp( ) 関数を用います。 二つの文字列を比較して,同じ場合は0 を返り値として返します。 – 返り値は整数型です。 文字列が異なる場合は,どのような結果 が返ってくるでしょう? ensyu57.cで確認してください。 文字列の処理 文字列を比較する 二つの文字列が同じ場合の出力 文字列を入力してください(s1) abcdef 文字列を入力してください(s2) abcdef 文字列を比較します。。 比較結果は0です。 文字列の処理 文字列を比較する 二つの文字列が異なる場合の出力 文字列を入力してください(s1) abcdef 文字列を入力してください(s2) ghijkl 文字列を比較します。。 比較結果は-1です。 文字列を入力してください(s1) efghijkl 文字列を入力してください(s2) abcdefgh 文字列を比較します。。 比較結果は1です。 この違いは,どうして起こるのでしょう? 文字列の処理 文字列を比較する strcpy(s1, s2); の結果 返り値 意味 文字コードの比較 1 s1 > s2 s1の文字コードが大きい 0 s1 == s2 -1 s1 < s2 s1の文字コードが小さい *文字コードが「大きい」とは,その文字が辞書内で後ろにある事を意味します 文字列の処理 文字列を比較する ある文字列の中から,キーワードを検索するプ ログラムを作ってみましょう。 キーワードは,3文字の文字列とします。 ヒント – 文字列から,順に3文字ずつ抜き出して,キーワード と比較します。比較にはstrcmp( )を利用します。 – 一致したら,「一致しました」と表示し,何文字目に あったかを表示します。 – この処理を文字列の最後まで繰り返します。 ensyu58.cを完成させてください。 文字列の処理 文字列を連結する 文字列同士をつなげて一つの文字列に する時には,strcat( )関数を使います。 strcpy(s1, “ABCD”); strcpy(s2, “EFGH”); strcat(s1, s2); を実行すると。。 s1の文字列が,”ABCDEFGH”となります *ensyu59.cで動作を確認しましょう。
© Copyright 2024 ExpyDoc