数据结构课程设计—同学录管理系统(c语言)
前言
计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系统。
提示:本程序采用的数据结构是线性表,主菜单为:
--------欢迎使用同学录管理系统V1.0--------
☆☆☆☆☆☆主菜单栏☆☆☆☆☆☆☆
★1.录入同学信息
★2.显示同学信息
★3.查找某同学
★4.修改某同学信息
★5.删除某同学信息
★6.同学录排序
★7.统计当前同学录总人数
★0.退出同学录管理系统
一、需求分析
1.问题描述:
实现同学录管理的几个操作功能(录入、查找、删除、排序、写入文件、从文件中读取、屏幕输出等功能)。同学录中可存储的学生信息包括姓名、年龄、性别、联系电话、QQ号码、邮箱、联系地址等。
2.问题要求:
要求编写一程序,选择适当的数据结构,解决上述问题。要求:(1)输入输出界面友好,可视化程度强;(2)程序的可读性较强;(3)程序具有较强的健壮性;(4)程序能够自动把用户操作之后的顺序表中信息写入到tong_xue_lu.txt文件中,并在运行程序时自动从tong_xue_lu.txt文件中读取同学的信息并建立顺序表;
二、总体设计
1.设计思路:
本程序采用顺序表来存储同学信息。先定义一个结构体类型someone,结构体包括六个字符数组变量,一个整形变量,用来存储每个人的姓名、年龄、性别、手机号码、QQ号码、邮箱、联系地址。再定义一个结构体类型classmate,结构体包括一个someone型指针变量(用来存储顺序表的首地址)和一个整型变量length(用来存储顺序表的长度)。然后通过对顺序表的取值、删除、查找、排序、修改、输出等算法来实现对同学录管理系统中的录入同学信息、删除某同学信息、查找某同学、对同学录进行排序、修改某同学的信息等功能。
三、代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR -1
char a[5]="序号";
char b[5]="姓名";
char c[5]="年龄";
char d[5]="性别";
char e[10]="手机号码";
char f[10]="QQ号码";
char g[6]="邮箱";
char h[10]="联系地址";
typedef struct mate
{
char name[6];
int age;
char sex[3];
char iphonenumber[20];
char QQnumber[20];
char mail[20];
char location[30];
} someone;
typedef struct
{
someone *elem;
int length;
}classmate;
//初始化线性表
int init_class(classmate &L)
{
L.elem=new someone[MAXSIZE];
if(!L.elem)
{
return ERROR;
}
L.length=0;
return OK;
}
//打印顺序表函数
void print_class(classmate L)
{
int choose,i;
if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
else
{
while(1)
{
printf("********************************************\n");
puts("●1.输出姓名列");
puts("●2.输出所有列信息");
puts("●0.返回主菜单");
printf("********************************************\n");
puts("请输入你的操作指令:");
scanf("%d",&choose);
while(choose<0||choose>2)
{
printf("您输入的查找指令有误,请重新输入:");
scanf("%d",&choose);
}
if(choose==0) break;
switch(choose)
{
case 1:
printf("-----------------------------------------------------------------------------------------------\n");
printf("%-6s",a);
printf("%-8s",b);
printf("\n");
printf("-----------------------------------------------------------------------------------------------\n");
for(i=0;i<L.length;i++)
{
printf("%-6d",i+1);
printf("%-8s",L.elem[i].name);
printf("\n");
}
printf("-----------------------------------------------------------------------------------------------\n");
break;
case 2:
printf("-----------------------------------------------------------------------------------------------\n");
printf("%-6s",a);
printf("%-8s",b);
printf("%-9s",c);
printf("%-6s",d);
printf("%-16s",e);
printf("%-16s",f);
printf("%-21s",g);
printf("%-21s",h);
printf("\n");
printf("-----------------------------------------------------------------------------------------------\n");
printf("\n");
for(i=0;i<L.length;i++)
{
printf("%-6d",i+1);
printf("%-8s",L.elem[i].name);
printf("%-9d",L.elem[i].age);
printf("%-6s",L.elem[i].sex);
printf("%-16s",L.elem[i].iphonenumber);
printf("%-16s",L.elem[i].QQnumber);
printf("%-21s",L.elem[i].mail);
printf("%-21s",L.elem[i].location);
printf("\n\n");
}
printf("-----------------------------------------------------------------------------------------------\n");
printf("***************************************************");
printf("\n");
break;
}
}
}
}
//录入同学录内容
void put_class(classmate &L)
{
void save(classmate L);
int i,l,j;
printf("请输入要录入的同学人数(0~%d):",MAXSIZE-L.length);
scanf("%d",&l);
while(l<1||l>(MAXSIZE-L.length))
{
printf("输入人数范围有误,请重新输入同学人数(1~%d):",MAXSIZE-L.length);
scanf("%d",&l);
}
for(i=L.length,j=0;j<l;j++,i++)
{
printf("***************************************************\n");
printf("请输入第%d个同学的姓名(最大长度6):",i+1);
scanf("%s",L.elem[i].name);
printf("请输入%s的年龄:",L.elem[i].name);
scanf("%d",&L.elem[i].age);
printf("请输入%s的性别(最大长度3):",L.elem[i].name);
scanf("%s",L.elem[i].sex);
printf("请输入%s的手机号(长度11):",L.elem[i].name);
scanf("%s",L.elem[i].iphonenumber);
while(strlen(L.elem[i].iphonenumber)!=11)
{
printf("您输入的号码长度不合法,请重新输入");
scanf("%s",L.elem[i].iphonenumber);
}
printf("请输入%s的QQ号码(最大长度20):",L.elem[i].name);
scanf("%s",L.elem[i].QQnumber);
printf("请输入%s的邮箱(最大长度20):",L.elem[i].name);
scanf("%s",L.elem[i].mail);
printf("请输入%s的联系地址(最大长度30):",L.elem[i].name);
scanf("%s",L.elem[i].location);
printf("***************************************************\n");
printf("\n");
}
L.length=L.length+l;
save(L);
}
//查找函数菜单
void chazhao(classmate L)
{
int i,b,e,choose;
void chazhao_print_title();
int chazhao_print(classmate L,int i);
char seek[20];
if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
else
{
while(1)
{
int count=0;
printf("********************************************\n");
puts("●1.按名字查找");
puts("●2.按地址查找");
puts("●3.按年龄段查找");
puts("●0.返回主菜单");
printf("********************************************\n");
puts("请输入你的查找指令:");
scanf("%d",&choose);
while(choose<0||choose>3)
{
printf("您输入的查找指令有误,请重新输入:");
scanf("%d",&choose);
}
if(choose==0) break;
switch(choose)
{
case 1:
printf("请输入你要查询人的名字:");scanf("%s",seek);
for(i=0;i<L.length;i++)
{
if(strcmp(seek,L.elem[i].name)==0)
{
printf("查找成功,在第%d个位置\n",i+1);
chazhao_print_title();
chazhao_print(L,i);
count++;
}
}
if(count==0) printf("%s不存在!\n",seek);
break;
case 2:
printf("请输入你要查询人的地址:");
scanf("%s",seek);
chazhao_print_title();
for(i=0;i<L.length;i++)
{
if(strcmp(seek,L.elem[i].location)==0)
{
chazhao_print(L,i);
count++;
}
}
if(count==0) printf("您要查询的人不存在!\n");
break;
case 3:
printf("请输入升序年龄范围,用短横杠隔开(例如1-10)\n");
scanf("%d-%d",&b,&e);
printf("年龄在%d-%d之间的人有:\n",b,e);
chazhao_print_title();
for(i=0;i<L.length;i++)
{
if((b<=L.elem[i].age)&&(L.elem[i].age<=e))
{
chazhao_print(L,i);
count++;
}
}
if(count==0) printf("年龄在%d-%d人不存在!\n",b,e);
break;
}
}
}
}
//查找时打印表头
void chazhao_print_title()
{
printf("-----------------------------------------------------------------------------------------------\n");
printf("%-6s",a);
printf("%-8s",b);
printf("%-9s",c);
printf("%-6s",d);
printf("%-16s",e);
printf("%-16s",f);
printf("%-21s",g);
printf("%-21s",h);
printf("\n");
printf("-----------------------------------------------------------------------------------------------\n");
printf("\n");
}
//查找时单独打印函数
int chazhao_print(classmate L,int i)
{
printf("%-6d",i+1);
printf("%-8s",L.elem[i].name);
printf("%-9d",L.elem[i].age);
printf("%-6s",L.elem[i].sex);
printf("%-16s",L.elem[i].iphonenumber);
printf("%-16s",L.elem[i].QQnumber);
printf("%-21s",L.elem[i].mail);
printf("%-21s",L.elem[i].location);
printf("\n");
printf("-----------------------------------------------------------------------------------------------\n");
printf("\n");
}
//删除函数
void shanchu(classmate &L)
{
void save(classmate L);
int i,choose,n,j;
char seek_name[6];
if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
else
{
while(1)
{
int count=0;
printf("********************************************\n");
puts("●1.按序号删除");
puts("●2.按名字删除");
puts("●0.返回主菜单");
printf("********************************************\n");
puts("请输入您的删除指令:");
scanf("%d",&choose);
while(choose<0||choose>3)
{
printf("您输入的删除指令有误,请重新输入:");
scanf("%d",&choose);
}
if(L.length==0)
{
printf("当前同学录为空,请先录入同学信息\n\n");
break;
}
else
{
while(choose<0||choose>2)
{
printf("您输入的删除指令有误,请重新输入:");
scanf("%d",&choose);
}
if(choose==0) break;
switch(choose)
{
case 1:
printf("请输入您要删除的同学的序号:");
scanf("%d",&n);
if(n>L.length)
{
printf("您要删除的人不存在!\n");
break;
}
printf("序号为%d的同学(%s)已被删除\n",n,L.elem[n-1].name);
for(i=n;i<L.length;i++)
{
L.elem[i-1]=L.elem[i];
}
L.length--;
save(L);
break;
case 2:
printf("请输入您要删除的同学的姓名:");
scanf("%s",seek_name);
for(i=0;i<L.length;i++)
{
if(strcmp(seek_name,L.elem[i].name)==0)
{
for(j=i+1;j<L.length;j++)
{
L.elem[j-1]=L.elem[j];
}
L.length--;
count++;
}
}
if(count==0)
{
printf("您要删除的人不存在!\n");
}
else
{
printf("%s的信息已删除成功\n",seek_name);
save(L);
}
break;
}
}
}
}
}
//排序函数
void paixu(classmate &L)
{
void save(classmate L);
if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
else
{
someone m;
int i,j,t;
int choose,choose1;
puts("●1.按升序排序");
puts("●2.按降序排序");
puts("请输入你的排序指令:");
scanf("%d",&choose1);
while(choose1<1||choose1>2)
{
printf("您输入的排序指令有误,请重新输入:");
scanf("%d",&choose1);
}
switch(choose1)
{
case 1:
puts("●1.按名字升序排序");
puts("●2.按年龄升序排序");
puts("●3.按地址升序排序");
puts("●4.按QQ号升序排序");
puts("请输入你的操作指令:");
scanf("%d",&choose);
while(choose<1||choose>4)
{
printf("您输入的指令有误,请重新输入:");
scanf("%d",&choose);
}
switch(choose)
{
case 1:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(strcmp(L.elem[i].name,L.elem[j].name))
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按姓名升序排序成功。");
save(L);
break;
case 2:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(L.elem[i].age>L.elem[j].age)
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按年龄升序排序成功。");
save(L);
break;
case 3:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(strcmp(L.elem[i].location,L.elem[j].location))
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按地址升序排序成功。");
save(L);
break;
case 4:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(strcmp(L.elem[i].QQnumber,L.elem[j].QQnumber))
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按QQ号升序排序成功。");
save(L);
break;
}
break;
case 2:
puts("●1.按名字降序排序");
puts("●2.按年龄降序排序");
puts("●3.按地址降序排序");
puts("●4.按QQ号降序排序");
puts("请输入你的操作指令:");
scanf("%d",&choose);
while(choose<1||choose>4)
{
printf("您输入的指令有误,请重新输入:");
scanf("%d",&choose);
}
switch(choose)
{
case 1:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(strcmp(L.elem[i].name,L.elem[j].name)==-1)
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按姓名降序排序成功。");
save(L);
break;
case 2:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(L.elem[i].age<L.elem[j].age)
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按年龄降序排序成功。");
save(L);
break;
case 3:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(strcmp(L.elem[i].location,L.elem[j].location)==-1)
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按地址降序排序成功。");
save(L);
break;
case 4:
for(i=0;i<L.length;i++)
{
for(j=i+1;j<L.length;j++)
{
if(strcmp(L.elem[i].QQnumber,L.elem[j].QQnumber)==-1)
{
m=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=m;
}
}
}
puts("按QQ号降序排序成功。");
save(L);
break;
}
break;
}
}
}
//修改同学信息
void xiugai(classmate &L)
{
void save(classmate L);
if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
else
{
int choose,i,t,count=0;
char seekname[6];//存储要修改人的名字
printf("你要修改谁的信息,请输入姓名:\t");
scanf("%s",seekname);
for(i=0;i<L.length;i++)
{
if(strcmp(seekname,L.elem[i].name)==0)
{
t=i;
count++;
break;
}
}
if(count==0) printf("您要删除的人不存在\n");
else
{
while(1)
{
printf("********************************************\n");
puts("●1.修改姓名");
puts("●2.修改年龄");
puts("●3.修改性别");
puts("●4.修改地址");
puts("●5.修改QQ号码");
puts("●6.修改手机号");
puts("●7.修改邮箱");
puts("●0.返回主菜单");
printf("********************************************\n");
puts("请输入你的修改指令:");
scanf("%d",&choose);
while(choose<0||choose>7)
{
printf("您输入的修改指令有误,请重新输入:");
scanf("%d",&choose);
}
if(choose==0) break;
switch(choose)
{
case 1:
puts("请输入新的姓名:");
scanf("%s",L.elem[t].name);
printf("%s的姓名修改成功\n",seekname);
save(L);
break;
case 2:
puts("请输入新的年龄:");
scanf("%d",&L.elem[t].age);
printf("%s的年龄修改成功\n",seekname);
save(L);
break;
case 3:
puts("请输入新的性别:");
scanf("%s",L.elem[t].sex);
printf("%s的性别修改成功\n",seekname);
save(L);
break;
case 4:
puts("请输入新的地址:");
scanf("%s",L.elem[t].location);
printf("%s的地址修改成功\n",seekname);
save(L);
break;
case 5:
puts("请输入新的QQ号码:");
scanf("%s",L.elem[t].QQnumber);
printf("%s的QQ号码修改成功\n",seekname);
save(L);
break;
case 6:
puts("请输入新的手机号:");
scanf("%s",L.elem[t].iphonenumber);
printf("%s的手机号修改成功\n",seekname);
save(L);
break;
case 7:
puts("请输入新的邮箱:");
scanf("%s",L.elem[t].mail);
printf("%s的邮箱修改成功\n",seekname);
save(L);
break;
}
}
}
}
}
//保存到文件函数
void save(classmate L)
{
FILE *fp;
int i;
fp=fopen("tong_xue_lu.txt","w");
fprintf(fp,"%d\n",L.length);
for(i=0;i<L.length;i++)
{
fprintf(fp,"%s %d %s %s %s %s %s\n",L.elem[i].name,L.elem[i].age,L.elem[i].sex,L.elem[i].iphonenumber,L.elem[i].QQnumber,L.elem[i].mail,L.elem[i].location);
}
fclose(fp);
}
void read(classmate &L)
{
FILE *fp;
int i;
fp=fopen("tong_xue_lu.txt","r");
int count;
fscanf(fp,"%d\n",&count);
for(i=0;i<count;i++)
{
fscanf(fp,"%s %d %s %s %s %s %s\n",L.elem[i].name,&L.elem[i].age,L.elem[i].sex,L.elem[i].iphonenumber,L.elem[i].QQnumber,L.elem[i].mail,L.elem[i].location);
L.length++;
}
fclose(fp);
}
void num(classmate L)
{
printf("-----------------------------------------------------------------------------------------------\n");
printf("当前同学录共有%d人\n",L.length);
printf("-----------------------------------------------------------------------------------------------\n");
}
int main()
{
int choose;
classmate L;
init_class(L);
read(L);
while(1)
{
printf("--------欢迎使用同学录管理系统V1.0--------\n");
printf("--------操作指令是选项前的数字序号--------\n");
printf("********************************************\n");
printf("☆☆☆☆☆☆主菜单栏☆☆☆☆☆☆☆\n");
printf("\n");
puts("★1.录入同学信息");
puts("★2.显示同学信息");
puts("★3.查找某同学");
puts("★4.修改某同学信息");
puts("★5.删除某同学信息");
puts("★6.同学录排序");
puts("★7.统计当前同学录总人数");
puts("★0.退出同学录管理系统");
printf("********************************************\n");
printf("\n");
printf("-----------------------------------------------------------\n");
printf("请选择主菜单指令:");
scanf("%d",&choose);
while(choose<0||choose>7)
{
printf("您输入的主菜单指令有误,请重新输入:");
scanf("%d",&choose);
}
if(choose==0) break;
switch(choose)
{
case 1:put_class(L);save(L);break;
case 2:print_class(L);break;
case 3:chazhao(L);break;
case 4:xiugai(L);break;
case 5:shanchu(L);break;
case 6:paixu(L);break;
case 7:num(L);break;
}
}
printf("请按任意键退出系统");
return 0;
}
四、代码说明
1.抽象数据类型定义:
抽象数据类型包括someone和classmate,someone是一个包含char name[6]; int age; char sex[3]; char iphonenumber[20]; char QQnumber[20]; char mail[20]; char location[30];七个变量的结构体数据类型,classmate是一个包含someone *elem; int length;两个变量的结构体数据类型。
数据关系:通过访问classmate里面的elem可以间接访问someone里面的数据。
基本操作:先定义classmate L;然后进行L.elem.name或者L.length;即可访问到抽象数据类型里的所有内容了。
2.存储结构设计:
本设计采用了顺序表的存储结构,顺序表的默认表长是100。
3.算法设计:
(1)初始化线性表函数【int init_class(classmate &L)】:使用new函数为线性表分配存储空间,用L.elem指向存储空间的首地址,并初始化线性表长度L.length==0;
(2)打印同学录信息【void print_class(classmate L)】:此函数参数是classmate型抽象数据变量。首先定义两个整形变量choose、i,chooose用来作为内部菜单的选择指令,i用来当做循环变量。然后进行判断表长是否为零(即同学录是否为空),此处用一个if判断语句,如果表长为零,则提示用户“当前同学录为空,请先录入同学信息”,直接跳出此函数;反之则显示内部菜单“●1.输出姓名列、●2.输出所有列信息、●0.返回主菜单”(PS:此处用了while循环,可以使用户对此进行多次操作,当用户选择“●0.返回主菜单”操作时,汇银break而结束循环)。为了程序的健壮性,用while(choose<0||choose>2),来判断用户输入的菜单指令是否在“0,1,2”之间,如果不在,则提示用户重新输入操作指令,直到输入正确。接下来用switch选择语句,参数是用户的操作指令choose,如果choose=1,则只输出姓名列,用for循环遍历一遍顺序表L,输出所有的姓名信息,然后用break终止。如果choose==2,则用for循环遍历L.elem中的所有信息并输出,然后用break终止。
(3)录入同学录内容【void put_class(classmate &L)】:先定义三个整型变量“i,l,j”,i和j用来当做for循环的循环变量,而l用来存储每次要录入的学生的个数。为了程序的健壮性,用了while(l<1||l>(MAXSIZE-L.length))来判断要录入的学生个数是否大于等于1且是否大于目前剩余的存储空间,如果l<1||l>(MAXSIZE-L.length),则提示用户重新输入学生个数。待l输入正确后,用for循环来以此录入每个学生的姓名、年龄、性别、手机号、QQ号码、邮箱、联系地址等。相应地循环次数是学生个数l。循环完成后,对表长L.length进行加l。
(4)查找功能【void chazaho(classmate L)】:先定义三个整型变量“i,b,e,count,choose”,i是for循环的循环变量;b和e用来存储使用年龄段查找功能时的年龄段的起始值和末尾值;count赋初值0,用来判断是否查找成功,当count=0时,查找失败;choose用来存储用户的操作指令。在定义一个字符数组变量seek,用来存储查找的关键字,比如按名字查找时的名字、按地址查找时的地址。考虑到程序的健壮性,使用if-else语句先判断线性表(同学录)是否为空,如果为空,则提示用户“当前同学录为空,请先录入同学信息”;如果不为空,则进行后续的查找操作。else内用一个while循环,只有当用户选择“●0.返回主菜单”操作时才会因break而终止。While循环内首先对用户展示内菜单栏“●1.按名字查找、●2.按地址查找、●3.按年龄段查找、●0.返回主菜单”。接下来用swith(choose)语句根据用户选择的查找命令使用不同的方式查找。考虑到程序的健壮性,用while(choose<0||choose>3),来判断用户输入的菜单指令是否在“0,1,2,3”之间,如果不在,则提示用户重新输入操作指令,直到输入正确;接下来用switch(choose)来实现用户命令与查找方式的对应:如果choose==1则进行按名字查找,用for循环遍历顺序表,如果某个人的姓名和关键字相同,则输出这个人的所有信息。同理,当choose==2时,则按地址查找。当choose==3时,则按年龄段查找。如果没有匹配到和关键字相同的同学,此时count==0,提示用户要查找的人不存在。(5)删除功能【void shanchu(classmate &L)】:先定义四个整型变量“i,choose,j”,i和j是循环变量,choose用来存储用户的操作指令;再定义一个字符数组变量seek_name用来存储使用按姓名删除功能时的姓名关键字。考虑到程序的健壮性,使用if-else语句先判断线性表(同学录)是否为空,如果为空,则提示用户“当前同学录为空,请先录入同学信息”;如果不为空,则进行后续的删除操作。else内用一个while循环,只有当用户选择“●0.返回主菜单”操作时才会因break而终止。While循环内首先对用户展示内菜单栏“●1. 按序号删除、●2. 按名字删除、●0.返回主菜单”(while内定义了一个整型变量count,用来判断当使用姓名删除时,被删除人是否存在)。考虑到程序的健壮性,用while(choose<0||choose>2),来判断用户输入的菜单指令是否在“0,1,2”之间,如果不在,则提示用户重新输入操作指令,直到输入正确;接下来用switch(choose)来实现用户命令与删除方式的对应:如果choose==1则进行按序号删除,如果choose=2则进行按名字删除。删除的算法思路为:把要删除的元素后面的所有元素都向前挪一个位置。当使用按姓名删除时,先匹配到到待删除人的下标,再进行删除。(且当要删除的人不存在时,系统会提示用户“您要删除的人不存在”,删除成功时则会提示用户删除成功)
(6)排序功能【void paixu(classmate &L)】:首先判断顺序表是否为空,为空的话会提示用户先录入同学信息(同时直接返回主菜单),不为空则进行下面的的排序操作。此功能同样采用了内菜单的方式来供用户选择不同的排序方式(首先让用户选择升序还是降序,然后再让用户选择按那个关键字排序)。排序的算法为简单选择排序。同时用到了字符串的比较函数strcmp函数。
(6)修改信息功能【void xiugai(classmate &L)】: 此功能定义了3个整型变量“choose.i.t”两个字符数组变量“seekname[6],change[31]”,choose用来存储用户的操作指令,i是循环变量,t用来存放被修改人的位置下标,seekname存储被修改人的名字。 首先判断顺序表是否为空,为空的话会提示用户先录入同学信息(同时直接返回主菜单),不为空则进行下面的的修改操作。此功能同样采用了内菜单的方式来供用户选择不同的修改方式。首先让用户输入要修改人的名字,根据查找算法来获得此人相应的下标。 然后展示内菜单(考虑到程序的健壮性,用while(choose<0||choose>7),来判断用户输入的菜单指令是否在“0,1,2,3,4,5,6,7”之间,如果不在,则提示用户重新输入操作指令,直到输入正确),让用户选择修改哪一项信息。通过用scanf函数直接修改相应地址的信息。
(7)保存到文件功能【void save(classmate L)】:先创建一个文件指针fp和一个整型变量i,i是循环变量,fp指向要保存到的文本文档“tong_xue_lu.txt”。文件使用方式选择“w”。先把同学录的人数保存到文本文档的第一行,然后用for循环以此将顺序表L中的所有同学信息写入到文本文档tong_xue_lu.txt中,每位同学的信息单独占一行。此系统采用了实时保存功能,即用户每进行一项操作之后,都会自动保存到文件中。
(8)从文件中读取功能【void read(classmate &L)】:先创建一个文件指针fp和两个整型变量i和count,i是循环变量,count用来存储从文本文档中读取到的第一个元素,即同学的人数。fp指向要读取的文本文档“tong_xue_lu.txt”。文件使用方式选择“r”。首先读取同学录的总人数存储到count里面,然后用for循环,循环count次将文本文档tong_xue_lu.txt中的所有同学信息读取到顺序表L中去。
(9)统计同学录人数功能【void num(classmate L)】:此功能实现把顺序表的长度(即同学录中的人数)输出,告知用户当前同学录有多少人。