函数说明
- 标准输入多条学生数据
- 将学生信息写入到文件中
- 将学生信息按照成绩降序写入文件中
- 从文件中读取到学生的成绩并计算出平均值输出
函数实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//学生类型结构体,包含姓名、学号、成绩
typedef struct{
char name[20];
char id[20];
double grade;
}Student;
/**
* 写入学生信息
* @param student
* @param num 需要写入的学生数量
*/
void InputStudentDate(Student * student,int num)
{
for (int i = 0; i < num; ++i) {
printf("请输入学生姓名(第%d位):",i+1);
scanf("%s",student[i].name);
fflush(stdin);
if(!student[i].name)
{
printf("输入错误!请重新输入:");
scanf("%s",student[i].name);
fflush(stdin);
}
printf("请输入学生学号:");
scanf("%s",student[i].id);
fflush(stdin);
if(!student[i].id)
{
printf("输入错误!请重新输入:");
scanf("%s",student[i].id);
fflush(stdin);
}
printf("请输入学生成绩:");
scanf("%lf",&student[i].grade);
fflush(stdin);
if(!student[i].grade)
{
printf("输入错误!请重新输入:");
scanf("%lf",&student[i].grade);
fflush(stdin);
}
}
printf("信息输入完成!");
}
/**
* 将学生信息写入文件中
* @param student
* @param num
*/
void OutputStudentDate1(Student * student,int num)
{
FILE * file= fopen("destfile1.txt","w+");//打开文件,参数1 文件名,参数2 文件类型为只写入
if(file == NULL)
{
perror("文件错误");//会打印错误类型
}
for (int i = 0; i < num; ++i) {
fprintf(file,"%s %s %.2f\n",student[i].name,student[i].id,student[i].grade);
}
fclose(file);//打开文件后一定要记得关闭文件
}
/**
* 将学生信息按成绩降序写入文件中
* @param student
* @param num
*/
void OutputStudentDate2(Student * student,int num)
{
for (int i = 0; i < num; ++i) {
for (int j = 0; j < num-i-1; ++j) {
if(student[j].grade<student[j+1].grade)
{//值交换,冒泡排序法
Student t;
strcpy(t.name,student[j].name);
strcpy(t.id,student[j].id);
t.grade=student[j].grade;
strcpy(student[j].name,student[j+1].name);
strcpy(student[j].id,student[j+1].id);
student[j].grade=student[j+1].grade;
strcpy(student[j+1].name,t.name);
strcpy(student[j+1].id,t.id);
student[j+1].grade=t.grade;
}
}
}
FILE * file= fopen("destfile1.txt","w+");
if(file == NULL)
{
perror("文件错误");
}
for (int i = 0; i < num; ++i) {
fprintf(file,"%s %s %.2f\n",student[i].name,student[i].id,student[i].grade);
}
fclose(file);
}
/**
* 读取到文件中学生成绩并求平均值
* @param num
* @return
*/
double AverageGradeOfStudent(int num)
{
Student student[100];
double ave_grade;
FILE * file= fopen("destfile1.txt","r");
if(file == NULL)
{
perror("文件错误");
}
rewind(file);//将文件中的光标移动到文件开始处
for (int i = 0; i < num; ++i) {
fscanf(file,"%s %s %lf\n",student[i].name,student[i].id,&student[i].grade);
ave_grade+=student[i].grade;
}
ave_grade/=num;
fclose(file);
return ave_grade;
}
int main() {
Student student[100];
int num=0;
printf("请输入要写入数据的学生人数:");
scanf("%d",&num);
fflush(stdin);
InputStudentDate(student,num);
OutputStudentDate2(student,num);
double ave_grade= AverageGradeOfStudent(num);
printf("\n学生的平均成绩为:%.2f",ave_grade);
return 0;
}
运行实现