第14回演習:解答例


(1)【構造体・関数】5件の名前,身長(cm),体重(kg)のデータファイル(右クリック-->[対象をファイルに保存] )data1.txtがある.
このファイルは,名前 身長(cm) 体重(kg) の順にデータが並んでいる.
①構造体を用いて,このファイルを読み込んで画面に出力しなさい.
②このデータを使い関数を使ってBMIをデータの4列目に代入しなさい.ただし,BMI=体重(kg)/{身長(m)×身長(m)}でもとめること.また身長は(m:メートル)での計算に注意すること.
 (BMI初期値は0となっている.)
③BMIが上書きされたデータを[bmi.csv]というファイルに書き出しなさい.


#include <stdio.h>

struct data{
	char name[25];
	float height;
	float weight;
	float bmi;
};

void read(struct data *p, int n)
{
	int i;
	FILE *fp;

	fp = fopen("data1.txt","r");
	if(fp == NULL){
		printf("ファイルを開けませんでした.¥n");
		return;
	}

	for(i=0;i<n;i++){
		fscanf(fp, "%s", (*(p+i)).name);
		fscanf(fp, "%f", &(*(p+i)).height);
		fscanf(fp, "%f", &(*(p+i)).weight);
		(*(p+i)).bmi = 0;
	}

	fclose(fp);
}

void disp(struct data *p, int n)
{
	int i;

	printf("名前¥t身長¥t体重¥tBMI¥n");
	for(i=0;i<n;i++){
		printf("%s¥t%.1f¥t%.1f¥t%f¥n", (*(p+i)).name, (*(p+i)).height, (*(p+i)).weight, (*(p+i)).bmi);
	}
	
	printf("¥n");
}

void bmi(struct data *p, int n)
{
	int i;

	for(i=0;i<n;i++){
		(*(p+i)).bmi = (*(p+i)).weight/((*(p+i)).height/100*(*(p+i)).height/100);
	}
}

void write(struct data *p, int n)
{
	int i;
	FILE *fp;

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

	fprintf(fp, "名前,身長(cm),体重(kg),BMI¥n");
	for(i=0;i<n;i++){
		fprintf(fp, "%s,%.1f,%.1f,%f¥n", (*(p+i)).name, (*(p+i)).height, (*(p+i)).weight, (*(p+i)).bmi);
	}

	fclose(fp);
}

void main()
{
	struct data list[5];
	
	read(list,5);
	disp(list,5);
	bmi(list,5);
	disp(list,5);
	write(list,5);
}

(2)【文字列】char s[]="Meiji University"として,この文の中にいくつ"i"が含まれているか数えるプログラムを作成せよ.


#include <stdio.h>

void main()
{
	char s[]="Meiji University";
	int i, count;
	
	count = 0;
	
	for(i=0;s[i]!='¥0';i++){
		if(s[i] == 'i'){
			count++;
		}
	}
	
	printf("iは%d個あります.¥n", count);
}

(3)【関数とポインタ】2~1000までの全ての素数を表示するプログラムを作成せよ.ただし素数の求める部分は関数を用いること


*また以下を参考にすること*

エラトステネスのふるいのアルゴリズム
①2~nの数をすべて「ふるい」に入れる.
②「ふるい」の中で最小値を素数とする.図の▼印
③今求めた素数の倍数をすべて「ふるい」からはずす.図の斜線部の数
④②~③をnまで繰り返し「ふるい」(斜線が引かれなかった)に残った数が素数である.


#include <stdio.h>

void sosuu(int *p, int n)
{
	int i,j;
	
	for(i=2;i<=n;i++){
		if(*(p+i-2) != 0){
			printf("%d¥n", i);
			for(j=i;j<=n;j++){
				if(*(p+j-2)%i == 0){
					*(p+j-2) = 0;
				}
			}
		}
	}
}

void main()
{
	int number[999];
	int i;

	for(i=2;i<=1000;i++){
		number[i-2] = i;
	}
	
	sosuu(number,1000);
}

(4)【二次元配列】ファイルから4×4の2次元行列Aを読み込み画面に表示するプログラムを,関数を用いて作成せよ.
行列は、次のファイルを(右クリック-->[対象をファイルに保存])で作成したプログラムと同じフォルダに入れること.
   [Amat.txt],


#include <stdio.h>
 
void read_matrix(char filename[], float mat[4][4])
{
	int i,j;
	FILE* fp;
	
	fp = fopen(filename,"r");
	if(fp == NULL){
		printf("ファイルを開けませんでした.¥n");
		return;
	}
	
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			fscanf(fp, "%f", &mat[i][j]);
		}
	}
	
	fclose(fp);
}
 
void print_matrix(float mat[4][4])
{
	int i,j;
	
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			printf("%.1f¥t", mat[i][j]);
		}
		printf("¥n");
	}
}
 
void main()
{
	float Amat[4][4];
	char filename1[]="Amat.txt";
	
	read_matrix(filename1,Amat);
	
	print_matrix(Amat);
 
}