首页 > 其他分享 >C语言项目实操-学生管理系统

C语言项目实操-学生管理系统

时间:2023-04-21 13:31:52浏览次数:40  
标签:管理系统 int 学生 students 实操 Student printf C语言 -------------------------

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"!
作者:张磊|慕课网讲师

0基础学员在经过C语言基础语法的学习后,需要通过一些实战案例来学习如何将C语言应用到实际工作中,今天我们通过一个学生管理系统案例的开发来提升实际开发能力。

1. 系统介绍

在这里,我们首先采用了数组的方式来存储我们输入的内容。同时,我们这里利用里前面学习到的 struct 来结构化存储我们的学生信息。

我们实现了基本的对于数据操作的几项功能:增、删、改、查。

也就是我们可以向这个系统中添加数据,删除数据,修改数据,还有就是查询数据。这里的查询数据,我们又分为了全部无条件的查询,和按照姓名条件的查询。

2. 功能

系统的功能里面我们设计了添加、删除、修改、列表显示和查询等 5 个功能。

添加:添加就是将数据添加到存储数据的数组中;

删除:删除就是根据指定的序列号删除特定的一条数据;

修改:修改就是根据指定的序列号来修改学生的成绩;

列表显示:列表的显示,其实就是无条件的查询,也就是在没有特点查询条件的情况下,将存储的数据全部显示出来;

查询:这里的查询,就是按照姓名这个特性的条件。把符合这个条件的数据筛选出来,并显示出来。

示例程序

#include <stdio.h>
#include <string.h>

#define StudentNumbers 50
#define NameLength 50

typedef struct
{
    int id;
    char name[NameLength];
    int age;
    int score;
    int flag;
} Student;

int add(Student student, Student Students[]);
int del(int id, Student students[]);
int display(Student students[]);
int update(int id, Student students[]);
int search(char name[], Student students[]);

int main()
{
    int id = -1;
    char name[NameLength];
    int choice = 0;
    int stop = 0;
    Student students[StudentNumbers];
    Student student;

    for (int i = 0; i < StudentNumbers; i++)
    {
        students[i].id = i;
        students[i].flag = 0;
    }

    while (stop == 0)
    {
        printf("-------------------------\n");
        printf("*      学生管理系统      *\n");
        printf("-------------------------\n");
        printf("1 添加\n");
        printf("2 修正成绩\n");
        printf("3 查询\n");
        printf("4 删除\n");
        printf("5 显示学生列表\n");
        printf("0 退出程序\n");
        printf("请直接输入数字选项:");

        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("请输入学生姓名:");
            scanf("%s", student.name);
            printf("请输入学生的年龄:");
            scanf("%d", &student.age);
            printf("请输入学生成绩:");
            scanf("%d", &student.score);
            add(student, students);
            break;
        case 2:
            printf("请输入要修改成绩的学生编号:");
            scanf("%d", &id);
            update(id, students);
            break;
        case 3:
            printf("请输入要查找的学生姓名:");
            scanf("%s", name);
            search(name, students);
            break;
        case 4:
            printf("请输入要删除的学生编号:");
            scanf("%d", &id);
            del(id, students);
            break;
        case 5:
            display(students);
            break;
        case 0:
            stop = 1;
            break;

        default:
            printf("输入选项有误\n");
            break;
        }
    }

    return 0;
}

int add(Student student, Student students[])
{
    for (int i = 0; i < StudentNumbers; i++)
    {
        if (students[i].flag == 0)
        {
            strcpy(students[i].name, student.name);
            students[i].age = student.age;
            students[i].score = student.score;
            students[i].flag = 1;
            return 0;
        }
    }

    return 1;
}

int del(int id, Student students[])
{
    for (int i = 0; i < StudentNumbers; i++)
    {
        if (students[i].id == id)
        {
            students[i].flag = 0;
            return 0;
        }
    }
    return 1;
}

int display(Student students[])
{
    printf("******************\n");
    printf("学生列表\n");
    printf("******************\n");
    for (int i = 0; i < StudentNumbers; i++)
    {
        if (students[i].flag == 1)
        {
            printf("学生编号:%d,学生姓名:%s,年龄:%d,成绩:%d\n", students[i].id, students[i].name, students[i].age, students[i].score);
        }
    }
    printf("******************\n");
    return 0;
}

int update(int id, Student students[])
{
    int score = -1;
    printf("请输入新的成绩:");
    scanf("%d", &score);
    for (int i = 0; i < StudentNumbers; i++)
    {
        if (students[i].id == id)
        {
            students[i].score = score;
            return 0;
        }
    }

    return 1;
}

int search(char name[], Student students[])
{
    for (int i = 0; i < StudentNumbers; i++)
    {
        if (strcmp(name, students[i].name) == 0)
        {
            printf("学生编号: %d,学生姓名: %s,年龄: %d,成绩: %d\n", students[i].id, students[i].name, students[i].age, students[i].score);
            return 0;
        }
    }
    printf("没有查找到相关学生信息。\n");
    return 1;
}

