復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.

Slides:



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

前回の関数のまとめ (1) プログラムは main() 関数の先頭から実行される 関数は main() 関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数 ( 変数 ) に コピーされる 関数内で求めた値は return 文によって関数値として呼び出し側に戻され.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
A B x y z 復習 構造体変数 普通の変数 x y z 構造体変数 x y z 箱のイメージ 引き出しのイメージ
ループで実行する文が一つならこれでもOK
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数(2) 芝浦工業大学情報工学科 青木 義満
プログラミング演習(2組) 第12回
情報処理Ⅱ 2005年12月9日(金).
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
構造体.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
関数 関数とスタック.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング論 ファイル入出力
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
関数への道.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
復習 前回の関数のまとめ(1) プログラムはmain()関数の先頭から実行される
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
プログラミング 3 2 次元配列.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
値渡しと参照渡しについて.
第2章 数値の入力と変数 scanfと変数をやります.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
プログラミング演習I 補講用課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
プログラミング 2 静的変数.
Presentation transcript:

復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数(変数)に コピーされる 関数内で求めた値はreturn文によって関数値として呼び出し側に戻される. #include <stdio.h> float menseki(float a, float b) { return (a * b / 2); } int main(void) float x, y, kekka; printf("底辺は?"); scanf(" %f ", &x); printf("高さは?"); scanf(" %f ", &y); kekka = menseki(x, y); printf("面積は%fです.\n", kekka); x,y:実引数 a, b: 仮引数 仮引数もローカル変数 →関数内でのみ有効 関数の定義 関数の呼び出し

復習 前回の関数のまとめ(2) 関数はプログラム上の部品(機能単位)である. 関数内の変数はお互いに独立である(干渉しない). #include <stdio.h> float menseki(float a, float b) { float s; s = a * b / 2; return s; } int main(void) float a, b, kekka; printf("底辺は?"); scanf(" %f ", &a); printf("高さは?"); scanf(" %f ", &b); kekka = menseki(); printf("面積は%fです.\n", kekka); menseki()関数 同じ変数名a,bでも,関数が違うと,別の変数と見なされる main()関数

復習 関数定義におけるreturn 文 float menseki(float a, float b) { float s; s = a * b / 2; return s; } float menseki(float a, float b) { return a * b / 2; } return文の文法  return 式; return文を実行すると関数を終了する.式の値を関数値として戻す. int func(int x, int y) { if (x*y % 2 == 0) return 1; } return文を実行しない場合があるのでダメ. int func(int x, int y) { if (x*y % 2 == 0) return 1; } else return 0; return文は複数あってもOK.但し,どのような場合でも必ずその一つを実行すること. return文で戻る値を返り値 あるいは戻り値と呼ぶ

menseki()関数の戻り値が変数に代入されていない! float menseki(float a, float b) { float s; s = a * b / 2; return s; } int main(void) float x, y; printf("底辺は?"); scanf("%f", &x); printf("高さは?"); scanf("%f", &y); menseki(x, y); printf("計算はしたよ\n"); printf(・・・) scanf(・・・) main() これらは全て関数 但し,一般に戻り値は利用されない menseki()関数の戻り値が変数に代入されていない! 質問 これはコンパイル エラーになるか? 答え エラーにはならない. 関数値の戻り値は代入され なくてもかまわない.

引数としてvoidと書くと,引数が無いことを宣言 関数値を持たない(返さない)関数の定義 void kansu(float a, float b) { .... return; } voidは戻り値が無いことを宣言 何も返さないので,return 式 ; とは書かない. return文の省略も可能! 引数としてvoidと書くと,引数が無いことを宣言 int main(void) { int x; x = kansu(3, 4); printf("x=%d, %d", x, kansu(2,5)); } int func(void) { return 5; } int main(void) printf("値は%d", func()); void 宣言された関数の関数値を利用しようとするとエラー

