C语言——学生信息管理系统(数组)

news2024/9/23 6:37:32

文章目录

    • 一、前言
    • 二、目的
    • 三、框架
      • 1.菜单
        • 1.1主菜单
        • 1.2子菜单
      • 2.流程图
        • 2.1总流程图
        • 2.2开始流程图
        • 2.3增加学生信息流程图
        • 2.4.删除学生信息流程图
        • 2.5修改学生信息流程图
        • 2.6查询学生信息流程图
        • 2.7对学生信息排序流程图
      • 3.思路
    • 四、代码
    • 五、演示视频

一、前言

因为最近是在赶进度总结,数组和指针的笔记已经更新,但是数组、指针的习题还未总结,数组的题已经开始总结,但是还没总结完,所以还没发出来,目前学习进度已经到了学生管理系统,趁热打铁将学生管理系统的数组篇更新,因为之后还有指针篇,怕到时候代码搞混了,由于代码注释都比较清晰,所以不在一一赘述代码含义,有疑问可以给老王留言~

二、目的

用C语言数组写一个学生信息管理系统,并实现以下功能
1.对学生信息实现增、删、改、查;
2.对于增加学生信息可以判定内存是否已满、是否重复录入(学号唯一性);
3.对于删除学生信息判定是否有该生信息;
4.对于修改学生信息判定是否有该生信息;
5.对于查询学生信息判定是否有该生信息、仅打印查询信息;
6.排序功能——按照学号排序/按照成绩排序
7.以管理员身份打印所有学生信息;
8.退出系统

三、框架

1.菜单

1.1主菜单

****** -学生管理系统******
1.添加学生信息
2.删除学生信息
3.修改学生信息
4.查询学生信息
5.学生信息排序
0.退出管理系统

1.2子菜单

**排序方式
1-按照学号排序
2-按照成绩排序

2.流程图

2.1总流程图

在这里插入图片描述
由于不太清楚,我把详细的各部分列出来如下:

2.2开始流程图

在这里插入图片描述

2.3增加学生信息流程图

在这里插入图片描述

2.4.删除学生信息流程图

在这里插入图片描述

2.5修改学生信息流程图

在这里插入图片描述

2.6查询学生信息流程图

在这里插入图片描述

2.7对学生信息排序流程图

在这里插入图片描述

3.思路

1.构建一个学生结构体,里面包含学生学号、姓名、班级、成绩;
2.该结构体是一个数组型,用来存储学生呢信息;
3.先写主菜单和主菜单选项函数及四个相关函数——增删改查;
4.写方便验证的函数——打印函数;
5.写排序方式的子菜单和获取菜单选项的函数;
6.写排序方式——按照学号排序函数/按照成绩排序函数
7.排序函数用的冒泡排序法(在数组的笔记那篇文章有讲);

四、代码

#include "stdio.h"
#define STUDENT_NUM 30

//创建一个学生结构体,包含学号、姓名、班级、成绩
struct Student
{
    int no;
    char name[64];
    int class;
    float score;
};
//初始化一个学生结构体为数组
struct Student student[STUDENT_NUM] = {0};

void Student_Init(void);
int StudentMenu(void); //主菜单函数声明
void Student_ADD();
void Student_Revise();
void Student_Del();
void Student_Find();
void Student_Sort();
int SortMenu();
void SortNo();
void SortScore();
void Student_Printf();



//初始化学生信息,将开辟STUDENT_NUM这么大的空间,并全部赋-1表示未录入信息
void Student_Init(void)
{
    for (int i = 0;i < STUDENT_NUM;i++)
    {
        student[i].no = -1; //未录入信息标志
    }
}

int main()
{
    Student_Init();
    int num1;
    
    
    while (1)
    {
        num1=StudentMenu();
        switch (num1)
        {
            case 1:Student_ADD();break;
            case 2:Student_Del();break;
            case 3:Student_Revise();break;
            case 4:Student_Find();break;
            case 5:Student_Sort();break;
            case 111:Student_Printf();break;
            case 0:goto over;
        }
    }
over:
    printf("感谢使用学生管理系统!\n");
}

