第8回演習:解答例


(1)試験結果のデータファイルtestdata.txt(右クリック-->[対象をファイルに保存] )を読み込んで,

  1. 平均値
  2. 最高点 & 最低点

を第5回(3)のプログラムを元に求め,画面に表示するプログラムを作成せよ.データ数はEOFを元に判断すること.
結果は平均44.84,最高点98,最低点1点となる.


#include <stdio.h>

int read(float *p)
{
    int n;
    FILE *fp;


    fp = fopen("testdata.txt", "r");
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.¥n");
        return 0;
    }

    n = 0;

    while ( ! feof(fp) && n < 512) {
        fscanf(fp, "%f", p+n);
        n++;
    }

    fclose(fp);

    return(n-1);
}

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 max_min(float *p, int n, float *max, float *min)
{
    int i;
    
    *max = *min = *p;
    
    for(i=1;i<n;i++){
        if(*max < *(p+i)){
            *max = *(p+i);
        }
    }
    
    for(i=1;i<n;i++){
        if(*min > *(p+i)){
            *min = *(p+i);
        }
    }
}

void main()
{
    int n;
    float data[512];
    float max, min;

    n =read(data);

    printf("平均値 = %.2f¥n",average(data,n));

    max_min(data,n,&max,&min);

    printf("最大値 = %.0f,最小値 = %.0f¥n",max,min);

}

(2)次に各点数に成績をつけて,ファイル("result.csv")に保存するプログラムを作成せよ.
結果については,データと成績両方をファイルに書き込むこと.
csvファイルに書き込む時,fprintf関数における値の型を書く所をカンマ区切りすることによって,
セルの列を区別することができる.

点数 成績
90点以上 S
80点以上90点未満 A
70点以上80点未満 B
60点以上70点未満 C
60点未満 F


#include <stdio.h>

int read(float *p)
{
    int n;
    FILE *fp;

    fp = fopen("testdata.txt", "r");
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.¥n");
        return 0;
    }

    n = 0;

    while ( ! feof(fp) && n < 512) {
        fscanf(fp, "%f", p+n);
        n++;
    }

    fclose(fp);

    return(n-1);
}

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

    FILE *fp;

    fp = fopen("result.csv", "w");

    if(fp == NULL){
        printf("ファイルを作れませんでした");
        return;
    }

    for(i=0;i<n;i++){
        if(*(p+i)>=90){
            fprintf(fp, "%f, S¥n",*(p+i));
        }else if(*(p+i)>=80){
            fprintf(fp, "%f, A¥n",*(p+i));
        }else if(*(p+i)>=70){
            fprintf(fp, "%f, B¥n",*(p+i));
        }else if(*(p+i)>=60){
            fprintf(fp, "%f, C¥n",*(p+i));
        }else{
            fprintf(fp, "%f, F¥n",*(p+i));
        }
    }

    fclose(fp);
}

void main()
{
    int n;
    float data[512];

    n = read(data);
    
    write(data,n);

}

(3)今度は成績に順位を付けて、csvファイルに保存するプログラムを作成せよ.ファイル名は任意で指定すること.

注意1:ただし,同じ点数の者が2名いたら,次の点数の者の順位は,一つ飛ぶ.
たとえば,47点が53位で,47点の者が2名いたとすると,46点の者は,55位となる.

注意2:結果についてはデータと順位両方をファイルに書き込むこと. csvファイルに書き込む時,fprintf関数における値の型を書く所をカンマ区切りすることによって,
セルの列を区別することができる.


#include <stdio.h>
 
int read(float *p)
{
	int n;
	FILE *fp;

	fp = fopen("testdata.txt", "r");
	if(fp == NULL) {
		printf("ファイルを開くことが出来ませんでした.¥n");
		return 0;
	}

	n = 0;

	while ( ! feof(fp) && n < 512) {
		fscanf(fp, "%f", p+n);
		n++;
	}

	fclose(fp);

	return(n-1);
}

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

	FILE *fp;

	fp = fopen("ranking.csv", "w");

	if(fp == NULL){
		printf("ファイルを作れませんでした");
		return;
	}

	fprintf(fp, "点数,順位¥n");
	for(i=0;i<n;i++){
		count = 1;
		for(j=0;j<n;j++){
			if(*(p+i) < *(p+j)){
				count++;
			}
		}
		fprintf(fp, "%f,%d¥n", *(p+i), count);
	}

	fclose(fp);
}

void main()
{
	int n;
	float data[512];

	n = read(data);

	write(data,n);

}