第7回演習:解答例


(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;
    }

    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;
    }

    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)最後に各成績に何人いるか計算し,その数をファイル(number.txt)に書き出すプログラムを作成せよ.
結果は, S:6 A : 5 B:11 C : 12  F:66 となる.


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

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

    n = 0;

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

    fclose(fp);

    return(n-1);
}

void write(int s, int a, int b, int c, int f)
{
    FILE *fp;

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

    fprintf(fp,"S:%d¥nA:%d¥nB:%d¥nC:%d¥nF:%d¥n",s,a,b,c,f);

    fclose(fp);
}

void main()
{
    int i, n, s, a, b, c, f;
    float data[512];

    s = 0;
    a = 0;
    b = 0;
    c = 0;
    f = 0;

    n = read(data);

    for(i=0;i<n;i++){
        if(data[i]>=90){
            s++;
        }else if(data[i]>=80){
            a++;
        }else if(data[i]>=70){
            b++;
        }else if(data[i]>=60){
            c++;
        }else{
            f++;
        }
    }

    write(s,a,b,c,f);

}

(4)キーボードから入力した文字列をファイル(moji.txt)に保存し,その文字列の文字数を数えるプログラムを作成せよ.
文字列については過去のページで各自確認すること.


#include <stdio.h>
 
void main()
{
    char str[100];
    int i;
    int count=0;
    
    FILE *fp;

    printf("文字を入力してください:");

    scanf("%s", str);

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

    fprintf(fp, "%s",str);
    fclose(fp);

    for(i=0;str[i]!='¥0';i++){
        count++;
    }

    printf("入力された文字数は%dです¥n",count);

}