//主菜单
int StudentMenu(void)
{
    int num;
p1:
    printf("****** -学生管理系统******\n");
    printf("******1.添加学生信息******\n");
    printf("******2.删除学生信息******\n");
    printf("******3.修改学生信息******\n");
    printf("******4.查询学生信息******\n");
    printf("******5.学生信息排序******\n");
    printf("******0.退出管理系统******\n");
    printf("请输入你要执行操作的序号:\n");
        scanf("%d", &num);
    if ((num >= 0 && num <= 5) || (num == 111)) //111打印所有数据
    {
        return num;
    }
    else
    {
        printf("您输入的菜单选项不正确,清重新输入!\n");
        goto p1;
    }
}
//学生信息排序子菜单
int SortMenu()
{
    int num1;
p1:
    printf("*******排序方式*****\n");
    printf("***1-按照学号排序***\n");
    printf("***2-按照成绩排序***\n");

    printf("请输入排序方式:\n");
    scanf("%d",&num1);
    if (num1>=1&&num1<=2)
    {
        return num1;
    }else{
        printf("输入错误选项,请重新选择排序方式!\n");
        goto p1;
    }

}


//添加学生信息
void Student_ADD()
{
    int i;
    //遍历学号数组,找到放数据的空间
    printf("正在执行添加学生信息操作……\n");
    for (i = 0; i < STUDENT_NUM; i++)
    {
        if (student[i].no==-1)//有空间,跳出循环,输入数据
        {
            break;
        }
    }  
    if (i==STUDENT_NUM)
    {
        printf("空间已满,禁止继续录入!\n");
    }
    //输入信息,由于有判定学号唯一,用tem保存从屏幕上获取的数据
    struct Student temp;
    printf("请输入学号:\n");
    scanf("%d",&temp.no);   
    printf("请输入姓名:\n");
    getchar();
    scanf("%s",temp.name);
    printf("请输入班级:\n");
    getchar();
    scanf("%d",&temp.class);
    printf("请输入成绩:\n");
    scanf("%f",&temp.score);
    //因为学号是唯一的,判断不能重复输入
    for (int j = 0; j < STUDENT_NUM; j++)
    {
        if (student[j].no==temp.no)
        {
            printf("该学生已被录入,请不要重复录入!\n");

        }   
    }
    student[i]=temp;

}
//修改学生信息
void Student_Revise()
{
    int num_0=0;//设置查询标志位,没找到0,找到1
    printf("正在执行修改学生信息操作……\n");
p1:
    printf("请输入您要修改的学号:\n");
    int num,i;
    scanf("%d",&num);
    for (i = 0; i < STUDENT_NUM; i++)   
    {
        if (num!=student[i].no)
        {
            num_0=0;
            continue;
        }else if(student[i].no==num)
        {
            num_0=1;
            break;
        }
    }
    if (num_0==0)
    {
        printf("查无此人,请重新输入要修改的学号!\n");
        goto p1;
    }
    //从屏幕获取新的数据
    printf("请输入学号:\n");
    scanf("%d",&student[i].no);
    printf("请输入姓名:\n");
    getchar();
    scanf("%s",student[i].name);
    getchar();
    printf("请输入班级:\n");
    scanf("%d",&student[i].class);
    printf("请输入成绩:\n");
    scanf("%f",&student[i].score); 

    
    
}
//删除学生信息
void Student_Del()
{
    int num,i;
    int num_0=0;//设置查询标志位,没找到0,找到1
    printf("正在执行删除学生信息操作……\n");
p1:
    printf("请输入您要删除的学号:\n");
    scanf("%d",&num);
    for (i = 0; i < STUDENT_NUM; i++)
    {
        if (num!=student[i].no)//没找到
        {
            continue;
            num_0=0;
        }else if (student[i].no==num)
        {
            num_0=1;
            student[i].no=-1;
            printf("删除成功!\n");
        }
    }
    if (num_0==0)
    {
        printf("查无此人,请重新输入要删除的学号!\n");
        goto p1;
    }
}
//查询学生信息
void Student_Find()
{
    int i,num;
    int num_0=0;//设置查询标志位,没找到0,找到1
    printf("正在执行查询学生信息操作……\n");
p1:
    printf("请输入您要查询的学号:\n");
    scanf("%d",&num);
    for (i = 0; i < STUDENT_NUM; i++)
    {
        if (num!=student[i].no)
        {
            num_0=0;
            continue;
        }else if (student[i].no==num)
        {
            num_0=1;
            break;
        }
    }
    if (num_0==0)
    {
        printf("查无此人,请重新输入要查询的学号!\n");
        goto p1;
    }
    printf("学号\t姓名\t班级\t成绩\n");
    printf("%d\t",student[i].no);
    printf("%s\t",student[i].name);
    printf("%d\t",student[i].class);
    printf("%.2f\n",student[i].score);
    
}
//对学生信息排序
void Student_Sort()
{
    int num2;
    num2=SortMenu();
    int num_0;
    //判断是否有学生信息,有则打印,
    for (int i = 0; i <STUDENT_NUM; i++)
    {
        if (student[i].no==-1)
        {
            num_0=0;
            continue;

        }else{
            num_0=1;
            break;
        }
    }
    if (num_0==0)
    {
        printf("没有学生信息,无法排序打印!\n");
    }
    
    //选择排序方式
    if (num2==1)
    {
        SortNo();
    }else if (num2==2)
    {
        SortScore();
    }
}
//学生学号排序
void SortNo()
{
    int i,j;
    printf("正在按照学号排序\n");
    struct Student temp;
    for ( i = 0; i < STUDENT_NUM; i++)
    {
        for (j = 0; j <STUDENT_NUM-i-1; j++)
        {
            if (student[j].no>student[j+1].no)
            {
                temp=student[j];
                student[j]=student[j+1];
                student[j+1]=temp;
            }
        }
    }
    Student_Printf(); 
}
//学生成绩排序
void SortScore()
{
    int i,j;
    printf("正在按照成绩排序\n");
    struct Student temp;
    for ( i = 0; i < STUDENT_NUM; i++)
    {
        for (j = 0; j <STUDENT_NUM-i-1; j++)
        {
            if (student[j].score<student[j+1].score)
            {
                temp=student[j];
                student[j]=student[j+1];
                student[j+1]=temp;
            }
        }
    }
    Student_Printf(); 

}
//打印所有学生信息
void Student_Printf()
{
    printf("学号\t姓名\t班级\t成绩\n");
    for (int i = 0; i < STUDENT_NUM; i++)
    {
        if (student[i].no!=-1)
        {
            printf("%d\t",student[i].no);
            printf("%s\t",student[i].name);
            printf("%d\t",student[i].class);
            printf("%.2f\n",student[i].score);
        }
    }
    
}

