一、需求分析
学生信息管理系统:
学生信息管理有许多使用功能,使用非常普遍。
需要有的功能是输入、输出、查找、排序、删除和修改等。
用菜单实现,界面功能简洁明了,需要容错,考虑人性化的设计。
二、总体设计
学生包含许多属性,考虑使用结构体来存储。由于不确定学生人数,还有要对信息增加、修改、删除等,使用动态链表实现较为方便。
菜单的设计根据用户的输入来执行不同的函数,有的函数中还要包括子菜单。
总体选择用switch-case
遇到的问题:学生信息管理系统最关键的就是录入信息,需要加容错
解决:输入单独写一个函数
遇到的问题:输入的学号不能重复
解决:用一个数组放学号,如果已经存在就置1,未存在为0
三、详细设计
编写的函数清单
函数调用关系图
Student add(Student head);//录入信息
该函数用来添加信息,里面调用了int input(Student p)输入函数
形参是链表的头指针,返回值是添加数据后的头指针
Student add(Student head)
{
Student p1;
while((p1=(Student )malloc(LEN))&&input(p1))
{
while(a【p1->num-190400】)
{
system("cls");
print(head);
printf("输入的学号%ld重复,请重新输入!\n",p1->num);
input(p1);
}
a【p1->num-190400】=1;
n++;
if(head==NULL)
{
head=p1;
p1->next=NULL;
}
else
{
p1->next=head;
head=p1;
}
system("cls");
}
system("cls");
free(p1);
return head;
}
View Code
void search(Student head);//查找信息
形参是链表的头指针,返回值是void
查找信息采用两种方式:按学号查找和按姓名查找
调用查找菜单函数void search_menu();
void search(Student head)
{
Student p1=head;
int choice=1;
long num;
char s【20】;
while(choice)
{
search_menu();
printf("请输入选择:");
scanf("%d",&choice);
if(choice==0)
{
system("cls");
break;
}
else if(choice==1)
{
system("cls");
p1=head;//如果不初始化,第二次查找会出错
printf("请输入学号查找 :");
scanf("%ld",&num);
while(p1->num!=num&&p1->next!=NULL)
{
p1=p1->next;
}
if(p1->num==num)
{
printf("找到了!\n");
printf("学号 姓名 年龄 性别\n");
printf("%4ld %6s %7d %5c\n",p1->num,p1->name,p1->age,p1->sex);
}
else
{
system("cls");
print(head);
printf("学号:%ld不存在!\n",num);
}
}
else if(choice==2)
{
system("cls");
p1=head;
printf("请输入姓名查找 :");
scanf("%s",s);
while(strcmp(p1->name,s)!=0&&p1->next!=NULL)
{
p1=p1->next;
}
if(strcmp(p1->name,s)==0)
//代码效果参考:http://www.zidongmutanji.com/bxxx/345428.html
{printf("找到了!\n");
printf("学号 姓名 年龄 性别\n");
printf("%4ld %6s %7d %5c\n",p1->num,p1->name,p1->age,p1->sex);
}
else
{
system("cls");
print(head);
printf("学生:%s不存在!\n",s);
}
}
else
{
system("cls");
printf("请根据菜单重新输入!\n");
}
}
}
View Code
Student del(Student head);//删除信息
删除一条信息,用到链表的删除操作
形参是链表的头指针,返回值是删除数据后的头指针
删除方式有两种:输入学号或姓名
调用删除菜单函数:void del_menu();
Student del(Student head)
{
Student p1=head,p2;
int choice=1;
long num;
char s【20】;
while(choice)
{
del_menu();
printf("请输入选择:");
scanf("%d",&choice);
if(choice==0)
{
system("cls");
break;
}
else if(choice==1)
{
system("cls");
if(head==NULL)
{
printf("没有任何信息!\n");
return head;
}
p1=head;
printf("请输入要删除的学号:");
scanf("%ld",&num);
while(p1->num!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->num==num)//找到了要删除的数字
{
if(p1==head)//删除头结点
head=p1->next;
else//删除中间或尾结点
{
p2->next=p1->next;
}
a【p1->num-190400】=0;
p1=p1->next;
printf("删除成功!\n");
n--;
}
else
{
printf("没找到要删除的学号%ld!请重新输入\n",num);
}
}
else if(choice==2)
{
system("cls");
if(head==NULL)
{
printf("没有任何信息!\n");
return head;
}
p1=head;
printf("请输入要删除的姓名:");
scanf("%s",s);
while(strcmp(p1->name,s)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,s)==0)//找到了要删除的数字
{
if(p1==head)//删除头结点
head=p1->next;
else//删除中间或尾结点
{
p2->next=p1->next;
}
a【p1->num-190400】=0;
p1=p1->next;
printf("删除成功!\n");
n--;
}
else
{
printf("没找到要删除的姓名%s!请重新输入\n",s);
}
}
else
{
system("cls");
printf("请根据菜单重新输入!\n");
}
}
return head;
}
View Code
Student modify(Student head);//修改信息
形参是链表的头指针,返回值是修改数据后的头指针
先输入要修改的学号或姓名,找到之后再修改信息
调用修改菜单函数:void modify_menu();
Student modify(Student head)
{
Student *p1=head;
int choice,choice1;
long num;
char s【20】;
int age;
char sex;
if(head==NULL)
{
printf("没有任何信息!\n");
return head;
}
while(1)
{
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃__0.退出__┃\n");
printf("┃__1.输入要修改的学生的学号__┃\n");
printf("┃__2.输入要修改的学生的姓名__┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("请输入选择:");
scanf("%d",&choice1);
if(choice1==0)
{
system("cls");
return head;
}
else if(choice1==1)
{
printf("要修改的学生的学号:");
scanf("%ld",&num);
p1=head;
while(p1->num!=num&&p1->next!=NULL)
{
p1=p1->next;
}
if(p1->num==num)
{
printf("当前信息:\n");
printf("学号 姓名 年龄 性别\n");
printf("%4ld %6s %7d %5c\n",p1->num,p1->name,p1->age,p1->sex);
while(1)
{
modify_menu();
printf("请输入选择:");
scanf("%d",&choice);
getchar();
if(choice==0)
{
system("cls");
break;
}
switch(choice)
{
case 1:
system("cls");
a【num-190400】=0;//修改这个学号要置零
printf("请输入修改后的学号:");
scanf("%ld",&num);
while(a【num-190400<span style="c