Day14:学生信息管理系统

用顺序表的形式制作一个学生信息管理系统

要求功能:

  1. 有自己的菜单页面

  2. 创建学生信息表

  3. 输入学生信息

  4. 按位置插入学生信息

  5. 输出任意位置范围内的学生信息

  6. 按位置删除学生信息

  7. 按位置修改学生信息

  8. 去掉重复学生信息

  9. 按名字查找学生信息位置

学生信息结构体

学生信息结构体:

        id:学号;

        name:姓名;

        age:年龄

信息表结构体:

        data:表单内学生信息;

        len:信息个数;

        size:表单大小

//学生信息结构体,id:学号;name:姓名;age:年龄
typedef struct Stu{int id;char name[20];int age;
}Stu,*PStu;
//信息表结构体,data:表单内学生信息;len:信息个数;size:表单大小
typedef struct Info{Stu *data;int len;int size;
}Info,*PInfo;

创建学生信息表

 创建,并初始化表单

        参数:num:表单大小;

        返回值p:表单地址

//创建,并初始化表单,参数:num:表单大小;返回值p:表单地址
PInfo list_create(int num) {//给表单基本信息分配空间PInfo p = (PInfo)malloc(sizeof(Info));//给表单内容分配信息p->data = (PStu) malloc(sizeof(Stu) * num);//初始化表单基础信息p->len = 0;p->size = num;//判空if(NULL == p || NULL == p->data){printf("创建失败!\n");return NULL;}printf("创建成功!\n");//返回地址return p;
}

输入学生信息

输入表单学生信息函数

        参数:info:表单地址,num:输入个数 

//输入表单学生信息函数,输入:info:表单地址,num:输入个数
void list_input(PInfo info, int num) {//判空if(NULL == info) return;//限制输入信息个数if(num > info->size){printf("数据学生数量超过表容量\n");return;}//循环插入表单内的学生信息printf("请输入学生信息:(id name age)\n");for (int i = 0; i < num; ++i) {printf("第 %d 个学生 :",i + 1);scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);info->len++;}printf("输入学生信息成功\n");
}

按位置插入学生信息

按位插入学生信息函数

        输入:info:表单地址,set:位置 

//按位插入学生信息函数,输入:info:表单地址,set:位置
void list_set_insert(PInfo info, int set) {//判空if(NULL == info) return;//判满if(info->len + 1 > info->size){printf("顺序表满了\n");return;}//限制位置范围if(set < 1 || set > info->len + 1){printf("插入位置出错\n");return;}//将set位置以后的位置循环后移一位for (int i = info->len; i >= 0; --i) {*(info->data + i) = *(info->data + i -1);//当到set位置后,插入学生信息if(i == set - 1){printf("请输入需要插入得学生信息:(id name age)\n");scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);//长度加一info->len++;break;}}printf("插入成功!\n");
}

输出任意位置范围内的学生信息

 输出任意范围的学生信息

        输入:info:表单地址,out_begin:输出起始位置,out_end:输出结束位置

//输出任意范围的学生信息,输入:info:表单地址,out_begin:输出起始位置,out_end:输出结束位置
void list_output(PInfo info, int out_begin, int out_end) {//判空if(NULL == info) return;//判空if(info->len == 0){printf("信息表为空\n");return;}//限制起始位置和结束位置顺序if(out_begin > out_end){printf("输入顺序错误!\n");return;}//限制位置范围if(out_begin < 1 || out_end > info->len){printf("输入位置超过信息表范围!\n");return;}//循环输出for (int i = out_begin - 1; i < out_end; ++i) {printf("第 %d 个学生信息为 :\nid : %d name : %s age : %d\n",i + 1 ,(info->data + i)->id,(info->data + i)->name,(info->data + i)->age);}
}

按位置删除学生信息

按位删除学生信息

        输入:info:表单地址,set:删除位置 

//按位删除学生信息,输入:info:表单地址,set:删除位置
void list_set_delete(PInfo info, int set) {//判空if(NULL == info) return;//判空if(info->len == 0) {printf("信息表为空!\n");return;}//限制位置范围if(set < 1 || set > info->len){printf("输入位置不在表单范围内!\n");return;}//将set位置后的数据前移for (int i = set - 1; i < info->len - 1; ++i) {*(info->data + i) = *(info->data + i + 1);}//减少表单长度info->len--;printf("删除成功!\n");
}

按位置修改学生信息

按位修改学生信息函数

        输入:info:表单地址,set:位置 