五、演示视频

由于之前我不知道数字时钟上传后友友们下载是要vip的,所以为了方便友友们,我将实现视频放在文章中如下:

数组学生管理系统

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

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

相关文章

无人驾驶--工控机安装autoware

时隔好久&#xff0c;又来写文章了&#xff0c;这次有高人指点&#xff0c;要系统的学习一下无人驾驶了。 使用的是易咖的底盘车&#xff0c;工控机是米文动力Apex Xavier II&#xff0c;基于autoware框架 首先是在工控机上安装autoware&#xff0c;工控是ubuntu18环境。 参…

Python入门教程+项目实战-9.2节: 字符串的操作符

目录 9.2.1 字符串常用操作符 9.2.2 操作符&#xff1a;拼接字符串 9.2.3 *操作符&#xff1a;字符串的乘法 9.2.4 []操作符&#xff1a;索引访问 9.2.5 [:]操作符&#xff1a;分片字符串 9.2.6 in操作符&#xff1a;查找子串 9.2.7 %操作符&#xff1a;格式化字符串 9…

为什么要做软件测试

随着信息技术的发展和普及&#xff0c;人们对软件的使用越来越普及。但是在软件的使用过程中&#xff0c;软件的效果却不尽如人意。为了确保软件的质量&#xff0c;整个软件业界已经逐渐意识到测试的重要性&#xff0c;软件测试已经成为IT 领域的黄金行业。本篇文章将会带领大家…

使用Tensorboard多超参数随机搜索训练

文章目录1超参数训练代码2远端电脑启动tensorboard完整代码位置https://gitee.com/chuge325/base_machinelearning.git 这里还参考了tensorflow的官方文档 但是由于是pytorch训练的差别还是比较大的&#xff0c;经过多次尝试完成了训练 硬件是两张v100 1超参数训练代码 这个…

Android Studio升级Gradle Plugin升级导致项目运行失败问题

背景&错误 升级Android Studio 旧项目无法运行&#xff0c;奇奇怪怪什么错误都有 例如&#xff1a; java.lang.IllegalAccessError: class org.gradle.api.internal.tasks.compile.processing.AggregatingProcessingStrategy (in unnamed module 0x390ea9fb) cannot acce…

传智健康-day2

一.需求分析(预约管理功能开发) 预约管理功能&#xff0c;包括检查项管理、检查组管理、体检套餐管理、预约设置等、预约管理属于系统的基础功能&#xff0c;主要就是管理一些体检的基础数据。 检查组是检查项的集合 二.基础环境搭建 1导入预约管理模块数据表 需要用到的…

Ubuntu安装MySQL及常用操作

一、安装MySQL 使用以下命令即可进行mysql安装&#xff0c;注意安装前先更新一下软件源以获得最新版本&#xff1a; sudo apt-get update #更新软件源 sudo apt-get install mysql-server #安装mysql 上述命令会安装以下包&#xff1a; apparmor mysql-client-5.7 mysql-c…

