C语言例程:学生成绩管理程序

学生成绩管理程序

实例说明

编制一个统计存储在文件中的学生考试分数的管理程序。设学生成绩以一个学生一条记录的
形式存储在文件中,每个学生记录包含的信息有姓名、学号和各门功课的成绩。要求编制具有以
下几项功能的程序:求出各门课程的总分,平均分、按姓名,按学号寻找其记录并显示,浏览全
部学生成绩和按总分由高到低显示学生信息等。

程序运行结果
在这里插入图片描述

输入 l 命令后的结果
在这里插入图片描述

输入 s 命令后的结果
在这里插入图片描述

按姓名和学号查找记录的结果

在这里插入图片描述

计算平均分和总分
在这里插入图片描述

实例解析

设每位学生学习语文、数学和英语 3 门课程,主程序输入文件名之后,进入接受命令、执行
命令处理程序的循环。
按问题的要求共设 5 条命令:求各门课程的总分、求各门课程的平均分、按学生名字寻找其
信息、按学号寻找其信息、结束命令。
为求各门课程的总分,从文件逐一读出学生记录,累计各门课程的分数,待文件处理完即可
得到各门课程的总分。为求各门课程的平均分,从文件逐一读出学生记录,累计各门课程的分数,
并统计学生人数,待文件处理完毕,将得到的各门课程的总分除以人数就得到各门课程的平均分。
按学生名字寻找学生信息的处理,首先要求输入待寻找学生的名字,顺序读入学生记录,凡名字
与待寻找学生相同的记录都在屏幕上显示,直到文件结束。按学生学号寻找学生信息的处理,首
先要求输入待寻找学生的学号,顺序读入学生记录,发现有学号与待寻找学生相同的记录就在屏
幕上显示,并结束处理。浏览学生全部成绩,顺序读入学生记录,并在屏幕上显示,直到文件结
束。按总分由高到低显示学生信息,首先顺序读入学生记录并构造一个有序链表,然后顺序显示
链表上的各元素。

程序代码

#include <stdio.h> 
#define SWN 3 /* 课程数 */ 
#define NAMELEN 20 /* 姓名最大字符数 */ 
#define CODELEN 10 /* 学号最大字符数 */ 
#define FNAMELEN 80 /* 文件名最大字符数 */ 
#define BUFLEN 80 /* 缓冲区最大字符数 */ 
/* 课程名称表 */ 
char schoolwork[SWN][NAMELEN+1] = {"Chinese","Mathematic","English"}; 
struct record 
{ 
    char name[NAMELEN+1]; /* 姓名 */ 
    char code[CODELEN+1]; /* 学号 */ 
    int marks[SWN]; /* 各课程成绩 */ 
    int total; /* 总分 */ 
}stu; 

struct node 
{ 
    char name[NAMELEN+1]; /* 姓名 */ 
    char code[CODELEN+1]; /* 学号 */ 
    int marks[SWN]; /* 各课程成绩 */ 
    int total; /* 总分 */ 
    struct node *next; /* 后续表元指针 */ 
}*head; /* 链表首指针 */ 
 
int total[SWN]; /* 各课程总分 */ 
FILE *stfpt; /* 文件指针 */ 
char stuf[FNAMELEN]; /* 文件名 */ 
/* 从指定文件读入一条记录 */ 
int readrecord(FILE *fpt,struct record *rpt) 
{ 
    char buf[BUFLEN]; 
    int i; 
    if(fscanf(fpt,"%s",buf)!=1) 
        return 0; /* 文件结束 */ 
    strncpy(rpt->name,buf,NAMELEN); 
    fscanf(fpt,"%s",buf); 
    strncpy(rpt->code,buf,CODELEN); 
    for(i=0;i<SWN;i++) 
        fscanf(fpt,"%d",&rpt->marks[i]); 
    for(rpt->total=0,i=0;i<SWN;i++) 
        rpt->total+=rpt->marks[i]; 
    return 1;   
}
/* 对指定文件写入一条记录 */ 
void writerecord(FILE *fpt,struct record *rpt) 
{ 
    int i; 
    fprintf(fpt,"%s\n",rpt->name); 
    fprintf(fpt,"%s\n",rpt->code); 
    for(i=0;i<SWN;i++) 
        fprintf(fpt,"%d\n",rpt->marks[i]); 
    return ; 
} 

