C语言将学生信息写入文件中

该程序实现了学生信息的输入、按照成绩降序排列并写入文件,以及从文件读取成绩计算平均值的功能。用户可以输入学生姓名、学号和成绩,程序通过冒泡排序进行成绩降序排列,并将数据保存到文件。最后,程序读取文件数据计算平均成绩并显示。
摘要由CSDN通过智能技术生成

函数说明

  • 标准输入多条学生数据
  • 将学生信息写入到文件中
  • 将学生信息按照成绩降序写入文件中
  • 从文件中读取到学生的成绩并计算出平均值输出

函数实现

#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;
}

运行实现

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值