目標
- ユーザ定義関数を定義して、それを利用したプログラムが作成できる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- 関数を自作する
- 戻り値のない関数
- 引数も戻り値もない関数
- 関数から関数を呼び出す
- 関数と配列
- 演習問題
- 提出課題
#include <stdio.h> int adder(int a, int b); //プロトタイプ宣言 /* メイン関数 */ int main(void) { int x, y, f; printf("整数xとyの和を求めます。(x,y)>> "); scanf("%d,%d", &x, &y); f = adder(x,y); // 関数の呼び出し、結果がfに代入される printf("%d\n", f); return 0; } /* ユーザ定義関数 整数の和を求める */ int adder(int a, int b) //戻り値の型 関数名(引数) { int ans; ans = a + b; return ans; //結果を返す:戻り値 }
戻り値の型 関数名(引数リスト) { 処理の記述 return 戻り値; }
#include <stdio.h> double adderf(double a, double b); //プロトタイプ宣言 /* メイン関数 */ int main(void) { double x, y; printf("実数xとyの和を求めます。(x,y)>> "); scanf("%lf,%lf", &x, &y); printf("%f\n", adderf(x,y)); return 0; } /* ユーザ定義関数 実数の和を求める*/ double adderf(double a, double b) { return a + b; //結果を戻す }
#include <stdio.h> [[空欄ア]] //プロトタイプ宣言 /* メイン関数 */ int main(void) { double x,f; int n; printf("実数xのn乗を求めます。(x,n)>>"); scanf("%lf,%d", &x, &n); f = power([[空欄イ]]); // 関数の呼び出し printf("%fの%d乗は、%fです。\n",x,n,f); return 0; } /* ユーザ定義関数 aのb乗を求める */ [[空欄ウ]] power(double a, int b) { double ans = 1.0; int i; for(i=1; i<=b; i++){ ans [[空欄エ]] a; } return [[空欄オ]]; //結果を返す }
#include <stdio.h> void judge(int score); //プロトタイプ宣言 /* メイン関数 */ int main(void) { int n; printf("得点>> "); scanf("%d", &n); judge(n); //関数の呼び出し return 0; } /* ユーザ定義関数 */ void judge(int score) //合否を判定する { if(score>=60){ printf("合格です。"); } else{ printf("不合格です。"); } }
#include <stdio.h> void judge(int score); //プロトタイプ宣言 /* メイン関数 */ int main(void) { int n; printf("得点>> "); scanf("%d", &n); judge(n); //関数の呼び出し printf(" %d点\n", n); // <--追加 return 0; } /* ユーザ定義関数 */ void judge(int score) //合否を判定する { socore += 10; // <--追加 下駄を履かせる if(score>=60){ printf("合格です。"); } else{ printf("不合格です。"); } }
#include <stdio.h> void message(void); //プロトタイプ宣言 /* メイン関数 */ int main(void) { message(); //関数の呼び出し return 0; } /* ユーザ定義関数 */ void message(void) { printf("7月22日は何の日? 「円周率の日」???\n"); }
#include <stdio.h> void drawLine(int n); //プロトタイプ宣言 void drawRect(int n); /* メイン関数 */ int main(void) { int step; printf("段数> "); scanf("%d", &step); drawRect(step); //関数の呼び出し return 0; } /* 文字*で直線を描く関数 */ void drawLine(int n) { int i; for(i=0; i<n; i++){ putchar('*'); } } /* 四角形を描く関数 */ void drawRect(int n) { int i; for(i=0; i<n; i++){ drawLine(n); putchar('\n'); } }
#include <stdio.h> void drawLine([[空欄ア]]); //プロトタイプ宣言 void drawLowerLeftTriangle([[空欄イ]]); /* メイン関数 */ int main(void) { int step; printf("段数> "); scanf("%d", &step); drawLowerLeftTriangle(step); //関数の呼び出し return 0; } /* 指定の文字で直線を描く関数 */ void drawLine([[空欄ア]]) { int i; for(i=0; i<n; i++){ [[空欄ウ]]; } } /* 指定の文字で左下直角三角形を描く関数 */ void drawLowerLeftTriangle([[空欄イ]]) { int i; for(i=0; i<n; i++){ drawLine([[空欄エ]]); putchar('\n'); } }
#include <stdio.h> #define N 10 void printArray(int n, int a[]); //プロトタイプ宣言 /* メイン関数 */ int main(void) { int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26}; printArray(N, m); return 0; } /* * 配列の各要素を表示する関数 * @引数 n 要素数, a[] 配列 */ void printArray(int n, int a[]) { int i; for(i=0; i<n; i++){ printf("%2d: %d\n", i,a[i]); } puts(""); }
#include <stdio.h> #define N 10 void printArray(int n, int a[]); //プロトタイプ宣言 void sqrArray(int n, int a[]); /* メイン関数 */ int main(void) { int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26}; printArray(N, m); // 配列の表示 sqrArray(N, m); // 配列の2乗値を計算 printArray(N, m); // 配列の表示 return 0; } /* * 配列の2乗値を求める関数 * @引数 n: 要素数、a: 配列 */ void sqrArray(int n, int a[]) { int i; for(i=0; i<n; i++){ a[i] *= a[i]; } } /* * 配列の各要素を表示する関数 * @引数 n 要素数, a[] 配列 */ void printArray(int n, int a[]) { int i; for(i=0; i<n; i++){ printf("%2d: %d\n", i,a[i]); } putchar('\n'); }
#include <stdio.h> #define N 10 void printArray(int n, int a[]); //プロトタイプ宣言 void sqrArray(int n, int a[]); /* メイン関数 */ int main(void) { int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26}; printArray(N, m); // 配列の表示 sqrArray(N, m); // 配列の2乗値を計算 printArray(N, m); // 配列の表示 ・・・ 中略 ・・・ void printArray(int n, const int a[]) { int i; for(i=0; i<n; i++){ printf("%2d: %d\n", i,a[i]); } putchar('\n'); }
#include <stdio.h> #define N 2 void addArray(int a[][N], int b[][N], int c[][N]); //プロトタイプ宣言 void printArray(int a[][N]); /* メイン関数 */ int main(void) { int ma[N][N] = {{1,1},{2,2}}; int mb[N][N] = {{1,2},{3,4}}; int mc[N][N]; add2Array(ma,mb,mc); printf("-- ma --\n"); print2Array(ma); printf("-- mb --\n"); print2Array(mb); printf("-- ma+mb --\n"); print2Array(mc); return 0; } /* * 2つの二次元配列aとbの加算結果を別の二次元配列cに格納する関数 * @引数 a[] 配列, b[] 配列, c[] 配列 */ void add2Array(int a[][N], int b[][N], int c[][N]) //一つ目の添字は空に { int i,j; for(i=0; i<N; i++){ for(j=0; j<N; j++){ c[i][j] = a[i][j] + b[i][j]; } } } void print2Array(int a[][N]) { int i,j; for(i=0; i<N; i++){ for(j=0; j<N; j++){ printf("%3d",a[i][j]); } puts(""); } }
#include <stdio.h> #define N 10 void printArray(int n, int a[]); //プロトタイプ宣言 [[空欄ア]] sumOfArray([[空欄イ]]); /* メイン関数 */ int main(void) { int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26}; printArray(N, m); // 配列の表示 printf("配列の合計 %d\n",sumOfArray([[空欄ウ]])); return 0; } /* * 配列の合計値を求める関数 * @引数 n: 要素数、a: 配列 */ [[空欄ア]] sumOfArray([[空欄エ]]) { int i, [[空欄オ]]; for(i=0; i<n; i++){ sum += a[i]; } return sum; } /* * 配列の各要素を表示する関数 * @引数 n 要素数, a[] 配列 */ void printArray(int n, int a[]) { int i; for(i=0; i<n; i++){ printf("%2d: %d\n", i,a[i]); } }
#include <stdio.h> [[空欄ア]]; int main(void) { [[空欄イ]]; return 0; } [[空欄ウ]] myProfile([[空欄エ]]) { printf("\tJX16888\t工学太郎\n"); printf("特技は、プログラミングです。\n"); }
#include <stdio.h> [[空欄ア]] //プロトタイプ宣言 int main(void) { int a,b,rem; printf("被除数,除数>> "); scanf("%d,%d",&a,&b); rem = [[空欄イ]]; printf("余り %d\n", rem); return 0; } /** 余りを求める関数(被除数,除数) 、正の整数にのみ対応 */ [[空欄ウ]] remaind(int dividend, int divisor) { while([[空欄エ]]){ dividend -= divisor; } return dividend; }
#include <stdio.h> [[空欄ア]] //プロトタイプ宣言 int main(void) { int a; printf("正の整数>> "); scanf("%d", &a); printf("1から%dまでの合計は、%dです。\n",a, [[空欄イ]]); return 0; } /** 1からnまでの合計を求める関数 */ [[空欄ウ]] sumOf(int n) { int i,sum=0; for(i=1; [[空欄エ]]; i++){ [[空欄オ]]; } [[空欄カ]]; }
今週の確認テスト テスト(PDF)