学生管理系统V2.0

article/2025/8/22 11:30:01

学生管理系统V2.0

  • 需求:

    要求实现一个基于指针的学生成绩管理系统,具体功能如下:

    1. 添加学生信息:输入学号和三门成绩,存储到数组中。
    2. 显示所有学生信息:遍历数组,输出每个学生的学号和成绩。
    3. 计算每个学生的平均分和总分:遍历数组,计算每行的总分和平均分。
    4. 根据某科成绩排序:用户选择科目,然后按该科成绩排序,可以升序或降序。
    5. 查找学生信息:按学号查找,显示该生的成绩和平均分。
    6. 退出程序。
  • 代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_STUDENTS 50  // 最大学生数量
#define COURSE_NUM 3     // 课程科目数量
#define ID_LENGTH 4      // 学号长度/** 函数原型声明 **/// 添加学生信息
void addStudent(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int *count);// 显示所有记录
void displayAll(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int count);// 显示统计信息
void showStatistics(int (*scores)[COURSE_NUM], int count);// 学生查找
void searchStudent(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int count);// 学号校验 1-校验合格,0-校验不合格
int validateId(char *id);
// 成绩排序
void scoreRanking(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int count);/*** 入口函数*/
int main(int argc,char *argv[])
{int choice;           // 用户菜单选择int studentCount = 0; // 当前学生的数量// 学生数据存储(二维数组)char studentIds[MAX_STUDENTS][ID_LENGTH];  // 学号数组int scores[MAX_STUDENTS][COURSE_NUM];      // 成绩二维数组do{// 系统菜单界面printf("\033[1;32m+-----------------------+\033[0m\n"); // 绿色边框printf("\033[1;32m| \033[1;33m学生成绩管理系统 v2.0\033[1;32m |\033[0m\n"); printf("\033[1;32m| \033[1;33m作者:AAA \033[1;32m|\033[0m\n"); printf("\033[1;32m+-----------------------+\033[0m\n");printf("\033[31m1. 添加学生信息\033[0m\n");printf("\033[31m2. 显示所有记录\033[0m\n");printf("\033[31m3. 查看统计信息\033[0m\n");printf("\033[31m4. 成绩排序\033[0m\n");printf("\033[31m5. 查找学生\033[0m\n");printf("\033[31m6. 退出系统\033[0m\n");printf("\n请输入您的选择: ");scanf("%d",&choice);// 选择菜单switch(choice){case 1: // 添加学生信息addStudent(scores, studentIds, &studentCount);break;case 2: // 显示所有记录displayAll(scores, studentIds, studentCount);break;case 3: // 查看统计信息showStatistics(scores, studentCount);break;case 4: // 成绩排序scoreRanking(scores, studentIds, studentCount);break;case 5: // 查找学生searchStudent(scores, studentIds, studentCount);break;case 6: // 退出系统printf("系统已退出,感谢使用!\n");break;default:printf("无效输入,请重新选择!\n");}}while(choice != 6);return 0;
}/*** 添加学生信息* @param scores 学生成绩二维数组* @param ids    学生编号二维数组* @param count  当前学生的数量*/
void addStudent(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int *count)
{// 校验存储空间是否已满if(*count >= MAX_STUDENTS){printf("错误信息,存储空间已满!\n");return; // 执行return,函数提前结束}printf("\n———— 添加学生信息 ————\n");// 创建一个数组,用来存放学生学号char tempId[ID_LENGTH + 1]; // 控制台录入的字符串默认\0结尾// 学号验证do{printf("请输入4位学号:");scanf("%4s", tempId); // 从控制台输入的字符串中,截取前4位// 清空缓冲区while(getchar() != '\n');            }while(!validateId(tempId));// 检查学号是否已存在for(int i = 0; i < *count; i++){// 使用内存比较,比较两个内存块中的数据是否相等if(memcmp(ids[i], tempId, ID_LENGTH) == 0){printf("错误信息:该学号已存在!\n");return;}}// 存储学号memcpy(ids[*count], tempId, ID_LENGTH);// 输入成绩printf("请输入%d门课程成绩(0~100):\n", COURSE_NUM);for(int i = 0; i < COURSE_NUM;){printf("课程%d:", i + 1);// 非法字符校验int tempScore = scanf("%d", &scores[*count][i]);if(tempScore != 1){printf("错误心虚:成绩无效,请重新输入!\n");while(getchar() != '\n');continue;}// 输入范围校验if(scores[*count][i] < 0 || scores[*count][i] > 100){printf("错误信息:成绩无效,请重新输入!\n");continue;}i++;}// 改变studentCount的值(*count)++;printf("学生信息添加成功!\n");
}/** 
* 显示所有记录
* @param scores 学生成绩二维数组
* @param ids    学生编号二维数组
* @param count  当前学生的数量 
*/
void displayAll(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int count)
{printf("\n—————— 学生成绩列表 ——————\n");// 校验是否存在数据if(count == 0){printf("暂无学生数据!\n");return;}// 表格 - 表头printf("%s\t%s\t%s\t%s\n","学号","语文","数学","英语");// 表格 - 数据for(int i = 0; i < count; i++){printf("%.4s\t", ids[i]); // 学号// 成绩二维数组for(int j = 0; j < COURSE_NUM; j++){printf("%d\t", *(*(scores + i) + j)); // scores[i][j]}printf("\n");}printf("\n");
}/*** 显示统计信息* @param scores 学生成绩二维数组* @param count  当前学生的数量 */
void showStatistics(int (*scores)[COURSE_NUM], int count)
{// 检验是否存在学生if(count == 0){printf("暂无学生数据!\n");return;}// 创建一个数组,用来存储每一科分总分int courseTotal[COURSE_NUM] = {0};// 创建一个数组,用来存储每一科最高分int max[COURSE_NUM] = {0};// 创建一个数组,用来存储每一科最低分int min[COURSE_NUM] = {100,100,100};// 遍历成绩,计算每一科总分,最高分,最低分for(int i = 0; i < count; i++) // 遍历得到每一个学生{for(int j = 0; j < COURSE_NUM; j++) // 遍历得到每个学生的每个科目成绩{// 获取成绩int score = scores[i][j];// 单科总分courseTotal[j] += score;// 单科最高分if(score > max[j]) max[j] = score;// 单科最低分if(score < min[j]) min[j] = score;}}// 输出信息printf("\n—————— 课程统计信息 ——————\n");char *courses[] = {"语文","数学","英语"};for(int i = 0; i < COURSE_NUM; i++){printf("%s:\n",courses[i]); // 科目printf("   平均分:%.2f\n", (float)courseTotal[i] / count);printf("   最高分:%d\n", max[i]);printf("   最低分:%d\n", min[i]);}
}/*** 成绩排序* @param scores 学生成绩二维数组* @param ids    学生编号二维数组* @param count  当前学生的数量*/
void scoreRanking(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int count)
{// 检验是否存在学生if(count == 0){printf("暂无学生数据!\n");return;}// 创建一个数组,用来存储每个人总分int courseTotal[MAX_STUDENTS] = {0};// 创建一个数组,用来当做成绩的副本int scores_copy[MAX_STUDENTS][COURSE_NUM];for(int i = 0; i < count; i++) {for(int j = 0; j < COURSE_NUM; j++){scores_copy[i][j] = scores[i][j];}}// 创建一个数组,用来当做学号的副本char ids_copy[MAX_STUDENTS][ID_LENGTH];for(int i = 0; i < count; i++){memcpy(ids_copy[i], ids[i], ID_LENGTH);}// 遍历成绩,计算出每个学生的总分for(int i = 0; i < count; i++) // 遍历得到每一个学生{for(int j = 0; j < COURSE_NUM; j++) // 遍历的到每个人的每科成绩{// 求出每人的总分courseTotal[i] += scores_copy[i][j];}}// 开始冒泡排序for (int i = 0; i < count; i++){for(int j = 0; j < count; j++){if (courseTotal[j] < courseTotal[j+1]){// 交换总分int tempTotal = courseTotal[j];courseTotal[j] = courseTotal[j+1];courseTotal[j+1] = tempTotal;// 交换成绩for (int k = 0; k < COURSE_NUM; k++) {int tempScore = scores_copy[j][k];scores_copy[j][k] = scores_copy[j + 1][k];scores_copy[j + 1][k] = tempScore;}// 交换学号char tempId[ID_LENGTH];memcpy(tempId, ids_copy[j], ID_LENGTH);memcpy(ids_copy[j], ids_copy[j + 1], ID_LENGTH);memcpy(ids_copy[j + 1], tempId, ID_LENGTH);}}}// 输出排序结果printf("\n—————— 成绩排序结果 ——————\n");printf("%s\t%s\t%s\t%s\t%s\t%s\n", "排名", "学号", "语文", "数学", "英语", "总分");for (int i = 0; i < count; i++) {printf("%d\t%.4s\t", i + 1, ids_copy[i]);for (int j = 0; j < COURSE_NUM; j++) {printf("%d\t", scores_copy[i][j]);}printf("%d\n", courseTotal[i]);}printf("\n");}/*** 学生查找* @param scores 学生成绩二维数组* @param ids    学生编号二维数组* @param count  当前学生的数量*/
void searchStudent(int (*scores)[COURSE_NUM], char (*ids)[ID_LENGTH], int count)
{// 创建一个数组,用来接收控制台输入的学号char targetId[ID_LENGTH + 1];printf("\n请输入要查找的学号:");scanf("%4s", targetId);while(getchar() != '\n');for(int i = 0; i < count; i++){//比较学号if(memcmp(ids[i], targetId, ID_LENGTH) == 0){printf("找到学生记录:\n");printf("学号:%.4s\n", ids[i]);printf("成绩:语文=%d 数学=%d 英语=%d\n", scores[i][0], scores[i][1],scores[i][2]);return;}}printf("未找到该学号的学生记录:\n");
}/*** 学号检验* @param id 检验的学号(数组)* @return 1-校验合格, 0-校验不合格*/
int validateId(char *id)
{char *p = id; // 不要直接操作形参,最好使用局部变量接收int len = 0;// 校验学号是否为数字while (*p && len < ID_LENGTH){// 校验输入的是否是数字if(!(*p >= '0' && *p <= '9')){printf("学号必须为数字!\n");return 0;}p++;len++;}// 校验输入的长度if (len != ID_LENGTH || *p != '\0'){printf("学号必须为4位!\n");return 0;}return 1;
}

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.hkcw.cn/article/AILoCMPRHS.shtml

相关文章

从汇编的角度揭秘C++函数重载,原来这么简单

函数重载是指在同一个作用域内&#xff0c;有多个同名函数&#xff0c;但是它们的形参列表不同。在调用时&#xff0c;根据不同的实参&#xff0c;调用相应的函数。函数重载是一种静态多态形式。我们先来看一个函数重载的例子&#xff0c;然后分析其背后的原理。请看下面这段代…

Sigma-Aldrich胰蛋白酶细胞解离方案速览

Sigma-Aldrich_胰蛋白酶用于细胞培养 细胞解离是细胞传代过程中的一个步骤&#xff0c;即细胞从预处理表面分离&#xff0c;形成悬浮液。这些悬浮液对于传代培养重新接种、细胞计数分析和细胞增殖非常重要。有多种蛋白水解酶可用来从粘附基质上脱离细胞&#xff0c;胰蛋白酶就…

金正恩:炮兵部队随时能战且战之必胜!

金正恩:炮兵部队随时能战且战之必胜!据朝中社报道,朝鲜人民军大联合部队炮兵部队于29日进行了火炮射击比赛,朝鲜劳动党总书记、国务委员长金正恩亲临现场观摩。金正恩对比赛成果予以高度评价,他指出,参赛炮兵部队充分展现了炮兵武装力量的实战能力,时刻保持着万全的临战…

保健品,为何总在“围猎”老年人?

近日,市场监管总局在全国部署开展老年人药品、保健品虚假宣传专项整治工作,打击药品、保健品市场“坑老”“骗老”行为。各地市场监管部门将聚焦老年人药品、保健品领域,依法查处虚假宣传、价格欺诈、违法广告、非法添加等侵害老年人合法权益、破坏市场竞争秩序的行为。同时…

立志成为一名优秀测试开发工程师(第八天)——jemeter的学习

jemeter的学习 目录 一、jemeter常见元件的认识 二、jemeter手动设计脚本 三、jemeter工具录制脚本 一、jemeter常见元件的认识 ①测试计划&#xff1a;所有元件的父级文件&#xff08;容器&#xff09;&#xff0c;在所有元件的最顶层 其他元件都是基于测试计划来组织的…

如何使删除的数据不可恢复?

一些无用的数据包含我们计算机上的重要信息。如果你想让这些数据彻底不可恢复&#xff0c;你需要了解必要的数据擦除方法和一些有用的技巧。继续阅读并轻松获得解决方案。 第 1 部分&#xff1a;我可以使已删除的数据不可恢复吗&#xff1f; 是的&#xff0c;完全有可能使已删…

35岁小伙不结婚 爆改山洞隐居4年:美色不值得浪费时间金钱!

35岁小伙不结婚爆改山洞隐居4年。近日,一35岁小伙爆改山洞隐居4年引发网友热议,采访中他表示美色不值得自己浪费时间金钱,成本太高了。叫世外桃源也不为过,山洞门前有小河,门口可以种菜,而山洞用红砖建造,也非常现代化,有电脑和家具一应俱全的,书房是自己空间!建造一…

【Git】View Submitted Updates——diff、show、log

在 Git 中查看更新的内容&#xff08;即工作区、暂存区或提交之间的差异&#xff09;是日常开发中的常见操作。以下是常用的命令和场景说明&#xff1a; 文章目录 1、查看工作区与暂存区的差异2、查看提交历史中的差异3、查看工作区与最新提交的差异4、查看两个提交之间的差异5…

连接远程桌面计算机提示:“这可能是由于CredSSP加密数据库修正” 问题解决方案

连接远程计算机提示&#xff1a;“这可能是由于CredSSP加密数据库修正” 问题解决方案 1.连接远程计算机提示&#xff1a;“这可能是由于CredSSP加密数据库修正” 问题 2. win R,输入gpedit.msc&#xff0c;打开本地组策略编辑器 2.1 操作步骤&#xff1a;计算机配置–>系…

切片器导航-大量报告页查看的更好方式

切片器导航-大量报告页查看的更好方式 现在很多报告使用的是按钮导航&#xff0c;即使用书签按钮来制作页面导航的方式。但是当我们的报告有几十页甚至上百页的时候&#xff0c;使用书签按钮来制作页面导航&#xff0c;无论是对于报表制作者还是报告使用者来说都是一种很繁琐的…

AI智能体|扣子(Coze)搭建【自动生成超高质量PPT】工作流

各位好久不见&#xff0c;你的失踪人口又回来了&#xff0c;已经超过一周的时间没有进行文章的更新了。 没更新的这段时间&#xff0c;主要还是因为工作上的调整以及身体生病所导致的停更&#xff0c;具体以后再说。 我们先讲今天的主要主题&#xff0c;使用 Coze 智能体一键生…

day39python打卡

知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容即可 一、 图像数据的介绍 1.1 灰度图像 从这里开…

Azure Devops pipeline 技巧和最佳实践

1. 如何显示release pipeline ? 解决方法: 登录devops, 找到organization - pipeline - setting下的Disable creation of classic release pipelines,禁用该选项。 然后在project - pipeline - setting,禁用Disable creation of classic release pipelines 现在可以看到r…

艺人李嘉琦回母校重庆大学开讲座 分享追梦历程

5月29日,演员李嘉琦回到母校重庆大学,参加新闻学院“优秀校友回母校”系列讲座。她以“梦想?梦幻?人生也是一部电视剧”为主题,与学弟学妹们分享了自己在母校时的学习生活和进入娱乐圈的奋斗经历。李嘉琦从小就有当演员的梦想,但不知道如何实现。高考时,她从内蒙古考入重…

定位例子(vue3)

定位 https://juejin.cn/post/7398348521135767567 一固定定位 1.1 固定定位是相对于根元素的&#xff0c;或说固定在浏览器视窗。

DSPE-PEG2000-Mal和DSPE-PEG2000-NHS偶联多肽的对比

1.结构区别&#xff1a; DSPE-PEG2000-MAL 的结构中包含马来酰亚胺&#xff08;Mal&#xff09;基团&#xff0c;这能够与含有巯基&#xff08;-SH&#xff09;的分子发生选择性反应&#xff0c;如半胱氨酸。它主要用于构建靶向脂质体&#xff0c;通过与特定的靶向分子结合实现…

数据库 1.0.3

数据库的数据类型问题 到目前为止实习的话百分之50都够用了 现在只是认识一下数据类型&#xff0c;还轮不到你一个实习生来写表 查询数据库不是想的那么简单 对于mysql&#xff0c;常用的数据类型就那几个 但是有的公司要求类型比较严格&#xff0c;在定义的时候感觉浪费几个空…

字节开源BAGEL可文生图、图像理解、图像编辑

BAGEL是由字节跳动开源的通用多模态大模型&#xff0c;一个原生支持多模态输入输出 思维链推理 MoE 架构优化的跨模态超级 AI。 话不多说&#xff0c;咱们今天来试着复现下。 1、下载代码&#xff0c;创建环境 git clone https://github.com/bytedance-seed/BAGEL.gitcd BA…

PaddleOCR本地部署 (Python+Flask)

查看配置&#xff1a; win10系统Python 3.9.13 NVIDIA GeForce RTX 3080 Ti 安装环境&#xff1a; 1&#xff09;下载 CUDA Toolkit 12.6 2&#xff09;安装 CUDA Toolkit 查看是否安装成功 nvcc --version3&#xff09;安装 PaddlePaddle GPU 版本&#xff08;配合 CU…

CSformer:结合通道独立性和混合的稳健多变量时间序列预测

原文地址&#xff1a;2312.06220 发表会议&#xff1a;AAAI 2025 代码地址:暂无 作者&#xff1a;王浩鑫 团队&#xff1a;四川大学 本博客内容主要介绍了此论文到底做了什么&#xff1f;以及我阅读中遇到的一些问题。 因为我本人就是时序预测方向的所以我直接借用AI助手对…