算法与数据结构课程设计.docx
《算法与数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《算法与数据结构课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
算法与数据结构课程设计
《算法与数据结构》课程设计报告
题目:
竞赛得分统计
专业:
班级:
学号:
姓名:
指导教师:
完成日期:
2012年6月23日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、课程设计内容
通过创建顺序表,对顺序表进行插入运算,查找运算的过程,并且通过使用快速排序实现算法的运算。
3、课程设计过程
(1)首先,创建一个顺序表里面包含班级名,班级序号,和成绩。
方便自己对顺序表进行查找以及插入。
设score[0]--score[2]为成绩,score[3]为总分
(2)通过采用快速排序的方法,对所输入的总分进行从升序排序,对所输入的成绩进行快速排序。
(3)写函数实现可以输入各个科目的前三名或前四名的成绩的功能,用循环语句控制向顺序表中插入班级名称,班级序号和各科成绩。
并用输出语句提示。
1.需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
并明确规定:
(1)要求输入班级名称,班级号以及前三名同学的成绩。
(2)要求输出班级成绩总和。
(3)班级积分根据第一名是5分,第二名3分,第三名1分的规则计算各班级的总积分。
(4)通过班级编号查询班级某个科目竞赛的情况。
2.概要设计
为了实现上述功能使用顺序表存储,通过顺序表对数据进行查找,插入,运算。
#include"stdio.h"
#include"string.h"
#include"process.h"
#definem3//科目数
structCLASS//构造班级
{
charcname[20];//班级名
intnum;//班级序号
intscore[4];//score[0]--score[2]为成绩,score[3]为总分
}CLA[6];
需要有四个函数实现其功能利用快速排序对成绩对总分进行排序输出
voidchoice1(inta)//操作1输入各个科目的前三名或前四名的成绩
插入数据scanf("%s",CLA[a]);
voidchoice2(intb)//操作2
用for(i=0;ivoidchoice3(intc)//操作3
quicksort1(r,s,t);//调用总分快速排序quicksort1
printf("Score:
%d.\n",r[i]);//输出总分
voidchoice4(intd)//操作4
if(CLA[x].score[y]==S[0])//成绩积分判定实现积分制
f=1;
voidmain()//主函数
scanf("%d",&q);
for(w=0;w可以实现循环操作
通过主函数调用上述实现功能的函数,在主函数中实现主菜单的提示和函数的调用,便于使用,可观。
printf("************CompetitionScoringStatistics************\n");//操作提示界面
操作3可以按班级编号、班级总分排序输出调用快速排序实现
3.详细设计
(1) 构造顺序表
#include"stdio.h"
#include"string.h"
#include"process.h"
#definem3//科目数
structCLASS//构造班级
{
charcname[20];//班级名
intnum;//班级序号
intscore[4];//score[0]--score[2]为成绩,score[3]为总分
}CLA[6];
用快速排序处理成绩总分
intstack[200],td;//总分快速排序
intpushstack(inta)
intpopstack()//总分快速排序
voidquicksort1(intr[],ints,intt)//总分快速排序
intstack2[200],sp2;//成绩快速排序
voidquicksort2(intS[],intu,intv)//成绩快速排序
(2)函数实现功能
voidchoice1(inta)//操作1输入各个科目的前三名或前四名的成绩
voidchoice2(intb)//操作2
voidchoice3(intc)//操作3
voidchoice4(intd)//操作4
voidmain()//主函数
提示界面
printf("Pleasechoosetheoperations:
\n");
printf("1.Pleaseentertheresultsofeachclassofsubjects.\n");
printf("2.Outputtotalforeachclassresults.\n");
printf("3.Outputscoresortresults.\n");
printf("4.Refertothecaseofanyclass.\n");
printf("5.Exit.\n");
printf("********************************************************\n");
scanf("%d",&q);
for(w=0;w
4.调试分析
内容包括:
5.用户使用说明
#include"stdio.h"//加载头文件
#include"string.h"//加载头文件
#include"process.h"//加载头文件
#definem3//科目数
structCLASS//构造班级
{
charcname[20];//班级名
intnum;//班级序号
intscore[4];//score[0]--score[2]为成绩,score[3]为总分
}CLA[6];
intstack[200],td;//总分快速排序
intpushstack(inta)
{
td+=1;
stack[td]=a;
return0;
}
intpopstack()//总分快速排序
{
if(td<0)
return0;
else
{
td--;
return(stack[td+1]);
}
}
voidquicksort1(intr[],ints,intt)//总分快速排序
{
inti,j,temp;
i=s;j=t;temp=r[s];
while(j>i)
{
while((r[j]>=temp)&&(ij--;
if((j>i)&&(r[j]{
r[i]=r[j];
r[j]=temp;
i++;
}
while((r[i])<=temp&&(ii++;
if((j>i)&&(r[i]>temp))
{
r[j]=r[i];
r[i]=temp;
j--;
}
}
if(s<(i-1))
{
pushstack(s);
pushstack(i-1);
}
if(t>(i+1))
{
pushstack(i+1);
pushstack(t);
}
}
intstack2[200],td2;//成绩快速排序
intpushstack2(inta)
{
td2+=1;
stack2[td2]=a;
return0;
}
intpopstack2()//成绩快速排序
{
if(td2<0)
return0;
else
{
td2--;
return(stack2[td2+1]);
}
}
voidquicksort2(intS[],intu,intv)//成绩快速排序
{
inti,j,temp;
i=u;j=v;temp=S[u];
while(j>i)
{
while((S[j]>=temp)&&(ij--;
if((j>i)&&(S[j]{
S[i]=S[j];
S[j]=temp;
i++;
}
while((S[i])<=temp&&(ii++;
if((j>i)&&(S[i]>temp))
{
S[j]=S[i];
S[i]=temp;
j--;
}
}
if(u<(i-1))
{
pushstack2(u);
pushstack2(i-1);
}
if(v>(i+1))
{
pushstack2(i+1);
pushstack2(v);
}
}
voidchoice1(inta)//操作1
{
inti,j;
printf("\nPleaseinputclass-nameclass-numMath-sHistory-sChinese-s:
\n");
printf("Suchas:
Rj1003909192\n");//输入示例
printf("________________________________________________________\n");
for(i=0;i{
getchar();
scanf("%s",CLA[i].cname);//输入班级名
scanf("%d",&CLA[i].num);//输入班级序号
for(j=0;j<3;j++)//输入各科目成绩
scanf("%d",&CLA[i].score[j]);
}
}
voidchoice2(intb)//操作2
{
inti,j;
for(i=0;i{
CLA[i].score[3]=0;
for(j=0;j<3;j++)
CLA[i].score[3]+=CLA[i].score[j];
printf("%s",CLA[i].cname);
printf("%d",CLA[i].num);
printf("totalscoreis:
");
printf("%d.\n",CLA[i].score[3]);
}
}
voidchoice3(intc)//操作3
{
inti,j,s,t;
intr[10];//r[i]存储各班总分进行下步排序
for(j=0;j<3;j++)
r[j]=CLA[j].score[3];
td=-1;
pushstack(0);
pushstack(3-1);
while(td>=0)
{
t=popstack();
s=popstack();
quicksort1(r,s,t);//调用总分快速排序quicksort1
}
printf("\n");
for(i=0;i<3;i++)
{
printf("Grade:
%d,",CLA[i].num);//输出班级编号
printf("Score:
%d.\n",r[i]);//输出总分
}
}
voidchoice4(intd)//操作4
{
intx,y,j,u,v,f;
intS[10];
printf("Pleaseinputthenumberofclass.\nSuchas0:
class1,1:
class2,2:
class3.\n");
printf("________________________________________________________\n");
scanf("%d",&x);
if(x<3)
{
printf("%s",CLA[x].cname);
printf("%d:
\n",CLA[x].num);
printf("Thenumberofsubjects.\nSuchas0:
Math,1:
History,2:
Chinese.\n");
printf("________________________________________________________\n");
scanf("%d",&y);
if(y<3)
{
for(j=0;j<3;j++)
S[j]=CLA[j].score[y];
td2=-1;
pushstack2(0);
pushstack2(3-1);
while(td2>=0)
{
v=popstack2();
u=popstack2();
quicksort2(S,u,v);//调用成绩快速排序quicksort2
}
if(CLA[x].score[y]==S[0])//成绩积分判定
f=1;
if(CLA[x].score[y]==S[1])
f=3;
if(CLA[x].score[y]==S[2])
f=5;
printf("\n");
printf("Score:
%d.",CLA[x].score[y]);
printf("Theintegralofscoreis%d.\n",f);
}
else
printf("Error.\n");
}
else
printf("Error.\n");
}
进入操作界面:
voidmain()//主函数
{
intz,q,w;
printf("************CompetitionScoringStatistics************\n");//操作提示界面
printf("Pleasechoosetheoperations:
\n");
printf("1.meansinputthescoreofeachclassofsubjects.\n");
printf("2.meansOutputtotalscoreofclass.\n");
printf("3.meansOutputscoresortresultsofclassaccordingtoclassnumber.\n");
printf("4.Refertothecaseofanyclassaccordingtotheclassnumber.\n");
printf("5.Exit.\n");
printf("pleaseinputanumberbetween1and5\n");
printf("********************************************************\n");
scanf("%d",&q);
for(w=0;w{
scanf("%d",&z);
if(z==1)//进入操作1
choice1(z);
else
{printf("\nWrongchoice.Automaticintooperation1\n");//提示选择错误
choice1(z);//自动进入操作1
}
printf("\nPleasechoosethenextstepofoperation.\n");
printf("______________________________________\n");
scanf("%d",&z);
if(z==2)//进入操作2
choice2(z);
else
{printf("\nWrongchoice.Automaticintooperation2.\n");
choice1(z);
}
printf("\nPleasechoosethenextstepofoperation.\n");
printf("______________________________________\n");
scanf("%d",&z);
if(z==3)//进入操作3
choice3(z);
else
{printf("\nWrongchoice.Automaticintooperation3.\n");
choice3(z);
}
printf("\nPleasechoosethenextstepofoperation.\n");
printf("___________________________________\n");
scanf("%d",&z);
if(z==4)//进入操作4
choice4(z);
else
{printf("\nWrongchoice.Automaticintooperation4.\n");
choice4(z);
}
printf("\nPleasechoosethenextstepofoperation.\n");
printf("______________________________________\n");
scanf("%d",&z);
if(z==5)//进入操作5
exit(0);
}
}
6.测试结果
运行环境visualC++6.0
调用总分的快速排序
7.附录
带注释的源程序。
如果提交源程序软盘,可以只列出程序文件名的清单。
四、课程设计体会
在此次的算法课程设计过程中,通过对“竞赛得分统计”程序的设计,是我更了解了算法的一些基本的运算等等,例如如何使用快速排序等方面的一些操作。
首先对线性表的存储也有了一些新的认识和了解,学会了如何进行一些基本的运算,例如:
插入,查找等。
在实验的实践检验过程中,以及上机操作的过程中,通过慢慢的了解设计的整体概念,不断改进自己的程序,慢慢去调试,使自己的程序在自己的实践过程中得到实现,让我学会了很多。
虽然在实验过程中也会遇到各种的问题,例如,可能程序中的某个环节出错了,可能是因为自己的疏忽,可能是自己的键盘输入导致的错误,或者是一些变量定义的不符合,让自己认真去检查自己的程序,经过修改,调试,完善自己的程序。
这是一种很有意义的实践过程。