C语言文件操作程序设计

简述

利用C语言实现一个程序,要求该程序具备以下功能:

  1. 用户可以输入一个班级学生的某门课程成绩信息,包括学号、姓名、平时成绩和考试成绩。
  2. 程序会通过计算得到学生的总评成绩,计算方法为总评成绩 = 20% × 平时成绩 + 80% × 考试成绩。
  3. 程序能够将学生的成绩信息存入文本文件。
  4. 程序可以从文本文件中读取全部学生信息。
  5. 程序能够查询并显示总评成绩最低和最高的学生信息。

任务描述

设计开发一个程序:能输入一个班学生某门课程的成绩信息,包括学号、姓名、平时成绩、考试成绩,然后通过计算得到总评成绩(=20%×平时成绩+80%×考试成绩),能够将这些信息存入文本文件;能够从文件中读取全部学生信息和查询总评成绩最低和最高的学生信息,并完整无误地显示出来。 学生信息按如下格式保存到文本文件: 001 张三 34.00 56.00 51.60 002 李四 68.00 90.00 85.60 ......

编程要求

(1)本程序采用多源文件结构,即:由三个源文件组成,分别是:

  • 主函数源文件(main.c);
  • 自定义函数源文件(student.c);
  • 头文件(student.h)。

(2)请你根据 main.c 和 head.h 中代码,在右侧代码区中完成 student.c 中的自定义函数的代码(不要更改已有的代码)。 (3)友情提示:你可以在 cbs 或 vs 中,把这三个文件添加到同一个 project 中,按要求完成程序的开发,然后,复制 student.c 中的代码到右侧代码区。 (4)完成该实训后,请迅速完成本次实验对应报告的撰写。

测试说明

以下是典型的测试结果画面(为防止低级错误,你可以根据需要复制下面的文本到你的代码中):


学生人数N=3
学生0的学号,姓名,平时成绩,考试成绩(空格分隔):
1900310101 张无忌 85 94
学生1的学号,姓名,平时成绩,考试成绩(空格分隔):
1900310102 周润发 78.5 60.4
学生2的学号,姓名,平时成绩,考试成绩(空格分隔):
1900320104 王杰 68 89.5
全部学生、总评最低和最高学生信息如下:
全部学生:
学号=1900310101,姓名=张无忌,平时成绩=85.00,考试成绩=94.00,总评成绩=92.20
学号=1900310102,姓名=周润发,平时成绩=78.50,考试成绩=60.40,总评成绩=64.02
学号=1900320104,姓名=王杰,平时成绩=68.00,考试成绩=89.50,总评成绩=85.20
最低分学生:
学号=1900310102,姓名=周润发,平时成绩=78.50,考试成绩=60.40,总评成绩=64.02
最高分学生:
学号=1900310101,姓名=张无忌,平时成绩=85.00,考试成绩=94.00,总评成绩=92.20

student.c文件代码如下:  

//student.c文件
#include<stdio.h>
#include<string.h>
#include "student.h"

//自定义函数的完整定义

//输入学生信息
void inputInformation(Student* stus, int N)
{
    int k = 0;
    char c = '\n';
    for (k = 0; k < N; k++)
    {
        printf("学生%d的学号,姓名,平时成绩,考试成绩(空格分隔):\n", k); //输入到结构体中 
        scanf("%s%s%f%f", &stus[k].stu_number, &stus[k].stu_name, &stus[k].usual_mark, &stus[k].exam_mark);
        stus[k].overall_mark = 0.2 * stus[k].usual_mark + 0.8 * stus[k].exam_mark; //计算总成绩 
    }
}

//保存学生信息到文件
void saveInformation(Student* stus, int N, char* filename)
{
    FILE* p = NULL;
    p = fopen(filename, "w");
    fwrite(stus, sizeof(struct student), N, p); //通过循环读取写入的数据 
    fclose(p);
}

//输出学生信息
void outputInformation(char* filename)
{
    int i, j = 0, f = 0, k = 0, m = 0;
    float max, min;
    Student stus[20], std[20];
    FILE* p;
    p = fopen(filename, "r");
    while (!feof(p))
    {
        fread(std, sizeof(Student), 1, p);
        j++;
    }
    rewind(p);
    fread(stus, sizeof(Student), j - 1, p);
    printf("全部学生:\n");
    for (int i = 0; i < j - 1; i++)
    {
        printf("学号=%s,姓名=%s,平时成绩=%.2f,考试成绩=%.2f,总评成绩=%.2f\n", stus[i].stu_number, stus[i].stu_name, stus[i].usual_mark, stus[i].exam_mark, stus[i].overall_mark);
    }

    for (i = 0; i < j - 1; i++)
    {
        if (i == 0)
        {
            max = stus[0].overall_mark;
            min = stus[0].overall_mark;
        }

        if (stus[i].overall_mark > max) //选出最高分的学生 
        {
            m = i;
            max = stus[i].overall_mark;
        }

        if (stus[i].overall_mark < min) //选出最低分的学生
        {
            f = i;
            min = stus[i].overall_mark;
        }

    }
    printf("最低分学生:\n");
    printf("学号=%s,姓名=%s,平时成绩=%.2f,考试成绩=%.2f,总评成绩=%.2f\n", stus[f].stu_number, stus[f].stu_name, stus[f].usual_mark, stus[f].exam_mark, stus[f].overall_mark);
    printf("最高分学生:\n");
    printf("学号=%s,姓名=%s,平时成绩=%.2f,考试成绩=%.2f,总评成绩=%.2f\n", stus[m].stu_number, stus[m].stu_name, stus[m].usual_mark, stus[m].exam_mark, stus[m].overall_mark);
    fclose(p);
}

 main.c文件代码如下:  

//main.c文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "student.h"

int main()
{
    Student* stus; //指向学生结构体的指针
    char path[1024]; //存储文件路径的字符数组
    int N; //学生人数

    getcwd(path, 1024); //获取当前工作目录
    strcat(path, "\\data.txt"); //在路径后添加文件名"data.txt"

    //输入学生人数
    printf("学生人数N=");
    scanf("%d", &N);

    //创建动态结构体数组,分配内存空间
    stus = (Student*)malloc(sizeof(Student) * N);

    //输入学生信息
    inputInformation(stus, N);

    //将学生成绩记录存入文件,并关闭文件
    saveInformation(stus, N, path);

    //释放内存
    free(stus);

    //从文件中读取学生成绩记录,输出最低和最高总评成绩对应的学生完整信息
    printf("全部学生、总评最低和最高学生信息如下:\n");
    outputInformation(path);

    return 0;
}

 student.h文件代码如下:  

//student.h
#ifndef STUDENT_H_INCLUDED
#define STUDENT_H_INCLUDED

// 学生结构体
typedef struct student
{
    char stu_number[20]; // 学号
    char stu_name[20];   // 姓名
    float usual_mark;    // 平时成绩
    float exam_mark;     // 考试成绩
    float overall_mark;  // 总评成绩
} Student;

// 输入学生信息
void inputInformation(Student* stus, int N);

// 保存学生信息到文件
void saveInformation(Student* stus, int N, char* filename);

// 输出学生信息
void outputInformation(char* filename);

#endif

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值