Microsoft PowerPoint - 5Chap10.ppt

Similar documents
プログラミング実習I

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

情報処理Ⅰ演習

gengo1-11

memo

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

講習No.12

基礎プログラミング2015

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft Word - no11.docx

02: 変数と標準入出力

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Prog1_10th

Microsoft PowerPoint - prog07.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

02: 変数と標準入出力

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

memo

PowerPoint プレゼンテーション

Microsoft PowerPoint - 09.pptx

プログラミング入門1

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

Microsoft PowerPoint - 12.ppt [互換モード]

gengo1-10

Microsoft PowerPoint - 11.pptx

Prog1_6th

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint - 13.ppt [互換モード]

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

kiso2-06.key

Microsoft PowerPoint - ca ppt [互換モード]

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

Microsoft Word - 03

Microsoft Word - Training10_プリプロセッサ.docx

プログラミングI第10回

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

ポインタ変数

Microsoft Word - no202.docx

Microsoft PowerPoint pptx

02: 変数と標準入出力

PowerPoint プレゼンテーション

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

02: 変数と標準入出力

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

Microsoft PowerPoint pptx[読み取り専用]

gengo1-12

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint - 10.ppt [互換モード]

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション - 物理学情報処理演習

PowerPoint プレゼンテーション

02: 変数と標準入出力

gengo1-12

02: 変数と標準入出力

プログラミング入門1

gengo1-12

memo

プログラミングI第6回

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

Taro-ポインタ変数Ⅰ(公開版).j

C-programming_kouza4(2007)

Microsoft Word - no12.doc

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

配列, 関数, 構造体

プログラミング基礎I(再)

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - 11.ppt [互換モード]

Microsoft PowerPoint - handout07.ppt [互換モード]

メソッドのまとめ

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

Microsoft PowerPoint - CproNt02.ppt [互換モード]

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

アクション講座 第1回目

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

Slide 1

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

数値計算

PowerPoint Presentation

02: 変数と標準入出力

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Microsoft PowerPoint - 12.ppt [互換モード]

第1回 プログラミング演習3 センサーアプリケーション

68 A mm 1/10 A. (a) (b) A.: (a) A.3 A.4 1 1

Microsoft PowerPoint - prog08.ppt

