余贞侠C语言程序设计课后参考答案

第十章 (答案仅供参考),有问题大家可以在评论区一起讨论。


10.2//用Windows的记事本编辑一个文本文件,编写程序读取该文件中的数据,并在屏幕上显示;
#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE *fp;
	char name[20];
	char ch;
	printf("请输入文件名称:\n");
	scanf("%s",name);
	fp=fopen(name,"r");
	if(fp==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回程序;
	}
	ch=fgetc(fp);//以字符方式从文件中读取一个字符;
	while(ch!=EOF)//若读取到末尾,解fgetc()返回EOF(-1);
	{
		putchar(ch);//将字符送往屏幕;
		ch=fgetc(fp);//从文件读取下一个字符;
	}
	putchar('\n');
	fclose(fp);//关闭文件;
	return 0;
}

10.3//将一个文本文件的内容复制到另一个文本文件中,文本文件的名字从键盘输入;
#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE *fp1,*fp2;
	char data;//一个内存数据域
	char c;
	char name1[21],name2[21];
	
	printf("请输入要读的文件名:\n");
	scanf("%s",name1);
	fp1=fopen(name1,"w");
	//fp1=fopen("student.txt","w");
	if(fp1==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回程序;
	}
	scanf("%c",&c);
	while(c!='$')
	{
		fputc(c,fp1);
		scanf("%c",&c);
	}
	fclose(fp1);


	//fp1=fopen("student.txt","rb");
	//fp2=fopen("stu.txt","wb");
	fp1=fopen(name1,"rb");//以二进制打开文件,供读
	printf("请输入要写的文件名:\n");
	scanf("%s",name2);
	fp2=fopen(name2,"wb");//以二进制打开文件,供写
	if(fp1==NULL||fp2==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回程序;
	}
	fread(&data,sizeof(char),1,fp1);//从fp1中对一个字节的内容到变量data;
	while(!feof(fp1))//所要读的文件未读完,feof()返回值为0;
	{
		fwrite(&data,sizeof(char),1,fp2);//将变量data的内容复制到fp2中;
		fread(&data,sizeof(char),1,fp1);//从fp1中在读一个字节的内容到变量data
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
}
	
