【实战编程】学生信息管理系统:一键实现数据插入、智能排序、精准查询与成绩统计(附完整源码,即学即用!)

简介: 结构体数组是C语言中一种复合数据类型,它结合了结构体的灵活性和数组的有序集合特性,允许你定义一组具有相同结构的数据项。结构体定义了一组不同数据类型的变量集合,而结构体数组则是这种结构的连续内存块,每个元素都是该结构类型的实例。这种方式特别适合管理具有相似属性的对象集合,如学生信息、员工记录等。

 

技术讲解:

结构体数组是C语言中一种复合数据类型,它结合了结构体的灵活性和数组的有序集合特性,允许你定义一组具有相同结构的数据项。结构体定义了一组不同数据类型的变量集合,而结构体数组则是这种结构的连续内存块,每个元素都是该结构类型的实例。这种方式特别适合管理具有相似属性的对象集合,如学生信息、员工记录等。

定义结构体数组

首先,你需要定义一个结构体类型,然后声明一个该结构体类型的数组。以下是一个简单的例子,定义了一个存储学生信息的结构体数组:

C

1#include <stdio.h>
2
3// 定义一个结构体类型 Student
4typedef struct {
5    int id;       // 学生ID
6    char name[50]; // 姓名
7    float score;  // 成绩
8} Student;
9
10int main() {
11    // 声明一个包含3个元素的Student结构体数组
12    Student students[3];
13
14    // 初始化数组元素
15    students[0] = {1, "Alice", 89.5};
16    students[1] = {2, "Bob", 92.0};
17    students[2] = {3, "Charlie", 78.8};
18
19    // 访问和打印结构体数组的元素
20    for(int i = 0; i < 3; i++) {
21        printf("Student ID: %d, Name: %s, Score: %.2f\n",
22               students[i].id, students[i].name, students[i].score);
23    }
24
25    return 0;
26}

image.gif

特点与应用

  • 数据组织:结构体数组使得同类数据的组织和访问变得直观和高效,特别适合处理固定大小的同构数据集。
  • 内存布局:结构体数组在内存中是连续存储的,每个结构体成员在数组的每个元素中按照定义顺序依次排列。
  • 操作便捷:可以使用数组索引来访问和修改结构体数组中的任何一个元素,便于循环遍历和批量处理。
  • 动态分配:除了静态声明,也可以使用malloc()calloc()动态分配结构体数组的内存,根据需要增减数组大小。

代码思路:

首先应该是开始界面的制作,大家可以自行发挥~

其次开始让用户输入指令,进入不同的函数。

逻辑比较简单,相信各位小伙伴们仔细观看可以看懂,可能在代码整体逻辑上有些小伙伴们会一下子想不出来,不妨可以看看下图捋顺一下整体思路。

image.gif 编辑

这个程序里我用的结构体数组去存储学生的信息,实话说是比较不友好的,如果大家以后学习了链表可以接入此程序进行使用,这样学生信息便不怕溢出或者封顶了。

源码如下:

#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
int count;
struct student
{
    int id;
    float math;
    float els;
    float lauge;
    float avg_score;
} stu[1000];
void home_page()
{
    printf("******************************************************\n");
    printf("*           学生成绩管理系统---帮助菜单              *\n");
    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");
    printf("******************************************************\n");
    printf("*           Copyright <C>   2023.6.17 by Liu         *\n");
    printf("******************************************************\n");
}
void Help()
{
    printf("*                  H = 显示帮助菜单                  *\n");
    printf("*                  T = 成绩录入                      *\n");
    printf("*                  A = 计算学生平均分                *\n");
    printf("*                  L = 列出成绩表                    *\n");
    printf("*                  P = 按平时成绩由高到低            *\n");
    printf("*                  S = 按学号查询成绩                *\n");
    printf("*                  C = 清屏                          *\n");
    printf("*                  Q = 退出系统                      *\n");
}
void Insert()
{
    printf("请输入同学个数:");
    scanf("%d", &count);
    int i, k = 0;
    printf("学号    英语    语文    数学\n");
    for (i = 0; i < count; i++)
    {
        stu[i].id = k;
        k++;
    }
    for (i = 0; i < count; i++)
    {
        ++stu[i].id;
        printf("%d", stu[i].id);
        scanf("%f %f %f", &stu[i].els, &stu[i].lauge, &stu[i].math);
    }
}
void Averge()
{
    if (strlen(stu) == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
    }
    if (strlen(stu) != 0)
    {
        for (int i = 0; i < count; i++)
        {
            stu[i].avg_score = (stu[i].els + stu[i].lauge + stu[i].math) / 3;
        }
        printf("平均值已经打印完成,请用列表L进行查看.\n");
    }
}
void List_Score()
{
    if (strlen(stu) == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
    }
    if (strlen(stu) != 0)
    {
        printf("学生成绩如下:\n");
        printf("学号    英语    语文    数学   平均分\n");
        for (int i = 0; i < count; i++)
        {
            printf("%d    %.1f    %.1f    %.1f    %.1f\n", stu[i].id, stu[i].els, stu[i].lauge, stu[i].math, stu[i].avg_score);
        }
    }
}
void Sort_Score()
{
    if (strlen(stu) == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
    }
    if (strlen(stu) != 0)
    {
        int i, j;
        for (i = 0; i < 999; i++)
        {
            for (j = 0; j < 998 - i; j++)
            {
                if (stu[j].avg_score < stu[j + 1].avg_score)
                {
                    mun = stu[j];
                    stu[j] = stu[j + 1];
                    stu[j + 1] = mun;
                }
            }
        }
        printf("完成排序。请使用命令L查看。\n");
    }
}
void Reserch_Score()
{
    if (strlen(stu) == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
    }
    while (1)
    {
        printf("请输入你想查询的学号:");
        int a;
        scanf("%d", &a);
        getchar();
        for (int i = 0; i < count; i++)
        {
            if (a == stu[i].id)
            {
                printf("%.1f %.1f %.1f %.1f\n", stu[i].els, stu[i].lauge, stu[i].math, stu[i].avg_score);
                break;
            }
        }
        break;
    }
}
int main(int argc, char const *argv[])
{
    home_page();
    char cmd[32];
    while (1)
    {
        printf("请输入你的指令:");
        scanf(" %c", cmd);
        // getchar();
        if (strcmp(cmd, "H") == 0)
        {
            Help();
        }
        else if (strcmp(cmd, "T") == 0)
        {
            Insert();
        }
        else if (strcmp(cmd, "A") == 0)
        {
            Averge();
        }
        else if (strcmp(cmd, "L") == 0)
        {
            List_Score();
        }
        else if (strcmp(cmd, "P") == 0)
        {
            Sort_Score();
        }
        else if (strcmp(cmd, "S") == 0)
        {
            Reserch_Score();
        }
        else if (strcmp(cmd, "C") == 0)
        {
            system("cls");
        }
        else if (strcmp(cmd, "Q") == 0)
        {
            return 0;
        }
    }
}

