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

Slides:



Advertisements
Similar presentations
知能情報工学演習 I 第 12 回( C 言語第6 回) 課題の回答 岩村雅一
Advertisements

プログラミング入門2 芝浦工業大学情報工学科青木 義満 第6回関数(2). プログラミング入門2 2 今回の講義内容 関数 配列データの受け渡し ( p.130 ~) 入出力と文字 ( p.198 ~) 文字列の基本 ( p.208 ~)
1 例題 ex3b ( 配列 ) 科学科プログラミング. 2 例題 : ex3b  以下の 3 つについて例題を進める ステップ 1 :配列 ステップ 2 :最小と最大 ステップ 3 :文字型の配列.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
第13回構造体.
第12回構造体.
プログラミング入門2 第6回 関数(2) 芝浦工業大学情報工学科 青木 義満
プログラミング演習(2組) 第12回
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
第8回 プログラミングⅡ 第8回
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
知能情報工学演習I 第12回(後半第6回) 課題の回答
プログラミング入門2 第11回 情報工学科 篠埜 功.
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
関数への道.
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語 はじめに 2016年 吉田研究室.
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
モジュール分割.
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
プログラミング 2 静的変数.
Presentation transcript:

プログラミング 関数編 情報科学科

プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる プログラムの一部分を再利用することが困 難 一連の処理を構成する意味のある部分処理をそ れぞれまとめたい

関数 汎用的に使用するコードや意味のある 部分処理を関数として一つの単位にま とめる main は一つの「関数」である 関数を使用するためには以下の部分が 必要となる プロトタイプ宣言 関数の定義 関数の呼び出し ( 関数の使用 ) p.126 ~

関数について 「関数呼出し」と「関数定義」 「プロトタイプ宣言」 「引数」 → 「実引数」と「仮引数」 「戻り値 ( 返り値 ) 」 「値渡し (Call by value) 」

機能と関数 ある一連の処理 ( 目的 : 機能 ) を実現する 手段が関数である 機能 f 引数 戻り値 x y z

#include float triangle(float,float); /* ← プロトタイプ宣言 */ int main(void) { float w, h, a; char line[100]; printf( “ width = "); fgets(line, sizeof(line), stdin); sscanf(line, "%d", &w); printf( “ highth = "); fgets(line, sizeof(line), stdin); sscanf(line, "%d", &h); area = triangle( w, h ); /* ← 関数呼び出し */ printf( “ size = %f\n", a); return 0; } float triangle ( float width, float height ) { float area; /* 変数定義 */ area = width * height / 2.0; /* 関数の計算本体 */ return area; } w とhの入力 変数の宣言 結果の出力

プロトタイプ宣言 コンパイラに対して、以下のことを教える どういう名前の関数で、 どのような型を戻り値にするか、 どのような型の引数を いくつ取るかを教える 例 : float triangle ( float, float ); プロトタイプ宣言には引数名は必要ない

