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

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

Microsoft Word - no11.docx

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

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

プログラミング実習I

講習No.12

memo

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

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

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

Microsoft Word - no202.docx

kiso2-09.key

gengo1-11

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - prog06.ppt

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

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

Microsoft PowerPoint ppt

PowerPoint Presentation

kiso2-03.key

PowerPoint プレゼンテーション

cp-7. 配列

Microsoft PowerPoint - lec10.ppt

講習No.10

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

プログラミング実習I

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft Word - no13.docx

2. 整数の値を 3 つ 引数として受け取ってそのうち最大の値を返す関数 int max(int a,int b,int c) 3 つの中からの最大値, と値が少ないので, 配列を使わずにごり押しで最大値を求めてみ ました. 配列を使う方法については今までの解答を見ればわかるはずです. その場合受け

Microsoft PowerPoint - prog07.ppt

PowerPoint プレゼンテーション

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

memo

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

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

PowerPoint プレゼンテーション

スライド 1

02: 変数と標準入出力

Microsoft PowerPoint - 11.pptx

ゲームエンジンの構成要素

Microsoft Word - 03

gengo1-10

02: 変数と標準入出力

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft Word - no15.docx

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

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

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

C-programming_kouza4(2007)

演算増幅器

02: 変数と標準入出力

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

PowerPoint Presentation

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

Prog1_10th

Cプログラミング1(再) 第2回

memo

02: 変数と標準入出力

Microsoft Word - 3new.doc

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

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

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

プログラミング入門1

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

演習課題No12

02: 変数と標準入出力

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

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

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

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

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

Microsoft PowerPoint pptx[読み取り専用]

gengo1-2

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

program7app.ppt

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

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

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

Microsoft Word - VBA基礎(6).docx

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

CプログラミングI

Microsoft PowerPoint - prog08.ppt

講習No.9

02: 変数と標準入出力

C言語講座

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

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

02: 変数と標準入出力

02: 変数と標準入出力

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

Javaプログラムの実行手順

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Prog1_6th

kiso2-06.key

Microsoft PowerPoint - prog04.ppt

slide5.pptx

第9回 配列(array)型の変数

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

演算増幅器

