数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(35页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
课程设计报告册
2011——2012学年度第一学期
计算机院/系信息管理与信息系统专业09年级1班
课程名称:
《数据结构课程设计》
1、程序设计与实现
(1)学生成绩管理系统…………………………………………………………3
1.需求分析…………………………………………………………………3
2.概要设计…………………………………………………………………3
3.详细设计…………………………………………………………………4
4.调试分析…………………………………………………………………8
(2)文章编辑……………………………………………………………………12
1.需求分析…………………………………………………………………12
2.概要设计…………………………………………………………………12
3.详细设计…………………………………………………………………12
4.调试分析…………………………………………………………………19
(3)运动会分数统计……………………………………………………………24
1.需求分析…………………………………………………………………24
2.概要设计…………………………………………………………………24
3.详细设计…………………………………………………………………25
4.调试分析…………………………………………………………………29
2、课程设计总结……………………………………………………31
附录……………………………………………………………………32
教师评语………………………………………………………………34
1、程序设计与实现
(1)学生成绩管理系统
1.需求分析
用c语言编写一个简单的学生信息管理程序,能实现对学生信息的简单管理。
本程序可对5个学生成绩进行管理,可以按降序输出学生总成绩,可以按学号作为关键字查询学生成绩,可以执行退出程序命令。
1)INPUT:
对5个学生的信息进行输入;
2)SORT:
对5个学生的总分按降序排序并显示出来;
3)QUERY:
输入一个学号后,查询显示出该学生的有关信息;
4)
EXIT:
退出。
2.概要设计
程序设计流程图:
本程序采用数组存储方式存储数据;
3.详细设计
#include
#include
structstu1/*采用结构体定义学生结点*/
{
intnum;
charname[20];
ints[3];
intscore;
};
structstu1student[5];/*建立一个长度为5的结构体数组*/
voidinput();
voidsort();
voidquery();
main()/*主程序*/
{
inti=1;
while(i!
=0)/*菜单界面设置*/
{
printf("\n\n*Thanksforusingstudentachievementsearchsystem!
*\n");
printf("\n--------------Menu----------------\n\n");
printf("|1.inputscores|\n\n");
printf("|2.sortscores|\n\n");
printf("|3.findscores|\n\n");
printf("|4.exit|\n\n");
printf("------------------------------\n\n");
printf("Pleasechooseonetocontinue:
");
a1:
scanf("%d",&i);
if(i<1||i>4)
{
printf("\nYouroperationiswrong,pleasechooseagain:
");
gotoa1;
}/*跳出多重循环并执行a1*/
switch(i)/*菜单选择*/
{
case1:
input();break;
case2:
sort();break;
case3:
query();break;
case4:
exit(0);
}/*选择4时退出程序*/
}
printf("PleasepressENTERtoexit");
getchar();
getchar();
}
voidinput()/*学生信息输入*/
{
intk;
printf("\n\n\nPleaseinputthestudent'sinformation:
\n\n1.number2.name3.mark14.mark25.mark3\n");
for(k=0;k<5;k++)/*利用for循环输入信息,学生学号默认为1~5*/
{
scanf("%d%s%d%d%d",&student[k].num,student[k].name,&student[k].s[0],&student[k].s[1],&student[k].s[2]);
student[k].score=student[k].s[0]+student[k].s[1]+student[k].s[2];
}
}
voidsort()/*学生成绩总分降序排列*/
{
inttmp1,i,j,tag=1;
chartmp2[8];
structstu1student2[5];
for(i=0;i<5;i++)
{
student2[i].num=student[i].num;
strcpy(student2[i].name,student[i].name);
student2[i].score=student[i].score;
}
for(i=0;i<4&&tag==1;i++)
{
for(j=0;j<4-i;j++)
{
if(student2[j].score{
tmp1=student2[j].num;student2[j].num=student2[j+1].num;student2[j+1].num=tmp1;
strcpy(tmp2,student2[j].name);strcpy(student2[j].name,student2[j+1].name);strcpy(student2[j+1].name,tmp2);
tmp1=student2[j].score;student2[j].score=student2[j+1].score;student2[j+1].score=tmp1;
tag=1;
}
}
}/*冒泡法,使用双循环把总分相对较高的学生信息向上移动*/
printf("\n");
printf("number\tname\tscore\n");
for(i=0;i<5;i++)/*通过循环把学生信息通过列表的形式显示出来*/
printf("%d\t%s\t%d\n",student2[i].num,student2[i].name,student2[i].score);
printf("\n\nPleasepressENTERtoreturnMenu!
!
");
getchar();
getchar();
}
voidquery()/*输入学号并查询学生信息*/
{
intn,t=0;
intf;
charj;
printf("\nPleaseinputthenumyouwanttofind:
");
a1:
scanf("%d",&n);
for(f=0;f<5;f++)
{
if(n==student[f].num)
{
printf("numnamemark1mark2mark3score\n");
printf("%d%s%d%d%d%d",student[f].num,student[f].name,student[f].s[0],student[f].s[1],student[f].s[2],student[f].score);
t=1;
break;}
elset=0;
}
if(t==0)
{
printf("\nItisthewrongnumber,pleaseinputagain:
");
gotoa1;
}
printf("\n\nDoyouwanttocontinue?
[YorN]");
scanf("%c",&j);
j=getchar();
getchar();
if(j=='y'||j=='Y')
{
printf("\nPleaseinputthenumyouwanttofind:
");
gotoa1;
}
printf("\nPleasepressENTERtoreturnMenu!
");
getchar();
}
4.调试分析
1)调试过程所遇到的问题:
输入学号时,带有字母,运行出现死循环;
解决方案:
输入学号时,输入的必须是数字。
2)测试数据和测试结果:
测试数据1:
Number
Name
Mark1
Mark2
Mark3
1
Momo
85
83
90
2
Kaka
76
80
85
3
Nono
90
77
80
4
Lily
66
89
90
5
Jojo
50
78
88
测试数据2:
Number
Name
Mark1
Mark2
Mark3
1
Tina
95
80
77
2
Anna
67
83
90
3
Yoga
80
69
88
4
Mini
90
65
92
5
Papa
78
60
56
测试结果:
测试结果1:
测试结果2:
(2)文章编辑
1.需求分析
用C++设计一个程序,输入一行文字(可以输入大写、小写的英文字母,任何数字及标点符号),程序可以统计出文字、数字、空格的个数。
1)分别统计出其中英文字母数和空格数及总字数;
2)统计某一字符串出现的次数,并输出该次数;
3)删除某一符号,并将后面的字符前移。
2.概要设计
While循环主菜单,进入程序后,用gets(str)录入字符串,程序利用isalpha(),isdigit(),strlen()等函数实现对一字符串的字符统计;再进入主功能菜单,分别有四个功能,统计字符数(子程序利用isalpha()和strlen()函数实现统计)、计算字符重复次数、删除还有退出。
其中除了退出功能外,其余三种功能都有各自的子程序完成其任务算法。
3.详细分析
#include
#include
#include
#defineMAX500
voidmain()
{
charstr[MAX];
inta=1;
intb,c,d;
//clrscr();
printf("\nPleaseinputstring:
\n");
gets(str);
while(a>=1&&a<=4)
{
printf("\n-----------------------------------MainMenu----------------------------------");/*主菜单界面设置*/
printf("\n1.statisticalinputsstringofthecharacternumber(Letter,Figure,Space,Punctuation).");
printf("\n2.countthestringrepetitionsnumber.");
printf("\n3.deletethecharacter.");
printf("\n4.exit.");
printf("\n--------------------------------------------------------------------------------\n");
printf("\nPleasechooseonetocontinue:
");
scanf("%d",&a);
if(a<1||a>4)
{
printf("\nYouroperationiswrong!
Pleasechooseagain!
");
scanf("%d",&a);
}/*!
a*/
if(a==1)
{
c=func1(str);
if(c==1)
continue;
}/*a=1*/
if(a==2)
{
c=func2(str);
if(c==1)
continue;
}/*a=2*/
if(a==3)
{
func3(str);
}/*a=3*/
if(a==4)
{
printf("\nDoyoureallywanttoquit?
Continuetopress1,exitpleasepress0.");
scanf("%d",&b);
printf("\nThankyouforyouruse!
");
break;
}/*a=4*/
}/*while*/
}/*main*/
intfunc1(charstr[MAX])/*调用func1函数*/
{
inti=1,j;
inte,d,a,c,sp,sy;
while(i>=1&&i<=6)
{
e=0;
d=0;
sp=0;
sy=0;
a=0;
printf("\n\n1.Letter");
printf("\n2.Figure");
printf("\n3.Space");
printf("\n4.Punctuation");
printf("\n5.Allcharacters");
printf("\n6.Return");
printf("\nPleasechooseonetocontinue:
");
scanf("%d",&i);
if(i<1||i>6)
{
printf("\nYouroperationiswrong!
Pleasechooseagain!
(Pleasepressanykeytoreturn!
)");
scanf("%d",&i);
continue;
}/*!
i*/
if(i==1)
{
for(j=0;j{
if(isalpha(str[j])!
=0)
{
e=e+1;
}/*e*/
}/*for*/
printf("\n");
puts(str);
printf("ThenumberofLetters:
%d",e);/*统计文章里字母的个数*/
}/*i=1*/
if(i==2)
{
for(j=0;j{
if(isdigit(str[j])!
=0)
{
d=d+1;
}/*d*/
}/*for*/
printf("\n");
puts(str);
printf("\nThenumberofFigures:
%d",d);/*统计文章里数字的个数*/
}/*i=2*/
if(i==3)
{
for(j=0;j{
if(str[j]=='')
{
sp=sp+1;
}/*sp*/
}/*for*/
printf("\n");
puts(str);
printf("ThenumberofSpaces:
%d",sp);/*统计文章里空格键的个数*/
}/*i=3*/
if(i==4)
{
for(j=0;j{
if(isdigit(str[j])!
=0)
{
d=d+1;
}/*d*/
if(isalpha(str[j])!
=0)
{
e=e+1;
}/*e*/
if(str[j]=='')
{
sp=sp+1;
}/*sp*/
}/*for*/
sy=strlen(str)-sp-e-d;
printf("\n");
puts(str);
printf("ThenumberofPunctuations:
%d",sy);/*统计文章里标点符号的个数*/
}/*i=4*/
if(i==5)
{
a=strlen(str);/*把长度赋值给a*/
printf("\n");
puts(str);
printf("Totalcharacternumber:
%d",a);/*统计文章里全部字符的个数*/
}/*i=5*/
if(i==6)
{
c=1;
return(c);
}/*i=6*/
}/*while*/
c=1;
return(c);
}/*func1*/
intfunc2(charstr[MAX])/*调用func2函数*/
{intc,b=1;
intlstr,lchi;
inti,j,count;
charchi[30];
while(b==1)
{
count=0;
printf("\nThestringyouwanttocount:
");/*输入要查询的字符串*/
scanf("%s",chi);
lstr=strlen(str);
lchi=strlen(chi);
if(lstr<=lchi)
{
printf("%d",count);
printf("Beyondtheinputrange,inputagainpleasepress1,returnpleasepress0!
");
scanf("%d",&b);
}/*lstr<=lchi*/
for(i=0;i{
if(str[i]==chi[0])
{
for(j=0;j{
if(str[i+j]!
=chi[j])
{
break;/*跳出循环*/
}/*if*/
}/*for*/
if(j==lchi)
{
count++;
}/*j=lchi*/
}/*if*/
}/*for*/
printf("\n");
puts(str);
printf("\nThisstringrepeated%d.",count);
printf("\nContinuetocountpleasepress1,returnpleasepress0!
");
scanf("%d",&b);
}/*while*/
c=1;
return(c);
}/*func2*/
intfunc3(charstr[MAX])/*调用func3函数*/
{
intc,b=1;
inti,j,e,t=0;
chard[1];
while(b==1)
{
t=0;
printf("\nPleaseinputthecharacteryouwanttodelete:
");/*输入要删除的字符*/
scanf("%s",&d[0]);
for(i=0;i{
if(d[0]==str[i])
{
t=t+1;
e=i;
for(j=i;j{
str[j]=str[j+1];
}/*for*/
str[j]='\0';
i=e-1;
}/*if*/
}/*for*/
if(t==0)
{
printf("\nItcannotbefoundinthestring%s\n",d);
}/*t*/
puts(str);
printf("\nIfyouwanttodeleteagainpleasepress1,returnpleasepress0!
");
scanf("%d",&b);
}/*while*/
c=1;
return(c);
}/*func3*/
4.调试分析
1)调试过程所遇到的问题:
在执行删除命令时,输入删除的字符时输入两个字母,结果只能删除一个,达不到删除的和输入的字符一致;
解决方案:
输入所要删除的字符时,只能输入一个才能达到删除的和输入的结果一致,如果要删除多个,可分多次删除。
2)测试数据和测试结果:
测试结果1:
测试结果2:
(3)运动会分数统计
1.需求分析
任务:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个项目,项目编号为男子1……m。
项目取前五名积分;积分分别为:
7、5、3、2、1;(m<=20,n<=20)
用C++编写一个运动会分数统计程序,此程序的功能要求:
1)可以输入各个项目的前五名的学校编号;
2)能统计各学校总分;
3)可以按学校编号输出、学校总分排序输出,输出内容包括学校编号,总分和名次;
4)可以按学校编号查询学校各个项目的情况。
2.概要设计
1)该程序包括两个结构体分别为:
structnode1项目信息;
structnode2学校信息;
2)程序分为5个模块:
初始化学校及项目的信息,依次输入每个学校的信息,根据每个学校的成绩计算对应的得分,生成运动会分数排名表,并输出放在数组2中,再进入查询功能。
3.详细设计
#include
structnode1
{
intarray;
intnum;
intscore[20];
inttotal;
intranki