image.gif

相关文章
|
SQL 算法 前端开发
技术分享-动态脱敏
数据脱敏(Data Masking),又称数据混淆、数据漂白、数据去隐私化。用虚假的数据掩饰真实数据,以达到防止数据泄漏的目的。
1065 21
|
3月前
|
数据采集 Web App开发 文字识别
基于 Python 的反爬虫策略突破与逆向技巧总结
本文介绍四大常见反爬策略及Python应对方案:User-Agent伪装、代理IP绕过IP限制、Tesseract识别验证码、Selenium模拟浏览器获取动态数据,助你合法、高效采集网页信息。
285 22
|
3月前
|
监控 安全 数据可视化
人员定位软件系统从核心架构、关键功能、主流技术、典型应用与选型要点详解
人员定位软件系统以定位引擎与管理平台为核心,融合终端与网络,实现人员实时定位、安全管控及智能管理,适用于工厂、矿山、工地等场景,支持高精度定位、电子围栏、应急报警、考勤管理,并可集成视频监控等系统,提升安全与运营效率。如果您想进一步了解人员定位的案例,欢迎关注、评论留言~也可搜索lbs智能定位。
|
传感器 安全 自动驾驶
汽车智能网联时代如何解决用户隐私问题?
随着科技的飞速发展,伴随着汽车行业的数字化转型,智能网联已经成为了当前汽车发展的重要趋势。新时代的智能网联车辆不仅具备了传统汽车的功能,还配备了各种传感器、通信设备和计算能力,使它们能够实现自动驾驶、实时交通信息获取、远程诊断等功能。然而,随着智能网联汽车的普及以及智能化程度的提高,用户的隐私问题也逐渐凸显,引起广泛关注。那么,就让我们一起讨论一下智能网联汽车隐私保护的问题:
363 21
|
机器学习/深度学习 数据可视化 数据挖掘
数据降维 | MATLAB实现T-SNE降维特征可视化
数据降维 | MATLAB实现T-SNE降维特征可视化
|
监控 前端开发 JavaScript
楼层导视软件
楼层导视软件通过直观的3D地图和精准的实时定位功能,帮助用户快速找到目的地,大大节省了时间和精力。
504 2
楼层导视软件
|
物联网 智能硬件
物联卡如何选择
选择物联卡需综合考量设备类型与数量、流量需求及卡种特性。明确设备属性后,挑选适宜流量套餐,并了解普通物联网卡、语音卡、NB-IoT卡及陶瓷卡等不同类型的应用场景。同时考虑网络覆盖、服务质量及成本预算,优选性价比高且售后服务完善的运营商,确保物联卡兼容设备并顺利完成实名认证。
物联卡如何选择
|
存储 JavaScript 前端开发
HarmonyOS 3.1/4.0应用升级到HarmonyOS NEXT改动点
在 “2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”(<https://coding.imooc.com/class/843.html>)视频课程中,因为讲师在该课程授课时是使用的HarmonyOS 3.1/4.0应用(API 9),如果部分学员采用了最新的HarmonyOS NEXT API,此时就会遇到API兼容性的问题。
679 1
HarmonyOS 3.1/4.0应用升级到HarmonyOS NEXT改动点
|
搜索推荐 数据可视化 数据挖掘
会展中心定位导航:精准展位指引,提升用户参馆体验,增加企业成交机会!
在数字化时代,会展中心借助物联网、大数据与AI技术,推出了智能定位导航系统,革新参会体验。展前通过线上展位预约和可视化招商地图,简化招商流程,提高展位分配效率。展会期间,利用精准定位技术,实现一键导航,同时提供个性化展位推荐,增强参观效率与满意度。系统还支持位置分享、车位检索等功能,并通过数据分析为决策提供支持,全面提升会展品牌形象与竞争力。
577 2
会展中心定位导航:精准展位指引,提升用户参馆体验,增加企业成交机会!
|
监控 安全 算法
室内定位导航技术:数字化时代的智能寻路解决方案
室内定位导航技术融合Wi-Fi、蓝牙信标及超宽带等技术,克服了GPS在室内的局限性。蓝牙信标作为关键组件,通过信号强度分析估算距离,结合三角定位算法确定位置。该技术不仅部署简便、成本低,还能提供准确稳定的定位服务。应用场景包括商场导航、医院科室指引、厂区资产管理、园区安全监控以及智能停车场等,极大提升了用户体验和管理效率。
1155 1
室内定位导航技术:数字化时代的智能寻路解决方案