//按位修改学生信息函数,输入:info:表单地址,set:位置
void list_set_change(PInfo info, int set) {//判空if(NULL == info) return;//判空if(info->len == 0){printf("信息表为空!\n");return;}//限制表单范围if(set < 1 || set > info->len){printf("输入位置不在表单范围内\n");return;}//输出set位置的数据内容,方便对比printf("第 %d 个位置的信息为:\n",set);printf("id : %d name : %s age : %d\n",(info->data + set - 1)->id,(info->data + set - 1)->name,(info->data + set - 1)->age);//输入修改后的内容printf("您想修改为:\n");scanf("%d %s %d",&(info->data + set - 1)->id,(info->data + set - 1)->name,&(info->data + set - 1)->age);printf("修改成功!\n");
}

去掉重复学生信息

 去掉重复学生,

        输入:info:表单地址

//去掉重复学生,输入:info:表单地址
void list_delete_repeat(PInfo info) {//判空if(NULL == info) return;//判空if(info->len == 0){printf("信息表为空!\n");return;}//选择排序思路找到重复学生,这里按照学号寻找for (int i = 0; i < info->len; ++i) {for (int j = i + 1; j < info->len; ++j) {//当学号相等时,调用按位删除函数if((info->data + i)->id == (info->data + j)->id){list_set_delete(info,j + 1);}}}printf("去重完成!\n");
}

按名字查找学生信息位置

按名字找到学生信息位置函数:

        输入:info:表单地址,name:学生姓名;

        返回值:set+1:位置,0:空 ,-1:无此数据

//按名字找到学生信息位置函数,输入:info:表单地址,name:学生姓名;返回值:set+1:位置,0:空表,-1:表内无此学生
int list_find_set(PInfo info, char *name) {//判空if(NULL == info) return -1;//判空if(info->len == 0){printf("信息表为空!\n");return 0;}//初始化set位置int set = -1;//循环找到学生信息位置for (int i = 0; i < info->len; ++i) {if(strcmp((info->data + i)->name,name) == 0){set = i;}}//无此学生if(set == -1){printf("信息表内无此数据!\n");}return set + 1;
}

 代码总和