/* 显示学生记录 */ 
void displaystu(struct record *rpt) 
{ 
    int i; 
    printf("\nName : %s\n",rpt->name); 
    printf("Code : %s\n",rpt->code); 
    printf("Marks :\n"); 
    for(i=0;i<SWN;i++) 
        printf(" %-15s : %4d\n",schoolwork[i],rpt->marks[i]); 
    printf("Total : %4d\n",rpt->total); 
} 
/* 计算各单科总分 */ 
int totalmark(char *fname) 
{ 
    FILE *fp; 
    struct record s; 
    int count,i; 
    if((fp=fopen(fname,"r"))==NULL) 
    { 
        printf("Can't open file %s.\n",fname); 
        return 0; 
    } 
    for(i=0;i<SWN;i++) 
    total[i]=0; 
    count=0; 
    while(readrecord(fp,&s)!=0) 
    { 
        for(i=0;i<SWN;i++) 
            total[i]+=s.marks[i]; 
        count++; 
    } 
    fclose(fp); 
    return count; /* 返回记录数 */ 
} 

/* 列表显示学生信息 */ 
void liststu(char *fname) 
{ 
    FILE *fp; 
    struct record s; 
    if((fp=fopen(fname,"r"))==NULL) 
    {
        printf("Can't open file %s.\n",fname); 
        return ; 
    } 
    while(readrecord(fp,&s)!=0) 
    { 
        displaystu(&s); 
        printf("\n Press ENTER to continue...\n"); 
        while(getchar()!='\n'); 
    } 
    fclose(fp); 
    return; 
} 

/* 构造链表 */ 
struct node *makelist(char *fname) 
{ 
    FILE *fp; 
    struct record s; 
    struct node *p,*u,*v,*h; 
    int i; 
    if((fp=fopen(fname,"r"))==NULL) 
    { 
        printf("Can't open file %s.\n",fname); 
        return NULL; 
    } 
    h=NULL; 
    p=(struct node *)malloc(sizeof(struct node)); 
    while(readrecord(fp,(struct record *)p)!=0) 
    { 
        v=h; 
        while(v&&p->total<=v->total) 
        { 
            u=v; 
            v=v->next; 
        } 
        if(v==h) 
            h=p; 
        else 
            u->next=p; 
        p->next=v; 
        p=(struct node *)malloc(sizeof(struct node)); 
    } 
    free(p); 
    fclose(fp); 
    return h; 
} 

/* 顺序显示链表各表元 */ 
void displaylist(struct node *h) 
{ 
    while(h!=NULL) 
    { 
        displaystu((struct record *)h); 
        printf("\n Press ENTER to continue...\n");
        while(getchar()!='\n'); 
            h=h->next; 
    } 
    return; 
} 
/* 按学生姓名查找学生记录 */ 
int retrievebyn(char *fname, char *key) 
{ 
    FILE *fp; 
    int c; 
    struct record s; 
    if((fp=fopen(fname,"r"))==NULL) 
    { 
        printf("Can't open file %s.\n",fname); 
        return 0; 
    } 
    c=0; 
    while(readrecord(fp,&s)!=0) 
    { 
        if(strcmp(s.name,key)==0) 
        { 
            displaystu(&s); 
            c++; 
        } 
    } 
    fclose(fp); 
    if(c==0) 
        printf("The student %s is not in the file %s.\n",key,fname); 
    return 1; 
} 

/* 按学生学号查找学生记录 */ 
int retrievebyc(char *fname, char *key) 
{ 
    FILE *fp; 
    int c; 
    struct record s; 
    if((fp=fopen(fname,"r"))==NULL) 
    { 
        printf("Can't open file %s.\n",fname); 
        return 0; 
    } 
    c=0; 
    while(readrecord(fp,&s)!=0) 
    { 
        if(strcmp(s.code,key)==0) 
        { 
            displaystu(&s); 
            c++; 
            break; 
        } 
    } 
    fclose(fp); 
    if(c==0)
        printf("The student %s is not in the file %s.\n",key,fname); 
    return 1; 
} 


