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

C基础项目(学生成绩管理系统)

目录

一、项目要求

二、完整代码实例

三、分文件编写代码实例

一、项目要求

1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令

2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩

3.输入命令 T,调用Type子函数录入成绩。界面提示输入学生人数

输入n提示输入n名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,学号自动生成

4.输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

5.输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。

6.输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。

7.输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。输入n,找到n号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。

8.输入命令C, 执行清屏函数语句system("clear");

9.输入命令H,调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。

10.输入命令Q, 则退出系统。

注意:

(1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。

(2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。

二、完整代码实例

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{int id;float chinese;float math;float english;float average;
} Student;Student students[MAX];int num = 0;void Type();
void List();
void Average();
void Sort();
void Search();
void ClearScreen();
void Help();int main()//主函数
{char c;printf("****************************************\n");printf("*\t学生成绩管理系统——帮助菜单\t*\n");printf("****************************************\n");printf(" *\tH = 显示帮助菜单\n");printf(" *\tT = 成绩录入\n");printf(" *\tA = 计算学生平均分\n");printf(" *\tL = 列出成绩表\n");printf(" *\tP = 按平均成绩由高到低排序\n");printf(" *\tS = 按学号查询学生成绩\n");printf(" *\tC = 清屏\n");printf(" *\tQ = 退出系统\n");printf("****************************************\n");while (1){printf("请输入命令:");scanf("%c", &c);getchar();switch (c){case 'T':Type();break;case 'L':List();break;case 'A':Average();break;case 'P':Sort();break;case 'S':Search();break;case 'C':ClearScreen();break;case 'H':Help();break;case 'Q':printf("退出系统。\n");return 0;}}return 0;
}
void Type()//输入学生人数和信息
{if (num != 0){printf("成绩表不为空,无法录入学生成绩。\n");return;}printf("请输入学生人数:");scanf("%d", &num);getchar();printf("请输入%d名学生的三门课成绩:\n", num);printf("学号\t语文\t数学\t外语\n");for (int i = 0; i < num; i++){students[i].id = i + 1;printf("%d\t", students[i].id);scanf("%f\t%f\t%f", &students[i].chinese, &students[i].math, &students[i].english);getchar();}
}void List()//展示学生成绩信息
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}printf("学号\t语文\t数学\t英语\t平均分\n");for (int i = 0; i < num; i++){printf("%d\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].id, students[i].chinese, students[i].math, students[i].english, students[i].average);}
}void Average()//求平均分
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}for (int i = 0; i < num; i++){students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3.0;}printf("平均分已计算。请使用命令 L 查看。\n");
}void Sort()//按平均分由大到小排序
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}for (int i = 0; i < num - 1; i++){for (int j = 0; j < num - 1 - i; j++){if (students[j].average < students[j + 1].average){Student t = students[j];students[j] = students[j + 1];students[j + 1] = t;}}}printf("完成排序。请使用命令 L 查看。\n");
}void Search()//查询学生成绩信息
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}int sid;printf("输入要查询的学生学号:");scanf("%d", &sid);getchar();for (int i = 0; i < num; i++){if (students[i].id == sid){printf("学号:%d\t语文:%.1f\t数学:%.1f\t英语:%.1f\t平均分:%.1f\n", students[i].id, students[i].chinese, students[i].math, students[i].english, students[i].average);return;}}printf("未找到该学生的成绩。\n");
}void ClearScreen()//清屏
{system("clear");
}void Help()//帮助菜单
{printf("****************************************\n");printf("*\t学生成绩管理系统——帮助菜单\t*\n");printf("****************************************\n");printf(" *\tH = 显示帮助菜单\n");printf(" *\tT = 成绩录入\n");printf(" *\tA = 计算学生平均分\n");printf(" *\tL = 列出成绩表\n");printf(" *\tP = 按平均成绩由高到低排序\n");printf(" *\tS = 按学号查询学生成绩\n");printf(" *\tC = 清屏\n");printf(" *\tQ = 退出系统\n");printf("****************************************\n");
}

