基于顺序存储结构的学生名册管理程序设计(重庆邮电大学软件基础2023年实验报告)C语言

本文详细描述了一个使用C语言实现的学生名册管理程序,包括添加、删除、查找和修改学生信息的功能,以及处理数组空和特殊情况的代码片段。
摘要由CSDN通过智能技术生成

俺花了3天左右的时间专心制作,也是为了完成软件基础作业,发布到这儿也是希望能给同学们一个借鉴,如有不符合之处,烦请在评论区予以指正。(自认为算是比较完美了哈😁)

1.基于顺序存储结构的学生名册管理程序设计

利用数组设计一个学生名册管理程序,记录每个学生的学号、姓名和电话号码,并通过数字化菜单为用户提供插入、删除、查找和打印等功能。通过菜单的选择,用户可以对学生的信息进行管理。需要实现的功能包括:

  1.  添加学生信息。可一次添加n人,n为键盘录入的整数。
  2.  在数组的指定位置插入某个学生的数据。
  3.  修改学生信息。根据学号或姓名查找学生的信息。如果找到对应的学生,用户就可以对其所有信息进行修改。
  4.  删除特定学号的学生。
  5.  在屏幕上输出所有学生的数据。一个人的学号、姓名和电话应显示在同一行。最后显示学生的总人数。

以上功能对应的菜单在执行时应当没有顺序和次数的限制。设计程序时需要对各种特殊情况(如数组为空)加以充分的考虑。姓名和电话号码要求定义成字符串。为了节省数据录入的时间,可以通过初始化程序将数据写入顺序表。键盘录入数据的功能,演示实现的过程就可以。要求演示功能的时候,至少要存储20组数据。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define A 30

typedef struct student
{
    long ID;//学号
    char Name[10];//姓名
    char Sex[3];//性别
    char phone[15];//电话号码
}STU;

int Search(long ID,STU N[],int len);
int Insert(int len,STU N[],int locate);
int Resourse(STU N[],int len,int n);
int mydelete(long ID,STU N[],int num);
void mycorrect(STU N[],long ID,char type[],int num);
int Initial_list(STU N[],int n);