/*示意程序*/
int main()
{

    int i,j,n; 
    char c; 
    char buf[BUFLEN]; 
    FILE *fp; 
    struct record s; 
    clrscr(); 
    printf("Please input the students marks record file's name: "); 
    scanf("%s",stuf); 
    if((fp=fopen(stuf,"r"))==NULL) 
    { 
        printf("The file %s doesn't exit, do you want to creat it? (Y/N) ",stuf); 
        getchar(); 
        c=getchar(); 
        if(c=='Y'||c=='y') 
        { 
            fp=fopen(stuf,"w"); 
            printf("Please input the record number you want to write to the file: "); 
            scanf("%d",&n); 
            for(i=0;i<n;i++) 
            { 
                printf("Input the student's name: "); 
                scanf("%s",&s.name); 
                printf("Input the student's code: "); 
                scanf("%s",&s.code); 
                for(j=0;j<SWN;j++) 
                { 
                    printf("Input the %s mark: ",schoolwork[j]); 
                    scanf("%d",&s.marks[j]); 
                } 
                writerecord(fp,&s); 
            } 
            fclose(fp); 
        } 
    } 
    fclose(fp); 
    getchar(); 
    /*clrscr();*/ 
    puts("Now you can input a command to manage the records."); 
    puts("m : mean of the marks."); 
    puts("t : total of the marks."); 
    puts("n : search record by student's name."); 
    puts("c : search record by student's code."); 
    puts("l : list all the records."); 
    puts("s : sort and list the records by the total."); 
    puts("q : quit!"); 
    while(1) 
    { 
        puts("Please input command:");
        scanf(" %c",&c); /* 输入选择命令 */ 
        if(c=='q'||c=='Q') 
        { 
            puts("\n Thank you for your using."); 
            break; /* q,结束程序运行 */ 
        } 
        switch(c) 
        { 
            case 'm': /* 计算平均分 */ 
            case 'M': 
                if((n=totalmark(stuf))==0) 
                { 
                    puts("Error!"); 
                    break; 
                } 
                printf("\n"); 
                for(i=0;i<SWN;i++) 
                    printf("%-15s's average is: %.2f.\n",schoolwork[i], (float) total[i]/n); 
                break; 
            case 't': /* 计算总分 */ 
            case 'T': 
                if((n=totalmark(stuf))==0) 
                { 
                    puts("Error!"); 
                    break; 
                } 
                printf("\n"); 
                for(i=0;i<SWN;i++) 
                    printf("%-15s's total mark is: %d.\n",schoolwork[i], total[i]); 
                break; 
            case 'n': /* 按学生的姓名寻找记录 */ 
            case 'N': 
                printf("Please input the student's name you want to search: ");

                scanf("%s",buf); 
                retrievebyn(stuf,buf); 
                break; 
            case 'c': /* 按学生的学号寻找记录 */ 
            case 'C': 
                printf("Please input the student's code you want to search: ");

                scanf("%s",buf); 
                retrievebyc(stuf,buf); 
                break; 
            case 'l': /* 列出所有学生记录 */ 
            case 'L': 
                liststu(stuf); 
                break; 
            case 's': /* 按总分从高到低排列显示 */ 
            case 'S': 
                if((head=makelist(stuf))!=NULL) 
                displaylist(head); 
                break; 
            default: break;
        } 
    } 
    return 0;
}

归纳注释

本程序除为每个处理功能编写相应的函数外,另外编写从文件读学生记录的函数、写记录到
文件和显示一个学生记录的函数,从而简化编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis单线程还是多线程?IO多路复用原理

目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程&#xff1f;三、Redis6.0引入多线程四、Redis主线程和IO线程是如何完成请求的&#xff1f;1、服务端和客户端建立socket连接2、IO线程读取并解析请求3、主线程执行请求命令4、IO线程会写回socket和主线程清…

cron表达式 详解

corn表达式是&#xff1a;由若干数字、空格、符号按一定的规则&#xff0c;组成的一组字符串&#xff0c;从而表达时间的信息。 好像和正则表达式有点类似哈&#xff0c;都是一个字符串表示一些信息。Cron 表达式生成器&#xff1a; https://www.smart-tools.cn/cron简介Cron 表…

部署私有npm 库

使用verdacciohttps://verdaccio.org/安装verdaccio使用npm全局安装npm install -g verdaccio安装完成以后&#xff0c;输入verdaccio -h出现如下相关提示&#xff0c;说明verdaccio安装成功。运行verdaccio直接执行verdaccio出现如下相关提示&#xff0c;说明verdaccio启动成功…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.25-03.31 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录2023-03-25&…

React 入门(超详细)

目录前言&#xff1a;一、React 简介1. 什么是 React2. React 的特点3. React 高效的原因4. React 官网5. React的主要原理6. Facebook为什么要建造React?二、React 的基本使用1. 基础代码2. 效果3. 相关 js 库4. 创建虚拟DOM的两种方式5. 虚拟DOM与真实DOM6. 虚拟DOM与真实DO…

Linux命令运行原理shell和bash

目录前言什么是shell,什么是bash?ls -l 执行过程前言 学习操作系统的过程中我们经常在自己的shell中执行一些Linux命令&#xff0c;那么当我们输入一个类似于 ls -a 这样的命令式&#xff0c;发生了什么&#xff1f; 换句话说&#xff0c;从我们在shell中输入ls -a 按下回车…

