1 / 25

プログラミング論

プログラミング論. 第十九回 ・よく使う処理は関数にしよう -2 ・標準ライブラリ関数(文字列の処理). 本日の内容. 戻り値のない関数 グローバル変数 標準ライブラリ関数とは? 文字列の処理 文字列の代入 文字列の長さを求める 文字列の比較 文字列の連結. 返り値のない関数. 返り値がない関数の場合は,関数宣言時の返り値の型は void で宣言をします (ensyu48.c). #include <stdio.h> void putd(int); int main(void) { int dt=100; putd(dt);

keziah
Download Presentation

プログラミング論

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. プログラミング論 第十九回 ・よく使う処理は関数にしよう-2 ・標準ライブラリ関数(文字列の処理)

  2. 本日の内容 • 戻り値のない関数 • グローバル変数 • 標準ライブラリ関数とは? • 文字列の処理 • 文字列の代入 • 文字列の長さを求める • 文字列の比較 • 文字列の連結

  3. 返り値のない関数 • 返り値がない関数の場合は,関数宣言時の返り値の型は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文がない

  4. 演習:よく間違う例 • ensyu49.cは,変数xと変数yの値を交換するプログラムとして作ってみたものです。実行して,変数値が交換できることを確認しなさい。 • ensyu50.cは,交換の機能をswapという関数で実現しようとしたものです。しかし,これでは変数値が交換されません。この理由を考えなさい。

  5. グローバル変数 • 関数内で宣言された変数はローカル変数と呼ばれ,その関数内でのみ有効です。 • 同じ名前の変数があったとしても,異なる関数内で宣言されていれば,「違う家に住んでいる同姓同名の人」という扱いになり,まったく別の変数,と言うことになります。 • ただし,関数の外,プリプロセッサの位置で宣言された変数は「グローバル変数」と呼ばれ,どの関数からでも共通して利用できる変数になります。 • ensyu51.cで確認しましょう。

  6. グローバル変数 #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; • } グローバル変数 この値を共通 に利用できる 共通に利用できる

  7. 演習 • int型引数一つを受け取り,その数値の階乗を計算する関数int kaijo(int n)を完成させなさい(ensyu52.c)。 • グローバル変数を用いることによりデータ交換を可能にした関数void swap(void)を完成させなさい(ensyu53.c)。

  8. 標準ライブラリ関数とは? • プログラムは,いろんな処理を「関数」という単位で行っています。 • 先週は,いくつかの関数を自作して利用する方法を勉強しました。 • しかし,C言語には,普段よく使う処理があらかじめ関数として用意されています。 • printf,scanf,などです。 • これらの関数を「標準ライブラリ関数」と呼びます。

  9. #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); • } どこで定義 されているの でしょう?? 標準ライブラリ関数とは? これが標 準ライブラ リ関数です これは自作 の関数です ここで定義(説明)されています

  10. 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); • } ここで定義 されている のです!! 標準ライブラリ関数とは?

  11. 標準ライブラリ関数とは? • printf()やscanf()などの標準ライブラリ関数は,「ヘッダファイル」の中に種類毎に整理して保存されています。 • printf()やscanf()は,入出力に関する関数なので,そのような関数を集めた,「stdio.h」というヘッダファイルの中にその定義(説明)が書いてあります。 • そのヘッダファイルを「include(含む)」処理すると,そのヘッダファイルの中にある関数が使える,という訳です。 • stdioは,STanDard Input Outputの略で,「標準入出力」という意味になります。

  12. 文字列の処理 • C言語には,文字列を処理するための便利な関数が用意されています。 • これらの関数は,「string.h」というヘッダーファイルに定義されているので,これをincludeして利用します。 • 次のような関数があります。 • 文字列の代入(コピー) • 文字列の長さを求める • 文字列を比較する • 文字列を連結する

  13. a a[0] a[1] a[2] a[3] 文字列の処理文字列の代入(コピー) • char型では,1文字しか扱えません。 ‘C’ a=‘C’; char a; • 配列にすると文字列が入力出来ますが・・ h a m a char a[4];

  14. 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’; なかなか面倒です。。。

  15. 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”);

  16. 文字列の処理文字列の代入(コピー) • ensyu54.cで関数strcpyの動作を確認しましょう。

  17. 文字列の処理文字列の長さを求める • 文字列の長さ(文字数)を求める時は,strlen( )関数を用います。 • strlen( )関数は,返り値として文字数を返します。 • ensyu55.cで動作を確認しましょう。

  18. 文字列の処理文字列の長さを求める • それでは,文字列の長さを求める関数を自分で作ってみましょう。 • ヒント • 文字列の最後には,’\0’が保存されています。 • ‘\0’を発見するまで文字をカウントしていけばよいことになります。 • 次のスライドのフローチャートを参考に考えてみましょう。 • ensyu56.cを完成させてください。

  19. 文字列の処理文字列の長さを求める n=0; i=0; s[i] !=‘\0’ No Yes n++; i++; printf(“文字数=%d\n”,n);

  20. 文字列の処理文字列を比較する • 2つの文字列を比較する時は,strcmp( )関数を用います。 • 二つの文字列を比較して,同じ場合は0を返り値として返します。 • 返り値は整数型です。 • 文字列が異なる場合は,どのような結果が返ってくるでしょう? • ensyu57.cで確認してください。

  21. 文字列の処理文字列を比較する • 二つの文字列が同じ場合の出力 文字列を入力してください(s1) abcdef 文字列を入力してください(s2) abcdef 文字列を比較します。。 比較結果は0です。

  22. 文字列の処理文字列を比較する • 二つの文字列が異なる場合の出力 文字列を入力してください(s1) abcdef 文字列を入力してください(s2) ghijkl 文字列を比較します。。 比較結果は-1です。 文字列を入力してください(s1) efghijkl 文字列を入力してください(s2) abcdefgh 文字列を比較します。。 比較結果は1です。 この違いは,どうして起こるのでしょう?

  23. 文字列の処理文字列を比較する • strcpy(s1, s2); の結果 *文字コードが「大きい」とは,その文字が辞書内で後ろにある事を意味します

  24. 文字列の処理文字列を比較する • ある文字列の中から,キーワードを検索するプログラムを作ってみましょう。 • キーワードは,3文字の文字列とします。 • ヒント • 文字列から,順に3文字ずつ抜き出して,キーワードと比較します。比較にはstrcmp( )を利用します。 • 一致したら,「一致しました」と表示し,何文字目にあったかを表示します。 • この処理を文字列の最後まで繰り返します。 • ensyu58.cを完成させてください。

  25. 文字列の処理文字列を連結する • 文字列同士をつなげて一つの文字列にする時には,strcat( )関数を使います。 strcpy(s1, “ABCD”); strcpy(s2, “EFGH”); strcat(s1, s2); を実行すると。。 s1の文字列が,”ABCDEFGH”となります *ensyu59.cで動作を確認しましょう。

More Related