不定期更新:我对 ChatGPT 进行多方位了解后的报告,超级全面,建议想了解的朋友看看

优质介绍视频&#xff1a; GPT4前端【AI编程新纪元】 【渐构】万字科普GPT4为何会颠覆现有工作流&#xff1b;为何你要关注微软Copilot、文心一言等大模型 此文章不定期更新&#xff08;一周应该会更新一次&#xff09; 最近一次更新&#xff1a;2023.4.16 12:00 ChatGPT 是什…

零基础搭建私人影音媒体平台【远程访问Jellyfin播放器】

文章目录1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5. 结语1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&#xf…

关于加强供水企业营销管理的几点思考

供水营销部门是供水企业最重要的职能部门之一&#xff0c;其工作职能直接与供水企业的经济利益和社会效益息息相关&#xff0c;具体来说&#xff0c;主要涉及到五个方面的指标内容&#xff1a;水费回收率、 水量漏损率&#xff08;产销差率&#xff09;、水表完好率、水价调整及…

《年会抽奖》:无人获奖的概率

目录 一、题目 二、思路 1、错排问题 2、n 的阶乘 3、输出格式要求 三、代码 一、题目 题目&#xff1a;年会抽奖 题目链接&#xff1a;年会抽奖 今年公司年会的奖品特别给力&#xff0c;但获奖的规矩却很奇葩&#xff1a; 1. 首先&#xff0c;所有人员都将…

SpringBoot起步依赖和自动配置

文章目录 1、起步依赖2、自动配置 1、起步依赖 概念 起步依赖本质上是一个Maven项目对象模型&#xff08;Project Object Model&#xff0c;POM&#xff09;&#xff0c;定义了对其他库的传递依赖&#xff0c;这些东西加在一起支持某一功能。 简单的说&#xff0c;起步依赖就…

这才是后端API该有的样子

一般系统大致架构如下&#xff1a; 有些小伙伴会说&#xff0c;这个架构太简单太low了吧&#xff0c;什么网关、缓存、消息中间件都没有。 需要说明的是&#xff0c;因为我们主题是API接口&#xff08;tbAPI&#xff0c;pinduoduo API接口调用&#xff09;所以聚焦这一点上就行…

Java FileChannel文件的读写实例

一、概述&#xff1a; 文件通道FileChannel是用于读取&#xff0c;写入&#xff0c;文件的通道。FileChannel只能被InputStream、OutputStream、RandomAccessFile创建。使用fileChannel.transferTo()可以极大的提高文件的复制效率&#xff0c;他们读和写直接建立了通道&#x…

【Leetcode刷题】链表的中间结点和合并两个有序链表

生命如同寓言&#xff0c;其价值不在与长短&#xff0c;而在与内容。 ——塞涅卡 目录 一.链表的中间结点 1.快慢指针 二.合并两个有序链表 1.尾插法 一.链表的中间结点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结…

Java——对象克隆(复制)

假如想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象&#xff0c;情况就复杂了。 假设说我是一个b…

windows安装scoop

scoop介绍 Scoop是一款适用于Windows平台的命令行软件&#xff08;包&#xff09;管理工具。简单来说&#xff0c;就是可以通过命令行工具&#xff08;PowerShell、CMD等&#xff09;实现软件&#xff08;包&#xff09;的安装管理等需求&#xff0c;通过简单的一行代码实现软…

博客上几种新职业的工作指南

© 2019 Conmajia 我不是在嘲讽谁&#xff0c;真的&#x1f605; 看了不少博客&#xff0c;发现了一些共同点。我觉得可以把这些博主分类一下&#xff0c;形成几种新的职业。 1. 超文本抄书匠Hypertext Copier Job description 拥有悠久历史的手打大师&#xff0c;大段抄录…

2023-04-16 算法面试中常见的栈和队列问题

栈和队列 1 栈的基础应用:20.括号匹配 class Solution {public boolean isValid(String s) {Stack<Character> stack new Stack<>();for (int i 0; i < s.length(); i) {char c s.charAt(i);if (c ( || c [ || c {) {stack.push(c);} else {// 还有字符…

【Linux】进程间通信 -- 命名管道

前言 在管道的通信中&#xff0c;除了匿名管道&#xff0c;还有一个命名管道。 匿名管道只支持具有“亲戚关系”的进程间通信&#xff0c;而命名管道就可以支持不同的&#xff0c;任意的进程通信。 那就下来就开始我们今天的学习。 文章目录 前言一. 命名管道二. 命名管道的应用…