main()関数 main()関数は特殊な関数である 関数値は int型 (関数値を戻す) voidなので引数は無い int func(void) { return 5; } int main(void) printf("値は%d", func()); voidなので引数は無い void 宣言されていない関数ではreturn文は省略できないはず!! main()関数は特殊な関数である

?? 関数の戻り値のまとめ 引数を10倍する関数 疑問 なぜこのmul10()関数は 意図どおりに働かないか? 戻り値がある関数でも,必要がなければ,呼び出し側でそれを使わなくても(代入しなくても)かまわない. 戻り値が無い関数を定義する場合,あらかじめvoid宣言をする.この場合,return文で値を戻さない.また,return文自体も省略可. void宣言された関数で戻り値を利用しようとするとエラーになる. void mul10(int a) { a = a * 10; return; } int main(void) int x = 12; mul10(x); printf("x = %d", x); 引数を10倍する関数 疑問 なぜこのmul10()関数は 意図どおりに働かないか? x = 12 ??

x a 12 120 12 引数の値渡し 引数を10倍する関数 関数呼び出し main()関数 mul10()関数 変数 引数の値のコピー int main(void) { int x = 12; mul10(x); printf("x = %d", x); } void mul10(int a) { a = a * 10; return; } 原則 引数のコピーが関数に渡され,呼び出し側の変数は変化しない. ⇒値渡し(call by value) x = 12 関数呼び出し a 12 x main()関数 変数 mul10()関数 12 引数の値のコピー 120 局所変数 ローカル変数 return文実行 例外 ポインタ引数,配列引数 ⇒参照渡し(call by reference)

配列を引数とする関数 n個のデータの合計を求める関数 データの個数がn個 (≠配列宣言の要素数) データを入れる配列 #include <stdio.h> int sum(int data[], int n) {   int s = 0, i;   for (i = 0; i < n; i++)   { s = s + data[i]; }   return s; } int main(void)   int i, aa[50], s;   // 配列aa[]に30個のデータを入力する   ・・・ //省略   s = sum(aa,30);   printf(“データの合計は%d\n”,s); データの個数がn個 (≠配列宣言の要素数) 理由:配列宣言時の要素数と有効なデータ数は 同じではないので! データを入れる配列 要素数を空欄にする.→data[n]× data[0]× aa[0]からaa[29]に30個の値を代入しておく 関数呼び出し 配列名のみ書く.[ ]は不要 有効なデータの個数は30個 配列引数は自動的に参照渡しだが,この例では配列要素の値は変化させていない

配列引数(参照渡し)を用いた関数 n個のデータの値を10倍する関数 関数宣言と引数の書き方は同じ #include <stdio.h> void mul10(int data[], int n) {   int i;   for (i = 0; i < n; i++)   { data[i] = data[i]*10; } } int main(void)   int i, aa[50], s;   // 配列aa[]に30個のデータを入力する   ・・・ //省略   mul10(aa,30);   printf(“データを全て10倍すると”);   ・・・   //データの表示(省略) 関数宣言と引数の書き方は同じ 配列引数は参照渡しであるため,呼び出し側の配列の値が変化する! 関数の呼び出し方法も同じ 配列aa[0]~aa[29]の値は全て10倍されている. 参照渡しにより配列要素の値を変化させる例

引数のまとめ 値渡し(基本) 関数を呼び出した側の実引数の値が変化しない. 配列引数とポインタ引数を除く他の全ての引数 参照渡し(例外) 関数を呼び出した側の実引数の値が変化する. 以下の二つのみ.  配列引数  ポインタ引数(2年で学習)

関数のデバッグ [A] ツールバーでデバッグを始める手順 ツールボタンで右クリックして,デバッグを選ぶ デバッグツールバーからボタンを選ぶ ステップインは関数内部に入って1行づつ実行する (3) (2) (1) (1)ステップオーバー 次の行を実行 (2) ステップイン 次の行を実行 (3) デバッグの中止 デバッグをやめる [B] メニューでデバッグを始める手順 デバッグメニューで,ステップオーバーを選ぶ