基于深度学习的瓶盖检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;基于深度学习的瓶盖检测系统用于传送带或日常场景中瓶盖检测识别&#xff0c;提供实时瓶盖检测定位和计数&#xff0c;辅助瓶盖生产加工过程的自动化识别。本文详细介绍基于深度学习的瓶盖检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实…

E - 积木画(状态压缩DP)

E - 积木画&#xff08;状态压缩DP&#xff09; 1、问题 E - 积木画 2、分析 这道题很明显是一道DP题&#xff0c;而且是一个简化版的状态压缩DP。 &#xff08;1&#xff09;状态表示 f[i][j]f[i][j]f[i][j]表示前面i−1i-1i−1已经摆好&#xff0c;并且第iii列的状态是j…

第七讲 贪心

文章目录股票买卖 II货仓选址&#xff08;贪心:排序中位数&#xff09;糖果传递&#xff08;❗贪心&#xff1a;中位数&#xff09;雷达设备&#xff08;贪心排序&#xff09;付账问题&#xff08;平均值排序❓&#xff09;乘积最大&#xff08;排序/双指针&#xff09;后缀表达…

SpringBoot——基于SpringBoot整合Mybatis的入门案例+sql提示配置

开发流程图 先选择springboot项目创建&#xff0c;此处3.0以上的springboot项目最低都要java17版本 让数据库表中的属性名和实体类中的属性名保持一致就可以完成查询结果的自动封装。 2.引入myabtis相关依赖&#xff0c;配置mybatis 这里可以手动选择mybatis框架的依赖和mysq…

常见的卷积神经网络结构——分类、检测和分割

本文持续更新~~ 本文整理了近些年来常见的卷积神经网络结构&#xff0c;涵盖了计算机视觉领域的几大基本任务&#xff1a;分类任务、检测任务和分割任务。对于较复杂的网络&#xff0c;本文只会记录其中的核心模块以及重要的网络设计思想&#xff0c;并不会记录完整的网络结构。…

POM依赖报错解决方案汇总

POM依赖报错解决方案汇总 POM依赖报错解决方案汇总 状况 1 创建完一个maven项目,在pom文件在引入依赖,等下方自动导入加载完毕,去查看IDEA工具的Maven Projects工具选项中Dependencies 依然后依赖红色报错 2 在pom文件中,引用依赖后,该依赖的版本号处直接出现红色 3 IDEA工具…

蓝桥杯Web前端练习题-----水果拼盘

一、水果拼盘 介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.…

值得记忆的STL常用算法,分分钟摆脱容器调用的困境,以vector为例,其余容器写法类似

STL常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric>组成 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、交换、查找、遍历操作、复制、修改等等 <nuneric>体积很小&#xff0c;只包括…

【AWS入门】通过AWS存储网关(Storage Gate Way)实现文件共享

目录1. 创建网关2. 创建文件共享3. Windows文件共享4. LINUX文件共享1. 创建网关 配置缓存存储需要加载一会儿&#xff0c;此处需要等候 根据上述配置&#xff0c;会自动生成一个EC2实例 2. 创建文件共享 网关&#xff1a;选择上述步骤中创建的网关&#xff0c;选择即可 文…

电路设计的一些概念

锁存器的产生 论述1 (转)时序电路&#xff0c;生成触发器&#xff0c;触发器是有使能端的&#xff0c;使能端无效时数据不变&#xff0c;这是触发器的特性。 组合逻辑&#xff0c;由于数据要保持不变&#xff0c;只能通过锁存器来保存。 第一个代码&#xff0c;由于是时序逻…

基于XML的自动装配~

基于XML的自动装配之场景模拟&#xff1a; 自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean&#xff0c;自动为指定的bean中所依赖的类类型或者接口类型赋值 之前我们学过的依赖注入&#xff0c;我们在为不同属性赋值时&#xff0c;例如类类型的属性…

可别再用BeanUtils了(性能拉胯),试试这款转换神器

老铁们是不是经常为写一些实体转换的原始代码感到头疼&#xff0c;尤其是实体字段特别多的时候。有的人会说&#xff0c;我直接使用get/set方法。没错&#xff0c;get/set方法的确可以解决&#xff0c;而且也是性能较高的处理方法&#xff0c;但是大家有没有想过&#xff0c;要…

数据结构与算法——堆的基本存储

目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 五.堆和栈的区别 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大…

MySQL主从复制

主从复制概述 如何提升数据库并发能力 在实际工作中&#xff0c;我们常常将 Redis 作为缓存与 MySQL 配合来使用&#xff0c;当有请求的时候&#xff0c;首先会从缓存中进行查找&#xff0c;如果存在就直接取出。如果不存在再访问数据库&#xff0c;这样就 提升了读取的效率&…