很多人可能会第一次接触这么长的程序,会产生畏惧的心理。其实不用担心。要相信自己可以看懂的。

我们分开来讲解一下。

在程序的最开始我们需要引入程序中可能需要使用的函数的头文件。这里我们因为要使用 printfscanf 等,所以需要 stdio 函数库。因为要使用 strcpystrcmp 函数,所以需要 string 函数库。

#include <stdio.h>
#include <string.h>

为了便于程序中的维护,不用在很多出修改共用的数值。所以这里定义了一个常量

#define StudentNumbers 50
#define NameLength 50

为了存储学生的信息。我们用了 struct 来定义学生的信息。里面包含学生的编号 id ,姓名 name 这是一个字符串,年龄 age ,成绩 score ,标志位 flag 这个变量是用来表示是否有学生信息存储在该位置的。不过这里我们使用了之前没有介绍的一个 typedef 。这个关键字使用的好处是使得后面使用这个 struct 的时候不用每次都用关键字 struct 来定义,只要用这个结构的名称直接定义就可以了,如同我们定义整数等内置类型一样方便。

typedef struct
{
    int id;
    char name[NameLength];
    int age;
    int score;
    int flag;
} Student;

为了便于维护,我们没有按照函数出现的顺序来写。不过 C 语言一直秉承着先定义再使用的原则。所以。如果你使用的函数没有在使用前出现,而是在后面的话,那么你就需要先让编译器知道这个函数的基本情况。这个时候我们会先把函数的定义写在前面。

我们可以看到下面我们定义了这个系统的功能。每个功能我们都会写一个函数。其实不写这些函数,把所有的功能写在 main 函数内部也是可以的。但是这样会在维护上存在问题。进行测试也会变得困难。

int add(Student student, Student Students[]);
int del(int id, Student students[]);
int display(Student students[]);
int update(int id, Student students[]);
int search(char name[], Student students[]);

这里定义了一些需要使用的变量。stop 变量是用来控制程序循环的,也就是控制程序在什么时候可以结束循环的。我们定义了一个 Student 的数组,用来存储学生的信息。用一个单独的变量来存储单条的学生信息。

int id = -1;
char name[NameLength];
int choice = 0;
int stop = 0;
Student students[StudentNumbers];
Student student;

这里我们通过循环来初始化我们的数组。

for (int i = 0; i < StudentNumbers; i++)
{
    students[i].id = i;
    students[i].flag = 0;
}

循环语句如果在不改变条件的情况下会一直循环。确保我们的系统可以一直运行。

while (stop == 0)

在接收到输入后。我们就会通过 switch 来进行相应的匹配。完成对应的操作。这比使用大量的 if 语句简约了很多。

switch (choice)

在子程序中,也就是实现增、删、改、查这些功能程序中。我们用了循环语句来访问数组中的元素。同时,利用了判断语句与特定的变量,来判断该位置是否存有学生信息。

运行结果:

utopia@DESKTOP:~$ ./test
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:1
请输入学生姓名:张三
请输入学生的年龄:22
请输入学生成绩:100
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:1
请输入学生姓名:李四
请输入学生的年龄:21
请输入学生成绩:90
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:1
请输入学生姓名:王二
请输入学生的年龄:23
请输入学生成绩:99
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:5
******************
学生列表
******************
学生编号:0,学生姓名:张三,年龄:22,成绩:100
学生编号:1,学生姓名:李四,年龄:21,成绩:90
学生编号:2,学生姓名:王二,年龄:23,成绩:99
******************
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:2
请输入要修改成绩的学生编号:1
请输入新的成绩:80
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:5
******************
学生列表
******************
学生编号:0,学生姓名:张三,年龄:22,成绩:100
学生编号:1,学生姓名:李四,年龄:21,成绩:80
学生编号:2,学生姓名:王二,年龄:23,成绩:99
******************
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:4
请输入要删除的学生编号:1
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:5
******************
学生列表
******************
学生编号:0,学生姓名:张三,年龄:22,成绩:100
学生编号:2,学生姓名:王二,年龄:23,成绩:99
******************
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:1
请输入学生姓名:张五
请输入学生的年龄:20
请输入学生成绩:70
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:5
******************
学生列表
******************
学生编号:0,学生姓名:张三,年龄:22,成绩:100
学生编号:1,学生姓名:张五,年龄:20,成绩:70
学生编号:2,学生姓名:王二,年龄:23,成绩:99
******************
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:3
请输入要查找的学生姓名:张五
学生编号: 1,学生姓名: 张五,年龄: 20,成绩: 70
-------------------------
*      学生管理系统      *
-------------------------
1 添加
2 修改成绩
3 查询
4 删除
5 显示学生列表
0 退出程序
请直接输入数字选项:

在程序中,我们首先添加了 3 条学生的记录。然后我们进行了列表显示。接着,我们尝试修改了其中一个学生成绩,并再次查看列表,发现成绩修改生效了。然后,我们删除了一个学生,列表显示结果其已经被删除了。然后我们又尝试添加了一个学生。列表显示结果添加成功。最后我们按照姓名查找了一个学生。

