学生成绩管理系统(C语言有结构体实现)

news2025/1/19 16:21:25

目录标

  • 一、要实现的功能
    • 1.首次运行
    • 2. 成绩录入
    • 3. 显示录入的成绩
    • 4. 计算平均值
    • 5. 对平均分排序
    • 6. 查询学生成绩
    • 7. 清屏
    • 8. 显示帮助菜单
    • 9. 系统
  • 二、实现代码
    • (一)所有代码在一个文件(v1)
    • (二)分文件编写(v2)

本文章介绍了一个通过C语言实现的一个简单的学生管理系统,该系统要是使用结构体数组来管理学生成绩数据的,通过该系统的练习能够对结构体的相关知识有更好的理解,提高逻辑思维能力。

一、要实现的功能

1.首次运行

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

p9qbzZj.png

开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。” 同理,当输入其他的成绩处理命令时也作相应的处理。

p9qqRkn.png

2. 成绩录入

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

p9qq5lT.png

输入3,提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,同时提示学号:1

p9qqH0J.png

输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2

p9qLktI.png

输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3

p9qLec8.png

输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。

p9qLlAs.png

3. 显示录入的成绩

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

p9qOlrD.png

4. 计算平均值

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

p9qOrZQ.png

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

p9qORzV.png

5. 对平均分排序

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

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

p9qXEy8.png

6. 查询学生成绩

输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。

输入 2 找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。

p9qXQWq.png

7. 清屏

输入命令C 执行清屏函数语句system(“clear”);

p9qXGOU.png

8. 显示帮助菜单

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

p9qXdYR.png

9. 系统

输入命令Q 则退出系统。

p9qxYm8.png

二、实现代码

(一)所有代码在一个文件(v1)

main.c

#include <stdio.h>
#include <stdlib.h>

struct student
{
    int num;
    float chinese;
    float math;
    float waiyu;
    float average;
};
/**********函数声明*********/
void Help();//帮助菜单显示函数
void Type(struct student *pstu);//成绩录入
void List(struct student *pstu);//输出成绩表
void Averange(struct student *pstu);//平均分
void Sort(struct student *pstu);//按平均分由高到底排序
void Search(struct student *pstu); //查询学生成绩
void Clear();   //清屏


int manNum = 0;//学生数

int main()
{

    char opt;   //命令变量
    Help();//首次运行显示帮助菜单
    struct student stu[10];//定义结构体数组


    while (1)
    {
        printf("\n");
        printf("请输入命令=");
        if(scanf("%c",&opt)){
            //printf("scanf出现EOF错误!\n");
            getchar();//吃掉空格
        }
        switch (opt)
        {
            case 'H':Help();break;//显示帮助菜单
            case 'T':Type(stu);break;//成绩录入
            case 'A':Averange(stu);;break;
            case 'L':List(stu);break;//列出成绩表
            case 'P':Sort(stu);break;//按平均成绩由高到低拍排序
            case 'S':Search(stu);break;//按学号查询学生成绩
            case 'C':Clear();break;//清屏
            case 'Q':return 0;break; //退出系统
            default:printf("输入命令有误!\n");break;
        }
    }
    return 0;
}

