题目:
(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( )的文件,并将输入的信息写入了这个文件。文章来源:https://www.toymoban.com/news/detail-441500.html
文章来源地址https://www.toymoban.com/news/detail-441500.html
到了这里,关于【C语言】#文件操作#有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!