身につくC言語-演習問題7回目 解答と解説-

問題1解答


#include<stdio.h>
int main(void)
{
	FILE *fp;
	fp=fopen("hello.txt","w");
	
	fprintf(fp,"おはよう\nこんにちは\nこんばんは\n");
	
	fclose(fp);
	
	return 0;
}

基本的なファイルへの出力です。

改行は、ファイルでも変わらず「\n」を使用します。

 

問題2解答


#include<stdio.h>
#include<string.h>

int main(void)
{
	FILE *fp;
	char a[3][40];
	char *b="今日はいい天気ですね。";
	int i;
	
	fp=fopen("hello.txt","r");
	
	for(i=0;i<3;i++)
	{
		fscanf(fp,"%s",a[i]);
		strcat(a[i],b);
	}
	for(i=0;i<3;i++)
	{
		printf("%s\n",a[i]);
	}
	
	fclose(fp);
	
	return 0;
}

ここでは、strcat();を使用しています。

はじめの要素に、次の要素を連結させたものをはじめの要素に代入しています。

string.hをインクルードする必要があります。

 

問題3解答


#include<stdio.h>
int main(void)
{
	FILE *fp;
	int num;
	
	fp=fopen("addtext.txt","a");
	if(fp==NULL)
	{
		printf("開けません。\n");
		return 1;
	}
	
	printf("入力する数はなんですか。\n");
	scanf("%d",&num);
	fprintf(fp,"%d",num);
	
	fclose(fp);
	return 0;
}

ここでは、追記ようにファイルを開く必要があります。

書き込みように開いてしまうと、プログラムを閉じて再び実行してしまうと新しいテキストファイルとなり追記ができません。

 

問題4解答


#include<stdio.h>
void soto(int *kazu);

int main(void)
{
	FILE *fp;
	int kazu[5];
	int i;
	
	fp=fopen("kazu.txt","r");
	for(i=0;i<5;i++)
	{
		fscanf(fp,"%d",&kazu[i]);
	}

	fclose(fp);
	
	fp=fopen("newkazu.txt","w");
	
	soto(kazu);
	
	for(i=0;i<5;i++)
	{
		printf("%d\n",kazu[i]);
	}
	for(i=0;i<5;i++)
	{
		fprintf(fp,"%d\n",kazu[i]);
	}
	fclose(fp);
	
	return 0;
}
void soto(int *kazu)
{
	int i,j;
	int num;
	for(i=0;i<5;i++)
	{
		for(j=1;j<5-i;j++) { if(kazu[i]>kazu[i+j])
			{
				num=kazu[i];
				kazu[i]=kazu[i+j];
				kazu[i+j]=num;
			}
		}
	}
}

今回はファイルへの入出力の他に、「ソート」もしなければなりません。

ソートについてわからないという人はこちらの問題+α解答をどうぞ↓

身につくc言語-演習問題6回目 解答と解説-

問題+α 解答


#include<stdio.h>
#include<string.h>
typedef struct{
	char name[20];
	int number;
	int score;
}List;

void soto(List lists[5]);

int main(void)
{
	FILE *fp;
	List lists[5];
	int i,j;
	
	fp=fopen("textfile.txt","r");
	if(fp==NULL)
	{
		printf("ファイルが開けません。\n");
		return 1;
	}
	
	for(i=0;i<5;i++)
	{
		fscanf(fp,"%d %s %d",&lists[i].number,lists[i].name,&lists[i].score);
		printf("%d %s %d\n",lists[i].number,lists[i].name,lists[i].score);
		
	}
	
	fclose(fp);
	putchar('\n');
	fp=fopen("textfilea.txt","w");
	if(fp==NULL)
	{
		printf("ファイルが開けません。\n");
		return 1;
	}
	
	soto(lists);
	
	for(i=0;i<5;i++)
	{
		printf("%d %s %d\n",lists[i].number,lists[i].name,lists[i].score);
	}
	
	
	for(i=0;i<5;i++)
	{
		fprintf(fp,"%d %s %d\n",lists[i].number,lists[i].name,lists[i].score);
	}
	
	fclose(fp);
	
	return 0;
}

void soto(List lists[5])
{
	char na[20];
	int i,j;
	int numb;
	int sco;

	for(i=0;i<5;i++)
	{
		for(j=1;j<5-i;j++) { if(lists[i].number>lists[i+j].number)
			{
				numb=lists[i].number;
				lists[i].number=lists[i+j].number;
				lists[i+j].number=numb;
				
				strcpy(na,lists[i].name);
				strcpy(lists[i].name,lists[i+j].name);
				strcpy(lists[i+j].name,na);
				
				sco=lists[i].score;
				lists[i].score=lists[i+j].score;
				lists[i+j].score=sco;
				
			}
		}
	}
	
}

これも、ソートが必要となります。

出席番号、名前、点数と3つの要素があるのでそれぞれをソートしなければなりません。

今まで通りにソート使用とした人は、名前のソートができないと感じたことでしょう。

ここでは、strcpyを利用して文字列をコピーしています。

こちらのプログラムを入力して見てください。


#include
int main(void)
{
	char a[20]="hello";
	printf("%s",a);
	return 0;
}

これは初期化しているので、出力することができます。

しかし、こちらはどうでしょうか。


#include
int main(void)
{
	char a[20];
	a="hello";
	printf("%s",a);
	return 0;
}

これでは左辺値が必要とエラーが出るはずです。

初期化ではない場合、配列に文字列を格納することはできません。

このような場合は、strcpy();を利用しましょう。


#include
int main(void)
{
	char a[20];
	strcpy(a,"hello");
	printf("%s",a);
	return 0;
}

これで出力されました。


ファイルの入出力や操作は難しいですが、覚えておいて損はありません。