当前位置: 首页 > news >正文

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

归纳注释

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

相关文章:

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

学生成绩管理程序 实例说明 编制一个统计存储在文件中的学生考试分数的管理程序。设学生成绩以一个学生一条记录的 形式存储在文件中&#xff0c;每个学生记录包含的信息有姓名、学号和各门功课的成绩。要求编制具有以 下几项功能的程序&#xff1a;求出各门课程的总分&#…...

完美日记母公司再度携手中国妇基会,以“创美人生”助力女性成长

撰稿 | 多客 来源 | 贝多财经 当春时节&#xff0c;梦想花开。和煦的三月暖阳&#xff0c;唤醒的不止是满城春意&#xff0c;更有逸仙电商“创美人生”公益项目播撒的一份希望。 3月8日“国际妇女节”当日&#xff0c;为积极响应我国促进共同富裕的政策倡导&#xff0c;助力相…...

【JaveEE】线程的创建及常见方法解析(Tread类)

目录 1.Tread类介绍 2线程的构造方法——创建线程 1.继承Thread类&#xff0c;重写run()方法 2.使用Runnbable接口创建线程 3.继承 Thread, 重写 run, 使用匿名内部类 4.实现 Runnable, 重写 run, 使用匿名内部类 5.使用 lambda 表达式&#xff08;重点掌握&#xff09;…...

Linux的诞生过程

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…...

面部表情识别1:表情识别数据集(含下载链接)

面部表情识别1&#xff1a;表情识别数据集(含下载链接) 目录 面部表情识别1&#xff1a;表情识别数据集(含下载链接) 1.前言 2.表情识别数据集介绍 1.JAFFE数据集 2.KDEF&#xff08;Karolinska Directed Emotional Faces&#xff09;数据集 3.GENKI数据集 4.RaFD数据集…...

CSS实现文字凹凸效果

使用两个div分别用来实现凹凸效果&#xff1b;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow&#xff1a;必需。水平阴影的位置。允许负值。 v-shadow &#xff1a;必需。垂直阴影的位置。允许负值。 blur&#xff1a;可选&#xff0c;模糊的距离。 co…...

嵌入式常使用的库函数

自己创建简单的mcu中常用的库函数 文章目录自己创建简单的mcu中常用的库函数1. 自己编写库函数的意义2. 计算字符串长度.以\0作为结束符3. 复制字符串4. 字符串比较5. 将整数转换为ASCII数组6. 将ASCII码字符串转换成整数7. 将字节数组转换为16位整数8.计算CRC,用于Modbus协议9…...

【业务安全-02】业务逻辑漏洞之越权操作

越权越权即越权查看被人的信息&#xff0c;又分为水平越权和垂直越权&#xff0c;但是两者的本质都是一样的&#xff0c;只是越权的身份权限不一样而已水平越权&#xff1a;相同级别的用户&#xff0c;如用户A访问用户B垂直越权&#xff1a;普通用户到管理员&#xff0c;普通用…...

完全小白的pycharm深度学习调试+for循环断点条件设置

完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…...

直方图及其应用

直方图定义直方图是一种描述数据的分布通过将连续变量划分成一系列区间&#xff0c;统计区间频率&#xff0c;并用来表示&#xff0c;以表征其统计特征在图像处理中&#xff0c;直方图可以用来表示图像中像素值的分布状况&#xff0c;描述不同灰度级的像素在图像中的占比直方图…...

《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;SpringBoot篇&#xff08;主要讲一些与springboot整合相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Jackson常见用法&#xff0c;超级详细。&#x1f468;‍&am…...

Redis 如何实现库存扣减操作和防止被超卖?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

(Linux)Ubuntu查看系统版本

uname -a : 查看操作系统的发行版号和操作系统版本 Command: uname -aResult: Linux SERVER 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux uname -v : 查看版本号 Command: uname -vResult: #36-Ubuntu …...

VxWorkds 内存管理(3)

虚拟内存管理 对于带MMU的目标板&#xff0c;VxWorks提供虚拟内存的支持&#xff0c;VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI 基本MMU邦定于VxWorks中&#xff0c;可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件 VxV…...

单元测试、反射、注解、动态代理

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…...

【数据结构】夯实基础|线性表刷题01

作者&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;算法、数据结构、Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: 【数据结构|刷题专栏】&#xff1a;该专栏专注于数据结构知识&#xff0c;持续更新&a…...

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…...

java多线程之线程的六种状态

线程的六种状态(1) NEW(初始状态)(2) TERMINATED(终止状态 / 死亡状态)(3) RUNNABLE(运行时状态)(4) TIMED_WAITING(超时等待状态)(5) WAITING(等待状态)(6) BLOCK(阻塞状态)sleep和wait的区别:操作系统里的线程自身是有一个状态的,但是java Thread 是对系统线程的封装,把这里的…...

