第6回演習の解答例

関数とポインタを良く整理して理解しておいてください。


(1)変数 a と b の値を,入れ替えるswap()関数を作成し,プログラムを完成させよ。


#include <stdio.h>

void swap(float *a, float *b)
{
    float tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;

}

void main()
{
    float a=2.0, b=3.0;

    printf("a=%f, b=%f\n", a, b);

    swap(&a, &b);

    printf("a=%f, b=%f\n", a, b);
}

(2)関数を用いて実数型配列の要素をキーボードから10個入力及び配列の中身表示プログラムを作成せよ。



#include <stdio.h>

void input(float *p, int n)/*キーボードからの入力*/
{
    int i;

    for(i=0;i<n;i++){
        printf("data[%d]=",i);
        scanf("%f", p+i);
    }
}

void output(float *p, int n)/*配列の表示*/
{
    int i;

    for(i=0;i<n;i++){
        printf("data[%d]=%f\n",i,*(p+i));
    }
}

void main()
{
    float data[10];

    input(data,10);

    output(data,10);
}



(3)実数型配列の要素をキーボードから10個入力する,平均値を算出する,大きい順に並び替え(ソート)る,配列の中身を表示する各関数を作成せよ。
ヒント:上の二つの問題を用いるとわかりやすいプログラムが出来る。

#include <stdio.h>

void swap(float *a, float *b)
{
    float tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;
}

void input(float *p, int n)
{
    int i;

    for(i=0;i<n;i++){
        printf("data[%d]=",i);
        scanf("%f",p+i);
    }
}

float average(float *p, int n)
{
    int i;
    float ave=0.0;

    for(i=0;i<n;i++) {
        ave += *(p+i);
    }

    ave /= n;

    return ave;
}

void sort(float *p, int n)
{
    int i, j;

    for(i=0;i<n-1;i++){
        for(j=i+1;j<n;j++){
            if(*(p+i) < *(p+j)){
                swap(p+i, p+j);
            }
        }
    }
}

void output(float *p, int n)
{
    int i;

    for(i=0;i<n;i++){
        printf("data[%d]=%f\n",i,*(p+i));
    }
}

void main()
{
    float data[10];

    input(data,10);                            /* 10個の要素を入力する関数*/

    printf("平均値 = %f\n",average(data,10));   /* 平均値を算出する関数 */


    sort(data,10);                             /* 大きい順に並び替える関数 */

    output(data,10);                           /* 配列の中身を出力する関数 */
}

(4)キーボードから文字列を入力すると,文字数を数えて値を返す関数を作成せよ。


#include <stdio.h>
int moji_nagasa(char *str)	
{
    int i=0;

    while(str[i]!=NULL){
        i++;
    }

    return (i);
}

void main()
{
    char str[128];

    printf("文字列を入力してください:");
    scanf("%s", str);

    printf("入力された文字列は,%sです.\n", str);
    printf("文字数は,%dです.\n", moji_nagasa(str));

}

(5)整数型配列に成績データである得点を入力する,偏差値を計算する,それぞれの番号の得点と偏差値を全て表示する,各関数を作成し,偏差値を表示するプログラムを作成せよ。成績データは以下に示す表を使用せよ。

配列データ

偏差値は,以下の式から求めることが出来る。
平方根の計算には,sqrt()関数を利用する。sqrt()関数を利用するには, math.hをインクルードする必要がある。

偏差値

#include <stdio.h>
#include <math.h>
   
void read_data(int *tensu, int n)
{
    int i;

    for(i=0; i<n; i++){
        scanf("%d", (tensu+i));
    }
}

void deviation(int *tensu, float *hensachi, int n)
{
    int i, wa=0;
    float ave,dev=0;

    /* 和の計算 */
    for(i=0; i<n; i++){
        wa += tensu[i];
    }
    ave = (float)wa / n;

    /* 標準偏差の計算 */
    for(i=0; i<n; i++){
        dev += (tensu[i]-ave)*(tensu[i]-ave);
    }
    dev = sqrt(dev/n);

    /* 偏差値の計算 */
    for(i=0; i<n; i++){
        hensachi[i] = 10.0*(tensu[i] - ave)/dev + 50;
    }
}

void kekka(int *tensu, float *hensachi, int n)
{
    int i;

    for(i=0; i<n; i++){
        printf("%d, %d, %.2f\n", i+1, tensu[i], hensachi[i]);
    }
}

void main()
{
    int tensu[20];
    float hensachi[20];

    read_data(tensu, 20);
    deviation(tensu, hensachi, 20);
    kekka(tensu, hensachi, 20);
}