C 言語第 8 回 複素微分方程式の解法 1 1 複素数の係数を持つ 1 階の微分方程式 複素数を z として 微分方程式は dz dt = である 特に とする f ( z, t) ( ) 実際には が含まれていないので ( ) f ( z, t) = i z Ü t f (

Microsoft PowerPoint pptx

Microsoft Word - no15.docx

Microsoft PowerPoint - prog04.ppt

02: 変数と標準入出力

Microsoft PowerPoint pptx

ポインタ変数

kiso2-09.key

Transcription:

第 11 章関数について 11.1 標準ライブラリ関数 11. 関数呼び出しのオーバーヘッド 11. 大域変数 11.4 プロトタイプ宣言数学関数の自作 11.1 標準ライブラリ関数 予め定義されており ユーザが定義 作成しなくても使える関数 ヘッダ部に以下のマクロが必要 #iclude <mth.h> pritf, scf 等の入出力関数 sqrt, si 等の数学関数 #iclude <stdlib.h> mlloc, clloc, rd 等の関数 11. 関数呼び出しのオーバーヘッド 関数を呼び出す時 実際の計算以外のことに使われるマシンへの余分な負荷をオーバーヘッドという 関数に渡すデータ ( 引数 ) などのコピー時間や そのためのメモリ消費など 呼び出し回数が多いと無視できなくなる 関数の呼び出し回数が少なくて済むプログラムに プログラム例 11..1 改 #iclude <stdlib.h> #iclude <widows.h> #prgm commet(lib, "wimm.lib") #defie N 1 it i, t1, t; sttic double [N], b[n], c[n]; for (i = ; i < N; i++) [i] = rd()/1.; b[i] = rd()/1.; for (i = ; i < N; i++) c[i] = [i] + b[i]; t = timegettime(); pritf("elpsed time = %d ms ", t-t1); pritf("&i=%u, &t1=%u, &t=%u ", &i, &t1, &t); pritf("mi=%u ", mi); pritf("=%1u, &[N-1]=%1u ",, &[N-1]); pritf("b=%1u, &b[n-1]=%1u ", b, &b[n-1]); pritf("c=%1u, &c[n-1]=%1u ", c, &c[n-1]); retur ; ex11 1.c 1 万個の配列の足し算の実行時間を計測

プログラム例 11.. 改 #iclude <stdlib.h> #iclude <widows.h> #prgm commet(lib, "wimm.lib") #defie N 1 double sum(double x, double y)retur (x + y); it i, t1, t; sttic double [N], b[n], c[n]; for (i = ; i < N; i++) [i] = rd()/1.; b[i] = rd()/1.; for (i = ; i < N; i++) c[i] = sum([i], b[i]); t = timegettime(); pritf("elpsed time = %d ms ", t-t1); pritf("&i=%u, &t1=%u, &t=%u ", &i, &t1, &t); pritf("mi=%u, sum=%u ", mi, sum); pritf("=%1u, &[N-1]=%1u ",, &[N-1]); pritf("b=%1u, &b[n-1]=%1u ", b, &b[n-1]); pritf("c=%1u, &c[n-1]=%1u ", c, &c[n-1]); retur ; ex11.c プログラム例 11..1 改にあえて関数を使ったら 1 万個の配列の足し算の実行時間を計測 実行例 Z: yumo>ex11 1 elpsed time = 5 ms &i=1158, &t1=11588, &t=11584 mi=4198896 = 164488, &[N-1]= 4448 b= 4488, &b[n-1]= 8448 c= 84488, &c[n-1]= 16448 Z: yumo>ex11 elpsed time = 469 ms &i=1158, &t1=11588, &t=11584 mi=419897, sum=4198896 = 164488, &[N-1]= 4448 b= 4488, &b[n-1]= 8448 c= 84488, &c[n-1]= 16448 スタック領域プログラム領域 データ領域 1,, 8バイト = 8,,バイトずつ増加 関数 sum を 1 万回呼び出しているため オーバーヘッドにより時間がかかっている プログラム領域 プログラム例 11.. 改 #iclude <stdlib.h> #iclude <widows.h> #prgm commet(lib, "wimm.lib") #defie N 1 void sum(it, double *x, double *y, double *z) it i; for (i = ; i < ; i++) z[i] = x[i] + y[i]; it i, t1, t; sttic double [N], b[n], c[n]; for (i = ; i < N; i++) [i] = rd()/1.; b[i] = rd()/1.; 関数 sumの呼び出しは1 回 sum(n,, b, c); t = timegettime(); pritf("elpsed time = %d ms ", t-t1); pritf("&i=%u, &t1=%u, &t=%u ", &i, &t1, &t); pritf("mi=%u, sum=%u ", mi, sum); pritf("=%1u, &[N-1]=%1u ",, &[N-1]); pritf("b=%1u, &b[n-1]=%1u ", b, &b[n-1]); pritf("c=%1u, &c[n-1]=%1u ", c, &c[n-1]); retur ; ex11.c ポインタを使って結果を返す方法 実行時間は ex11 1.c と同程度 11. 大域変数 (globl vrible) 全ての関数からアクセス可能な変数 1.4 で学習した グローバル変数 外部変数 (exter) 自動変数 (uto) 局所変数 (locl vrible) とは対立する概念 以下のつのプログラム例を参照 静的領域に確保 スタック領域に確保

1.4 関数と変数の可視範囲より引用 関数内で宣言した変数は その関数内でのみ可視アクセス可能変数の可視範囲 = スコープある関数の中でのみ通用する変数 = 局所変数 局所変数の例 プログラム例 1.4.1 mi と scope_rule の両方で同じ変数,b を用いても良い it = 1, b = ; この,b のスコープは mi のみ pritf(" 関数呼び出し前 &=%u:=%d, &b=%u:b=%d ",&,,&b,b); scope_rule(); pritf(" 関数呼び出し後 &=%u:=%d, &b=%u:b=%d ",&,,&b,b); retur ; 同じ変数名,b でも 関数ごとに別々にスコープが割り当てられる void scope_rule(void) it, b; この,b のスコープは scope_rule のみ = ; b = 4; pritf(" 関数内部では &=%u:=%d, &b=%u:b=%d ",&,,&b,b); 大域変数の例 プログラム例 11..1 void sum(void); void diff(void); double x, y; この x,y のスコープは全ての関数 x = 1.5; y = 56.7; sum(); diff(); retur ; 関数 sum や differece で新たに変数宣言していないので x,y といえば 4 行目で宣言された変数 x,y を指す void sum(void) 関数 sum や differece に引数は不要 pritf("&x=%u, &y=%u, 和は %f ", &x, &y, x + y); void diff(void) pritf("&x=%u, &y=%u, 差は %f ", &x, &y, x - y); 一見 便利! 混在する場合 プログラム例 11.. void scope_rule(void); it u, v; この u,v のスコープは全ての関数 混乱を招くので 乱用しない u = 1; v = ; pritf(" 関数の呼び出し前 &u=%u:u=%d, &v=%u:v=%d ", &u,u,&v,v); scope_rule(); pritf(" 関数の呼び出し後 &u=%u:u=%d, &v=%u:v=%d ", &u,u,&v,v); retur ; 関数内での局所変数名に大域変数名と同じ void scope_rule(void) ものを用いても構わない この u,v のスコープは scope_rule のみ it u, v; u = 1; v = ; pritf(" 関数内では &u=%u:u=%d, &v=%u:v=%d ", &u,u,&v,v); 大域変数を使わないプログラミングを心がけよう!

11.4 プロトタイプ宣言 プロトタイプ宣言とは?( 教科書 p.78 参照 ) プログラム例 1.1.1 double sum(double x, double y); retur ; double sum(double x, double y) double z; z = x + y; retur z; プロトタイプ宣言 sum という関数を使う その詳細は後で定義 引数は double 型 個 戻り値は double 型 1 行でこれだけの意味を持つ sum という関数の定義部 プログラム例 11.4. it foo(it, it, double); double br(double, double); retur ; it foo(it u, it v, double w) double br(double m, double ) プロトタイプ宣言では 関数の引数となる変数名は省略できる 当然だが 関数定義では仮引数は必要 プロトタイプ宣言の必要性 戻り値の型や引数の型のクロスチェック バグを減らすために有効 引数の変数名は省略可 呼び出す前に必要 先に関数が定義されていれば なくてもよい 下請けの関数から順に書き mi 関数を最後にすれば 必要なし 標準ライブラリはヘッダファイル内でプロトタイプ宣言 指数関数の自作 ( 演習問題 1.5) 指数関数の級数展開と漸化式 e x = = = 1, 1 は 1 まででよい x x x x = 1+ + + +...! 1!!! = x / < 1 16 で収束判定, 1 1 < x < 1 で数学ライブラリ関数と比較 =, = +

指数関数の自作 ( 演習問題 1.5) 1 Exp 1 = 1...1 x / + の出力 を返す / < 1 16 brek mi i = 1...1 Exp(i), exp(i) の出力 #iclude <mth.h> double Exp(double x) it ; double =1, =1; for (=1; <1; ++) *= x/; += ; if (fbs(/) < 1e-16) pritf("%d, ", ); brek; retur ; it i; for (i=-1; i<=1; i++) pritf("%f, %f ", Exp(i), exp(i)); retur ; 指数関数の自作 ( 演習問題 1.5) 収束確認用なので完成後は削除する 自作 ライブラリ exp.c 三角関数の自作 ( 演習問題 1.5) 三角関数の級数展開と漸化式 si.c si x = = x, = ( 1) = 1 + 1 x x x x = x + +... ( + 1)!! 5! 7! x, ( + 1) 5 =, 7 = 1 + 本日のパズル次のプログラムは何を出力するか #defie PR(x) pritf("%g t",(double)x) #defie NL putchr(' ') #defie PRINT4(x1,x,x,x4) PR(x1);PR(x);PR(x);PR(x4);NL mi() double d; flot f; log l; it i; は 1 まででよい / < 1 16 で収束判定 1 < x < 1 で数学ライブラリ関数と比較 i = l = f = d = 1/; PRINT4(i,l,f,d); d = f = l = i = 1/; PRINT4(i,l,f,d); i = l = f = d = 1/.; PRINT4(i,l,f,d); d = f = l = i = (double)1/; PRINT4(i,l,f,d); 1 4