第8章 関数・2

1 ポインタと関数

教科書P106〜109

1-1 関数に値を渡す(復習)

[例題] 2つの整数を関数に渡し、加算結果を返す

#include     <stdio.h>

/* 関数プロトタイプ */
int sum(int, int);

void main(void)
{
    int     a, b;

    scanf("%d %d", &a, &b);
    printf("%d + %d = %d\n", a, b, sum(a, b));

}

int sum(int x, int y)
{
    int     z;

    z = x + y;
    return z;

}

[解説]

1-2 関数にアドレスを渡す

例題のプログラムをポインタを利用して作り直す

#include     <stdio.h>

/* 関数プロトタイプ */
int sum(int *, int *);

void main(void)
{
    int     a, b;

    scanf("%d %d", &a, &b);
    printf("%d + %d = %d\n", a, b, sum(&a, &b));

}

int sum(int *x, int *y)
{
    int     z;

    z = *x + *y;
    return z;

}

[解説]

[関数にアドレスを渡すメリット]

  1. 引数にアドレスを利用することにより、1つの関数で複数の値を同時に編集できる
  2. (配列などを引数にする場合、)関数内で変数を宣言しないですむため、プログラム実行時に使用するメモリの量を減らすことができる

[例題2] 引数に与えられた2つの変数の内容を入れ替える

#include     <stdio.h>

/* 関数プロトタイプ */
void swap(int *, int *);

void main(void)
{
    int     a, b;

    scanf("%d %d", &a, &b);
    printf("入れ替え前:a = %d, b = %d\n", a, b);
    swap(&a, &b);
    printf("入れ替え後:a = %d, b = %d\n", a, b);

}

void swap(int *x, int *y)
{
    int     z;

    z = *x;
    *x = *y;
    *y = z;

}

[例題3] 入力された文字列をすべて大文字に変換する

#include     <stdio.h>

/* 関数プロトタイプ */
void upper(char *);

void main(void)
{
    char    str[80];

    gets(str);
    printf("変換前:%s\n", str);
    upper(str);
    printf("変換後:%s\n", str);

}

void upper(char *pstr)
{
    for ( ; *pstr!='\0' ; pstr++)
    {
        if ('a' <= *pstr && *pstr <= 'z')
            *pstr -= ('a' - 'A');
    }

}

練習問題

問題1

教科書109ページ練習問題24

問題2

与えられた文字列の長さを返す関数str_lenを作成せよ。

#include     <stdio.h>

/* 関数プロトタイプ */
int str_len(char *);

void main(void)
{
    char    str[80];

    gets(str);
    printf("入力文字列の長さ:%d\n", str_len(str));

}

int str_len(ここも考える)
{
    ここの処理を考える

}

問題3

文字列を別の配列にコピーする関数str_cpyを作成せよ。

#include     <stdio.h>

/* 関数プロトタイプ */
関数の型 str_cpy(引数の型);

void main(void)
{
    char    str1[80], str2[80];

    gets(str1);
    str_cpy(str1, str2);
    printf("str1:%s\n", str1);
    printf("str2:%s\n", str2);

}

関数の型 str_cpy(引数の型)
{
    ここの処理を考える

}

問題4

2つの文字列の内容が同じなら1を、1文字でも違っていたら0を返す関数str_chkを作成せよ。

#include     <stdio.h>

/* 関数プロトタイプ */
int str_chk(char *, char *);

void main(void)
{
    char    str1[80], str2[80];

    gets(str1);
    gets(str2);
    if (str_chk(str1, str2) == 1)
        printf("同じ\n");
    else
        printf("違う\n");

}

int str_chk(ここも考える)
{
    ここの処理を考える

}

2 配列と関数

教科書P110〜115

2-1 一次元配列を渡す

[例題] 配列内データの加算結果を返す関数

#include     <stdio.h>

/* 関数プロトタイプ */
int sum(int []);

void main(void)
{
    int     data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1};

    printf("合計 = %d\n", sum(data));

}

int sum(int d[])
{
    int     i, goukei = 0;

    for(i=0 ; d[i]!=(-1) ; i++)
        goukei += d[i];

    return goukei;

}

[解説]

配列内の全データを関数に引き渡すことはできないため、配列の先頭アドレスを渡し、関数側で添え字を使って配列データを参照する。

つまり、アドレス渡しの別の書き方である。

[ポインタを使った書き方]

#include     <stdio.h>

/* 関数プロトタイプ */
int sum(int *);

void main(void)
{
    int     data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1};

    printf("合計 = %d\n", sum(data));

}

int sum(int *d)
{
    int     goukei = 0;

    for( ; *d!=(-1) ; d++)
        goukei += *d;

    return goukei;

}

練習問題

2-2 二次元配列を渡す

教科書112〜113ページを参照。
とりあえず飛ばす。

2-3 ポインタ配列を渡す

教科書114〜115ページを参照。
とりあえず飛ばす。


[ TOP ]