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

news2024/11/15 2:06:52

目录

一、项目要求

二、完整代码实例

三、分文件编写代码实例

一、项目要求

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决 Vue 页面中地址栏参数变更不刷新的问题

在一次Vue项目开发中&#xff0c;遇到了只改变路由中的参数&#xff0c;路由地址不改变页面数据不刷新的问题。造成这个问题的原因&#xff0c;是因为 vue-router 同一个页面地址栏参数改变&#xff08;比如文章的发布和编辑是同一个页面&#xff09;&#xff0c;不会触发vue的…

cms-wordpress 漏洞

登录后台 一、后台改模板 点击外观&#xff0c;编辑&#xff0c; 找一个php文件&#xff0c;在最开头加入一句话木马&#xff1b; 点击更新&#xff0c;访问模板类路径下的这个文件(不知道默认模板路径可以搜) 使用工具连接 二、上传主题拿shell 点击外观&#xff0c;主题&am…

NeRF学习——基于Pytorch代码复现的笔记

代码复现的框架是基于&#xff1a;pengsida 的 Learning NeRF 源代码框架是基于 Linux 的&#xff0c;我在 Windows 上进行复现有些许 bug&#xff0c;Windows 上 bug 修复的框架版本&#xff1a;Learning NeRF 希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看…

Lanproxy开箱即用的内网穿透工服务!!

Lanproxy快速上手配置服务器转发到内网!! 本教程云服务器推荐使用的开发环境如下&#xff1a;服务器端配置配置端口登录Web界面 内网客户端配置下载客户端配置客户端端口 最终效果测试 本文主要记录了使用Lanproxy搭建内网穿透服务的过程&#xff0c;其中包括服务端和客户端的详…

使用redis缓存文章浏览量

效果展示 好处 首先初始化所有浏览量 访问文章后增加的浏览量**不直接修改数据库&#xff0c;先存到redis然后访问也是获取redis的浏览量&#xff0c;做个定时任务&#xff0c;后续自定义时间同步数据库**&#xff0c;好像也就是一个集中处理罢了 CommandLineRunner实现项目…

鸿蒙系统学习指南

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…

8月2日SpringBoot学习笔记

今日内容: AOP 面向切面 代理模式 springmvc 运行原理 拦截器 springmvc异常处理机制 代理模式 为其他对象提供一种代理以控制对这个对象的访问。想在访问一个类时做一些控制是使用。 静态代理 优点&#xff1a;便于理解 缺点&#xff1a; 1.代码冗余&…

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构 与外设的通信通常称之为输入输出&#xff0c;一般都缩写为I/O。 在实现外设的I/O时&#xff0c;内核必须处理3个可能出现的问题&#xff1a; &#xff08;1&#xff09;必须根据具体的设备类型和模型&#xff0c;使用各种方法对硬件寻址&#xff1b; &#xff08…

java面试题Spring部分(四)

一、什么事spring的三级缓存 典型回答 在Spring的BeanFactory体系中&#xff0c;BeanFactory是Spring IOC容器的基础接口&#xff0c;其DefaultSingletonBeanRegistry类实现了BeanFactory接口&#xff0c;并维护了三级缓存&#xff1a; public class DefaultSingletonBeanRe…

如何在OpenHarmony 4.1R上设置系统默认不锁屏(修改系统锁屏应用)

本文介绍如何修改系统锁屏应用&#xff0c;从而实现在OpenHarmony 4.1R上设置系统默认不锁屏。 环境配置 1.DevEco Studio 4.1 Release&#xff0c;下载链接地址 API10 Full SDK,安装教程 步骤 1.首先下载4.1r分支的系统锁屏应用applications_screenlock 2.修改系统锁屏应…

【Plotly-驯化】一文画出漂亮的流量漏斗图:plotly.funnel函数使用技巧

【Plotly-驯化】一文画出漂亮的流量漏斗图&#xff1a;plotly.funnel函数使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获…

HTML+CSS練習---空隙產生記錄

1.第一層和第二層之間的間隙&#xff1a;以為導航欄超過高度朝下擠下來了 2.第2層兩個div中的空隙 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>font-face {f…

ATTCK实战系列-红队评估 (一)Vulnstack三层网络域渗透

目录 一、搭建环境 1.靶场下载地址&#xff1a; 2、网络拓扑 3、环境配置 Win7&#xff08;外网服务器 &#xff09; Win2008&#xff08;域控&#xff09; Win2003&#xff08;域成员&#xff09; 4、启动环境 二、信息收集 1、端口扫描 2、目录扫描 三、漏洞利用…

IM即时通讯客服聊天系统源码(某站售8千)

即时通讯客服聊天系统已经成为企业提供卓越客户服务的不可或缺的工具。为了帮助您快速搭建强大的客服聊天系统&#xff0c;提供了一款全面的源码模板&#xff0c;基于Java和Spring Boot微服务架构构建&#xff0c;支持多种功能模块&#xff0c;以及消息加密、红包、消息撤回等功…

基于JSP的学生综合考评管理系统

你好&#xff0c;我是专注于教育信息化的开发者&#xff0c;很高兴为您介绍本系统。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;Eclipse、MySQL数据库管理工具 系统展示 首页 管理员功能 教师功能 学生功能 摘要 本文…

笔记本怎么手动设置ip地址:一步步教你操作

在使用笔记本电脑连接网络时&#xff0c;有时候我们需要手动设置IP地址以满足特定的网络需求或解决网络问题。手动设置IP地址可以帮助我们更好地控制网络连接&#xff0c;确保设备在网络中的稳定性和安全性。然而&#xff0c;对于不熟悉网络设置的用户来说&#xff0c;手动设置…

EPLAN EDZ 文件太大导入很慢如何解决?

目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…

[CP_AUTOSAR]_系统服务_DEM模块(二)功能规范介绍

目录 1、DEM 功能规范描述1.1、Startup behavior1.2、Monitor re-initialization 在前面 《[CP_AUTOSAR]_系统服务_DEM模块&#xff08;一&#xff09;》文中&#xff0c;简要介绍了 DEM 模块的功能、与其它模块之间的功能交互&#xff0c;本文将接着介绍 DEM 模块的功能规范。…

Web前端:Vue开发环境搭建

一、搭建开发环境&#xff1a; 1.nodejs安装&#xff1a; 下载地址&#xff1a; https://nodejs.org/dist/v20.13.1/node-v20.13.1-x64.msi 查看版本号&#xff1a; node -v 2.安装nrm(用于指定国内镜像源&#xff0c;加速依赖包下载速度)&#xff1a; 安装nrm&#xff…

程序员的魔法石!

本文由 ChatMoney团队出品 AI自己写代码&#xff0c;这只是传说&#xff1f;还是摸鱼新指南&#xff1f; AI出现之前&#xff0c;从来都是老板或产品经理提需求&#xff0c;程序员熬夜加班吭哧吭哧写代码或者是从Github&#xff0c;Stackoverflow上controlc&#xff0c;control…