C语言实现学生管理系统(顺序表版)

news/2024/11/28 9:24:12/

前言

涉及知识


使用语言:C语言


数据结构类型:顺序表

内容导图

在这里插入图片描述

效果展示

在这里插入图片描述

内容目录

  • 前言
    • 涉及知识
    • 内容导图
    • 效果展示
  • 静态管理系统
    • 菜单的实现
    • 选择功能实现
    • 静态开辟空间
    • 实现增删功能
      • 增加功能实现
      • 删除功能实现
    • 实现查找功能
    • 实现修改功能
    • 实现排序功能
  • 动态管理系统
    • 动态开辟空间
    • 动态的初始化
    • 动态扩容函数
    • 动态增加函数
  • 总代码汇总
    • 静态管理系统汇总
      • 头文件:student.h
      • 函数实现:student.c
      • 功能实现:test.c
    • 动态管理系统汇总
      • 头文件:student.h
      • 函数实现:stduent2.c
      • 功能的实现:test.c

静态管理系统

菜单的实现

完成一个小项目,我们首先要明确它有那些功能,并且我们需要告诉明确的告诉用户这些功能。而菜单恰恰能够实现和用户的交互。但是,如果我们把菜单直接写在main函数里面就会显得非常的臃肿,所以我们可以把菜单封装成一个函数

void menu()
{printf("********************************\n");printf("*******欢迎进入学生管理系统*****\n");printf("*********0.退出管理系统*********\n");printf("*********1.增加学生信息*********\n");printf("*********2.删除学生信息*********\n");printf("*********3.查找学生信息*********\n");printf("*********4.修改学生信息*********\n");printf("*********5.打印学生信息*********\n");printf("********************************\n");
}

选择功能实现

有了菜单还不够,我们需要让菜单的每一个选项都有对应的功能。
因为每个功能都还没用函数进行实现,所以我们可以先用其他东西代替测试。比如我需要添加一个学生的信息,因为我还没开始实现我的增加学生这个函数,我们可以先打印一句话来确定。选择功能的这个函数有没有出问题。
写完选择功能,我们可以把他和菜单函数一起放在main函数中测试一下。

int main()
{int input=0;do{menu();printf("请选择功能:");scanf("%d", &input);switch (input){case 1:printf("增加\n"); break;case 2:printf("删除\n"); break;case 3:printf("查找\n"); break;case 4:printf("修改\n"); break;case 5:printf("排序\n"); break;case 6:printf("打印\n"); break;default:printf("选项输入有误!\n"); break;}} while (input);return 0;
}

在这里插入图片描述


测试正常,选择功能并没有出错,所以我们接下来需要分类实现一个个实现对应功能的函数。

静态开辟空间

每一位学生都有很多信息,所以符合结构体的特性。我们可以定义一个结构体类型。

typedef struct StudentInfo
{char name[NAME];//姓名char sex[SEX];//性别int id;//学号int age;//年纪int score;//分数
}Student;

接下来,继续开辟一个结构体,里面还要存放上面的结构体的数组

//静态开辟100个数组
#define MAX 100
typedef struct ClassInfo
{Student data[MAX];size_t size;
}Class;

实现增删功能

增加功能实现

静态开辟空间的最大缺陷就是内存有限,不能随需而增加。
所以我们在是实现该增加函数的时候,必须要先判断他的内存是不是已经满了。

void ClassAdd(Class* psl)
{assert(psl);if (psl->size == MAX){printf("该学生管理系统内存已满,请清理!\n");return;}printf("请输入学生姓名:");scanf("%s", &psl->data[psl->size].name);printf("请输入学生性别:");scanf("%s", &psl->data[psl->size].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[psl->size].age);printf("请输入学生分数:");scanf("%d", &psl->data[psl->size].score);printf("请输入学生学号:");scanf("%d", &psl->data[psl->size].id);psl->size++;printf("添加信息成功!\n");
}

删除功能实现

想删除一个数,那就必须得先找到这个数,找到某个数所在的位置,这个需求,在其他的功能的实现中也是被需要的。所以我们可以把它封装为一个函数,便于实现其他功能的时候可以使用。
我们使用循环,遍历数组中的所有内容。找到了就返回下标,找不到就返回-1