三、分文件编写代码实例

头文件head.h

#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{int id;float chinese;float math;float english;float average;
} Student;extern int num;Student students[MAX];
void Type();
void List();
void Average();
void Sort();
void Search();
void ClearScreen();
void Help();#endif

主函数main.c

#include "head.h"
int num = 0;
int main()
{char c;printf("****************************************\n");printf("*\t学生成绩管理系统——帮助菜单\t*\n");printf("****************************************\n");printf(" *\tH = 显示帮助菜单\n");printf(" *\tT = 成绩录入\n");printf(" *\tA = 计算学生平均分\n");printf(" *\tL = 列出成绩表\n");printf(" *\tP = 按平均成绩由高到低排序\n");printf(" *\tS = 按学号查询学生成绩\n");printf(" *\tC = 清屏\n");printf(" *\tQ = 退出系统\n");printf("****************************************\n");while (1){printf("请输入命令:");scanf("%c", &c);getchar();switch (c){case 'T':Type();break;case 'L':List();break;case 'A':Average();break;case 'P':Sort();break;case 'S':Search();break;case 'C':ClearScreen();break;case 'H':Help();break;case 'Q':printf("退出系统。\n");return 0;}}return 0;
}

输入学生人数和成绩的type.c

#include "head.h"void Type()
{if (num != 0){printf("成绩表不为空,无法录入学生成绩。\n");return;}printf("请输入学生人数:");scanf("%d", &num);getchar();printf("请输入%d名学生的三门课成绩:\n", num);printf("学号\t语文\t数学\t外语\n");for (int i = 0; i < num; i++){students[i].id = i + 1;printf("%d\t", students[i].id);scanf("%f\t%f\t%f", &students[i].chinese, &students[i].math, &students[i].english);getchar();}
}

显示学生成绩信息的list.c

#include "head.h"
void List()
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}printf("学号\t语文\t数学\t英语\t平均分\n");for (int i = 0; i < num; i++){printf("%d\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].id, students[i].chinese, students[i].math, students[i].english, students[i].average);}
}

求平均成绩的average.c

#include "head.h"
void Average()
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}for (int i = 0; i < num; i++){students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3.0;}printf("平均分已计算。请使用命令 L 查看。\n");
}

按照平均成绩由大到小排序的sort.c(冒牌排序)

#include "head.h"
void Sort()
{if (num == 0){printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}for (int i = 0; i < num - 1; i++){for (int j = 0; j < num - 1 - i; j++){if (students[j].average < students[j + 1].average){Student t = students[j];students[j] = students[j + 1];students[j + 1] = t;}}}printf("完成排序。请使用命令 L 查看。\n");
}

查询学生成绩信息的search.c

