自学内容网 自学内容网

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;
}


原文地址:https://blog.csdn.net/qq_57461392/article/details/142368358

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!