int Find_name(Class* psl, char name[])
{int i = 0;for (i = 0; i < psl->size; i++){if (0 == strcmp(psl->data[i].name, name)){return i;}}return -1;
}

有了查找位置的功能,再去实现删除函数就显得容易很多了。
当然,值得注意的是,顺序表要保证数据的连续性,你删除某个数,并不是删除它所在位置的空间,而是用后面的数来覆盖掉它,并且删除掉最后面的一个空间。以此来保证数据的连续性。

void ClassDel(Class* psl)
{assert(psl);char name[NAME];printf("请输入你要删除学生的姓名:");scanf("%s", &name);int ret = Find_name(psl, name);if (-1 == ret)printf("你输入的学生不存在!\n");else{for (int i = ret; i < psl->size - 1; i++){psl->data[i] = psl->data[i + 1];}psl->size--;printf("成功删除指定联系人\n");}
}

实现查找功能

这个功能就用到了上面我们实现的查找位置函数了。我们只要查找到需要被查找到的数的位置,并打印该位置的数,就可以了。

void ClassSearch(Class* psl)
{assert(psl);char name[NAME];printf("请输入你要查找的学生的姓名:");scanf("%s", &name);int ret = Find_name(psl, name);if (-1 == ret)printf("你要查找的学生不存在!\n");else{printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[ret].name,psl->data[ret].sex,psl->data[ret].age,psl->data[ret].id,psl->data[ret].score);}
}

实现修改功能

和查找功能一样,想修改一个数,我们必须要找到这个数的。

void ClassModi(Class* psl)
{printf("请输入要修改人的名字:>");char name[NAME];scanf("%s", name);int ret = Find_name(psl, name);if (ret == -1)printf("要修改的人不存在\n");else{printf("请输入学生姓名:");scanf("%s", &psl->data[ret].name);printf("请输入学生性别:");scanf("%s", &psl->data[ret].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[ret].age);printf("请输入学生分数:");scanf("%d", &psl->data[ret].score);printf("请输入学生学号:");scanf("%d", &psl->data[ret].id);printf("修改成功\n");}
}

实现排序功能

实现排序的方法有很多,这里我使用的是大家最常用的冒泡排序法。
我这里以分数作为的排序标准。
感兴趣的也可以以学号或者年纪作为排序标准。

void Score_sqrt(Class* psl)
{Student tmp;for (int i = 0; i < psl->size; i++){for (int j = 0; j < psl->size; j++){if (psl->data[j].score < psl->data[j + 1].score){tmp = psl->data[j];psl->data[j] = psl->data[j + 1];psl->data[j + 1] = tmp;}}}printf("排序完成!\n");
}

动态管理系统

动态开辟空间

静态的管理系统最大的缺点就是不能自主的扩容,很麻烦。
所以这里我们可以使用动态的顺序表来修改开辟空间的这一个过程。
当然其他功能还都可以用上述的函数实现,最后面我们会汇总代码。

typedef struct ClassInof
{Student *data;size_t size; //现有数据size_t capacity;//最大容量
}Class;

动态的初始化

void ClassInit(Class* psl)
{assert(psl);//断言防止其为空指针psl->data = NULL;//讲该指针置空psl->size = 0;//设置有效数据个数为0psl->capacity = 0;//设置空间容量为0
}

动态扩容函数

我们可以通过realloc函数根据我们需要多少空间来进行动态开辟。

void ClassAddcapacity(Class* psl)
{assert(psl);if (psl->size == psl->capacity){int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;Student* tmp = (Student*)realloc(psl->data, newCapacity * sizeof(Student));if (tmp == NULL){perror("realloc fail");exit(-1);}psl->data = tmp;psl->capacity = newCapacity;}
}

动态增加函数

这个增加数据的函数,就是和静态管理系统的其他功能唯一不一样的地方了。
其他的功能的实现和静态版本的一模一样,无需修改。

void ClassAdd(Class* psl)
{assert(psl);ClassAddcapacity( psl);printf("请输入学生姓名:");scanf("%s", &psl->data[psl->size].name);printf("请输入学生性别:");scanf("%s", &psl->data[psl->size].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[psl->size].age);printf("请输入学生分数:");scanf("%d", &psl->data[psl->size].score);printf("请输入学生学号:");scanf("%d", &psl->data[psl->size].id);psl->size++;printf("添加信息成功!\n");
}

