1 / 14

プログラミング論

プログラミング論. 第十八回 ・よく使う処理は関数にしよう②. 本日の内容. 簡単な関数の例 関数の構成 ローカル変数の宣言 戻り値と return 文 関数の呼び出し 関数のプロトタイプ宣言 戻り値のない関数 グローバル変数. 演習(復習). 実数を四捨五入して整数にする処理を,関数で実現するプログラムを作成しなさい。 ensyu45c.c を確認して下さい。. プロトタイプ宣言. ensyu46.c は, ensyu44.c を改訂したものです。 main 関数を最初に配置し,後ろに関数 f を配置しています。 コンパイルするとどうなるでしょうか?.

tass
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. 本日の内容 • 簡単な関数の例 • 関数の構成 • ローカル変数の宣言 • 戻り値とreturn文 • 関数の呼び出し • 関数のプロトタイプ宣言 • 戻り値のない関数 • グローバル変数

  3. 演習(復習) • 実数を四捨五入して整数にする処理を,関数で実現するプログラムを作成しなさい。 • ensyu45c.cを確認して下さい。

  4. プロトタイプ宣言 • ensyu46.cは,ensyu44.cを改訂したものです。 • main関数を最初に配置し,後ろに関数fを配置しています。 • コンパイルするとどうなるでしょうか?

  5. プロトタイプ宣言 • こんなエラーが出ます。 警告 W8065 ensyu46.c 12:  プロトタイプ宣言のない                     関数 'f' の呼び出し(関数 main ) エラー E2356 ensyu46.c 20: 'f' の再宣言で型が一致していない • では,一つずつ考えていきましょう。

  6. プロトタイプ宣言 警告 W8065 ensyu46.c 12:  プロトタイプ宣言のない                     関数 'f' の呼び出し(関数 main ) #include <stdio.h> int main(void) { double x, y; printf("x="); scanf("%lf",&x); y = f(x); printf("y=%f\n",y); } double f(double x) { double y; y = x*x+3*x+2; return y; } ここの段階でこのメッセージ が出力されます。 ここでいきなり初めて関数fと いうのが出てきた。 こんなものは聞いたことがない から勝手に解釈して先に進み ます。

  7. プロトタイプ宣言 エラー E2356 ensyu46.c 20: 'f' の再宣言で型が一致していない #include <stdio.h> int main(void) { double x, y; printf("x="); scanf("%lf",&x); y = f(x); printf("y=%f\n",y); } double f(double x) { double y; y = x*x+3*x+2; return y; } ここの段階でこのメッセージ が出力されます。 さっき初めて見たからこっちで 勝手に解釈していたのに, こんなところで教えてくれたって もう遅い!

  8. プロトタイプ宣言 • というわけで,初めて作って利用する関数は,「呼び出す関数の前に宣言をすませておかないと,コンパイル時に解釈できなくてエラーが出る」ということになります。 • プリプロセッサの位置に,「これからこういう関数を使いますよ」という関数の形の宣言をします。これを「プロトタイプ宣言」といいます。 • 関数名,引数の数・型,返り値(関数の結果)の型を宣言します。 • ensyu47.cでプロトタイプ宣言の方法を確認して下さい。

  9. プロトタイプ宣言 プロトタイプ宣言 • #include <stdio.h> • double f(double); • int main(void) • { • double x, y; • printf("x="); • scanf("%lf",&x); • y = f(x); • printf("y=%f\n",y); • } • double f(double x) • { • double y; • y = x*x+3*x+2; • return y; • } double f(double); 引数の型と数 関数名 関数の結果(返り値)の型 printfやscanfは,標準ライブラリ 関数と言われ,stdio.hの中に記載 してあるため,エラーとならない。

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

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

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

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

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

More Related