学生成绩管理系统实验报告

来源:互联网 发布:关键词下拉框软件 编辑:程序博客网 时间:2024/05/11 11:25

一.问题的需求分析

1.问题描述

设计一个程序实现学生成绩管理,以便管理学生成绩。

2.需求分析

(1)录入

(2)修改

(3)删除

(4)查询

(5)排序

二.抽象数据类型的设计

存储学生成绩的结构体数据

typedef struct{

char num[10];//学号

char name[20];//姓名

int date[3];//修改日期

float Chinese;//语文

float math;//数学

float English;//英语

float total;//总分

float average;//平均分

}Stu;

函数:

menu()//功能选择菜单

 

Record();//录入

——getDate()//获取系统当前日期  getTotal()//获取总分

        getAverage()//获取平均分

Input()//读取信息  OutputAll()//输出全部数据

Update();//修改

   ——Input()//读取信息     ListUpdate()//顺序列表更新数据

 

Delete();//删除

——ListDelete()//顺序列表删除数据 Output()

 

Search();//查询

——SearchOrder();//按输入顺序查找

(没有进行排序操作前使用)

SearchNum();//按学号查找  SearchName();//按名字查找

SearchChinese();//按语文成绩查找 

SearchMath();//按数学成绩查找

SearchEnglish();//按英语成绩查找

SearchTotal();//按总成绩查找

SearchAverage();//学号按平均成绩查找

SearchDate();//按日期查找

 

Sort();//排序

——SortDate()//按日期排序

SortTotal()//按总分排序

SortChinese()//按语文成绩排序

SortMath()//按数学成绩排序

SortEnglish()//按英语成绩排序

SortName()//按名字排序

SortNum()//按学号排序

exchange()//交换数据组

 

OutputAll();//输出

 

三.算法与数据结构的设计

1 数据结构设计

在对上述问题的数据进行抽象之后,确定应用以下存储结构:

typedef Stu ElemType;//基本数据设为Stu

typedef struct//顺序存储结构

{

 ElemType data[MaxSize];

 int size;

}SequenceList;

 

 

2 算法设计

线性表的顺序存储结构是最简单最常用的数据结构:用一段连续地址依次存储表中的数据元素。逻辑上和物理上都相邻。

优点:节省存储空间优点:随机存取表中元素。

缺点:插入和删除操作需要移动元素。

插入时后面的部分整体移动腾出空位给插入数据

 

 

删除时后面的部分整体移动填上空位

 

四.算法的精化与程序的实现(程序实现的核心算法)

void ListInitialize(SequenceList*L){

//顺序列表初始化

        L->size=0;

printf("初始化成功!\n");}

 

int ListInsert(SequenceList *L,inti,ElemType x){

//顺序列表插入数据

int j;

if(L->size>MaxSize)

{printf("顺序表已经满,无法插入!\n");

return 0;}

else if(i<0||i>L->size+1)

{printf("位置错误!\n");

return 0;}

else

{for(j=L->size;j>i;j--)

L->data[j]=L->data[j-1];

L->data[i]=x;

L->size++;

return 1;}

}

 

int ListDelete(SequenceList *L,inti){

//顺序列表删除数据

 

   int j;

   if(L->size<=0)

   {printf("顺序表已经空,无数据元素可删!\n");

   return 0;

   }

   else if(i<0||i>L->size+1)

   {

   printf("位置错误!\n");

   return 0;}

   else

   {

   for(j=i+1;j<=L->size-1;j++)

   L->data[j-1]=L->data[j];

   L->size--;

   return 1;}

}

 

int ListGet(SequenceList L,inti,ElemType *x){

//顺序列表获取数据

 *x=L.data[i];

   return 1;

}

 

int ListUpdate(SequenceList *L,inti,ElemType x){

//顺序列表更新数据

int j;

for(j=i+1;j<=L->size-1;j++)//删除原项

L->data[j-1]=L->data[j];

L->size--;

for(j=L->size;j>i;j--)

L->data[j]=L->data[j-1]; //插入新项

L->data[i]=x;

L->size++;

   return 1;

}

五.程序的调试与计算的结果分析

用户进入程序之后就顺序列表初始化,然后显示功能选项表,进行功能选择。

 

1.调试情况

(1)录入数据到顺序表,如上图所示。

(2)修改数据,结果如下:

(3)输出数据,结果如下:


 (4)删除数据,结果如下:


(5)查询数据,结果如下:


(6)排序数据,结果如下:


2.结果分析

整体调试过程中在更新数据的那个地方卡了很久,不能直接复制给指定的数据组,只能

六.时间代价的分析

1.顺序存储结构

平均插入元素移动次数=n/2

平均删除元素移动次数=(n-1)/2

时间复杂度度O(n)

2.冒泡排序法

比较次数=n(n-1)/2

移动次数=3 n(n-1)/2

时间复杂度为O(n^2)

空间复杂度为O(1)


0 0
原创粉丝点击