void Help()  //帮助菜单显示函数 H
{
    printf("\n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
    printf("  *      学生成绩管理系统———帮助菜单       *  \n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
    printf("  *         H = 显示帮助菜单               *  \n");
    printf("  *         T = 成绩录入                   *  \n");
    printf("  *         A = 计算学生平均分             *  \n");
    printf("  *         L = 列出成绩表                 *  \n");
    printf("  *         P = 按平均成绩由高到低排序     *  \n");
    printf("  *         S = 按学号查询学生成绩         *  \n");
    printf("  *         C = 清屏                       *  \n");
    printf("  *         Q = 退出系统                   *  \n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
    printf("  * Copyright <C> 2023.05.19  By Sunqk5665 *  \n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");

}
void Type(struct student *pstu)//成绩录入 T
{
    printf("请输入学生人数:");
    scanf("%d",&manNum);
    printf("请输入%d名学生的三门课成绩:\n",manNum);
    printf("学号 语文 数学 外语\n");
    // for(int i = 0; i < manNum; i++){
    //     scanf("%d  %f  %f  %f",&pstu[i].num,&pstu[i].chinese,&pstu[i].math,&pstu[i].waiyu);
    //     //getchar();
    // }
    for(int i = 0; i < manNum; i++){
        pstu[i].num = i+1;
        printf("%d   ",pstu[i].num);
        scanf("%f  %f  %f",&pstu[i].chinese,&pstu[i].math,&pstu[i].waiyu);
        //getchar();
    }
    getchar();//吃最后一次输入后的回车
}
void List(struct student *pstu)//输出成绩表 L
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    printf("学号 语文 数学 外语 平均分\n");
    for(int i=0; i<manNum; i++){
        printf(" %d   %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
    }
}
void Averange(struct student *pstu)//平均分 A
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    for(int i=0; i<manNum; i++){
        pstu[i].average = (pstu[i].chinese + pstu[i].math + pstu[i].waiyu)/3;
    }
    printf("平均分已计算完,请使用命令 L 查看。\n");
}
void Sort(struct student *pstu) //按平均分由高到底排序 P
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    struct student stTemp;//交换中转
    for(int i = 1; i < manNum; i++){
        for(int j = 0; j < manNum-i; j++){
            if (pstu[j].average < pstu[j+1].average){
                stTemp = pstu[j];
                pstu[j] = pstu[j+1];
                pstu[j+1] = stTemp;
            }
        }
    }
    printf("完成排序,请使用 L 查看。\n");
}
void Search(struct student *pstu) //按学号查询学生成绩 S
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    int stuNum;

    printf("请输入要查询的学生学号:");
    scanf("%d",&stuNum);
    if(stuNum <= 0 || stuNum >=manNum){
        printf("输入学号有误!\n");
    }
    getchar();
    for(int i=0; i<manNum; i++){
        if(pstu[i].num == stuNum){
            printf("学号 语文 数学 外语 平均分\n");
            printf(" %d   %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
        }
    }   

}
void Clear()//清屏 C
{
    system("clear"); //"clear"为Linux终端清屏命令(实质是向上翻页)
}

(二)分文件编写(v2)

main.c

#include <stdio.h>
#include <stdlib.h>
#include "help.h"
#include "score.h"
#include "clear.h"


// int flag = 0;
int manNum = 0;//学生数
struct student stu[20]; //结构体数组定义

int main()
{
    char opt;   //命令
    Help(); //首次运行显示帮助菜单
    while (1)
    {
        printf("\n");
        printf("请输入命令=");
        if(scanf("%c",&opt)){
            //printf("scanf出现EOF错误!\n");
            getchar();//吃掉空格
        }
        switch (opt)
        {
            case 'H':Help();break;           //显示帮助菜单
            case 'T':Type(stu);break;        //成绩录入
            case 'A':Averange(stu);;break;   //计算平均分
            case 'L':List(stu);break;        //列出成绩表
            case 'P':Sort(stu);break;        //按平均成绩由高到低拍排序
            case 'S':Search(stu);break;      //按学号查询学生成绩
            case 'C':Clear();break;          //清屏
            case 'Q':return 0;break;         //退出系统
            default:
                printf("输入命令有误!\n");break;
        }

    }
    return 0;
}

help.h

#ifndef _SCORE_H_
#define __SCORE_H_
#include <stdio.h>
/****函数声明***/
void Help();//帮助菜单显示函数

#endif

clear.h

#ifndef _CLEAR_H_
#define _CLEAR_H_
#include <stdlib.h>
/****函数声明***/
void Clear();   //清屏

#endif

score.h

#ifndef _SCORE_H_
#define _SCORE_H_
#include <stdio.h>
#include <ctype.h>

/****学生结构体***/
struct student
{
    int num;
    float chinese;
    float math;
    float waiyu;
    float average;
};
/****函数声明***/
void Type(struct student *pstu);//成绩录入
void List(struct student *pstu);//输出成绩表
void Averange(struct student *pstu);//平均分
void Sort(struct student *pstu);//按平均分由高到底排序
void Search(struct student *pstu); //查询学生成绩

#endif

help.c

#include "help.h"

void Help()//帮助菜单显示函数 H
{
    printf("\n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
    printf("  *      学生成绩管理系统———帮助菜单       *  \n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
    printf("  *         H = 显示帮助菜单               *  \n");
    printf("  *         T = 成绩录入                   *  \n");
    printf("  *         A = 计算学生平均分             *  \n");
    printf("  *         L = 列出成绩表                 *  \n");
    printf("  *         P = 按平均成绩由高到低排序     *  \n");
    printf("  *         S = 按学号查询学生成绩         *  \n");
    printf("  *         C = 清屏                       *  \n");
    printf("  *         Q = 退出系统                   *  \n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
    printf("  *   Copyright <C> 2023.05.19 By 孙启凯   *  \n");
    for(int i=1;i<=46;i++){
        printf("*");
    }
    printf("\n");
}

clear.c

#include "clear.h"

void Clear()//清屏 C
{
    system("clear"); //"clear"为Linux终端清屏命令(实质是向上翻页)
}

score.c

#include "score.h"
extern int manNum;

void Type(struct student *pstu)//成绩录入 T
{
    printf("请输入学生人数:");
    scanf("%d",&manNum);
    printf("请输入%d名学生的三门课成绩:\n",manNum);
    printf("学号 语文 数学 外语\n");

    for(int i = 0; i < manNum; i++){
        pstu[i].num = i+1;
        printf("%d   ",pstu[i].num);
        scanf("%f  %f  %f",&pstu[i].chinese,&pstu[i].math,&pstu[i].waiyu);
        //getchar();
    }
    getchar();//吃最后一次输入后的回车

}
void List(struct student *pstu)//输出成绩表 L
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    printf("学号 语文 数学 外语 平均分\n");
    for(int i=0; i<manNum; i++){
        printf(" %d   %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
    }
}
void Averange(struct student *pstu)//平均分 A
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    for(int i=0; i<manNum; i++){
        pstu[i].average = (pstu[i].chinese + pstu[i].math + pstu[i].waiyu)/3;
    }
    printf("平均分已计算完,请使用命令 L 查看。\n");
}
void Sort(struct student *pstu) //按平均分由高到底排序 P
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    struct student stTemp;//交换中转
    for(int i = 1; i < manNum; i++){
        for(int j = 0; j < manNum-i; j++){
            if (pstu[j].average < pstu[j+1].average){
                stTemp = pstu[j];
                pstu[j] = pstu[j+1];
                pstu[j+1] = stTemp;
            }
        }
    }
    printf("完成排序,请使用 L 查看。\n");
}
void Search(struct student *pstu) //按学号查询学生成绩 S
{
    if(manNum == 0){
        printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
        return;//函数到此终止
    }
    int stuNum;

    printf("请输入要查询的学生学号:");
    scanf("%d",&stuNum);
    getchar();
    if(stuNum>0 && stuNum<=manNum){
        for(int i=0; i<manNum; i++){
            if(pstu[i].num == stuNum){
                printf("学号 语文 数学 外语 平均分\n");
                printf(" %d   %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
            }
        }
    }
    else{
        printf("输入的学号非法,请仔细核对!!\n");
    }
}

Makefile

CC=gcc
CFLAGS=-c -g
OBJS=help.o clear.o score.o main.o
a.out:$(OBJS)
	$(CC) $(OBJS) -o $@
$(OBJS):%.o:%.c
	$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
	rm *.o a.out

请添加图片描述

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

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

相关文章

全志V3S嵌入式驱动开发(制作根文件系统)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 根文件系统是嵌入式开发很重要的一环。目前对于大多数soc来说&#xff0c;制作嵌入式系统就是配置buildroot文件。今天使用的buildroot版本是build…

一个字牛!腾讯大牛把《数据结构与算法》讲透了,带源码笔记

话不多说&#xff0c;直接先上图 经历过校招的人都知道&#xff0c;算法和数据结构都是不可避免的。 在笔试的时候&#xff0c;最主要的就是靠算法题。像拼多多、头条这种大公司&#xff0c;上来就来几道算法题&#xff0c;如果你没AC出来&#xff0c;面试机会都没有。 在面试…

上午在改BUG,下午就被通知优化了····

前段时间&#xff0c;爱奇艺被曝出大规模裁员的消息&#xff0c;裁员比例为20%-40%&#xff0c;对此&#xff0c;爱奇艺并未回应。有多位爱奇艺员工向深燃证实了裁员消息。“现在&#xff0c;空了好些工位。”一位爱奇艺员工表示。据他了解&#xff0c;仅爱奇艺文学&#xff0c…

21天学会C++:Day5----引用

CSDN的uu们&#xff0c;大家好。这里是C入门的第五讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 引用的特性 2.1 引用在定义时必须初始化 2.2 一个变量可以有多…

车间静电消除不掉?静电接地桩来帮忙!

静电接地桩的原理是通过将金属导体与地面相连&#xff0c;以便在设备运行时能够稳定地将静电荷自然地释放到地面中&#xff0c;从而保护人员和设备不受到静电的危害。 在工业生产中&#xff0c;静电容易在人体和物体表面积聚&#xff0c;如果不及时地排放处理会对人员和设备造…

【算法】简单讲解如何使用两个栈实现一个队列

文章目录 什么是栈和队列&#xff1f;设计思路代码实现 什么是栈和队列&#xff1f; 栈和队列其实大家基本都知道是什么&#xff0c;或者说&#xff0c;最基本的&#xff0c;他们的特性我们是知道的。 栈是一种FILO先进后出的数据结构&#xff0c;队列是一种FIFO先进先出的数据…

SRS流媒体服务器 ---- st-thread框架

1.使用st-thread 我们用一个简单的demo研究一下st框架。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include "st.h"static void *_thread(void *arg) {printf("thread: %lu\n", pthread_self());return NULL; }i…

实例6.1 六度空间

“六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一个陌生人。”如图1所示…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

ROS学习——Gazebo中搭建模型并显示

一、打开gazebo搭建模型 gazebo 在gazebo界面左上角点击“Edit”——>"Building Editor"进入下图的模型搭建界面。可以自己利用左边的材料搭建模型。 点击墙壁之类的物品&#xff0c;右键&#xff0c;点击“Open Wall Inspector”按钮&#xff0c;就会出现可以调…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…

第11届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 对对碰 题目说明 编程实现 对对碰 两两相同的一共四张扣下的纸牌&#xff0c;每次先后翻开两张。如果两张一样就消失&#xff0c;如果两张不一样就重新扣下。当舞台上所有纸牌都消失&#xff0c;就过关了 .1)创建四个经牌角色&#xff0c;每张纸牌…

linuxOPS基础_Linux文件管理

Linux下文件命名规则 可以使用哪些字符&#xff1f; 理论上除了字符“/”之外&#xff0c;所有的字符都可以使用&#xff0c;但是要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;例如&#xff0c; <、>、&#xff1f;、* 等&…

表单重复提交:

1. 表单重复提交原因 当用户提交完请求&#xff0c;浏览器会记录最后一次请求的全部信息。用户按下功能键F5&#xff0c;就会发起浏览器记录的最后一次请求。如果最后一次请求为添加操作&#xff0c;那么此时刷新按钮就会再次提交数据&#xff0c;造成表单重复提交。 2. 表单…

Hive优化

Hive的本质是MapReduce&#xff0c;优化其实大部分是对mapreduce的优化 hive优化目标&#xff1a;①横向增加并发&#xff0c;②纵向减少依赖 //开启mapjoin&#xff0c;默认为 true • set hive.auto.convert.join true; //开启map端数据聚合 • hive.map.aggrtrue&…

API的应用范围主要有哪些方面?

API&#xff08;Application Programming Interface&#xff09;即应用程序接口&#xff0c;它是一组规则和工具&#xff0c;通过 HTTP 协议将两个软件应用程序之间的通信连接起来。API 的设计可以使不同应用程序的数据和功能进行交互和共享&#xff0c;从而促进了各种应用程序…

对讲机在未来会有更好的发展吗?

对讲机经过几十年的发展&#xff0c;目前在很多领域都有着广泛的应用。那么在未来对讲机还会有更好的发展吗&#xff1f; 对讲机未来会有更好的发展吗 下面河南宝蓝小编根据目前的发展情况做一些猜想&#xff1a; 一、更高的频率范围 目前对讲机所使用的频率范围主要是在VHF…

Spring的作用域和生命周期

目录 1.Bean的作用域 2.Bean的作用域的分类 3.设置作用域 4.Spring的执行流程&#xff08;生命周期&#xff09; 5.Bean的生命周期 1.Bean的作用域 lombok &#xff08;dependency依赖&#xff09; 是为了解决代码的冗余&#xff08;比如说get和set方法&#xff09;那些构造…

平衡二叉树的插入,删除以及平衡调整。

一&#xff0c;平衡二叉树插入失衡情况及解决方案 由于各种的插入导致的不平衡&#xff0c;每次调整都是最小不平衡子树。 LL&#xff1a;由于在结点A的 左孩子的左子树 插入结点导致失衡。 右单旋&#xff1a;①将A的 左孩子B 向右上旋转 代替A成为根节点       ②将A结…

从零开始:使用低代码平台开发OA系统的教程

随着中小型企业持续拥抱数字化转型&#xff0c;对支持业务流程的定制软件应用程序的需求增加。而办公自动化(OA)系统是一个有助于自动执行重复性任务并简化工作流程的系统。按照传统的开发模式&#xff0c;开发OA系统可能既耗时又昂贵&#xff0c;需要经验丰富的开发人员从头开…