4. 小结

在这里,我们完成了一个接近实际可用的系统。当然作为一个可以使用的系统,我们还会设计到数据输入时合法性的校验,以及数据持久化的存储等等一系列的问题需要考虑。

同时在一个系统规模变大以后,其存储的结构和方式会影响到数据的操作效率,最直观的就是完成一次操作所需要的时间会发生较大甚至巨大的变化。这个时候,通过改善数据结构与算法会起到非常重大的作用。但是切记实现功能在很多时候时一个系统的第一要务,而优化系统则是在你实现一个系统以后在做的事情。

学习没有终点,人生短暂而漫长。需要你不断的通过学习来找寻乐趣。不然这短暂的人生稍纵即逝,这漫长的人生会让你苦闷不堪。所以闲来没事,用多种方式多学习一点。


欢迎关注「慕课网」帐号,我们会一直坚持内容原创,提供IT圈优质内容,分享干货知识,大家一起共同成长吧!

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

标签:管理系统,int,学生,students,实操,Student,printf,C语言,-------------------------
From: https://blog.51cto.com/u_15771948/6212623

相关文章

  • C语言基础知识(不想写笔记啦,就把它打出来)
    scanf()函数的使用:操作系统接收数据时其实都是当作字符来接收的。scanf()函数的两种用法:用法一:scanf("输入控制符",输入参数);功能:将从键盘输入的字符转化成输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。用法二:scanf("非输入控制符输入控制符"......
  • 【C语言】基础知识
    整型数据浮点化:9*(x-32)/5.0部分库函数:乘方:doublepow(doublebase,doubleexponent) 开方:double sqrt(double x)pow(a,1.0/x)=a^(1.0/x) 就是a开x次方 格式化输出:%m.nlf 双精度浮点型输出,字符宽度m,小数点后保留n位。输出位数大于m时按原数据输出。位数不足时前面......
  • 学习十大排序算法(1)——选择排序【实现方法c语言】
    十大排序算法第一节——选择排序复制代码直接滑到最后!!!选择排序就是找到(最大或者)最小元素,放到最开始的位置,然后就是在没有排序的序列中找到最小的排在已经排好的序列之后,直至没有排数列排完。(自己的理解)大概解释代码其中的细节:第6行中的sizeof的用法是求出括号里面......
  • 【云原生】夜莺系统的可观测性实操 - 1
    【云原生】夜莺系统的可观测性实操-1前言笔者已经在公有云上搭建了一套临时环境,可以先登录体验下:http://124.222.45.207:17000/login账号:root/root.2020指标监控记录规则记录规则(RecordRule)实现基于现有指标数据计算出新指标数据,通过定时周期(interval)执行计算规则,形成新的指标......
  • C语言:求正整数的所有质数因子(如:180:2 2 3 3 5)
    #include<stdio.h>#求正整数的所有质数因子(如:180:22335)main(){intm,i;scanf("%d",&m);for(i=2;i<=m;i++){if(m%i==0){printf("%3d",i);m=m/i;......
  • 编程打卡:C语言趣味编程习题做
    编程打卡:C语言趣味编程习题做求车速问题描述已知一个对称数里程数,2小时之后它又变成了一个对称数,求速度。设计思路很明显看出来95859的下一个对称数是95959,再下一个对称数是96069,不,还是每次增加,然后再判断对称数吧。流程图graphA[开始]-->B[i=95859+1]-->C[i++]-->D{i......
  • linux环境C语言实现:h264与pcm封装成mp4视频格式
    前言H.264是压缩过的数据,PCM是原始数据,MP4是一种视频封装格式。实际H.264与PCM不能直接合成MP4格式,因为音频格式不对。这里需要中间对音频做一次压缩处理。基本流程为:将PCM音频数据压缩成AAC格式音频数据,再将AAC与H.264合成MP4视频格式。(一)PCM压缩为AAC格式直接上代码,接口函数......
  • linux环境C语言实现:h264与pcm封装成AVI格式
    ​前言拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题。RIFF和AVI以及WAV格式,可以参考前面的一些文章。这里详细介绍将一个H264视频流和一个2通道PCM音频流封装成一个AVI格式的视频文件。测试过可以在暴风,迅雷和VLC播放器上......
  • linux环境C语言实现:h265与pcm封装成AVI格式
    ​前言不知道是处于版权收费问题还是什么原因,H265现在也并没有非常广泛的被普及。将h265数据合成AVI的资料现在在网上也基本上没有。使用格式化工厂工具将h265数据封装成AVI格式,发现它在封装的时候其实是对数据进行了一个装换,转成了FMP4格式。正文因为是在嵌入式设备中使用,所......
  • 4/20 C语言判断字符串是否为回文,字符串中可以包含中文和英文
    //已知中文字符占用两个字节#include<stdio.h>#include<string.h>booljudge(char*a,int&i,int&k);intmain(){inti,k;chara[100];while(scanf("%s",a)!=EOF){i=0;k=strlen(a)-1;while......