总代码汇总

静态管理系统汇总

头文件:student.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define NAME 50
#define SEX 100
#define MAX 100
//学生信息结构
typedef struct StudentInfo
{char name[NAME];//姓名char sex[SEX];//性别int id;//学号int age;//年纪int score;//分数
}Student;
//静态开辟的数组
typedef struct ClassInfo
{Student data[MAX];size_t size;
}Class;
//菜单函数的声明
void menu();
//初始化函数的声明
void ClassInit(Class* psl);
//增加函数的声明
void ClassAdd(Class* psl);
//打印函数的声明
void ClassPrint(Class* psl);
//删除函数的声明
void ClassDel(Class* psl);
//查找函数的声明
void ClassSearch(Class* psl);
//修改函数的声明
void ClassModi(Class* psl);
//排序函数的声明
void Score_sqrt(Class* psl);

函数实现:student.c

#include"Student.h"
void menu()
{printf("********************************\n");printf("*******欢迎进入学生管理系统*****\n");printf("*********0.退出管理系统*********\n");printf("*********1.增加学生信息*********\n");printf("*********2.删除学生信息*********\n");printf("*********3.查找学生信息*********\n");printf("*********4.修改学生信息*********\n");printf("*********5.成绩排序信息*********\n");printf("*********6.打印学生信息*********\n");printf("********************************\n");
}
//静态初始化
void ClassInit(Class* psl)
{assert(psl);psl->size = 0;memset(psl->data, 0, MAX * sizeof(Student));
}
//增加函数的实现
void ClassAdd(Class* psl)
{assert(psl);if (psl->size == MAX){printf("该学生管理系统内存已满,请清理!\n");return;}printf("请输入学生姓名:");scanf("%s", &psl->data[psl->size].name);printf("请输入学生性别:");scanf("%s", &psl->data[psl->size].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[psl->size].age);printf("请输入学生分数:");scanf("%d", &psl->data[psl->size].score);printf("请输入学生学号:");scanf("%d", &psl->data[psl->size].id);psl->size++;printf("添加信息成功!\n");
}
//打印函数的实现
void ClassPrint(Class* psl)
{int i = 0;printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");for (i = 0; i < psl->size; i++){printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[i].name,psl->data[i].sex,psl->data[i].age,psl->data[i].id,psl->data[i].score);}
}
//查找位置的函数
int Find_name(Class* psl, char name[])
{int i = 0;for (i = 0; i < psl->size; i++){if (0 == strcmp(psl->data[i].name, name)){return i;}}return -1;
}
//删除函数的实现
void ClassDel(Class* psl)
{assert(psl);char name[NAME];printf("请输入你要删除学生的姓名:");scanf("%s", &name);int ret = Find_name(psl, name);if (-1 == ret)printf("你输入的学生不存在!\n");else{for (int i = ret; i < psl->size - 1; i++){psl->data[i] = psl->data[i + 1];}psl->size--;printf("成功删除指定联系人\n");}
}
//查找学生函数的实现
void ClassSearch(Class* psl)
{assert(psl);char name[NAME];printf("请输入你要查找的学生的姓名:");scanf("%s", &name);int ret = Find_name(psl, name);if (-1 == ret)printf("你要查找的学生不存在!\n");else{printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[ret].name,psl->data[ret].sex,psl->data[ret].age,psl->data[ret].id,psl->data[ret].score);}
}
//修改函数的实现
void ClassModi(Class* psl)
{printf("请输入要修改人的名字:>");char name[NAME];scanf("%s", name);int ret = Find_name(psl, name);if (ret == -1)printf("要修改的人不存在\n");else{printf("请输入学生姓名:");scanf("%s", &psl->data[ret].name);printf("请输入学生性别:");scanf("%s", &psl->data[ret].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[ret].age);printf("请输入学生分数:");scanf("%d", &psl->data[ret].score);printf("请输入学生学号:");scanf("%d", &psl->data[ret].id);printf("修改成功\n");}
}
//排序函数的实现(冒泡)
void Score_sqrt(Class* psl)
{Student tmp;for (int i = 0; i < psl->size; i++){for (int j = 0; j < psl->size; j++){if (psl->data[j].score < psl->data[j + 1].score){tmp = psl->data[j];psl->data[j] = psl->data[j + 1];psl->data[j + 1] = tmp;}}}printf("排序完成!\n");
}

