目標
- ユーザ定義関数を定義して、それを利用したプログラムが作成できる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- 関数を自作する
- 戻り値のない関数
- 引数も戻り値もない関数
- 関数から関数を呼び出す
- 関数と配列
- 演習問題
- 提出課題


#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)