#include<stdio.h>
#include <malloc.h>
#include <string.h>
//学生信息结构体,id:学号;name:姓名;age:年龄
typedef struct Stu{int id;char name[20];int age;
}Stu,*PStu;
//信息表结构体,data:表单内学生信息;len:信息个数;size:表单大小
typedef struct Info{Stu *data;int len;int size;
}Info,*PInfo;PInfo list_create(int num);void list_input(PInfo info, int i);void list_set_insert(PInfo info, int set);void list_output(PInfo info, int out_begin, int out_end);void list_set_delete(PInfo info, int set);void list_set_change(PInfo info, int set);void list_delete_repeat(PInfo info);int list_find_set(PInfo info, char *name);int main(){//选择按钮int chose;//结构体指针,接收结构体PInfo info;for (;;) {//提示菜单printf("0、查看信息表基本信息\n");printf("1、创建信息表,初始化信息表内容\n");printf("2、插入学生信息\n");printf("3、按位置输出表单内容\n");printf("4、按位置插入学生信息\n");printf("5、按位置删除学生信息\n");printf("6、按位置修改学生信息\n");printf("7、去除重复的学生信息\n");printf("8、按名字查找学生信息在表单内的位置\n");printf("-1、退出\n");printf("请输入选项:");scanf("%d",&chose);if(chose == 0){//查看表长和表单容量printf("当前表长为 : %d\n当前表容量为 : %d\n",info->len,info->size);}else if(chose == 1){//创建信息表,并初始化表内容int list_size;printf("请输入信息表大小:\n");scanf("%d",&list_size);//调用创建函数info = list_create(list_size);} else if(chose == 2){//输入学生信息int num;printf("请输入学生数量:\n");scanf("%d",&num);//调用输入信息函数list_input(info, num);} else if(chose == 3){//记录输出位置起点和终点,输出信息int out_begin,out_end;printf("当前数据个数为 %d ,请输入想输出第几个到第几个位置的数据:",info->len);scanf("%d %d",&out_begin,&out_end);//调用输出函数list_output(info,out_begin,out_end);} else if(chose == 4){//按位置插入学生信息int set;printf("请输入要插入的位置:\n");scanf("%d",&set);//调用按位置输出函数list_set_insert(info,set);} else if(chose == 5){//按位置删除学生信息int set;printf("请输入要删除的位置:\n");scanf("%d",&set);list_set_delete(info,set);} else if(chose == 6){//按位置修改学生信息int set;printf("请输入要修改的位置:\n");scanf("%d",&set);list_set_change(info,set);} else if(chose == 7){//删除重复学生信息list_delete_repeat(info);} else if(chose == 8){//按名字找到学生信息找表单中的位置char name[10];printf("请输入需要查找的学生姓名:\n");scanf("%s",name);int set = list_find_set(info,name);//当返回值大于0,输出结果if(set > 0)printf("%s  在信息表内第 %d 个位置!\n",name,set);}else if(chose == -1) {//内存释放,指针指空,退出程序free(info->data);info->data = NULL;free(info);info = NULL;break;}printf("\n");}return 0;
}
//按名字找到学生信息位置函数,输入:info:表单地址,name:学生姓名;返回值:set+1:位置,0:空表,-1:表内无此学生
int list_find_set(PInfo info, char *name) {//判空if(NULL == info) return -1;//判空if(info->len == 0){printf("信息表为空!\n");return 0;}//初始化set位置int set = -1;//循环找到学生信息位置for (int i = 0; i < info->len; ++i) {if(strcmp((info->data + i)->name,name) == 0){set = i;}}//无此学生if(set == -1){printf("信息表内无此数据!\n");}return set + 1;
}
//去掉重复学生
void list_delete_repeat(PInfo info) {//判空if(NULL == info) return;//判空if(info->len == 0){printf("信息表为空!\n");return;}//选择排序思路找到重复学生,这里按照学号寻找for (int i = 0; i < info->len; ++i) {for (int j = i + 1; j < info->len; ++j) {//当学号相等时,调用按位删除函数if((info->data + i)->id == (info->data + j)->id){list_set_delete(info,j + 1);}}}printf("去重完成!\n");
}
//按位修改学生信息函数,输入:info:表单地址,set:位置
void list_set_change(PInfo info, int set) {//判空if(NULL == info) return;//判空if(info->len == 0){printf("信息表为空!\n");return;}//限制表单范围if(set < 1 || set > info->len){printf("输入位置不在表单范围内\n");return;}//输出set位置的数据内容,方便对比printf("第 %d 个位置的信息为:\n",set);printf("id : %d name : %s age : %d\n",(info->data + set - 1)->id,(info->data + set - 1)->name,(info->data + set - 1)->age);//输入修改后的内容printf("您想修改为:\n");scanf("%d %s %d",&(info->data + set - 1)->id,(info->data + set - 1)->name,&(info->data + set - 1)->age);printf("修改成功!\n");
}
//按位删除学生信息,输入:info:表单地址,set:删除位置
void list_set_delete(PInfo info, int set) {//判空if(NULL == info) return;//判空if(info->len == 0) {printf("信息表为空!\n");return;}//限制位置范围if(set < 1 || set > info->len){printf("输入位置不在表单范围内!\n");return;}//将set位置后的数据前移for (int i = set - 1; i < info->len - 1; ++i) {*(info->data + i) = *(info->data + i + 1);}//减少表单长度info->len--;printf("删除成功!\n");
}
//输出任意范围的学生信息,输入:info:表单地址,out_begin:输出起始位置,out_end:输出结束位置
void list_output(PInfo info, int out_begin, int out_end) {//判空if(NULL == info) return;//判空if(info->len == 0){printf("信息表为空\n");return;}//限制起始位置和结束位置顺序if(out_begin > out_end){printf("输入顺序错误!\n");return;}//限制位置范围if(out_begin < 1 || out_end > info->len){printf("输入位置超过信息表范围!\n");return;}//循环输出for (int i = out_begin - 1; i < out_end; ++i) {printf("第 %d 个学生信息为 :\nid : %d name : %s age : %d\n",i + 1 ,(info->data + i)->id,(info->data + i)->name,(info->data + i)->age);}
}
//按位插入学生信息函数,输入:info:表单地址,set:位置
void list_set_insert(PInfo info, int set) {//判空if(NULL == info) return;//判满if(info->len + 1 > info->size){printf("顺序表满了\n");return;}//限制位置范围if(set < 1 || set > info->len + 1){printf("插入位置出错\n");return;}//将set位置以后的位置循环后移一位for (int i = info->len; i >= 0; --i) {*(info->data + i) = *(info->data + i -1);//当到set位置后,插入学生信息if(i == set - 1){printf("请输入需要插入得学生信息:(id name age)\n");scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);//长度加一info->len++;break;}}printf("插入成功!\n");
}
//输入表单学生信息函数,输入:info:表单地址,num:输入个数
void list_input(PInfo info, int num) {//判空if(NULL == info) return;//限制输入信息个数if(num > info->size){printf("数据学生数量超过表容量\n");return;}//循环插入表单内的学生信息printf("请输入学生信息:(id name age)\n");for (int i = 0; i < num; ++i) {printf("第 %d 个学生 :",i + 1);scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);info->len++;}printf("输入学生信息成功\n");
}
//创建,并初始化表单,参数:num:表单大小;返回值p:表单地址
PInfo list_create(int num) {//给表单基本信息分配空间PInfo p = (PInfo)malloc(sizeof(Info));//给表单内容分配信息p->data = (PStu) malloc(sizeof(Stu) * num);//初始化表单基础信息p->len = 0;p->size = num;//判空if(NULL == p || NULL == p->data){printf("创建失败!\n");return NULL;}printf("创建成功!\n");//返回地址return p;
}

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

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

