250 likes | 396 Views
プログラミング論. 第十九回 ・よく使う処理は関数にしよう -2 ・標準ライブラリ関数(文字列の処理). 本日の内容. 戻り値のない関数 グローバル変数 標準ライブラリ関数とは? 文字列の処理 文字列の代入 文字列の長さを求める 文字列の比較 文字列の連結. 返り値のない関数. 返り値がない関数の場合は,関数宣言時の返り値の型は void で宣言をします (ensyu48.c). #include <stdio.h> void putd(int); int main(void) { int dt=100; putd(dt);
E N D
プログラミング論 第十九回 ・よく使う処理は関数にしよう-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> • double f( double x) • { • double y; • y = x*x+3*x+2; • return y; • } • int main(void) • { • double x,y; • printf("x=?"); • scanf("%lf", &x); • y = f(x); • printf("y=%f\n",y); • } どこで定義 されているの でしょう?? 標準ライブラリ関数とは? これが標 準ライブラ リ関数です これは自作 の関数です ここで定義(説明)されています
printf( ・・・・ ) { ・・・・・ ・・・・・ } scanf( ・・・・ ) { ・・・・・ } • #include <stdio.h> • double f( double x) • { • double y; • y = x*x+3*x+2; • return y; • } • int main(void) • { • double x,y; • printf("x=?"); • scanf("%lf", &x); • y = f(x); • printf("y=%f\n",y); • } ここで定義 されている のです!! 標準ライブラリ関数とは?
標準ライブラリ関数とは? • printf()やscanf()などの標準ライブラリ関数は,「ヘッダファイル」の中に種類毎に整理して保存されています。 • printf()やscanf()は,入出力に関する関数なので,そのような関数を集めた,「stdio.h」というヘッダファイルの中にその定義(説明)が書いてあります。 • そのヘッダファイルを「include(含む)」処理すると,そのヘッダファイルの中にある関数が使える,という訳です。 • stdioは,STanDard Input Outputの略で,「標準入出力」という意味になります。
文字列の処理 • C言語には,文字列を処理するための便利な関数が用意されています。 • これらの関数は,「string.h」というヘッダーファイルに定義されているので,これをincludeして利用します。 • 次のような関数があります。 • 文字列の代入(コピー) • 文字列の長さを求める • 文字列を比較する • 文字列を連結する
a a[0] a[1] a[2] a[3] 文字列の処理文字列の代入(コピー) • char型では,1文字しか扱えません。 ‘C’ a=‘C’; char a; • 配列にすると文字列が入力出来ますが・・ h a m a char a[4];
h a m a h a m a a[3] a[0] a[1] a[2] 文字列の処理文字列の代入(コピー) • その入力方法は一文字ずつになってしまい, char a[4]; a[0]=‘h’; a[1]=‘a’; a[2]=‘m’; a[3]=‘a’; なかなか面倒です。。。
h a m a h a m a a[0] a[1] a[2] a[3] 文字列の処理文字列の代入(コピー) • ところが,string.hにあるstrcpy()関数を使うと,簡単に文字列の代入ができます! char a[4]; strcpy(a,”hama”);
文字列の処理文字列の代入(コピー) • ensyu54.cで関数strcpyの動作を確認しましょう。
文字列の処理文字列の長さを求める • 文字列の長さ(文字数)を求める時は,strlen( )関数を用います。 • strlen( )関数は,返り値として文字数を返します。 • ensyu55.cで動作を確認しましょう。
文字列の処理文字列の長さを求める • それでは,文字列の長さを求める関数を自分で作ってみましょう。 • ヒント • 文字列の最後には,’\0’が保存されています。 • ‘\0’を発見するまで文字をカウントしていけばよいことになります。 • 次のスライドのフローチャートを参考に考えてみましょう。 • ensyu56.cを完成させてください。
文字列の処理文字列の長さを求める n=0; i=0; s[i] !=‘\0’ No 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); の結果 *文字コードが「大きい」とは,その文字が辞書内で後ろにある事を意味します
文字列の処理文字列を比較する • ある文字列の中から,キーワードを検索するプログラムを作ってみましょう。 • キーワードは,3文字の文字列とします。 • ヒント • 文字列から,順に3文字ずつ抜き出して,キーワードと比較します。比較にはstrcmp( )を利用します。 • 一致したら,「一致しました」と表示し,何文字目にあったかを表示します。 • この処理を文字列の最後まで繰り返します。 • ensyu58.cを完成させてください。
文字列の処理文字列を連結する • 文字列同士をつなげて一つの文字列にする時には,strcat( )関数を使います。 strcpy(s1, “ABCD”); strcpy(s2, “EFGH”); strcat(s1, s2); を実行すると。。 s1の文字列が,”ABCDEFGH”となります *ensyu59.cで動作を確認しましょう。