第13回と14回の演習解答例


第13回演習の解答例

(1) 30件の数字データ30data.txtを読み込み,偶数と奇数に分けてそれぞれ別のファイルに出力せよ.


#include<stdio.h>
void main()
{
	int a[30];
	int i;

	FILE *ifp;
	FILE *o1fp;
	FILE *o2fp;

	ifp=fopen("30data.txt","r");
	o1fp=fopen("gusu.txt","w");
	o2fp=fopen("kisu.txt","w");

	if(ifp==NULL){
		printf("ファイルがありません.¥n");
		return;
	}
	if(o1fp==NULL){
		printf("ファイルに書き込めません.¥n");
		return;
	}
	if(o2fp==NULL){
		printf("ファイルに書き込めません.¥n");
		return;
	}
	
	for(i=0;i<30;i++){
		fscanf(ifp,"%d",&a[i]);
		printf("%d番目=%d¥n",i+1,a[i]);
	}
	for(i=0;i<30;i++){
		if(a[i]%2==0){
			fprintf(o1fp,"%d¥n",a[i]);
		}else{
			fprintf(o2fp,"%d¥n",a[i]);
		}
	}
	fclose(ifp);
	fclose(o1fp);
	fclose(o2fp);
}

(2) 文章str1.txtを読み込み,A, B, C,…,Z(大文字と小文字)までの各文字が何文字あるかをファイルに書き出すプログラムを作成せよ.


#include<stdio.h>
#include<stdlib.h>
void count(char str[], char chr, int i,int num[])
{
	int j;
	for(j=0;str[j]!=NULL;j++){
		if(str[j]==chr){
			num[i]++;
		}
	}
}

void main()
{
	int i;
	int num[26]={0};
	char str[1024];
	char filename1[]="str1.txt";
	char filename2[]="countdata.txt";
	FILE *ofp,*wfp;
	
	if((ofp=fopen(filename1,"r"))==NULL){
		printf("%sを開けません¥n",filename1);
		exit(0);
	}
	
	i = 0;
	while ( !feof(ofp) && i < 1024) {
		fscanf(ofp,"%c",&str[i]);
		i++;
    }
	
	fclose(ofp);
	
	printf("%s¥n",str);
	
	for(i=0;i<26;i++){
		count(str,'a'+i,i,num);
	}
	
	if((wfp=fopen(filename2,"w"))==NULL){
		printf("%sを開けません¥n",filename2);
		exit(0);
	}
	
	for(i=0;i<26;i++){
		fprintf(wfp,"%c %d¥n",'a'+i,num[i]);
	}
	
	fclose(wfp);
}

(3) 熱電対により得られたデータsokutei.csvを電圧から温度に変換しondo.csvファイルに書き出すプログラムを作成せよ.


#include<stdio.h>
void main()
{
	float data[1000];
	float t,s;
	int i;

	FILE *ifp;
	FILE *ofp;
	ifp=fopen("sokutei.csv","r");
	ofp=fopen("temp.xls","w");

	if(ifp==NULL){
		printf("ファイルが開けません.¥n");
	}
	if(ofp==NULL){
		printf("ファイルに書き込めません.¥n");
	}

	for(i=0;i<1000;i++){
		fscanf(ifp,"%f",&data[i]);
	}
	s=0.0;
	for(i=0;i<1000;i++){
		s=s+0.001;
		t=100.0/5.0*data[i];
		fprintf(ofp,"%f¥t%f¥n",s,t);
	}
	
	fclose(ifp);
	fclose(ofp);
}

第14回演習の解答例

(1) キーボードから3つの実数a, b, cを入力し,二次方程式ax2+bx+c=0の実数解を求めるプログラムを作成せよ.
但し虚数解の場合は "虚数解です" と表示するだけでよい.


#include<stdio.h>
#include<math.h>
void main()
{
	float a,b,c,D;
	
	printf("a=");
	scanf("%f",&a);
	
	printf("b=");
	scanf("%f",&b);
	
	printf("c=");
	scanf("%f",&c);
	
	D = b * b - 4 * a * c;
	
	if(D < 0){
		printf("虚数解です¥n");
	}else {
		printf("解は%f,%fです¥n",(-b+sqrt(D))/(2*a),(-b-sqrt(D))/(2*a));
	}

}

(2) 整数の格納された配列a{9, 8, 7, 6, 5}に,数字の8が含まれるかどうか調べ,含まれている場合「配列は8を含みます」と画面に表示したい.
配列から数字8を探すプログラムを完成せよ.


#include<stdio.h>
void main()
{
	int a[5]={9,8,7,6,5},i,kosu;
	
	kosu=0;
	
	for(i=0;i<5;i++){
		if(a[i] == 8){
			kosu++;
		}
	}
	
	printf("配列は8を%d個含みます¥n",kosu);

}

(3) test.txtという名前のファイルを作成し,"Hello, Meiji"という文字列を書むプログラムを作成せよ.


#include<stdio.h>
void main()
{
	FILE *fp;

	fp=fopen("test.txt","w");

	if(fp==NULL){
		printf("ファイルに書き込めません¥n");
		return;
	}

	fprintf(fp,"Hello,Meiji¥n");
	
	fclose(fp);
}

(4) データ件数nと,浮動小数点配列fを受け取り,データの平均値(浮動小数点)を求めて返す関数heikinを作成せよ.

(5) あるクラスの生徒の身長(浮動小数点)が,番号順に1番から30番まで並んだファイルsincho.txtがある(人数は30人だとわかっているとする).
前問で作成した平均値を求める関数を用いて(関数の定義も解答に含めること),ファイルの内容を配列に読み込み,クラスの生徒の平均身長を求め,
結果を画面に表示するプログラムを作成せよ.


#include<stdio.h>

float heikin(int n,float *a)
{
	float sum=0.0;
	int i;
	for(i=0;i<n;i++){
		sum=sum+a[i];
	}

	return (sum/(float)n);
}

void main()
{
	float a[30];
	int i;
	
	FILE *fp;
	fp=fopen("sincho.txt","r");

	if(fp==NULL){
		printf("ファイルを読み込めません.¥n");
		return;
	}

	for(i=0;i<30;i++){
		fscanf(fp,"%f",&a[i]);
		printf("%d番目の身長=%f¥n",i+1,a[i]);
	}
	printf("平均身長は%fです.¥n",heikin(30,a));
	
	fclose(fp);
}