プログラミング初級 -...

13
プログラミング初級 8201765関数(1) 1

Upload: others

Post on 20-Sep-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

プログラミング初級

第8回 2017年6月5日

関数(1)

1

Page 2: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数とは 2

• 数学では のような式を関数と呼ぶ

• が 2なら となる

• C言語でこの関数をプログラムとして表すと以下のようになる

• この関数は以下のように呼び出して使う

int f(int x){

int ans;ans = x * x + 4 * x + 3;return ans;

}

34)( 2 xxxf

3242)2( 2 fx

y = f(2);

Page 3: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数とは 3

<ポイント>C言語における関数とは「計算などの処理をおこなう文の集まり」のことである

#include <stdio.h>

void func(void); //関数のプロトタイプ宣言

int main(void){

printf("ここはメイン関数内(関数呼び出し前)です.¥n");func(); //関数呼び出しprintf("ここはメイン関数内(関数呼び出し後)です.¥n");return 0;

}

void func(void) //自作関数{

printf("ここは自作関数内です.¥n");return;

}

実行結果

Page 4: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数の動きを追うと・・・ 4

#include <stdio.h>

void func(void); //関数のプロトタイプ宣言

int main(void){

printf("ここはメイン関数内(関数呼び出し前)です.¥n");func(); //関数呼び出しprintf("ここはメイン関数内(関数呼び出し後)です.¥n");return 0;

}

void func(void) //自作関数{

printf("ここは自作関数内です.¥n");return;

}

③④

<ポイント>呼び出すところから、呼び出されるところへ行き、そして戻る。

① main関数中でfunc()を呼び出す

② func関数に移動する

③ func関数に書かれた処理が実行される

④ func関数が終了したら、

関数を呼び出したところへ戻る

⑤ main関数の残りを実行する

Page 5: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数の使用例 5

#include <stdio.h>

int f(int x);

int main(void){

int x, y;

x = 2;y = f(x);printf("f(%d)=%d¥n", x, y);

return 0;}

int f(int x){

int ans;ans = x * x + 4 * x + 3;return ans;

}

<ポイント>呼び出すときに、関数に値を渡すことができる(渡す値は引数と呼ぶ)また、関数から値を返すこともできる(戻り値と呼ぶ)

関数 f

入力:2(「引数」)

出力:15(「戻り値」)

を計算

名前出力

入力

32422

ひきすう

Page 6: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数の使用例(つづき) 6

#include <stdio.h>

int f(int x);

int main(void){

int x, y;

x = 2;y = f(x);printf("f(%d)=%d¥n", x, y);

return 0;}

int f(int x){

int ans;ans = x * x + 4 * x + 3;return ans;

}

<ポイント>関数があっても、流れに沿って読めば今までと何も変わらない

① main関数で用いる変数の宣言変数xに2をセットする

② f関数を呼び出す⇒f関数に移動する

(f関数に変数xの内容を渡す、f関数の結果を変数yで受け取る)

③ f関数の処理を開始する変数xに渡された値を受け取る

④ f関数で用いる変数を宣言する

⑤ を計算する

⑥ f関数が終了したら、f関数を呼び出したところへ戻る

(f関数の結果をmain関数に渡す)

⑦ main関数の残りを実行する

①②

④⑤⑥

342 xx

Page 7: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数に関する覚えごと 7

<ポイント>関数を構成するための基本構造と各部の役割をしっかり覚えよう

int f(int x){

int ans;ans = x * x + 4 * x + 3;return ans;

}

関数の名前

関数から戻るデータ(戻り値)の型

関数に渡すデータの型と名前(引数)

結果を戻すための記述

関数の定義

Page 8: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

戻り値の型 8

<ポイント>関数の型と戻り値の型は一致しなくてはならない

main関数内{

int tokuten;

tokuten = keisan( hyouka );

}

int keisan( char hyouka ){

int sagyou;

sagyou = 0;switch ( hyouka ) {

case 'A': sagyou = 100; break;case 'B': sagyou = 70; break;case 'C': sagyou = 50; break;case 'D': sagyou = 20; break;

}return sagyou;

}

keisan関数はint型の値を返す関数

値を返す変数も当然int型でなくてはならない

関数の戻り値がint型なのでmainで受ける変数もint型

Page 9: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

#include <stdio.h>

int f(int x);

int main(void){

・・・y = f(x);・・・return 0;

}

