一、需求分析
系统名称为:学生信息管理系统。它包括了浏览、插入、删除、查找、修改,并对学生信息进行排序的功能。
二、概要设计
1、主程序的流程说明
在主函数中,运用顺序表和结构体来实现,学生管理系统的浏览、插入、删除、查找、修改,并对学生信息进行排序。
2、程序中用到的数据逻辑结构描述及其上定义的函数的描述
集合结构:在结构体中定义的学生的各项信息属于一个集合,是集合结构。线性结构:顺序表:在进行存储学生信息时每个学生的信息以顺序表的形式保存学生信息。每一个集合组合在一起构成了线性结构。
3、存储表示
typedef struct
{
char sno[14];
char sname[7];
char sex[3];
int score;
}student;
#define INIT_SIZE 100
#define INCREMENT 10
typedef student ElemType;
typedef struct
{ ElemType *elem;
int length;
int listsize;
}SqList;
三、详细设计
1.各功能模块设计
1)初始化
功能分析
为顺序表分配一个预定义大小的数组空间。
流程图
代码实现case语句
int InitList_Sq(SqList *L)
{
L->elem=(ElemType *)malloc(INIT_SIZE*sizeof(ElemType));
if(!L->elem) return 0;
L->length=0;
L->listsize=INIT_SIZE;
return 1;
}
2)浏览
功能分析
在主函数中通过对查看函数的调用来实现学生信息的显示。首先定义一个查看学生信息的函数(ListDisplay_Sq(SqList L)),通过判断L.length的值,用printf语句输出学生信息。当L.length大于等于1时用for语句进行循环输出,当L.length小于1显示“当前为空表!”。
流程图
代码实现case语句
printf("\n此功能可以浏览学生信息\n\n");
ListDisplay_Sq(&SL);
printf("表中元素个数共%d个\n\n",SL.length);
system("pause");break;
3)插入
功能分析
在表L中的第i-1个元素和第i个元素之间插入一个新的元素e。用存储位置的相邻来体现数据元素之间的逻辑关系。
流程图
代码实现case语句
printf("\n此功能可以插入学生信息\n\n");
p=1;
while(p==1)
{
printf("请输入插入学生的信息:\n");
printf("请输入插入学生学号:"); scanf("%s",x.sno);
printf("请输入插入学生的姓名:"); scanf("%s",x.sname);
printf("请输入插入学生的性别:"); scanf("%s",x.sex);
printf("请输入插入学生的成绩:"); scanf("%d",&x.score);
printf("请输入将学生插入到的位置(0-%d):",SL.length);
scanf("%d",&q);
ListInsert_Sq(&SL,q,x);
printf("插入后表中元素有:\n");
ListDisplay_Sq( &SL);
printf("是否继续输入(1表示继续插入,0表示终止插入):");
scanf("%d",&p);
}
printf("终止信息的插入!\n");
system("pause");break;
4)删除
功能分析
当进行删除学生信息时,其中,当i值不合法时,删除失败,而删除1号学
生信息时,后边的学生信息依次向前移动,2号学生信息移到1号学生的位置,并修改了线性表当前长度length的值,此时删除成功。
流程图
代码实现case语句
printf("\n此功能可以删除学生信息\n\n");
p=1;
while(p==1)
{
printf("请输入要删除学生的位序(0—%d):",SL.length-1);
scanf("%d",&loc);
ListDelete_Sq(&SL,loc,&x);
printf("删除后表中元素有:\n");
ListDisplay_Sq( &SL);
printf("是否继续删除(1表示继续,0表示终止):");
scanf("%d",&p);
}
printf("终止信息的删除\n");
system("pause");break;
5)查找
功能分析
当输入想要查找的学生姓名后,可以将该学生的信息输出。具体是在主控菜单中输入4,进入查找功能界面,并输入想要查找的学生姓名,来完成对该学生所有信息的输出。
流程图
代码实现case语句
printf("\n此功能可以查找学生信息\n\n");
printf("请输入待查学生的姓名");
scanf("%s",key);
loc=Search_Seq(SL,key);
if(loc==-1)
printf("所查学生不存在!\n");
else
{
printf("学号\t\t姓名\t\t性别\t\t成绩 \n");
printf("%-16s%-16s%-16s%-16d\n\n",SL.elem[loc].sno,SL.elem[loc].sname,SL.elem[loc].sex,SL.elem[loc].score);
}
system("pause");break;
6)修改
功能分析
主要负责修改学生信息数据,具体内容为在主控菜单中输入5,进入修改界面,并输入想要修改的学生姓名,来完成对该学生信息的修改。
流程图
代码实现case语句
printf("\n此功能可以修改学生信息\n\n");
printf("请输入待查学生的姓名");
scanf("%s",key);
loc=Search_Seq(SL,key);
if(loc==-1)
printf("所查学生不存在!\n");
else
{
printf("学号\t\t姓名\t\t性别\t\t成绩 \n");
printf("%-16s%-16s%-16s%-16d\n\n",SL.elem[loc].sno,SL.elem[loc].sname,SL.elem[loc].sex,SL.elem[loc].score);
printf("是否要修改此学生的信息???(修改请输入1):");
scanf("%d",&q);
if(q==1)
{
printf("请输入修改后的学生学号:");
scanf("%s",SL.elem[loc].sno);
printf("请输入修改后的学生姓名:");
scanf("%s",SL.elem[loc].sname);
printf("请输入修改后的学生性别:");
scanf("%s",SL.elem[loc].sex);
printf("请输入修改后的学生成绩:");
scanf("%s",SL.elem[loc].score);
}
}
system("pause");break;
7)排序
功能分析
在学生管理系统中,根据一定的规则对学生信息通过直接插入排序、冒泡排序、直接选择排序对学生成绩进行排序,使其更加便于观察。
流程图
代码实现case语句
printf("直接插入排序后的结果为:");
InsertSort(SL);
ListDisplay_Sq(&SL);
printf("冒泡排序后的结果为:");
Bullbe_sort(SL);
ListDisplay_Sq(&SL);
printf("直接选择排序后的结果为:");
Selectsort(SL);
ListDisplay_Sq(&SL);
system("pause");break;
四、调试分析
1.问题与对策
(1)问题:函数调用写错了,没有搞清楚传递的参数。
对策:将传递参数改为SL。
(2)问题:浏览函数中分配存储位置的循环出现bug。
对策:把0换成变量i。
2.基本操作的算法复杂度分析
(1)浏览的算法复杂度分析
时间复杂度:
i=0;执行1次
i<L.length;执行n次
i++;执行n次
总的执行次数为2n+1,因此该算法的时间复杂度为T(n)=O(2n+1)=O(n).
空间复杂度:算法的辅助空间是一个控制变量i,共n个,所以S(n)=n=O(n)
(2)插入的算法复杂度分析
时间复杂度:在顺序表的插入操作中,其时间主要消耗在插入位置的插入位置的若干数据元素的移动上。要在第i个位置插入元素e,则从ai到an-1都要向后移动一个位置,共移动(n-i)个元素。当有n+1个位置可以插入时,则平均移动数据元素的次数为n/2,则时间复杂度为O(n)。
(3)删除的算法复杂度分析
时间复杂度:在顺序表的删除操作中,其时间主要消耗在删除元素之后的其他数据元素的移动上,要删除第i个元素,其后面的元素ai+1到an-1都要向前移动一个位置,共移动(n-i-1)个元素,则平均移动数据元素的次数为n-1/2,则该算法的时间复杂度为O(n)。