10.4//输入五个学生信息,(姓名,年龄,数学,英语,语文),将学生信息存入名为"student.txt"文本文件中,
//每个学生占一行,各个数据之间用空格分隔,写文件采用fprintf()函数;
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct STU
{
	char name[21];
	int age;	
	float score[3];//三门课成绩;	
};		
int main()
{
	struct STU stu[N];
	FILE *fp;
	int i,s;
	fp=fopen("student.txt","w");
	if(fp==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回程序;
	}
	for(i=0;i<N;i++)
	{
		printf("%d_student information:\n姓名 年龄 数学 英语 语文\n",i+1);
		/*从键盘读入一个结构体数据到变量;*/
		scanf("%s %d %f %f %f",stu[i].name,&stu[i].age,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
		fprintf(fp,"%s %d %4.2f %4.2f %4.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
	}
	fclose(fp);
	/*
	fp=fopen("student.txt","r");
	printf("students information:\n姓名 年龄 英语 数学 语文\n");
	//利用fscanf()从文件读出学生信息,利用返回值判断是否读出成功,(成功则返回fscanf以赋值变量的个数
	//负责返回EOF(-1)
	for(i=0;i<N;i++)
	{
		s=fscanf(fp,"%s %d %f %f %f",stu[i].name,&stu[i].age,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
		if(s==5)//fscanf返回值(以赋值变量个数)
		{
			printf("%s %3d %5.2f %5.2f %5.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
		}
	}
	fclose(fp);
	*/

	return 0;
}

10.5/*将第四题文件中的数据读出来并求出平均成绩,按平均成绩从高到低显示学生信息(读文件采用fscanf()函数)*/
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct STU
{
	char name[21];
	int age;	
	float score[3];//三门课成绩;
	float avg;//平均成绩
};		
int main()
{
	struct STU stu[N],t;
	FILE *fp;
	int i,j,s;
	float sum;
	fp=fopen("student.txt","r");
	if(fp==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回程序;
	}
	printf("students information:\n姓名 年龄 英语 数学 语文\n");
	//利用fscanf()从文件读出学生信息,利用返回值判断是否读出成功,(成功则返回fscanf以赋值变量的个数
	//负责返回EOF(-1)
	for(i=0;i<N;i++)
	{
		sum=0;
		s=fscanf(fp,"%s %d %f %f %f",stu[i].name,&stu[i].age,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
		if(s==5)//fscanf返回值(以赋值变量个数)
		{
			printf("%s %3d %5.2f %5.2f %5.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
	        for(j=0;j<3;j++)
			{
				sum=sum+stu[i].score[j];
			}
			stu[i].avg=sum/3;
		}
	}
	for(i=0;i<N;i++)
	{
		printf("平均成绩:%.2f ",stu[i].avg);
	}
	for(i=0;i<N;i++)//比较排序法
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[i].avg<stu[j].avg)
			{
				t=stu[i];
				stu[i]=stu[j];
				stu[j]=t;
			}
		}
	}
	printf("排序后的信息:\n姓名  年龄  英语  数学  语文  平均成绩\n");
	for(i=0;i<N;i++)
	{
		printf("%6s %2d %6.2f %6.2f %6.2f %6.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].avg);
	}
	fclose(fp);
	return 0;
}
10.6//定义一个结构体类型,其成员变量分别用来描述商品的名称,单价,数量,金额。输入n个商品的信息,将其保存到二进制文件中。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Product
{
	char name[21];//名称
	float price;//单价
	int num;//数量
	float money;//金额
};
int main()
{
	struct Product p[N];
	int i,n;
	char a[21];//用来存放文件地址;
	FILE *fp;
	printf("please input product numbers(1~%d):\n",N);
	scanf("%d",&n);
	if(n<=0||n>N)
	{
		printf("please input again!\n");
		exit(0);
	}
	printf("please input text site:\n");
	scanf("%s",a);//二进制文件以dat为文件名后缀;
	fp=fopen(a,"wb");
	if(fp==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回文件
	}
	for(i=0;i<n;i++)
	{
		printf("please input %d product information:\n名称 单价 数量\n",i+1);
		scanf("%s %f %d",p[i].name,&p[i].price,&p[i].num);
		p[i].money=p[i].price*p[i].num;
		fwrite(&p[i],sizeof(struct Product),1,fp);
	}

	fclose(fp);
	fp=fopen(a,"rb");//以二进制打开文件供读;
	printf("product information:\n名称 单价 数量 金额\n");
	for(i=0;i<n;i++)
	{
		while(fread(&p[i],sizeof(struct Product),1,fp)==1)//返回值为数据块的个数,说明还有内容
		{
	    	printf("%3s %3.2f %3d %3.2f\n",p[i].name,p[i].price,p[i].num,p[i].money);
		}
	}
	fclose(fp);
	return 0;
}


10.7//将第六题的商品信息文件读出并显示,要求在显示数据时,首先按照金额从高到低排序,若金额相同,在按产品单价从高到低排序;

#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Product
{
	char name[21];//名称
	float price;//单价
	int num;//数量
	float money;//金额
};
int main()
{
	struct Product p[N],t;
	int i,j,n;
	char a[21];//用来存放文件地址;
	FILE *fp;
	printf("please input text site:\n");
	scanf("%s",a);//二进制文件以dat为文件名后缀;
	fp=fopen(a,"rb");
	if(fp==NULL)
	{
		printf("File can not be opened!\n");
		exit(0);//返回文件
	}
	printf("product information:\n名称 单价 数量 金额\n");
	/*for(i=0;i<N;i++)
	{
		if(fread(&p[i],sizeof(struct Product),1,fp)==1)//返回值为数据块的个数,说明还有内容
		{
	    	printf("%6s %3.1f %2d %4.2f\n",p[i].name,p[i].price,p[i].num,p[i].money);
		}
		if(feof(fp))//feof()判断文件是否读
		{
			break;
		}
	}*/
	for(i=0;i<N;i++)
	{
		if(feof(fp))
		{
			break;
		}
		fread(&p[i],sizeof(struct Product),1,fp);
	}
	n=i-1;//n表示的是结构体变量(数据块)的个数,i-1是因为feof函数会在文件内容输入完后在循环一次才结束,
	for(i=0;i<n;i++)//比较排序法
	{
		for(j=i+1;j<n;j++)
		{
			if(p[i].money<p[j].money)//比较金额
			{
				t=p[i];
				p[i]=p[j];
				p[j]=t;
			}
			else if(p[i].money==p[j].money&&p[i].price<p[j].price)//比较价格
			{
				t=p[i];
				p[i]=p[j];
				p[j]=t;
			}
		}
	}
	printf("product finally information:\n名称 单价 数量 金额\n");
	for(i=0;i<n;i++)
	{
		printf("%6s %3.1f %2d %4.2f\n",p[i].name,p[i].price,p[i].num,p[i].money);
	}
	fclose(fp);
	return 0;
}


#include #include struct DATA { int ID; char name[4]; char sex[3]; int score; }; void paixu(int*,DATA*,int); int sishewuru(double); void func1(int*,int*,DATA*,int*,int,int,int,int);//统计男女比例 int func2(int*,int,DATA*);//查找考生序号 void print(); void main() { int length=0,i,yiben,erben,sanben,dazhuan,male[4],female[4]; int yi,er,san,si; char input; FILE* file=fopen("f1.txt","r"),*file1; if(file==NULL) { printf("No such file!\n"); return; } while(EOF!=fscanf(file,"%*[^\n]\n")) length++;//自动计算考生数罝ATA* data=(DATA*)malloc(length*sizeof(DATA)); int* pai=(int*)malloc(length*sizeof(int)); rewind(file); for(i=0;i='0'&&input<='4')) { printf("非法输入,请重新输入\n请输入:"); fflush(stdin); } else break; } getchar(); switch(input) { case '0': printf("\n一类本科招生线:%d\n二类本科招生线:%d\三类本科招生线:%d\\n高职高专招生线:%d\n",yi,er,san,si); printf("是否打印为文件?(y/n):"); if(getchar()=='y') { file1=fopen("各批次录取分数线.txt","w"); fprintf(file1,"一类本科招生线:%d\n二类本科招生线:%d\\n三类本科招生线:%d\n高职高专招生线:%d\n",yi,er,san,si); fclose(file1); } fflush(stdin); break; case '1': func1(male,female,data,pai,yiben,erben,sanben,dazhuan); printf("一类本科招生线男女比例:%d:%d\n",male[0],female[0]); printf("二类本科招生线男女比例:%d:%d\n",male[1],female[1]); printf("三类本科招生线男女比例:%d:%d\n",male[2],female[2]); printf("高职高专招生线招生线男女比例:%d:%d\n",male[3],female[3]); printf("是否打印为文件?(y/n):"); if(getchar()=='y') { file1=fopen("各批次录取男女比例.txt","w"); fprintf(file1,"一类本科招生线男女比例:%d:%d\n",male[0],female[0]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野性的鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值