#include "head.h"
void Search()
{if (num==0) {printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");return;}int sid;printf("输入要查询的学生学号:");scanf("%d",&sid);getchar();for(int i=0;i<num;i++){if(students[i].id==sid){printf("学号:%d\t语文:%.1f\t数学:%.1f\t英语:%.1f\t平均分:%.1f\n",students[i].id,students[i].chinese,students[i].math,students[i].english,students[i].average);return;}}printf("未找到该学生的成绩。\n");
}

清屏的clearscreen.c

#include "head.h"
void ClearScreen()
{system("clear");
}

显示帮助菜单的help.c

#include "head.h"
void Help()
{printf("****************************************\n");printf("*\t学生成绩管理系统——帮助菜单\t*\n");printf("****************************************\n");printf(" *\tH = 显示帮助菜单\n");printf(" *\tT = 成绩录入\n");printf(" *\tA = 计算学生平均分\n");printf(" *\tL = 列出成绩表\n");printf(" *\tP = 按平均成绩由高到低排序\n");printf(" *\tS = 按学号查询学生成绩\n");printf(" *\tC = 清屏\n");printf(" *\tQ = 退出系统\n");printf("****************************************\n");
}

使用Make进行编译:

makefile文件

CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o type.o list.o average.o sort.o search.o clearscreen.o help.o xscjglxt:$(OBJS)$(CC) $^ -o $@
%.o:%.c$(CC) $(CFLAGS) $< -o $@.PHONY:clean
clean:$(RM) *.o xscjglxt

 B站讲解视频

http://【C基础(学生成绩管理系统)】 https://www.bilibili.com/video/BV1gTi7eUEc3/?share_source=copy_web&vd_source=f25867d1b9870033386a3e5ea1bbca6e

相关文章:

C基础项目(学生成绩管理系统)

目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提…...

C# 设计模式之原型模式

总目录 前言 在软件系统中&#xff0c;当创建一个类的实例的过程很昂贵或很复杂&#xff0c;并且我们需要创建多个这样类的实例时&#xff0c;如果我们用new操作符去创建这样的类实例&#xff0c;这未免会增加创建类的复杂度和耗费更多的内存空间&#xff0c;因为这样在内存中…...

美林数据Tempo Talents | 两大资源中心,打造开放、成长型数智人才能力平台

在数字化时代的大潮中&#xff0c;高校作为知识与人才培养的重要阵地&#xff0c;独立分散的课程资源管理方式已无法满足现代教育的需求&#xff0c;而数据资源的分散和碎片化也阻碍了科研和教学工作的深入进行。那么&#xff0c;高校如何打造一个集中、高效的课程与数据资源中…...

IDC权威认可!工业领域最佳实践案例!

近日&#xff0c;IDC发布了《工业领域中数据管理分析服务最佳实践案例》报告&#xff0c;总结行业用户在应用过程中面临的主要挑战和实践路径&#xff0c;并评选最佳实践案例&#xff0c;为行业用户提供了相关的指导建议&#xff0c;供市场参考。星环科技中航电梯数据中台项目入…...

未授权访问漏洞系列详解①!

Redis未授权访问漏洞 Redis 默认情况下&#xff0c;会绑定在 0.0.0.0:6379 &#xff0c;如果没有进行采用相关的策略&#xff0c;比如添加防火墙规则避免其他非信任来源 ip 访问等&#xff0c;这样将会将 Redis 服务暴露到公网上&#xff0c;如果在没有设置密码认证(一般为空)的…...

第1天:Python基础语法(五)

正文&#xff1a; 在之前的文章中&#xff0c;我们已经学习了Python的基本语法集合和集合的一些常用操作。 在本篇文章中&#xff0c;我们将继续学习其他类型 字符串格式化 使用操作符%s来实现 ➢ 几个%s就几个变量 ➢ 超过一个变量时&#xff0c;需要用元组%&#xff08;…...

【c++】用C++制作一个简易windows系统

源码&#xff1a; #include <iostream> #include <cstdlib> // 为了使用system #include<limits> void clearScreen() {system("cls"); }void displayMenu() {clearScreen();std::cout << "1.我的文件" << std::endl;std::…...

常见锁策略

目录 1.乐观锁/悲观锁 2.重量级锁/轻量级锁&#xff08;轻量重量是站在加锁开销的角度&#xff09; 3.挂起等待锁/自旋锁 4.公平锁/非公平锁 5.可重入锁与不可重入锁 6.读写锁 synchronized 面试题&#xff1a;是什么偏向锁&#xff1f; 锁的升级&#xff1a; 锁消除&…...

【机器学习】人工神经网络优化方法及正则化技术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 人工神经网络优化方法及正则化技术1. 引言2. 神经网络优化的基础2.1 损失函数2.…...

Django异步请求和后台管理实战

项目概述 项目实现Ajax异步请求局部刷新使用XAdmin后台模板提供图片上传接口在明细页应用了富文本编辑器在加载图书信息的时候使用LazyLoad&#xff08;图片懒加载&#xff09; # 环境 asgiref3.7.2 crispy-bootstrap32024.1 defusedxml0.7.1 diff-match-patch20230430 Djang…...

大奖放送 | AI编程达人秀视频文章征集大赛来啦!

AI Coding&#xff0c;可以有多少种打开玩法&#xff1f;腾讯云AI代码助手是一款辅助编码工具&#xff0c;基于混元大模型&#xff0c;提供技术对话、代码补全、代码诊断和优化等能力&#xff0c;为你生成优质代码&#xff0c;帮你解决技术难题&#xff0c;提升编码效率。 我…...

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

小猫咪PHP加密系统历时半年&#xff0c;它再一次迎来更新&#xff0c;更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09;&#xff0c;适配php56-php74&#xff0c;取消批量加密&#xff08;一些不可控因素&#…...

a bag of bones

以下是根据你提供的内容制作的5道选择题&#xff0c;包括答案和解析&#xff1a; 1. 短语 "a bag of bones" 通常用来描述什么&#xff1f; - A. 一个恐怖片中的角色 - B. 一个非常瘦弱的人 - C. 一个懒惰的人 - D. 一个穿着比基尼的人 答案&#xff1a;B 解析&#…...

XLT高速线缆自动化测试系统

高速线缆自动化测试系统 随着高速通信的快速发展&#xff0c;对于高速数据通信线缆性能要求日益增高&#xff0c;在其硏发、生产阶段&#xff0c;需要多次测试射频性能。传统人工手动测试存在测试环境搭建复杂、测试效率低、耗时长&#xff0c;特别是多次测试中因为人工测试带…...

微软AI业务最新营收数据情况(2024年7月)

Azure AI 年度经常性收入 (ARR)&#xff1a;达到50亿美元客户数量&#xff1a;60,000家平均客户价值 (ACV) 中位数&#xff1a;83,000美元同比增长率&#xff1a;达到了惊人的900% GitHub Copilot 年度经常性收入 (ARR)&#xff1a;达到3亿美元客户数量&#xff1a;77,000家…...

canvas绘制表格

canvas绘制表格 最近在为公司产品做技术预研&#xff0c;经理让用canvas做一个表格&#xff0c;于是就有了这篇博客。 我们的数据是后端通过MQTT推送过来的 我在代码中也直接使用了 具体MQTT的实现代码&#xff0c;可见博客 在vue使用MQTT 在这里为了方便实用我直接封装成组件…...

避免溃坝的关键:渗压计在防洪管理中的作用

防洪管理对于保障人民生命财产安全具有重要意义&#xff0c;而溃坝作为防洪管理中的重大风险之一&#xff0c;其防范工作尤为关键。在防洪管理体系中&#xff0c;渗压计作为一种重要的监测工具&#xff0c;发挥着不可替代的作用。本文将深入探讨渗压计在防洪管理中的作用。 实时…...

品牌建设如何助力中小企业突破生存瓶颈?

品牌&#xff0c;不仅仅是一个标志或商标&#xff0c;更是企业的形象、声誉和信誉的体现。品牌的存在是为了使企业区别于其他竞争对手&#xff0c;树立独特的形象&#xff0c;赢得消费者的认可和信任。 品牌的本质是品牌拥有者的产品、服务或其它优于竞争对手的优势能为目标受…...

探索Python FastAPI的Annotated参数设计:提升代码的灵活性与可读性

在现代软件开发中&#xff0c;代码的可读性和灵活性是至关重要的。Python的FastAPI框架以其高性能和易用性而受到开发者的喜爱。FastAPI提供了一种名为Annotated的参数设计方式&#xff0c;它允许开发者以类型注解的形式增强函数参数的定义&#xff0c;从而提升代码的表达力和灵…...

ClickHouse 进阶【建表、查询优化】

1、ClickHouse 进阶 因为上一节部署了集群模式&#xff0c;所以需要启动 Zookeeper 和 ck 集群&#xff1b; 1.1、Explain 基本语法 EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting value, ...] SELECT ... [FORMAT ...] AST&#xff1a;用于查看语法树SYNTAX&#…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...