当前位置:文档之家› 数据结构课程设计

数据结构课程设计

福建工程学院课程设计
课程:数据结构课程设计
题目: 1.综合应用
2.折半查找
3.快速排序
专业:软件工程
班级:1101
座号:3110305129
姓名:潘聪
2012 年 6 月26 日
设计题目1:综合应用
一、问题描述
有N名学生,每名学生含有如下信息:学号、姓名、某四门课的成绩,并计算其总分,用一结构数组表示之。

然后实现以下功能:
(1)将这些数据存放至文件stuf.dat中;
(2)将文件中的数据读出至结构数组中,并显示之;
(3)输出总分最高分和最低分的名字;
(4)输出总分在340分,单科成绩不低于80分的名单;
(5)求出各科平均分数;
(6)按总分排名;
(7)输出补考名单。

二、解决问题的算法思想描述
(1)子函数:首先确定需要的子函数,总共7个,对应的功能分别是题目要求的七项(2)主函数:主函数中,要设计出易于使用的人机界面,就必须要用到switch 。

(3)文件的存放读取,必须要用到文件的函数,fopen,fread,fclose等。

(4)把每个学生的信息定义在一个结构数组中,利用结构数组更加方便。

(5)各科成绩排名用冒泡排序即可。

(6)输出总分,补考名单,各科的平均分都比较简单。

三、设计
1. 数据结构的设计和说明
//定义结构体
typedef struct
{
int num; //学号
char name[10]; //姓名
int score1; //语文
int score2; //数学
int score3; //物理
int score4; //化学
}student;
student stu[MAX]; //结构数组
2.模块结构图及各模块的功能:
3. 关键算法的设计(必须画出流程图)
打印最高成绩和最低成绩的名单算法流程图:
四、测试数据及测试结果:
五、课程设计总结
注意细节方面,任何一个小问题都不能忽视,才能最终解决问题。

六、关键源程序的清单
关键算法一:
按照总成绩排名:
void paiming()
{
read();
student x;
int sum[MAX],t=0,i,m,n,j;
for(i=0;i<MAX; i++)
{
sum[i]=stu[i].score1+stu[i].score2+stu[i].score3+stu[i].score4;
}
for(m=0;m<MAX-1;m++)
for(n=m+1;n<MAX;n++)
if(sum[n]>sum[m])
{
t=sum[n];
sum[n]=sum[m]; //总成绩交换
sum[m]=t;
x=stu[n];
stu[n]=stu[m]; //总成绩对应的学生也要同时交换
stu[m]=x;
}
printf("学号\t姓名\t语文\t数学\t英语\t物理\t总分\t名次\n");
for(j=0;j<MAX;j++)
{
printf("%-8d%-8s%-8d%-8d%-8d%-8d%-8d%-8d\n",stu[j].num,stu[j].name,stu[j].score1,stu[j].sc ore2,stu[j].score3,stu[j].score4,sum[j],j+1);
}
}
关键算法二:
打印出最高成绩和最低成绩的姓名:
void maxmin()
{
int sum[MAX],i,j,m=0,n=0,max,min;
read();
for(i=0;i<MAX; i++)
{
sum[i]=stu[i].score1+stu[i].score2+stu[i].score3+stu[i].score4;
} //求书每个人的总分
max=min=sum[0]; //用一维数组保存成绩,并且先令第一位学生的成绩作为最高分和最低分
for(j=0;j<MAX;j++)
{
if(sum[j]>max)
{
m=j;
max=sum[j]; //定义变量m,n分别保存最高分和最低分的下标}
else if(sum[j]<min)
{
n=j;
min=sum[j];
}
}
printf("\n最高分:%s 总分%d\n",stu[m].name,sum[m]);
printf("\n最低分:%s 总分%d\n\n",stu[n].name,sum[n]);
}
设计题目2:折半查找
一、问题描述
用折半查找法,实现对任意一组数据的查找。

(任意一组数据,意味着需要先对数据列
进行排序,然后才能用折半方法查找)
二、解决问题的算法思想描述
任意一组数据,意味着需要先对数据列进行排序,然后才能用折半方法查找,所以先用快速排序将数据从小到大排序,在运用折半查找方法。

三、设计
1. 数据结构的设计和说明
(1)快速排序;
(2)折半查找;
在有序表中,取中间元素作为比较的对象,若给定值与中间元素的关键码相等,则查找成功;若给定值小于中间元素的关键码,则在中间元素的左半区急速查找;若给定值大于中间元素的关键码,则在中间元素的右半区继续查找。

不断重复,直到查找成功。

2. 关键算法的设计(必须画出流程图)
快速排序的流程图:
折半查找流程图:
四、测试数据及测试结果:
五、课程设计总结
折半查找必须要先排序。

六、关键源程序的清单
int binsearch(Sq_Table st,KeyType kx)
{
int mid,low=1,high=st.length;
while(low<=high)
{
mid=(low+high)/2;
if(kx==st.r[mid].key)
return mid;
if(kx>st.r[mid].key)
low=mid+1;
else
high=mid-1;
}
return 0;
}
设计题目3:快速排序
一、问题描述
实现对任意一组数据的快速排序。

二、解决问题的算法思想描述
运用快速排序的算法就可解决问题。

三、设计
1. 数据结构的设计和说明
快速排序:快速排序是交换排序的一种,实际上是冒泡排序的一种改进。

快速排序的基本思想是:以某个记录(一般去第一个记录)为标准,也就是支点,通过划分,将待排序序列分成两组,其中一组中所有记录的关键码均大于等于记录的关键码,另一组中的左右记录的关键码均小于支点记录的关键码。

2. 关键算法的设计(必须画出流程图)
快速排序流程图见上面一题。

四、测试数据及测试结果:
六、关键源程序的清单
int Partition(RecNode r[],int low,int high)
/*r[low..high]存放待排记录,算法返回支点最终位置*/ {
if(low>high)
return 0;
if(low==high)
return low;
r[0]=r[low]; /*缓存支点记录*/
while(low<high)
{
while(low<high&&r[high].key>=r[0].key)
high--; //查看high记录
if(low<high)
{
r[low]=r[high];
low++;
}
while(low<high&&r[low].key<r[0].key)
low++;
if(low<high)
{
r[high]=r[low];
high--;
}
}
r[low]=r[0]; /*支点记录最终位置*/
return low;
}
void Quick_sort(RecNode r[], int m, int n)
/*对顺序表r[m..n]作快速排序,m初值为1*/
{ int i;
i= Partition(r,m,n);
if(m<i)
Quick_sort(r,m,i-1);
if(i<n)
Quick_sort(r,i+1,n);
}。

相关主题