俺花了3天左右的时间专心制作,也是为了完成软件基础作业,发布到这儿也是希望能给同学们一个借鉴,如有不符合之处,烦请在评论区予以指正。(自认为算是比较完美了哈😁)
1.基于顺序存储结构的学生名册管理程序设计
利用数组设计一个学生名册管理程序,记录每个学生的学号、姓名和电话号码,并通过数字化菜单为用户提供插入、删除、查找和打印等功能。通过菜单的选择,用户可以对学生的信息进行管理。需要实现的功能包括:
- 添加学生信息。可一次添加n人,n为键盘录入的整数。
- 在数组的指定位置插入某个学生的数据。
- 修改学生信息。根据学号或姓名查找学生的信息。如果找到对应的学生,用户就可以对其所有信息进行修改。
- 删除特定学号的学生。
- 在屏幕上输出所有学生的数据。一个人的学号、姓名和电话应显示在同一行。最后显示学生的总人数。
以上功能对应的菜单在执行时应当没有顺序和次数的限制。设计程序时需要对各种特殊情况(如数组为空)加以充分的考虑。姓名和电话号码要求定义成字符串。为了节省数据录入的时间,可以通过初始化程序将数据写入顺序表。键盘录入数据的功能,演示实现的过程就可以。要求演示功能的时候,至少要存储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");
}
}