功能实现:test.c

#include"Student.h"
int main()
{int input=0;Class class;ClassInit(&class);do{menu();printf("请选择功能:");scanf("%d", &input);switch (input){case 1:ClassAdd(&class); break;case 2:ClassDel(&class); break;case 3:ClassSearch(&class); break;case 4:ClassModi(&class); break;case 5:Score_sqrt(&class); break;case 6:ClassPrint(&class); break;default:printf("选项输入有误!\n"); break;}} while (input);return 0;
}

动态管理系统汇总

头文件:student.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define NAME 100
#define SEX 50
//学生基本信息
typedef struct StudentInof
{char name[NAME];//姓名char sex[SEX];//性别int id;//学号int age;//年纪int score;//分数
}Student;
//动态顺序表
typedef struct ClassInof
{Student *data;size_t size; //现有数据size_t capacity;//最大容量
}Class;void menu();
//初始化函数的声明
void ClassInit(Class* psl);
//增加容量声明
void ClassAddcapacity(Class* psl);
//增加函数的声明
void ClassAdd(Class* psl);
//打印函数的声明
void ClassPrint(Class* psl);
//删除函数的声明
void ClassDel(Class* psl);
//查找函数的声明
void ClassSearch(Class* psl);
//修改函数的声明
void ClassModi(Class* psl);
//排序函数的声明
void Score_sqrt(Class* psl);

函数实现:stduent2.c

#include"student.h"
//菜单的定义
void menu()
{printf("********************************\n");printf("*******欢迎进入学生管理系统*****\n");printf("*********0.退出管理系统*********\n");printf("*********1.增加学生信息*********\n");printf("*********2.删除学生信息*********\n");printf("*********3.查找学生信息*********\n");printf("*********4.修改学生信息*********\n");printf("*********5.成绩排序信息*********\n");printf("*********6.打印学生信息*********\n");printf("********************************\n");
}
//动态初始化
void ClassInit(Class* psl)
{assert(psl);//断言防止其为空指针psl->data = NULL;//讲该指针置空psl->size = 0;//设置有效数据个数为0psl->capacity = 0;//设置空间容量为0
}
//动态扩容
void ClassAddcapacity(Class* psl)
{assert(psl);if (psl->size == psl->capacity){int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;Student* tmp = (Student*)realloc(psl->data, newCapacity * sizeof(Student));if (tmp == NULL){perror("realloc fail");exit(-1);}psl->data = tmp;psl->capacity = newCapacity;}
}
//增加数据函数定义
void ClassAdd(Class* psl)
{assert(psl);ClassAddcapacity( psl);printf("请输入学生姓名:");scanf("%s", &psl->data[psl->size].name);printf("请输入学生性别:");scanf("%s", &psl->data[psl->size].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[psl->size].age);printf("请输入学生分数:");scanf("%d", &psl->data[psl->size].score);printf("请输入学生学号:");scanf("%d", &psl->data[psl->size].id);psl->size++;printf("添加信息成功!\n");
}
//打印函数的定义
void ClassPrint(Class* psl)
{int i = 0;printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");for (i = 0; i < psl->size; i++){printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[i].name,psl->data[i].sex,psl->data[i].age,psl->data[i].id,psl->data[i].score);}
}
//查找位置的函数
int Find_name(Class* psl, char name[])
{int i = 0;for (i = 0; i < psl->size; i++){if (0 == strcmp(psl->data[i].name, name)){return i;}}return -1;
}
//删除函数的实现
void ClassDel(Class* psl)
{assert(psl);char name[NAME];printf("请输入你要删除学生的姓名:");scanf("%s", &name);int ret = Find_name(psl, name);if (-1 == ret)printf("你输入的学生不存在!\n");else{for (int i = ret; i < psl->size - 1; i++){psl->data[i] = psl->data[i + 1];}psl->size--;printf("成功删除指定联系人\n");}
}
//查找学生函数的实现
void ClassSearch(Class* psl)
{assert(psl);char name[NAME];printf("请输入你要查找的学生的姓名:");scanf("%s", &name);int ret = Find_name(psl, name);if (-1 == ret)printf("你要查找的学生不存在!\n");else{printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[ret].name,psl->data[ret].sex,psl->data[ret].age,psl->data[ret].id,psl->data[ret].score);}
}
//修改函数的实现
void ClassModi(Class* psl)
{printf("请输入要修改人的名字:>");char name[NAME];scanf("%s", name);int ret = Find_name(psl, name);if (ret == -1)printf("要修改的人不存在\n");else{printf("请输入学生姓名:");scanf("%s", &psl->data[ret].name);printf("请输入学生性别:");scanf("%s", &psl->data[ret].sex);printf("请输入学生年纪:");scanf("%d", &psl->data[ret].age);printf("请输入学生分数:");scanf("%d", &psl->data[ret].score);printf("请输入学生学号:");scanf("%d", &psl->data[ret].id);printf("修改成功\n");}
}
//排序函数的实现(冒泡)
void Score_sqrt(Class* psl)
{Student tmp;for (int i = 0; i < psl->size; i++){for (int j = 0; j < psl->size; j++){if (psl->data[j].score < psl->data[j + 1].score){tmp = psl->data[j];psl->data[j] = psl->data[j + 1];psl->data[j + 1] = tmp;}}}printf("排序完成!\n");
}

