服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c语言实现学生管理系统详解

c语言实现学生管理系统详解

2022-07-20 12:15如风暖阳 C/C++

这篇文章主要为大家介绍了c语言实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

?
1
2
3
4
    该学生管理系统的实现是通过分文件的方式来写的,infor.h
文件为头文件,源文件infor.c实现源文件test.c中封装函数,建议
读者在做较大的系统是分文件来实现,可以提高代码的运行效率。
(该学生管理系统由b站鹏哥c语言通讯录视频改进而来)

infor.h

//头文件 实现引用函数头文件,定义常量,以及源文件中封装函数的声明

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define  _CRT_SECURE_NO_WARNINGS   1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <windows.h>
#define MAX_NAME 20               //都用define定义 为了后期的可改性
#define MAX_SEX 10
#define MAX_TELE 15
#define MAX_ADDR 30  
#define begin 3                 //初始开辟动态内存容量
#define add 2                   //每次容满后增容数量
//#define MAX 1000
typedef struct Student           //定义学生信息结构体变量
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    int age;
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}Student;
//typedef struct student          //结构体套结构体
//{
//  Student data[MAX];          //存放添加进来的个人信息
//  int sz;                     //记录当前系统中有效信息个数
//}student;
typedef struct student          //结构体嵌套结构体 
{
    Student*data;           //指向动态申请空间,用来存放个人信息
    int sz;                 //记录当前系统中有效信息个数
    int capacity;           //记录当前通讯录最大容量
}student;
void Initstudent(student*pc);//初始化结构体
void ADDstudent(student* pc);//增加学生信息
void PRINTstudent(student* pc);//浏览学生信息
void SEARCHstudent(student* pc);//查找学生信息
void MODIFYstudent(student* pc);//修改学生信息
void DELETEstudent(student* pc);//删除学生信息
void DESETORYstudent(student* pc);//销毁学生信息

test.c