相关文章

【machine learning-七-线性回归之成本函数】

监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b&#xff0c;使成本函数值最小化&#xff1f; 在线性回归中&#xff0c;我们说到评估模型训练中好坏的一个方法&#xff0c;是用成本函数来衡量&#xff0c;下面来详细介绍一下 成本函数…

【Unity】对象池 - 未更新完

自定义泛型对象池 文章目录 自定义泛型对象池封装泛型类例子 使用Unity自带对象池 封装泛型类 public abstract class MyPool<T> : MonoBehaviour where T :Component {[SerializeField] protected T prefab; // 生成的预制体[SerializeField] protected int defaultNum…

.Net日志组件之NLog的使用和配置

文章目录 .Net日志组件之NLog的使用和配置1、新建.Net8控制台项目2、Nuget安装NLog组件3、添加配置文件nlog.config4、右键文件nlog.config&#xff0c;修改属性为“始终复制 or 较新则复制”5、编写nlog.config配置文件内容6、编写c#代码测试记录简单日志7、编写c#代码测试记录…

苹果CMS插件:优化蜘蛛访问内容,提升百度收录率

确保蜘蛛抓取原始内容 专为苹果CMS设计的广告管理插件&#xff0c;能够智能识别搜索引擎蜘蛛与普通访客&#xff0c;确保蜘蛛访问时展示原始内容&#xff0c;从而提升被百度等搜索引擎收录的几率。 广告显示提升收益 对于普通访客&#xff0c;该插件则优先显示广告内容&#…

【HTTP】认识 URL 和 URL encode

文章目录 认识 URLURL 基本格式**带层次的文件路径****查询字符串****片段标识符** URL encode 认识 URL 计算机中非常重要的概念&#xff0c;并不仅仅是在 HTTP 中使用。用来描述一个网络资源所处的位置&#xff0c;全称“唯一资源定位符” URI 是“唯一资源标识符“严格的说…

Java 数据类型转换详解:隐式转换(自动转换)与强制转换(手动转换)

目录 前言 取值范围从小到大的关系&#xff1a; 隐式转换&#xff08;自动转换&#xff09; &#x1f4dc;示例 1&#xff1a;基本类型隐式转换 &#x1f4dc;示例 2&#xff1a;算术运算中的类型提升 &#x1f4dc;示例 3&#xff1a;byte、short 和 char 的自动转换 隐…

排序的实现

1&#xff0c;插入排序 时间复杂度O(N) 思路&#xff1a;当插入第i个元素时&#xff0c;前面i-1个元素已经排好&#xff0c;将第i个元素与前面的元素比较&#xff0c;找到插入的位置&#xff0c;原来位置的元素向后挪。 动图展示&#xff1a; 从上图可以看出&#xff0c;先把…

CS61C 2020计算机组成原理Lab03

Exercise 1: Familiarizing yourself with Venus .data .word 2, 4, 6, 8 n: .word 9.text main: # add t0, x0, x0# addi 是 "add immediate"&#xff08;立即数加法&#xff09;的缩写&#xff0c;表示这是一个加法指令&#xff0c;其中一个加数是一个立即数&am…

macos tcl-tk python图形库软件包安装 port 和brew 包管理工具安装方法和使用总结

macos下安装这个tcl-tk 图形库&#xff0c; 使用port和brew 安装时是不一样的&#xff0c; 软件包名称不一样&#xff0c;安装后的软件文件路径信息也不一样。 在brew 包管理工具中&#xff0c;这个软件包的名称就是tcl-tk&#xff0c; 安装方法为 brew install tcl-tk , 而…

昂科烧录器支持Senasic琻捷电子的蓝牙低功耗芯片SNP746

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Senasic琻捷电子的蓝牙低功耗芯片SNP746已经被昂科的通用烧录平台AP8000所支持。 SNP746是一款蓝牙低功耗芯片&#xff0c;集成了压力传感器和加速度传感器的测量电路。它是为…

表达式求值(综合应用的难题)

一、各种表达式的含义与操作 请看下面链接里面的博客吧&#xff0c;这是一位大佬写的&#xff0c;里面的图很是不错&#xff0c;可以看看。 各种表达式的概念与操作 二、题目 给定一个表达式&#xff0c;其中运算符仅包含 ,-,*,/&#xff08;加 减 乘 整除&#xff09;&…

产业报告 | 2024年中国机器人产业研究报告

近日&#xff0c;世界机器人大会在北京亦庄国际会展中心举办。据悉&#xff0c;这是国内最大的机器人展会&#xff0c;今年的展会规模更是创下新高&#xff0c;共有169家企业参展&#xff0c;展出的产品数量超过600款&#xff0c;观展人次超过30万&#xff0c;足见各行各业对机…

QT widgets 窗口缩放,自适应窗口大小进行布局

1. 窗口布局 2. 尺寸策略&#xff1a;扩展 Fixed (固定): 行为&#xff1a;控件的大小是固定的&#xff0c;不会随着窗口大小的变化而改变。它的大小由控件的 sizeHint() 返回的值决定。 适用场景&#xff1a;当你希望控件的大小保持不变&#xff0c;不随布局调整时使用&#x…

前端vue-插值表达式和v-html的区别

创建vue实例的时候&#xff0c;可以有两种形式。 1.let appnew Vue({}) 2 const appnew Vue({}) 3 el是挂载点&#xff0c;是上面div的id值 4 data中的值可以展示在上面div中 5 v-html标签里面如果有内容&#xff0c;则我们的新内容会把标签里面的内容覆盖掉

解决 Torch not compiled with CUDA enabled 问题 | MiniCPM3-4B 【应用开发笔记】

最近在研究测试MiniCPM3-4B&#xff0c;这里记录一下遇到的cuda和torch版本问题 在调试和运行MiniCPM3-4B过程中如果出现找不到某个包&#xff0c;就用pip进行安装&#xff0c;如果提示GPU相关的问题则需要进一步检查 解决 Torch not compiled with CUDA enabled 问题 一、查看…

Arthas 全攻略:让调试变得简单

文章目录 一、简介二、命令列表 一、简介 注意 &#xff1a; 我安装的版本是&#xff1a;Arthas V3.7.2 官网&#xff1a;https://arthas.aliyun.com/doc/ 相关错误解决方案请看GitHub&#xff1a;https://github.com/alibaba/arthas/issues Alibaba开源的Java诊断工具。 从…

我的AI工具箱Tauri版-MicrosoftTTS文本转语音

本教程基于自研的AI工具箱Tauri版进行MicrosoftTTS文本转语音服务。 MicrosoftTTS文本转语音服务 是自研的AI工具箱Tauri版中的一款功能模块&#xff0c;专为实现高效的文本转语音操作而设计。通过集成微软TTS服务&#xff0c;用户可以将大量文本自动转换为自然流畅的语音文件…

圣多纳释放法,达到内心的平静

圣多纳释放法的关键在于&#xff1a;我们被情绪控制时&#xff0c;不应该压抑情绪或是发泄情绪。 利用释放法处理情绪是最健康的方法&#xff0c;可以帮助我们获得自由与平静。当我们面对讨厌的人时&#xff0c;我们真正要做的并非压抑或者爆发&#xff0c;而是将“讨厌”这种…

仪表放大器AD620

AD623 是一款低功耗、高精度的仪表放大器&#xff0c;而不是轨到轨运算放大器。它的输入电压范围并不覆盖整个电源电压&#xff08;轨到轨&#xff09;&#xff0c;但在单电源供电下可以处理接近地电位的输入信号。 AD620 和 AD623 都是仪表放大器&#xff0c;但它们在一些关键…

HTB-Netmon(prtg配置文件获取,CVE-2018-9276复现)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Netmon靶机 渗透流程 信息搜集 服务器开放了80HTTP、21FTP(匿名登录)、445SMB服务 FTP匿名登录 获取敏感文件 登录后台 网站登录需要 账号、密码 &#xff0c;尝试去FTP服务 碰下运气 通过翻阅ft…