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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux系统中pinictrl框架基本实现

1. 回顾Pinctrl的三大作用 记住pinctrl的三大作用,有助于理解所涉及的数据结构: * 引脚枚举与命名(Enumerating and naming) * 单个引脚 * 各组引脚 * 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能 * 引脚配置(Configuration):比如上拉、下拉、open drain、驱…

从零入门 AI for Science(AI+药物) 笔记 #Datawhale AI 夏令营

&#x1f496;使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset . 魔搭高峰期打不开Task3又换回飞桨了 吧torch 架构换成了 飞桨的paddle 飞桨AI Studio星河社区-人工智能学习与实训社区 https://aistudio.baidu.com/projectdetail/8191835?cont…

Python数据分析案例58——热门游戏数据分析及其可视化

案例背景 有哪个男生不喜欢玩游戏呢&#xff1f;就算上了班儿也要研究一下游戏以及热门的游戏。正好这里有个热门的游戏数据集&#xff0c;全球热门游戏数据集来做一下一些可视化的分析。 数据介绍 该文件包含一个数据集&#xff0c;详细说明了多个平台上的各种流行游戏。每个…

基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码

基于ThinkPHP开发的校园跑腿社区小程序系统源码&#xff0c;包含前后端代码 最新独立版校园跑腿校园社区小程序系统源码 | 附教程 测试环境&#xff1a;NginxPHP7.2MySQL5.6 多校版本&#xff0c;多模块&#xff0c;适合跑腿&#xff0c;外卖&#xff0c;表白&#xff0c;二…

Java中的5种线程池类型

Java中的5种线程池类型 1. CachedThreadPool &#xff08;有缓冲的线程池&#xff09;2. FixedThreadPool &#xff08;固定大小的线程池&#xff09;3. ScheduledThreadPool&#xff08;计划线程池&#xff09;4. SingleThreadExecutor &#xff08;单线程线程池&#xff09;…

使用 Streamlit 和 Python 构建 Web 应用程序

一.介绍 在本文中&#xff0c;我们将探讨如何使用 Streamlit 构建一个简单的 Web 应用程序。Streamlit 是一个功能强大的 Python 库&#xff0c;允许开发人员快速轻松地创建交互式 Web 应用程序。Streamlit 旨在让 Python 开发人员尽可能轻松地创建 Web 应用程序。以下是一些主…

萱仔大模型学习记录5-langchain实战

前面我的bertlora微调已经跑出了不错的结果&#xff0c;我也学会了如何在bert上使用Lora进行微调&#xff0c;我后续会补充一个医疗意图识别的项目于这个系列&#xff0c;现在这个医疗意图识别代码还暂时不准备公开。我就继续按照我的计划学习一番LangChain。 LangChain是一个用…

【软件测试】--接口测试

1. 接口用例设计 接口测试的测试点 功能测试 单接口功能&#xff1a; 手工测试中的单个业务模块&#xff0c;一般对应一个接口 登陆业务 --> 登陆接口加入购物车业务 --> 加入购物车接口订单业务 --> 订单接口支付业务 --> 支付接口 借助工具、代码。绕开前端界面…

AI大模型技术的四大核心架构分析

AI大模型技术的四大核心架构演进之路 随着人工智能技术的飞速发展&#xff0c;大模型技术已经成为AI领域的重要分支。 深度剖析四大大模型技术架构&#xff1a;纯粹的Prompt提示词法、Agent Function Calling机制&#xff0c;RAG&#xff08;检索增强生成&#xff09;及Fine-…

NSSCTF-Web题目27(Nginx漏洞、php伪协议、php解析绕过)

