今週は,「ファイルからデータを配列に読みこむ」,「配列のデータをファイルへ書き込む」ことを学びます.
sin, cos の計算とグラフィック表示,ファイル入出力
(1) まず,システムに用意された三角関数を利用して,値を計算してみよう.システムに用意された数学関数を利用するには,「math.h」を include する必要がある.
#include <stdio.h>
#include <math.h>
void main()
{
int i;
for(i=0; i<360; i++){
printf("%d, %f, %f\n", i, sin(i*3.14/180.0), cos(i*3.14/180.0));
}
}
|
(2) これを応用して,sin, cos のグラフを表示してみよう.グラフィックを利用するには,「mogra.f」を include する.各値をうまく画面に見えるように変換し,点を表示します.
#include <stdio.h>
#include <math.h>
#include "mogra.f"
void main()
{
int x, y;
g_int(640,480);
for(x=0; x<640; x++){
y = 240 - 100 * sin(3.1415*x/320);
pset(x, y, 9);
y = 240 - 100 * cos(3.1415*x/320);
pset(x, y, 10);
}
gend();
}
|
(3) 次に,計算結果をファイルに保存してみよう.ファイル名は,最初から決まっているとします.
#include <stdio.h>
#include <math.h>
void main()
{
int i;
FILE *fp;
fp = fopen("sincos.csv", "w");
for(i=0; i<360; i++){
printf( "%d, %f, %f\n", i, sin(i*3.14/180.0), cos(i*3.14/180.0));
fprintf(fp, "%d, %f, %f\n", i, sin(i*3.14/180.0), cos(i*3.14/180.0));
}
fclose(fp);
}
|
(4) 保存したファイルからデータを読み込んで,グラフを表示しよう.いきなりグラフでは,うまくいかないときにわかりにくいので,画面にも表示するようにしよう.値はファイルから読めばよいので,数学関数は使いません.
#include <stdio.h>
#include "mogra.f"
void main()
{
int i, x, y;
float siny, cosy;
FILE *fp;
fp = fopen("sincos.csv", "r");
g_int(640,480);
for(i=0; i<360; i++){
fscanf(fp, "%d, %f, %f", &x, &siny, &cosy);
printf( "%d, %f, %f\n", x, siny, cosy);
y = 240 - 100 * siny;
pset(x, y, 0);
y = 240 - 100 * cosy;
pset(x, y, 0);
}
gend();
}
|
先週のプログラムでは,ファイルからデータを一個づつ取り出しました.では,ファイルから10個のデータを一気に読み込んで,画面に表示するにはどうしたら良いでしょう.
データは,配列に読み込みたいですよね.(そんなことはない?)
配列にキーボードからデータを読み込みには,
#include <stdio.h>
void main()
{
int i, n;
int data[10];
for(i = 0; i < 10; i++) {
printf("%d番目のデータ:", i+1); scanf("%d", &(data[i]));
}
for(i=0; i<10; i++) printf("%d\n", data[i]);
}
でしたね.これをファイルから読み込むように変えてみましょう.
#include <stdio.h>
void main()
{
int i, n;
int x[10];
float siny[10], cosy[10];
FILE *fp;
fp = fopen("sincos.csv", "r");
for(i = 0; i < 10; i++){
fscanf(fp, "%d, %f, %f", &(x[i]), &(siny[i]), &(cosy[i]));
}
fclose(fp);
for(i=0; i<10; i++) printf("%d, %f, %f\n", x[i], siny[i], cosy[i]);
}
ここで,事前にデータの個数がわからないとしたら,どうしたらよいだろう?
ファイルの終わりには,文字列と同様おしまいのマーク「EOF」がついています.EOFを探すには,feof()関数を使います.この関数は,ファイルの終わりに達すると,trueになります.
この関数を使って,データの並んだファイルから,配列にデータを読み込んでみよう.配列は,あらかじめ大きめに用意しておきます.
#include <stdio.h>
void main()
{
int i, n;
int x[512];
float siny[512], cosy[512];
FILE *fp;
fp = fopen("sincos.csv", "r");
i = 0;
do{
fscanf(fp, "%d, %f, %f", &(x[i]), &(siny[i]), &(cosy[i]));
i++;
}while(!(feof(fp)));
fclose(fp);
n = i-1;
for(i=0; i<n; i++) printf("%d, %f, %f\n", x[i], siny[i], cosy[i]);
}
または,for文を使って,
#include <stdio.h>
void main()
{
int i, n;
int x[512];
float siny[512], cosy[512];
FILE *fp;
fp = fopen("sincos.csv", "r");
for(i = 0; !(feof(fp)); i++) fscanf(fp, "%d, %f, %f", &(x[i]), &(siny[i]), &(cosy[i]));
fclose(fp);
n = i-1;
for(i=0; i<n; i++) printf("%d, %f, %f\n", x[i], siny[i], cosy[i]);
}
これができた人は,標準偏差を求めてから各点数の偏差値を求めてみよう.
さらに,できた人は,関数の演習で作成した並べ替える関数を使って,成績のよい順に並べ替えて,結果を別のファイルに保存してみよう.