Transcription:

ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す というものです 関数が受け取った値を 引数 関数が呼び出し元に返す値を 返り値 といいます 例えば printf では \n や %d を含んだ出力したい文字列 出力したい変数 が引数 処理をした結果実際に出力された文字列 が返り値になります 一部には引数 返り値のどちらか または両方が存在しない関数も存在します main 関数とライブラリ関数 main 関数とは int main(void){ で囲まれたひとくくりの部分のことです その名の通りプログラムのメインで プログラムは main 関数から実行されます また printf や scanf などはライブラリ関数と呼ばれ printf や scanf は stdio.h( 標準ライブラリ ) を include することで使えるようになります ライブラリには数学に特化した数学ライブラリ (math.h) やゲーム制作に向いた DX ライブラリがあります 特に エレ研は DX ライブラリがゲーム制作の中心になります 関数の定義 使い方 関数は main 関数の前で定義して使います 定義されなければ使えないので 関数内で別の関数を呼び出す場合は定義の順番にも注意が必要です ( 後述のプロトタイプ宣言を使う場合はこの限りではない ) 実際に関数を利用したプログラムを見てみましょう ここでは二通りの呼び出し方法を用いています

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){ // ここで仮引数を宣言 ここでは int 型の 3 つ double d; //main 関数とあまり変わらない感覚でコーディングできます d = a + b + c; // 関数内で有効な変数も宣言できるし 引数も変数と同様に使用できます d /= 3; return d; // ここで戻り値を呼び出し元に返します ; int main(void) { int l, m, n, x, y, z; double o; l = 1; m = 4; n = 8; o = average(l, m, n); // ここで関数 average を呼び出している printf("l = %d, m = %d, n = %3.3f 平均は %d\n", l, m, n, o); x = 11; y = 13; z = 7; printf("x = %d, y = %d, z = %3.3f 平均は %d\n", x, y, z, average(x,y,z)); // 関数の中で関数を呼び出すこともできます return 0; 実行結果 l = 1, m = 4, n = 8 平均は 4.333 x = 11, y = 13, z = 7 平均は 10.333 続行するには何かキーを押してください... このサンプルでは 3 つの整数の平均値を求めて double 形で返す関数 average を定義し int 型の l m n の平均値を求めて double 形の o に代入しています また x y z についてのように printf 関数の中で average 関数を直接呼び出す といった使い方もできます

関数の定義と呼び出しの詳しい説明は以下の通りです // 関数の定義返り値の型関数名 ( 引数 1の型引数 1の名前, 引数 2の型引数 2の名前, ){ // ここでの引数は仮のもので 仮引数という ( 関数の処理内容 ) return 返り値 ; // 返り値がない場合は書かない // 関数の使用変数名 = 関数名 ( 引数 1, 引数 2, ); // 返り値を代入する変数と定義した返り値間 引数の型と仮引数間の型はそれぞれ一致することが望ましい 変数名 = ( 関数名 ( 引数 1, 引数 2, ) + 10)/3; // 上記の拡張版 ややこしいに見えるが 関数の使用と四則演算を組み合わせることもできると いうことである 返り値の型返り値名 = 関数名 ( 引数 1, 引数 2, ); // こちらは変数の定義と同時に関数の戻り値を代入している printf( %d, 関数名 ( 引数 1, 引数 2, )); //printf 関数の引数として関数を使用している ここでは int 型だが当然他の型でも可能 引数や返り値が存在しない場合 関数の定義の際に仮引数 返り値のどちらか または両方が存在しない場合 以下のように void を用いて書きます 返り値の型関数名 (void){ ( 関数の内容 ) return 返り値 ; // 引数が存在しない場合 void 関数名 ( 引数 1 の型引数 1 の名前, 引数 2 の型引数 2 の名前, ){ ( 関数の内容 ) // 返り値が存在しない場合 void 関数名 (void){ ( 関数の内容 ) // 両方が存在しない場合

関数名 ( 引数 1, 引数 2, ); // 返り値が void の場合の関数の呼び出し 返すべき変数が存在しないので printf などのように処理として呼び出す 返り値に加えて引数が定義されない場合も同様 返り値や引数が存在しない変数は ポインタとの併用や ゲームでの数値が絡まない処理に使われることも多いです グローバル変数とローカル変数 関数内で宣言された変数をローカル変数といいます 初期値は不定なので 代入する必要があります ローカル変数は定義されたその関数でのみ使え 一度呼び出しを終えた後に再び呼び出しても基本的には値は保持されません (static int など例外あり ) ポインタを用いない限りは基本的に外部の関数から書き換えることはできず 別の関数間では同じ名前のローカル変数を使うことができます 関数の外で定義されプログラム全体で共有 関数をまたいで使える変数をグローバル変数といいます 初期値は 0 です グローバル変数はどこからでも参照や変更ができますが どこで値が変わったのかわかりづらくなってしまいます バグの修正 ( デバッグ ) に支障をきたすので 多用するのはなるべく避けましょう また グローバル変数と同じ名前のローカル変数が関数内にある場合にはローカル変数が優先されます 練習問題 以下の関数を作成し 1 つのプログラム (main 文 ) でそのすべてを呼び出しなさい どの関数を呼び出したのかわかりやすくすること 1.double 型で円の直径を入力し その面積を求める関数 円周率は 3.14 とする 2.int 型の変数 3 つを引数とし その最小値を返し値とする関数 3.int 型の自然数ひとつを引数とし その階乗を返し値とする関数

ソフトゼミ A 第 6 回 問題の解答 練習問題 以下の関数を作成し 1 つのプログラム (main 文 ) でそのすべてを呼び出しなさい どの関数を呼び出したのかわかりやすくすること 1.double 型で円の直径を入力し その面積を求める関数 円周率は 3.14 とする 2.int 型の変数 3 つを引数とし その最小値を返し値とする関数 3.int 型の自然数ひとつを引数とし その階乗を返し値とする関数 回答の一例です 正しい動作さえすれば関数の呼び出し方法などは問いません #include<stdio.h> double circle(double d) { d /= 2; return d*d*3.14; int min(int a, int b, int c) { int smallest = a; if (b < smallest)smallest = b; if (c < smallest)smallest = c; return smallest; int kaijyo(int a) { int i, b = 1; for (i = 1; i <= a; i++)b *= i; return b; // 次のページに続く

// 回答続き int main(void) { double a; int b, c, d, e, f; printf(" 円の直径 a(double 型 ) を入力 :"); scanf("%lf", &a); printf(" 直径 %3.3f の円の面積は %3.3f \n",a,circle(a)); printf("int 型の整数 b,c,d を入力 :"); scanf("%d%d%d", &b, &c, &d); printf("%d, %d, %d のうち最少は %d \n", b,c,d, min(b,c,d)); printf("int 型の整数 eを入力 :"); scanf("%d", &e); f = kaijyo(e); printf("f = e! = %d! = %d \n", e, f); return 0;

ソフトゼミ 第 6 回 関数 配列引数について 返り値の型関数名 ( 引数の型引数の名前 [], ) { ( 関数の内容 ) return 返り値 ; // 関数を定義するとき 返り値の型として void を使用可 代入先 = 関数名 ( 引数名, ) // 関数を呼び出すとき [] を付けないことに注意 変数の宣言と同時の代入 四則演算との併用 型さえ合えば別の関数の引数として呼び出すことも当然可能配列を引数とする場合は以下のように関数の定義や呼び出しをします 配列引数を使用した場合 関数で使用した配列を書き換えると呼び出した元の配列も書き換わってしまいます これは注意すべき点にもなりますが 逆手にとって仮引数に配列を複数定義して 処理結果を書き込みたい配列を引数に指定すれば 処理した結果を配列として書き出し 疑似的な返り値とすることもできます 元の配列が書き換わるのを避ける場合は const という型修飾子を用いて以下のように記述することで 今までの変数と同じように使えます 返り値の型関数名 (const 引数の型引数の名前 [], ) { ( 関数の内容 ) return 返り値 ; また 多次元配列の場合は関数の定義の際 以下のように先頭以外の要素を指定する必要があります 返り値の型関数名 ( 引数の型引数の名前 [][ 要素 ], ) { ( 関数の内容 ) return 返り値 ;

プロトタイプ宣言 このように関数の宣言だけを先に行い main 関数の後に実際の処理内容を書くことをプロトタイプ宣言といいます 返り値の型関数名 1( 引数 1の型引数 1の名前, 引数 2の型引数 2の名前, ); // 関数名 1のプロトタイプ宣言返り値の型関数名 2( 引数 aの型引数 aの名前, 引数 bの型引数 bの名前, ); // 関数名 2のプロトタイプ宣言 int main(void) { (main 関数の処理内容 ) return 0; 返り値の型関数名 1( 引数 1の型引数 1の名前, 引数 2の型引数 2の名前, ){ // こちらにもプロトタイプ宣言時と同じ引数を記述する必要がある ( 関数の処理内容 ) return 返り値 ; 返り値の型関数名 2 ( 引数 aの型引数 aの名前, 引数 bの型引数 bの名前, ){ ( 関数の処理内容 ) return 返り値 ; 二度手間にはなりますが プログラムが見やすくなるメリットがあります また プロトタイプ宣言を用いることにより関数を宣言する順番に気を使う必要もなくなります