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