プロトタイプ宣言について 9

<ポイント>関数を用いるときは、関数の型をあらかじめ宣言する必要がある。これを「プロトタイプ宣言」と呼ぶ。

int f(int x){

int ans;・・・return ans;

}

宣言する場所とセミコロンに注意!

Page 10: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

今日覚える関数のパターン(続きは次回) 10

戻り値なし、引数なし

void 関数名(void)

<表記例>void disp(void)

戻り値なし、引数あり

void 関数名(変数型 変数名)

<表記例>void calc(int a)void dcalc(double x)

戻り値あり、引数あり

変数型 関数名(変数型 変数名)

<表記例>int calc(int a)int dcalc(double x)double cc(int y)

■関数が引数で受けた値を使用する例int calculation(int x);

int main(void) {int ans;ans = calculation(10);return 0;

}

int calculation(int x) {int y;y = 2 * x + 3;return y;

}

■関数では表示のみvoid outputonly(void);

int main(void) {outputonly();return 0;

}

void outputonly(void) {printf("引数、戻り値ナシ");

}

■関数が引数で受けた値を使用する例void output(int x);

int main(void) {int x = 10;output(x);return 0;

}

void output(int x) {printf("%d¥n",x);

}

(おまけ)voidとは「空の、何もない」という意味の英単語である

戻り値がvoidのときreturn;は省略できる

Page 11: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

その他のポイント 11

•引数の数は何個でもOK

•戻り値は1つだけ

•1つのプログラムの中に関数をいくつ作ってもOK

•自作関数の中から別の自作関数を呼び出すこともできる

Page 12: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

関数について補足 12

■小さいプログラムの場合は必要性は低いmain関数だけのプログラムで事足りる

■プログラムサイズが大きくなると非常に重要な概念になる・1000行の処理をいっぺんに理解する

・50行ずつ20個のパーツに分けて理解するどちらが理解しやすいか? どちらが間違いが生じにくいか?

■同じような処理が何度も出てくる場合、関数化したほうが便利ひとつのプログラムで同じような処理を行う30行が5回出てきたとき、

・main関数だけのプログラムでは、その処理について150行書く必要がある・関数化すると、その30行を関数としてまとめることで、呼び出すところは1行で済む。よって、トータル30+5行で済む。

複数のプログラムで同じような処理が必要な場合,再利用できる。

■関数をブラックボックスとして扱うことができる関数の引数・戻り値の仕様だけが分かれば、中身が分からなくても使うことができる。

(みなさんもprintfの中身を知らないにも関わらず、平気でprintfを使えていますね)

■仮に自分の作るプログラムで関数は必要ないとしても、仕事などで人が書いたプログラムを読む必要が生じたとき、読み方が分からないと仕事に差し支える。

関数のありがたみを感じない人が少なからずいると思うので、ここで補足。

Page 13: プログラミング初級 - 東北学院大学mmt1.cs.tohoku-gakuin.ac.jp/cprog/slide08.pdf関数とは 2 •数学では のような式を関数と呼ぶ • が2 なら となる

13

int main(void){

// 入力処理(省略)

ans = kokugoTable[0];for (i=1; i<NUM; i++) {

if (ans < kokugoTable[i])ans = kokugoTable[i];

}kokugoMax = ans;

ans = eigoTable[0];for (i=1; i<NUM; i++) {

if (ans < eigoTable[i])ans = eigoTable[i];

}eigoMax = ans;

ans = suugakuTable[0];for (i=1; i<NUM; i++) {

if (ans < suugakuTable[i])ans = suugakuTable[i];

}suugakuMax = ans;

ans = gokeiTable[0];for (i=1; i<NUM; i++) {

if (ans < gokeiTable[i])ans = gokeiTable[i];

}gokeiMax = ans;

// 出力処理(省略)}

int main(void){

// 入力処理(省略)

kokugoMax = maxof(kokugoTable, NUM);eigoMax = maxof(eigoTable, NUM);suugakuMax = maxof(suugakuTable, NUM);gokeiMax = maxof(gokeiTable, NUM);

// 出力処理(省略)}

int maxof(int data[], int len){

int ans;ans = data[0];for (i=1; i<len; i++) {

if (ans < data[i])ans = data[i];

}return ans:

}

例:国語・数学・英語・合計点の各最高点を求めるプログラム

同じ処理は何度も書かずに関数にする