UnixBench----x86架构openEuler操作系统上进行性能测试

【原文链接】UnixBench----x86架构openEuler操作系统上进行性能测试 &#xff08;1&#xff09;打开github上 UnixBench 地址&#xff0c;找到发布的tag &#xff08;2&#xff09;找到tar.gz包&#xff0c;右键复制链接 比如这里是 https://github.com/kdlucas/byte-unix…...

于Java8 Stream教程之collect()

目录 前言正文第一个小玩法 将集合通过Stream.collect() 转换成其他集合/数组&#xff1a;第二个小玩法 聚合&#xff08;求和、最小、最大、平均值、分组&#xff09;总结前言 本身我是一个比较偏向少使用Stream的人&#xff0c;因为调试比较不方便。 但是, 不得不说&#…...

Python

1、str 三个关键点&#xff1a; 正着数&#xff0c;0&#xff0c;1&#xff0c;2 反着数&#xff0c;0&#xff0c;-1&#xff0c;-2 str[a&#xff0c;b] 左闭右开 [a&#xff0c;b) str123456789 print(str) # 输出字符串 print(str[0:-1]) # 输…...

Spring框架中IOC和DI详解

Spring框架学习一—IOC和DI 来源黑马Spring课程&#xff0c;觉得挺好的 目录 文章目录Spring框架学习一---IOC和DI目录学习目标第一章 Spring概述1、为什么要学习spring&#xff1f;2、Spring概述【了解】【1】Spring是什么【2】Spring发展历程【3】Spring优势【4】Spring体系…...

本地快速搭建Kubernetes单机版实验环境(含问题解决方案)

Kubernetes是一个容器编排系统&#xff0c;用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识&#xff0c;包括基本概念、安装部署和基础用法。 一、什么是Kubernetes&#xff1f; Kubernetes是Google开发的开源项目&#xff0c;是一个容器编排系统&…...

FPGA控制DDS产生1CLK周期误差的分析(二)

前文简短的介绍了DDS的产生原理&#xff0c;其实相当的简单&#xff0c;所以也不需要多做解释&#xff0c;本文详细阐述一下在调试DDS的过程中所产生的一个bug 问题发现 正如上文所述&#xff0c;再用FPGA控制存储在rom中的波形信号输出之后&#xff0c;在上板之前&#xff0…...

这一次,吃了Redis的亏,也败给了GPT

关注【离心计划】&#xff0c;一起离开地球表面 背景 组内有一个系统中有一个延迟任务的需求&#xff0c;关于延迟任务常见的做法有时间轮、延迟MQ还有Redis Zset等方案&#xff0c;关于时间轮&#xff0c;这边小苏有一个大学时候做的demo&#xff1a; https://github.com/JA…...

第一章 信息化知识

1、信息是客观事物状态和运动特征的一种普遍形式&#xff0c;信息的概念存在两个基本的层次&#xff0c;即本体论层次和认识论层次&#xff1a; 本体论层次&#xff1a;就是事物的运动状态和状态变化方式的自我表述认识论层次&#xff1a;就是主体对于该事物的运动状态以及状态…...

如何用matlab工具箱训练一个SOM神经网络

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com本文展示如何用matlab工具箱训练一个SOM神经网络的DEMO并讲解其中的代码含义和相关使用说明- 01.SOM神经网络DEMO代码 -- 本文说明 -下面&#xff0c;我们先随机初始化一些样本点&#xff0c;然后…...

音视频技术开发周刊 | 285

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。GPT-4 Office全家桶发布谷歌前脚刚宣布AI工具整合进Workspace&#xff0c;微软后脚就急匆匆召开了发布会&#xff0c;人狠话不多地祭出了办公软件王炸——Microsoft 365 Cop…...

安装flume

flume最主要的作用就是实时读取服务器本地磁盘的数据&#xff0c;将数据写入到hdfs中架构&#xff1a;开始安装一&#xff0c;上传压缩包&#xff0c;解压并更名解压&#xff1a;[rootsiwen install]# tar -zxf apache-flume-1.9.0-bin.tar.gz -C ../soft/[rootsiwen install]#…...

为工作排好优先级

工作&#xff0c;是干不完的&#xff0c;因此我们需要分清轻重缓急&#xff0c;为它们划分优先级&#xff0c;这样才不至于让自己手忙脚乱。 给手头的事情排上正确的优先级&#xff0c;是一项很重要的工作能力。 优先级有很多考量&#xff0c;并不是简单的先来后到的线性时间…...