目录 [HNCTF 2022 WEEK2]easy_include 1、题目 2、知识点 3、思路 [NSSRound#8 Basic]MyDoor 4、题目 5、知识点 6、思路 [HNCTF 2022 WEEK2]easy_include 1、题目 2、知识点 nginx日志漏洞执行系统命令 3、思路 打开题目&#xff0c;出现源码 题目要我们上传一个fi…

web浏览器播放rtsp视频流,海康监控API

概述 这里记录一下如何让前端播放rtsp协议的视频流 ​ 项目中调用海康API&#xff0c;生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放&#xff0c;说明视频流有问题&#xff0c;唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的&#xff0c;即使…

C++——异常

前言&#xff1a;本篇文章我们来分享C的一个全新内容——异常。 目录 一.异常概念 二.异常的使用 1.异常的抛出和匹配原则 2.在函数调用链中异常栈展开匹配原则 3.异常的重新抛出 三.异常的优缺点 1.优点 2.缺点 结语 一.异常概念 异常是一种处理错误的方式&#xff…

完成QT上位机(八)

一. 正式开始设计界面 这一章节我们将完成QT上位机的设计&#xff0c;如果有同学对QtCreater的使用不太熟悉的&#xff0c;可以参考下面的链接 Qt 快速入门系列教程 Qt 快速入门系列教程 (gitbooks.io)https://wizardforcel.gitbooks.io/qt-beginning/content/ 二. 数据库处…

自动气象站:高度自动化、智能化和精准化

自动气象站&#xff0c;作为科技进步的产物&#xff0c;以其高度的自动化、智能化和精准化特点&#xff0c;极大地提升了气象观测的效率和准确性。它集成了多种高精度传感器&#xff0c;能够全天候、不间断地监测温度、湿度、气压、风速、风向、降水量等关键气象要素&#xff0…

小试牛刀-Telebot区块链游戏机器人(TS升级)

目录 1.编写目的 2.为什么使用TypeScript实现? 3.实现功能 3.1 AI图片生成 3.2 签到 3.3 邀请 3.4 WalletConnect连接 4.功能实现详解 4.1 AI图片生成 4.2 签到 4.3 邀请 4.4 WalletConnect连接 5.功能截图 ​6.问题整理 Welcome to Code Blocks blog 本篇文章主…

【图解秒杀系列】秒杀场景介绍及其相关技术点

【图解秒杀系列】秒杀场景介绍及其相关技术点 秒杀场景介绍秒杀页面的交互秒杀的整套流程 秒杀系统面临的挑战秒杀涉及的技术点 秒杀场景介绍 电商系统的秒杀是一种营销活动&#xff0c;在特定的时间点&#xff0c;以极低的价格&#xff0c;有限的商品数量&#xff0c;吸引大量…

【JavaEE初阶】懒汉模式与饿汉模式及指令重排序问题

目录 &#x1f4d5; 单例模式 &#x1f333; 饿汉模式 &#x1f6a9; 线程安全 &#x1f38d; 懒汉模式 &#x1f6a9; 懒汉模式-单线程版 &#x1f6a9; 懒汉模式-多线程版 &#x1f384; 指令重排序 &#x1f4d5; 单例模式 单例模式是一种经典的设计模式&#xff0c;…

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法&#xff1a; machineIdSync 此函数同步获取操作系统本机UUID/GUID&#xff0c;默认情况下进行哈…

视频教程 - 自研Vue3 Tree组件高级功能:虚拟滚动新增节点实现自动滚动

感谢小伙伴们对本套自研vue3 tree组件教程的关注&#xff0c;在前一篇媲美Element Plus JuanTree终极实战&#xff1a;虚拟滚动的功能演示中发现了小bug&#xff0c;特地整理了相关录屏来说明怎么一步步解决bug的&#xff0c;来回馈小伙伴们的支持。 Tree组件高级功能&#xff…

redis面试(四)持久化

什么是持久化&#xff1f; 由于redis是基于内存操作的轻量型数据库&#xff0c;所以如果发生宕机重启这种事情&#xff0c;存储的数据就会直接丢失&#xff0c;如果在里面存储了没有备份的数据&#xff0c;那么确实会对我们的业务造成一定影响。 所以我们要通过持久化的手段&a…