int main()
{
    STU N[A];
    int num=0;
    num=Initial_list(N,20);//初始化数组,预存20组数据
    START:printf("---欢迎来到学生名册系统!---\n--请问您想执行什么操作?--\n1.查找(学号)  2.删除\n3.插入      4.打印所有学生信息\n5.添加学生信息   6.修改\n0.退出程序\n");
    int operate;
    scanf("%d",&operate);
    if(operate==1)
    {
        printf("请输入学号:");
        long serID;
        scanf("%ld",&serID);
        Search(serID,N,num);
        goto START;
    }
    else if(operate==5)
    {
        int n;
        printf("请输入添加的学生个数:");
    scanf("%d",&n);
    num=Resourse(N,num,n);
    goto START;
    }
    else if(operate==2)
   {
printf("请输入要删除信息的学号:");
long deID;
scanf("%ld",&deID);
num=mydelete(deID,N,num);
goto START;
    }
    else if(operate==3)
   {
       printf("请输入要插入的位置:");
       int locate;
       scanf("%d",&locate);
       num=Insert(num,N,locate);
       goto START;
   }
   else if(operate==4)
   {
       if(num==0) printf("没有任何学生的信息,请按5添加!!\n");
       for(int i=0;i<num;i++)
    {
        printf("第%d个同学的信息:\n学号:%ld  姓名:%s  性别:%s  电话号码:%s\n",i+1,N[i].ID,N[i].Name,N[i].Sex,N[i].phone);
    printf("\n");
    }
    printf("总人数:%d\n",num);
    goto START;
   }
   else if(operate==0) return 0;
   else if(operate==6)
   {
       printf("请输入要修改信息的同学的学号:");
       long coID;fflush(stdin);
       scanf("%ld",&coID);
       long ID=coID;//实验发现后面的扫描type会影响coID的值,不得不用ID先接收
       printf("请输入要修改的信息(例如:姓名、学号、性别、电话号码):");
       char type[4]={'\0'};fflush(stdin);
       scanf("%s",&type);
       mycorrect(N,ID,type,num);
       goto START;
   }
   else
   {
    printf("请重新选择操作!\n");
    goto START;
   }
}
int Initial_list(STU N[],int n)
{
    long id=202301;
    char name[4]={"001"};
    char sex[3]={"男"};
    char sexl[3]={"女"};
    char ph[11]="110";
    for(int j=0;j<n;j++)
    {
       N[j].ID=id;id++;
        strcpy(N[j].Name,name);
        if(name[2]<'9'){name[2]++;}
        else {name[1]++;name[2]='0';}//考虑到进位的问题
        if(j%2==0) {strcpy(N[j].Sex,sex);}
        else {strcpy(N[j].Sex,sexl);}
        strcpy(N[j].phone,ph);
        if(ph[2]<'9') {ph[2]++;}
        else {ph[1]++;ph[2]='0';}
    }
    return n;
}
int Search(long ID,STU N[],int len)//查找学号,len就是num(人数)
{
    int find=-1;//标志变量find
    for(int i=0;i<len;i++)
    {
        if(ID==N[i].ID)
        {
            find=i;//同时把find作为地址
            printf("学号为%ld的相关信息为:\n",ID);
        printf("学号:");
        printf("%ld\n",N[find].ID);
        printf("姓名:");
        printf("%s\n",N[find].Name);
        printf("性别:");
        printf("%s\n",N[find].Sex);
        printf("电话:");
        printf("%s\n",N[find].phone);
        break;
        }
    }
    if(find==-1) printf("未找到学号为%ld的同学!!\n",ID);
    return find;//返回找到的地址
}
int Insert(int len,STU N[],int locate)//插入一个学生信息,并使人数加一,locate是位置
{
    if(len==A)
        {
            printf("数据溢出!!");
            return len;
        }
    if(locate>len)locate=len+1;
    if(locate<1)locate=1;
    int i;
    STU test;//此时先用一个临时的结构体接受输入的学号,便于验证重复性
    printf("请输入该学生的相关信息:\n");
    RE:printf("学号:");
        scanf("%ld",&test.ID);
        for(i=0;i<len;i++)
        {
            if(test.ID==N[i].ID)
            {
                REMIND:printf("您输入的学号已重复,是否继续插入信息?\n(输入是或否)");
                char yes[]={"是"};char  no[]={"否"};
                char jud[3]={'\0'};
                scanf("%s",&jud);
                if(strcmp(jud,yes)==0) goto RE;
                else if(strcmp(jud,no)==0) return len;//没插入成功,人数不变
                else goto REMIND;
            }
        }//验证学号重复性后再输入其他信息
        printf("姓名:");
        scanf("%s",&test.Name);
        printf("性别:");
        scanf("%s",&test.Sex);
        printf("电话号码:");
        scanf("%s",&test.phone);
    for(i=len-1;i>=locate-1;i--)
    {
        N[i+1]=N[i];
    }
    N[locate-1].ID=test.ID;
    strcpy(N[locate-1].Name,test.Name);
    strcpy(N[locate-1].Sex,test.Sex);
    strcpy(N[locate-1].phone,test.phone);
        return len+1;//插入后人数加一
}
int Resourse(STU N[],int len,int n)//从末尾开始添加
{
    if((len+n)>A)
    {
        printf("数据溢出!!\n");
        return len;
    }
    for(int i=len;i<=len+n-1;i++)
    {
        printf("请输入第%d个学生的相关信息:\n",i+1);
        printf("学号:");fflush(stdin);
        IN:scanf("%ld",&N[i].ID);
        for(int j=0;j<i;j++)
        {
            if(N[i].ID==N[j].ID)
            {
                printf("学号重复,请重新输入:");
                goto IN;
            }
        }
        printf("姓名:");fflush(stdin);
        scanf("%s",&N[i].Name);
        printf("性别:");fflush(stdin);
        scanf("%s",&N[i].Sex);
        printf("电话号码:");fflush(stdin);
        scanf("%s",&N[i].phone);
    }
    return len+n;
}
int mydelete(long ID,STU N[],int num)
{
    int find=Search(ID,N,num);//找到的同时记录地址
    if(find==-1) return num;//没找到就是删除失败,人数不变
    else
    {
    int i;
    for(i=find+1;i<num;i++)
    {
        N[i-1]=N[i];//直接后一个覆盖前一个
    }
    return num-1;//删除后人数减一
    }
}
void mycorrect(STU N[],long ID,char type[],int num)
{
    int find=Search(ID,N,num);
    if(find==-1) printf("修改失败!\n");
    else
   {
    char ID[]={"学号"};
    char Name[]={"姓名"};
    char Sex[]={"性别"};
    char Phone[]={"电话号码"};
    if(strcmp(type,Name)==0)
       {
          printf("请输入修改后的姓名:");fflush(stdin);
          scanf("%s",&N[find].Name);
       }
    else if(strcmp(type,ID)==0)
    {
        printf("请输入修改后的学号:");
        long cID;fflush(stdin);
        CHE:scanf("%ld",&cID);
        for(int j=0;j<num;j++)
        {
            if(cID==N[j].ID)
            {
                printf("学号重复,请重新输入:");
                goto CHE;//重复继续输
            }
        }
        N[find].ID=cID;
    }
    else if(strcmp(type,Sex)==0)
    {
        printf("请输入修改后的性别:");fflush(stdin);
        scanf("%s",&N[find].Sex);
    }
    else if(strcmp(type,Phone)==0)
    {
        printf("请输入修改后的电话号码:");fflush(stdin);
        scanf("%s",&N[find].phone);
    }
    else printf("目前仅支持修改学号、姓名、性别、电话号码,请重试!!\n");
    }
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值