题目:

(1)有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。

设5名学生的学号、姓名和3门课成绩如下:

在向文件stud写入数据后,应检查验证stud文件中的内容是否正确。

编写程序:

#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Student{		//定义结构体 
	char id[10];		//学号 
	char name[10];		//姓名 
	float score[3];		//3科成绩 
	float ave;			//平均分 
}stu[N];				//定义结构体数组 
/*-----学生信息输入函数------*/
void input(void){
	int i,j; 
	for(i=0;i<N;i++){
		printf("输入第%d个学生信息:\n",i+1);
	scanf("%s %s %f %f %f",&stu[i].id,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);		//接收学生信息 
		stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;	//计算每个学生平均分 
	}
}
/*-----学生信息写入文件函数----*/
void wri(void){
	FILE *fp;				//定义文件指针 
	int i;
	fp=fopen("stud","w");	//为了输出数据,打开一个文件,若么有该文件就新建一个 
	for(i=0;i<N;i++)
		if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1){	//写入数据信息 
			printf("\n写入错误!!!\n");
			exit(0);				 
		}
	fp=fopen("stud","r");		//打开刚才的文件 
	puts("----------------------------------------------");
	puts("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分");		//表头样式 
	puts("----------------------------------------------");
	for(i=0;i<N;i++){
		fread(&stu[i],sizeof(struct Student),1,fp);	//每次读取fp所指文件中的长度为sizeof所得字节数的数据项 
	printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); 		//输出刚才写入文件的信息	
	}
	fclose(fp);
}
int main(){
	input();		//调用学生信息输入函数 
	wri();			//调用学生信息写入文件函数
	return 0;
}

 程序运行结果:程序运行生成了一个名为stud(        )的文件,并将输入的

 信息写入了这个文件。


(2)将上题stud文件中的学生数据按平均分进行排序处理,将已排序的学生数据存入一个新文件stu_sort中。在向文件stu_sort写入数据后,应检查验证stu_sort文件中的内容是否正确。

 编写程序

#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Student{		//定义结构体 
	char id[10];		//学号 
	char name[10];		//姓名 
	float score[3];		//3科成绩 
	float ave;			//平均分 
}stu[N],temp;			//定义结构体数组,和一个结构体变量 
/*---对上次文件中的数据排序函数--*/
void stu_sort(){
	FILE *fp;					//定义文件指针 
	int i,j,count=0,max;		 
	fp=fopen("stud","r");		//以度的方式打开刚才的文件 
	puts("原来的:");
	puts("----------------------------------------------");
	puts("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分");		//表头样式 
	puts("----------------------------------------------");
	for(i=0;i<N;i++){
		fread(&stu[i],sizeof(struct Student),1,fp);	//每次读取fp所指文件中的长度为sizeof所得字节数的数据项 
	printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //输出所读原来的内容 
	}
	//冒泡排序 
	for(j=0;j<N;j++)
		for(i=0;i<N-j-1;i++)
			if(stu[i].ave<stu[i+1].ave){
				temp=stu[i+1];
				stu[i+1]=stu[i];
				stu[i]=temp;
			}
	fp=fopen("stu_sort","w");			//将排好序的结构体数组写入新的文件中 
	for(i=0;i<N;i++)	
		if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1){			//写入数据信息 
			printf("\n写入错误!!!\n");
			exit(0);				 
		}
	fp=fopen("stu_sort","r");		//再次打开需要将信息排序的的文件 
	puts("\n现在的:"); 
	puts("----------------------------------------------");
	puts("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分");		//表头样式 
	puts("----------------------------------------------");
	for(i=0;i<N;i++){
		fread(&stu[i],sizeof(struct Student),1,fp);		//每次读取fp所指文件中的长度为sizeof所得字节数的数据项 
	printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //输出排序好的数组	
	}
	fclose(fp);		//关闭文件 
}
int main() {
	stu_sort();		//调用文件内容排序函数 
	return 0;
}

程序运行结果:程序运行生成了一个名为stu_sort(           )的文件,并将输入的信息写入了这个文件。

  (3)将上题已排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩。程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。 在向新文件stu_new写入数据后,应检查验证stu_new文件中的内容是否正确

要插入的学生数据为:

 编写程序:

#include<stdio.h>
#include<stdlib.h>
#define N 6			//原来的5人再加1人 
struct Student{		//定义结构体 
	char id[10];		//学号 
	char name[10];		//姓名 
	float score[3];		//3科成绩 
	float ave;			//平均分 
}stu[N],temp;			//定义结构体数组,和一个结构体变量 
/*----插入排序队列函数----*/
void stu_sort_new(struct Student stu0){
	FILE *fp;					//定义文件指针 
	int i,count; 
	fp=fopen("stu_sort","r");	//读入刚才内容排好序的文件 
	puts("原来的:");
	puts("----------------------------------------------");
	puts("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分");		//表头样式 
	puts("----------------------------------------------");
	for(i=0;i<N-1;i++){				//因为原来只有五人,所以这次只读入N-1=5人 
		fread(&stu[i],sizeof(struct Student),1,fp);	//每次读取fp所指文件中的长度为sizeof所得字节数的数据项 
	printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); 		//输出所读原来的内容 
	}
	//将原来文件中的个数据项的平均分和传入的数据的平均分项对比,找出应该插入位置 
	for(i=0;i<N-1;i++)			//因为现在数组只有五个人的信息,所以不用检查数组尾部了
		if(stu0.ave>stu[i].ave){
			count=i; 		//记录插入位置 
			break;
		}
	for(i=N-1;i>=count;i--)
		stu[i]=stu[i-1];		//将插入位置及其后的数据向后挪 
	stu[count]=stu0;
	fp=fopen("stu_new","w");		//再次打开需要将信息排序的的文件 
	for(i=0;i<N;i++)	
		if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1){	  //写入数据信息 
			printf("\n写入错误!!!\n");
			exit(0);
		}
	fp=fopen("stu_new","r");		//再次打开需要将信息排序的的文件,检查其中的内容 
	puts("\n现在的:"); 
	puts("----------------------------------------------");
	puts("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分");		//表头样式 
	puts("----------------------------------------------");
	for(i=0;i<N;i++){
		fread(&stu[i],sizeof(struct Student),1,fp);	//每次读取fp所指文件中的长度为sizeof所得字节数的数据项 
	printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);			 //输出内容重新排序好的文件内容 
	}
	fclose(fp);		//关闭文件 
} 
int main(){
	struct Student stu0;		//定义需要结构体变量 
	printf("输入要插入的学生信息:\n");
	scanf("%s %s %f %f %f",&stu0.id,&stu0.name,&stu0.score[0],&stu0.score[1],&stu0.score[2]);
	stu0.ave=(stu0.score[0]+stu0.score[1]+stu0.score[2])/3;		//计算平均分 
	stu_sort_new(stu0);			//调用插入排序队列函数 
	return 0;	
}

程序运行结果:程序运行生成了一个名为stu_new(  )的文件,并将输入的信息写入了这个文件。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