(14) 第6章 関数

関数の基礎

ユーザー関数

通常の関数

/* List6-1 */
#include <stdio.h>
int maxof(int x, int y)
{
if(x>y){
return x;
}else{
return y;
}
}
int main(void)
{
int na, nb;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &na);
printf("整数2:");
scanf("%d", &nb);
printf("大きい方はの値は%dです。¥n", maxof(na, nb));
return 0;
}

関数の値の渡し方

/* List6-5 */
#include <stdio.h>
double power(double dx, int no)
{
double tmp=1.0;
while(no-->0){
tmp*=dx;
}
return tmp;
}
int main(void)
{
double x;
int n;
printf("実数を入力:");
scanf("%lf", &x);
printf("整数を入力:");
scanf("%d", &n);
printf("%.2fの%d乗は%.2fです。¥n", x, n, power(x, n));
return 0;
}

値を返さない関数・値を受け取らない関数

/* List6-7 */
#include <stdio.h>
void put_stars(int no)
{
while(no-->0){
putchar('*');
}
}
int main(void)
{
int i, ln;
printf("何段ですか:");
scanf("%d", &ln);
for(i=1; i<=ln; i++){
put_stars(i);
putchar('¥n');
}
return 0;
}

値を受け取らない関数

/* List6-9 */
#include <stdio.h>
int scan_unit(void)
{
int tmp;
do{
printf("非負の整数を入力してください:");
scanf("%d", &tmp);
if(tmp<0){
puts("¥a負の数を入力しないでください。");
}
}while(tmp<0);
return tmp;
}
int rev_int(int num)
{
int tmp=0;
if(num>0){
do{
tmp=tmp*10+num%10;
num/=10;
}while(num>0);
}
return tmp;
}
int main(void)
{
int nx=scan_unit();
printf("反転した値は%dです。¥n", rev_int(nx));
return 0;
}

変数の有効範囲

/* List6-10 */
#include <stdio.h>
#define NUMBER 5
int tensu[NUMBER];
int top(void);
int main(void)
{
extern int tensu[];
int i;
printf("%d人の点数を入力してください。¥n", NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("%d:", i + 1);
scanf("%d", &tensu[i]);
}
printf("最高点=%d¥n", top());
return (0);
}
/*--- 配列tensuの最大値を返す【関数定義】 ---*/
int top(void)
{
extern int tensu[];
int i;
int max = tensu[0];
for(i = 1; i < NUMBER; i++)
if(tensu[i] > max)
max = tensu[i];
return (max);
}

配列と関数

/* List6-11 */
#include <stdio.h>
#define NUMBER 5
int max_of(int vc[], int no)
{
int i;
int max = vc[0];
for(i = 1; i < no; i++){
if(vc[i] > max){
max = vc[i];
}
}
return max;
}
int main(void)
{
int i;
int eng[NUMBER];
int mat[NUMBER];
int max_e, max_m;
printf("%d人の点数を入力してください。¥n", NUMBER);
for(i = 0; i < NUMBER; i++) {
printf("[%d] 英語:", i + 1);
scanf("%d", &eng[i]);
printf( " 数学:");
scanf("%d", &mat[i]);
}
max_e = max_of(eng, NUMBER);
max_m = max_of(mat, NUMBER);
printf("英語の最高点=%d¥n", max_e);
printf("数学の最高点=%d¥n", max_m);
return (0);
}
/* List6-12 */
#include <stdio.h>
void int_set(int vc[], int no)
{
int i;
for(i = 0; i < no; i++){
vc[i] = 0;
}
}
int main(void)
{
int i;
int ary1[] = {1, 2, 3, 4, 5};
int ary2[] = {3, 2, 1};

int_set(ary1, 5);
int_set(ary2, 3);

for(i = 0; i < 5; i++){
printf("ary1[%d] = %d¥n", i, ary1[i]);
}
for(i = 0; i < 3; i++){
printf("ary2[%d] = %d¥n", i, ary2[i]);
}
return (0);
}

課題14

以下のプログラムを作成する。メールの本文に書くのは関数の定義だけでよい。

  1. 二つの実数を受け取り、小さいほうの値を返す関数
  2. 整数の三乗値を返す関数
  3. 整数の四乗値を返す関数(ただし、List6-3に示した関数sqrを使用すること)
  4. 整数を受け取り、「こんにちは」をその数だけ繰り返して表示する関数
  5. テストの点数を入力し、その値を返す関数。範囲が0点から100点にない場合は再入力させる。
  6. 画面に自分の名前と学籍番号を表示する関数
  7. 整数型配列とその要素数を受け取り、最初の要素から順番に画面に表示する関数
  8. 整数型配列とその要素数を受け取り、配列の要素をすべて-1にする関数
  9. 整数型配列とその要素数を受け取り、平均点(実数型)を返す関数

注意事項