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