140 likes | 260 Views
プログラミング論. 第十八回 ・よく使う処理は関数にしよう②. 本日の内容. 簡単な関数の例 関数の構成 ローカル変数の宣言 戻り値と return 文 関数の呼び出し 関数のプロトタイプ宣言 戻り値のない関数 グローバル変数. 演習(復習). 実数を四捨五入して整数にする処理を,関数で実現するプログラムを作成しなさい。 ensyu45c.c を確認して下さい。. プロトタイプ宣言. ensyu46.c は, ensyu44.c を改訂したものです。 main 関数を最初に配置し,後ろに関数 f を配置しています。 コンパイルするとどうなるでしょうか?.
E N D
プログラミング論 第十八回 ・よく使う処理は関数にしよう②
本日の内容 • 簡単な関数の例 • 関数の構成 • ローカル変数の宣言 • 戻り値とreturn文 • 関数の呼び出し • 関数のプロトタイプ宣言 • 戻り値のない関数 • グローバル変数
演習(復習) • 実数を四捨五入して整数にする処理を,関数で実現するプログラムを作成しなさい。 • ensyu45c.cを確認して下さい。
プロトタイプ宣言 • ensyu46.cは,ensyu44.cを改訂したものです。 • main関数を最初に配置し,後ろに関数fを配置しています。 • コンパイルするとどうなるでしょうか?
プロトタイプ宣言 • こんなエラーが出ます。 警告 W8065 ensyu46.c 12: プロトタイプ宣言のない 関数 'f' の呼び出し(関数 main ) エラー E2356 ensyu46.c 20: 'f' の再宣言で型が一致していない • では,一つずつ考えていきましょう。
プロトタイプ宣言 警告 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と いうのが出てきた。 こんなものは聞いたことがない から勝手に解釈して先に進み ます。
プロトタイプ宣言 エラー 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; } ここの段階でこのメッセージ が出力されます。 さっき初めて見たからこっちで 勝手に解釈していたのに, こんなところで教えてくれたって もう遅い!
プロトタイプ宣言 • というわけで,初めて作って利用する関数は,「呼び出す関数の前に宣言をすませておかないと,コンパイル時に解釈できなくてエラーが出る」ということになります。 • プリプロセッサの位置に,「これからこういう関数を使いますよ」という関数の形の宣言をします。これを「プロトタイプ宣言」といいます。 • 関数名,引数の数・型,返り値(関数の結果)の型を宣言します。 • ensyu47.cでプロトタイプ宣言の方法を確認して下さい。
プロトタイプ宣言 プロトタイプ宣言 • #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の中に記載 してあるため,エラーとならない。
返り値のない関数 • 返り値がない関数の場合は,関数宣言時の返り値の型は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)。