関数に渡すパラメータ 引数(実引数) 関数の呼出し 関数をプログラム中で「使う」部分 代入文の右辺や条件式の一部に現れる 例 : area = triangle( w, h ); : if ( triangle(w, 3.2) < 40.9) { : printf(" %f\n", triangle(width, height)); :

関数の戻り値は一つ 通常、関数からの戻り値が 1 つだけ返される 計算結果や処理の終了状態 ( 正常終了 / 異常終了 ) 等 を戻り値として呼び出し側に返す。 例外 …… 0 個の場合 ( 関数の型が void) なにか仕事をして終ったことを通知 ( 関数からぬける ) 、呼出し側に戻る 2 個以上の値 ( 結果 ) を呼出し側に返したい場合 どの関数からも読み書きできる大域変数を用いる ポインタ (Call by reference) を使う → 詳細はポインタの所で

関数定義 関数の内容を詳細に記述する部分 例 : float triangle ( float width, float height ) { float area; /* 変数定義 */ area = width * height / 2.0; /* 関数の計算本体 */ return area; } 関数の型 関数名 (仮)引数 プロトタイプ宣言 と 型、名前、個数が 一致すること 引数の変数は、関 数の中で宣言しな くても使用できる 戻り値を返すため の return 文 関数の型 と戻り値の 型は一致

#include void printpage(int); int main(void) { int x; n = 1; printpage(n); n = n + 1; printpage(n); n = n + 1; printpage(n); return 0; } void printpage(int x) { printf("- %d -\n", x); printf("\n"); return; } 例1

実行結果

#include void printpage(int); int main(void) { int x; n = 1; printpage(n); return 0; } void printpage(int x) { printf("- %d -\n", x); printf("\n"); x = x + 1; return; } nの更新も関数内で 失敗する どうなるだろう? なぜだろう? 例2

どうなるだろう? - 1 -

なぜだろう? 関数の仮引数 x には、 実引数 n そのものではなく 実引数 n のコピーが渡るためです。 コピーを書き換えても オリジナルは破壊されません。 これを値渡し (call by value) といいます。

#include void printpage(void); int main(void) { int x; printpage(); return 0; } void printpage(void) { static int x = 0; printf("- %d -\n", x); printf("\n"); x = x + 1; return; } 例3例3 静的変数 静的変数を使うと、それが 属する関数が何回呼ばれて も、その変数はプログラム が動いている間ずっと値を 保持し続けることが出来る。

関数を利用する利点 プログラム作成の際、見通しが良くな る。 関数を使用すれば、そこで「何をするの か」が分かり、詳細に「どうする」まで考 えなくてもよい。 関数の定義では、「どうする」だけに集中 してプログラミングできる。 関数をくり返し利用することができて 効率がよくなる。 別のプログラムにも再利用が容易にな る。

変数のスコープ 教科書 p.123 ~を参照 ローカル変数 ( 局所変数 ) グローバル変数 ( 大域変数 )

ローカル変数 ( 局所変数 ) ブロック ("{" と "}" で括られた部分 ) 内 だけで使用できる変数 "{" の直後 ( ブロックの先頭 ) で宣言される 宣言されたブロック中だけで有効 → ブロックの外側では使用できない ブロック内のブロックで同名の変数が宣言 された場合には、最も内側のブロックで宣 言されている変数が使用される

グローバル変数 ( 大域変数 ) main を含む関数の一番外側のブロック よりも外側で宣言された変数 どの関数からも参照できる変数 極力グローバル変数の使用は避ける 名前の衝突が起こり安くなる 別の関数で変更される可能性があり、プログラ ム修正の波及効果が大きくなる → バグを埋め込んでしまう可能性が高くなる

#include void printx(void); int main(void) { int x; char line[100]; printf("x = "); fgets(line, sizeof(line), stdin); sscanf(line, "%d", &x); printx(); return 0; } void printx(void) { printf( “ x = %d ”, x); /* エラー */ return; } X の入力 例4例4

#include void printx(int); int main(void) { int x; char line[100]; printf("x = "); fgets(line, sizeof(line), stdin); sscanf(line, "%d", &x); printx( x ); return 0; } void printx(int x) { printf( “ x = %d ”, x); /* エラー */ return; } X の入力 例5例5

#include int x; void printx(void); int main(void) { char line[100]; printf("x = "); fgets(line, sizeof(line), stdin); sscanf(line, "%d", &x); printx(); return 0; } void printx(void) { printf( “ x = %d ”, x); return; } X の入力 例6例6

プリプロセッサ プリプロセッサとは プログラムのコンパイル段階で行わ れる 前処理 プリプロセッサの機能 1)ファイルを取り込む 2)マクロ定義をする

ファイルを取り込む #include #include :指定したファイルを読み込み、そ の内容を あたかもそこに記述したように組 み込む #include 指定したファイルが、コンパイラのパスがと おっている場所から探索されて取りこまれる。 #include “ ファイル名 ” 指定したファイルが、作成者が示した場所から 探索されて取りこまれる。

ヘッダーファイル( ○○ .h) 関数の定義をヘッダーファイルとしてファイル化し、 #include で取り込んで利用する ヘッダーファイルの作り方 1)関数内で標準ライブラリ関数を使う場合は #include のように必要なヘッダーファイルを取り込 んでおく。 2)自作関数のプロトタイプ宣言を書く。 3)関数の定義を書く。 4)拡張子 "h" で好きな名前にして保存する。 ヘッダーファイルの取り込み方 1)標準で用意されているヘッダーファイル → 例 )#include 2)自分で作ったヘッダーファイル → 例 )#include "jisaku.h"

マクロを定義する #define マクロとは: ある特定の数値、値を、 指定した特定の文字列に置き換えるこ と

マクロの使用例 例1) #define kuku 81; ・・・ printf( “ %d ”,kuku) 例2) #define OUT(x) printf(" 数値の値は %d です。 \n",x); ・・・ OUT(a);

マクロの使用例 注意! #define square(x) x * x ; ・・・ a=3; b=1; ・・・ printf( “ (a+b)*(a+b)=%d ”,square(a+b));

square(a+b) a+b*a+b 3+1* 単なる文字列の書き換え

まとめ 関数は、一連の処理を構成する意味の ある部分処理のまとまりに名前を付け たもの 似た処理の共通部分を関数化すること で、再利用ができる 呼出し側で複雑な処理を考えなくてよ くなるのでプログラムの見通しが良く なる main 関数の記述をできるだけ簡素化し、 main 関数を見れば処理全体の流れを把握で きるようにプログラムを作ろう