関数の定義.

Slides:



Advertisements
Similar presentations
プログラミング 関数編 情報科学科. プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる.
Advertisements

第 11 章 関数について 11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 数学関数の自作.
プログラミング入門2 芝浦工業大学情報工学科青木 義満 第6回関数(2). プログラミング入門2 2 今回の講義内容 関数 配列データの受け渡し ( p.130 ~) 入出力と文字 ( p.198 ~) 文字列の基本 ( p.208 ~)
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
第13回構造体.
第12回構造体.
プログラミング入門2 第6回 関数(2) 芝浦工業大学情報工学科 青木 義満
プログラミング演習(2組) 第12回
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月6日、H.16(‘04)] 今日のメニュー 1 前回の課題の復習
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
関数 関数とスタック.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング論 ファイル入出力
第9回関数と記憶クラス.
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 条件による繰り返し.
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
関数への道.
プログラムの制御構造 配列・繰り返し.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
疑似乱数, モンテカルロ法によるシミュレーション
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
アルゴリズムとプログラミング (Algorithms and Programming)
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第13回 ポインタ 1 1.
C言語復習 来週もこの資料を持参してください.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
高度プログラミング演習 (11).
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
モジュール分割.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
モバイルプログラミング第2回 C言語の基礎 (1).
第10回 関数と再帰.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
プログラミング演習I 補講用課題
プログラミング 2 静的変数.
Presentation transcript:

関数の定義

前回の復習 配列・配列の初期化 while, for, do 文 break, continue, goto文

printf()は便利だなー printf(“Hello, world !\n”); 実引数という。また、printf(“Hello, world\n”)を関数を評価する、または、printfに “Hello, world\n”を引数に与えて関数を呼び出すという。関数の評価は 関数名(実引数) の形をとる ひとまとまりの処理を内部の動作を見えない形で実現するものを関数という

数学的関数

C言語での関数の定義 省略可.ある場合は計算結果があってはならない! 関数の型 関数名(仮引数1の型,{仮引数2の型,…}); /*プロトタイプ宣言*/ 関数の型 関数名(仮引数1の型 仮引数名1,{仮引数2の型 仮引数名2,…}) { 変数の宣言 文 return(計算結果); } void 関数名(仮引数1の型 仮引数名1,{仮引数2の型 仮引数名2,…}) {return;} 省略可.ある場合は計算結果があってはならない!

関数定義の例 実数を2つ取って、その和を計算する関数 #include <stdio.h> double dadd(double, double); int main(void) { dou ble a,b,c; scanf(“%lf%lf”,&a,&b); c=dadd(a,b); printf(“%f+%f=%f\n”,a,b,c); } double dadd(double x, double y) { double z; z =x + y; return(z); } プロトタイプ宣言のメリット 実引数と仮引数の型の不一致の検出 → バグの発見 実引数の自動型変換

仮引数への実引数の引き渡し double dadd(double x=2, double y=3) { double z; z =x + y; return(z); } #include <stdio.h> double dadd(double, double); int main(void) { dou ble a,b,c; scanf(“%lf%lf”,&a,&b); c=5; printf(“%f+%f=%f\n”,a,b,c); } double dadd(double x=2, double y=3) { double z; z =x + y; return(5); } #include <stdio.h> double dadd(double, double); int main(void) { dou ble a,b,c; scanf(“%lf%lf”,&a,&b); c=dadd(a,b); printf(“%f+%f=%f\n”,a,b,c); } dadd(2,3)

関数導入の理由 プログラムの構造を見やすくし、ソースファイルをコンパクトに トップダウン的プログラムの作成 関数毎にプログラムを分割して作製 (引数と返り値の属性と名前さえ分かっていればプログラムの作成は可能) 関数内での処理の隠蔽(ぺい) 関数のライブラリ化による共有化のメリット

例 int i; for(i=0;i<N;i++) scanf("%lf",&data1[i]); #include <stdio.h> #define N 100 #define M 100 int main(void) { double data1[N], data2[M]; ReadData(data1, N); ReadData(data2, M); } void ReadData(double data[], int n) int i; for(i=0;i<n;i++) scanf("%lf", &data[i]); int i; for(i=0;i<N;i++) scanf("%lf",&data1[i]); for(i=0;i<M;i++) scanf("%lf",&data2[i]);

変数の有効範囲:自動変数と静的変数(1) [自動変数] ○ 自動変数はブロック内で定義された変数で、そのブロック{}内だけで有効で、プログラムがそのブロックの外に出ると自動的に消滅する。初期化はプログラムが{}に入る毎にされる。 int main(void) { int a; a = 1; int a: a = 2; } printf("a = %d\n",a); { int b; a = 2; } int a; a = b; ○ ×

変数の有効範囲:自動変数と静的変数(2) [静的変数] [大域変数] staticを付けるとそのファイル内だけで有効になる! プログラムの実行の前に一回だけ初期化され、プログラムの実行中は常に 定義されている変数 [大域変数] 全ての{}の外で宣言されている変数は基本的に全てのプログラム内で使用可能。 staticを付けるとそのファイル内だけで有効になる!

static変数の応用 関数の呼び出された回数を関数内に記憶する void f1() { static int count=0; ... } void f2() .... 関数の呼び出された回数を関数内に記憶する

関数の再帰呼び出し(1) 定義している関数内で、その関数を呼び出す 演算の再帰的定義に類似 → 効率的なプログラミング → 再帰的に定義されるデータ構造処理が簡潔

関数の再帰呼び出し(2) Int factorial(int n) { if(n==0) return(1); else   return(n*factorial(n-1)); }

factrial(3)の実行例 int ans; ans = factorial(3); int ans; ans = 6; factorial(n←3) { return(3*factrial(2)); } factorial(n←3) { return(3*2); } factorial(n←2) { return(2*factrial(1)); } factorial(n←2) { return(2*1); } factorial(n←1) { return(1*factrial(0)); } factorial(n←1) { return(1*1); } factorial(n←0); { return(1); }

main()も関数だった int main(void) {…} もmainという関数の定義だった 引数はなし、戻り値は整数 Cのプログラムでは最初必ずmainという関数が実行される