功能的实现:test.c

#include"student.h"
int main()
{int input = 0;Class class;ClassInit(&class);do{menu();printf("请选择功能:");scanf("%d", &input);switch (input){case 1:ClassAdd(&class); break;case 2:ClassDel(&class); break;case 3:ClassSearch(&class); break;case 4:ClassModi(&class); break;case 5:Score_sqrt(&class); break;case 6:ClassPrint(&class); break;default:printf("选项输入有误!\n"); break;}} while (input);return 0;
}

http://www.ppmy.cn/news/1684.html

相关文章

dirty make clean

仅仅是清除之前编译的可执行文件及配置文件 make clean清除所有生成的文件 make dist-clean编译 make clean all

安装mongodb6

一、安装mongodb6.0.2 1.官网下载社区版 https://www.mongodb.com/ 2.双击下载的文件&#xff0c;按步骤安装 选择custom 自定义安装 改一下安装地址&#xff0c;路径最好不要带空格 Install MongoD as a Service 作为服务方式安装 Run the service as Network Service…

[附源码]计算机毕业设计人体健康管理appSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

毕业设计 大数据电商用户行为分析 -python 大数据

文章目录0 前言一.背景描述二.项目背景三.数据来源四.提出问题五.理解数据六.数据清洗6.1缺失值处理6.2查看数据6.3一致化处理6.4查看data_user数据集数据类型&#xff1a;6.5数据类型转换6.6异常值处理七.用户行为分析7.1日访问量分析7.2小时访问量分析7.3不同行为类型用户PV分…

HummerRisk 入门3:开发手册

本文是 HummerRisk 的开发手册&#xff0c;介绍项目的结构及如何配置 HummerRisk 的开发环境和开发中的注意事项&#xff0c;快速参与到 HummerRisk 项目的开发中来。 一、项目结构 二、配置开发环境 1、环境准备 后端 HummerRisk 后端使用了 Java 语言的 Spring Boot 框架…

vue2.x与vue3.x中自定义指令详解

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

(41)Verilog实现递归功能

(41)Verilog实现递归功能 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog实现递归功能 5)结语 1.2 FPGA简介 FPGA(Field Programmable Gate Array)是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定…

supOS APP开发者课程练习册

4、在功能集合下创建“时间转换”&#xff0c;别名“DateFormat”&#xff0c;在该功能集合中创建服务&#xff0c;信息如下&#xff1a; 服务名称&#xff1a;功能集合&#xff1a;日期格式转换 服务别名&#xff1a;DateFormat 服务参数&#xff1a;dt(类型&#xff1a;STR…