//主文件的测试 该文件为实现学生管理系统的核心

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#define  _CRT_SECURE_NO_WARNINGS   1
#include"infor.h"                     //注意分文件写时  源文件中都需要引用头文件
void menu()
{
    system("color fc");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("        ***********郑州轻工业大学学生信息管理系统************\n");
    printf("        *-------0.退出                 1.增加学生信息-------*\n");
    printf("        *-------2.浏览学生信息         3.查找学生信息-------*\n");
    printf("        *-------4.修改学生信息         5.删除学生信息-------*\n");
    printf("        *****************************************************\n");
    printf("\n");
    printf("\n");
    printf("\n");
}
enum option
{                         //通过枚举常量,使得主函数中的switch语句更明了的实现不同的功能
    EXIT,
    ADD,
    PRINT,
    SEARCH,
    MODIFY,
    Delete
};
int main()
{
    int input = 0;
    student stu;
    Initstudent(&stu);          //结构体数组的初始化
    do
    {
        menu();
        printf("请选择:>\n");
        scanf("%d", &input);
        switch(input)                   //封装多个函数实现多个功能
        {                       //函数的声明位于头文件中,实现在infor.c中实现
        case EXIT:
            DESETORYstudent(&stu);
            printf("退出系统\n");
            break;
        case ADD:
            ADDstudent(&stu);
            break;
        case PRINT:
            PRINTstudent(&stu);
            break;
        case SEARCH:
            SEARCHstudent(&stu);
            break;
        case MODIFY:
            MODIFYstudent(&stu);
            break;
        case Delete:
            DELETEstudent(&stu);
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    } while (input);
    return 0;
}

infor.c

//该文件为test.c中封装函数的实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#define  _CRT_SECURE_NO_WARNINGS   1
#include"infor.h"
//静态
//void Initstudent(student* pc)
//{
//  pc->sz = 0;
//  memset(pc->data, 0, sizeof(pc->data));//memset()内存设置 使整个结构体数组初始化
//}
//动态
void Initstudent(student* pc)
{
    //指针data维护开辟的动态内存空间 calloc初始化开辟空间
    pc->data = (Student*)calloc(begin,sizeof(Student));  
    pc->sz = 0;                          //sz为有效信息个数         
    pc->capacity = begin;                //定义目前容量为初始容量
}
void ADDstudent(student* pc)
{
    if (pc->sz == pc->capacity)  //容量满了完成增容
    {
        Student* ptr = (Student*)realloc(pc->data, (pc->capacity + add)*sizeof(Student));
        if (ptr != NULL)
        {
            pc->data = ptr;
            pc->capacity += add;
            printf("~~~增容成功~~~\n");
        }
        else
        {
            perror("ADDstudent");//失败报错
            printf("增加联系人失败\n");
            return;
        }
    }
    //增加一个人的信息
    printf("请输入姓名:\n");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入性别:\n");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入年龄:\n");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请输入电话:\n");
    scanf("%s", pc->data[pc->sz].tele);
    printf("请输入地址:\n");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("增加成功\n");
}
void DESETORYstudent(student* pc)   //销毁个人信息
{
    free(pc->data);                  //释放内存
    pc->data = NULL;             //回归为0
    pc->capacity = 0;
    pc->sz = 0;
}
//void ADDstudent(student* pc)
//{
//  if (pc->sz == MAX)
//  {
//      printf("通讯录已满,无法添加\n");
//      return;
//  }
//  //增加一个人的信息
//  printf("请输入姓名:\n");
//  scanf("%s", pc->data[pc->sz].name);
//  printf("请输入性别:\n");
//  scanf("%s", pc->data[pc->sz].sex);
//  printf("请输入年龄:\n");
//  scanf("%d", &(pc->data[pc->sz].age));
//  printf("请输入电话:\n");
//  scanf("%s", pc->data[pc->sz].tele);
//  printf("请输入地址:\n");
//  scanf("%s", pc->data[pc->sz].addr);
//  pc->sz++;
//  printf("增加成功\n");
//}
void PRINTstudent(student* pc)
{
    int i = 0;
    printf("%-10s%-10s%-10s%-15s%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s%-10s%-10d%-15s%-30s\n",
            pc->data[i].name,
            pc->data[i].sex,
            pc->data[i].age,
            pc->data[i].tele,
            pc->data[i].addr
        );
    }
}
static int Findbyname(student* pc, char name[])         //通过名字来查找学生   stadic静态局部变量  该函数只在本文件中应用  保护该函数
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)     //利用strcmp函数的返回值判断是否找到了该人
        {
            return i;                               //找到了就返回学生信息的角标
        }
    }
    return -1;                                      //没找到
}
void SEARCHstudent(student* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要查找学生姓名:\n");
    scanf("%s", name);
    int end = Findbyname(pc, name);
    if (end == -1)
    {
        printf("你所要查找的人不存在");
    }
    else
    {
        printf("%-10s%-10s%-10s%-15s%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
        printf("%-10s%-10s%-10d%-15s%-30s\n",           //Findbuname函数如果找到对应学生,返回对应下标,输出对应下标学生信息
            pc->data[end].name,
            pc->data[end].sex,
            pc->data[end].age,
            pc->data[end].tele,
            pc->data[end].addr
        );
    }
}
void MODIFYstudent(student* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要修改学生信息的学生姓名:\n");
    scanf("%s", name);
    int end = Findbyname(pc, name);
    if (end == -1)
    {
        printf("你所要修改学生信息的人不存在");
    }
    else
    {
        printf("请输入性别:\n");
        scanf("%s", pc->data[end].sex);
        printf("请输入年龄:\n");
        scanf("%d", &(pc->data[end].age));
        printf("请输入电话:\n");
        scanf("%s", pc->data[end].tele);
        printf("请输入地址:\n");
        scanf("%s", pc->data[end].addr);
        printf("修改成功\n");
    }
}
void DELETEstudent(student* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要删除学生信息的学生姓名:\n");
    scanf("%s", name);
    int end = Findbyname(pc, name);
    if (end == -1)
    {
        printf("你所要删除学生信息的人不存在");
    }
    int i = 0;
    for (i = end; i < pc->sz - 1; i++)
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功");
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/qq_60856948/article/details/121969295

延伸 · 阅读

精彩推荐
  • C/C++Linux 软件看门狗 watchdog使用介绍

    Linux 软件看门狗 watchdog使用介绍

    这篇文章主要介绍了Linux 软件看门狗 watchdog使用介绍,需要的朋友可以参考下...

    Liigo10142021-04-18
  • C/C++c++中堆栈及创建对象示例代码

    c++中堆栈及创建对象示例代码

    这篇文章主要给大家详细介绍了c++如何实现堆栈及创建对象,文中先进行了简单的介绍,而后给出了详细的示例代码及注释,相信对大家的理解和学习很有...

    daisy7302021-04-21
  • C/C++C语言实现简单图书管理系统

    C语言实现简单图书管理系统

    这篇文章主要为大家详细介绍了C语言实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    zhangyucha05332021-06-15
  • C/C++C/C++获取目录下的文件列表信息

    C/C++获取目录下的文件列表信息

    在C/C++编程时,需要获取目录下面的文件列表信息,下面把代码分享一下...

    C语言程序设计11092021-01-15
  • C/C++C++ 非递归实现二叉树的前中后序遍历

    C++ 非递归实现二叉树的前中后序遍历

    本文将结合动画和代码演示如何通过C++ 非递归实现二叉树的前中后序的遍历,代码具有一定的价值,感兴趣的同学可以学习一下...

    2021dragon7542022-03-02
  • C/C++C语言打印某一年的日历

    C语言打印某一年的日历

    这篇文章主要为大家详细介绍了C语言打印某一年的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    带着你的名字9442021-11-15
  • C/C++C语言实现计算树的深度的方法

    C语言实现计算树的深度的方法

    这篇文章主要介绍了C语言实现计算树的深度的方法,针对数据结构中树进行操作的方法,在算法设计中比较常见,需要的朋友可以参考下...

    C语言程序设计12752021-02-02
  • C/C++C++中指针的数据类型和运算相关知识小结

    C++中指针的数据类型和运算相关知识小结

    这篇文章主要介绍了C++中指针的数据类型和运算相关知识小结,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网10392021-03-13