例如以关键字{20,95,33,21,55,44,61,91}为例:
第一趟排序为:
20,44,33,21,55,95,61,91
第二趟排序为:
20,21,33,44,55,91,61,95
第三趟排序为:
20,21,33,44,55,61,91,95
其算法为:
voidShellsort(SeqList*L)
{
inti,j;
intincrement=L->len;
do{
increment=increment/3+1;/*增量序列*/
for(i=increment+1;i<=L->len;i++)
{if(L->data[i].score>L->data[i-increment].score)/*需将L->r[i]插入有序增量子表*/
{
L->data[0]=L->data[i];/*暂存在L->r[0]*/
for(j=i-increment;j>0&&L->data[0].score>L->data[j].score;j-=increment)
L->data[j+increment]=L->data[j];/*记录后移,查找插入位置*/
L->data[j+increment]=L->data[0];/*插入*/
}
}
}while(increment>1);
}
voidRank(SeqList*L)/*计算选手名次*/
{
inti;
L->data[1].tax=1;
for(i=2;i<=L->len;i++)
if(L->data[i-1].score==L->data[i].score)
L->data[i].tax=L->data[i-1].tax;
else
L->data[i].tax=L->data[i-1].tax+1;
printf("正在计算选手名次请稍后\n排序成功\n");
}
3.4程序预计实现结果
本程序在c++6.0中运行:
1.输入的形式和输入值的范围:
由于本程序主要运用于观众投票以及选手信息的输入,所以输入的形式是数字及字符,范围不限;
2.输出的形式:
根据观众投票情况输出排名情况
3.程序实现的功能:
实现观众投票以及选手得分情况的排名
4.测试数据:
a.输入选手的个数以及每个选手的信息输入“4”“a s d f”
b.根据菜单输入选号“2”输出“1号a得分是0,排名是0;2号s得分是0,排名是0;3号d得分是0,排名是0;4号f得分是0,排名是0;”
c.给选手投票,输入“1 2 3 3 3 3 4 3 2 2 1 0”。
d. 根据菜单输入选号“4”,输出排序结果及名次。
e.根据菜单驶入选号“5”,保存输出文件
f.根据菜单选号“6”,退出程序。
第四章方案的调试及测试结果与分析
4.1调试过程
1、在刚开始编程的时候经常会碰到一些低级编写错误例如漏分号大括号不匹配等经过仔细修改已能正常运行;
2、本程序的模块划分简单而合理,在操作方面比较容易,运用顺序表来存储选手信息;
3、在程序完成后但由于输入选手姓名后不能根据名字长短自动判断自动判断对齐编号列表,后来经过老师指导并请教同学优化代码,在输入名字后按下TAB键就能自动对齐编号列表,程序更加人性化。
4、本实验程序设计中,将程序分为五个模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。
4.2调试结果与分析
(1)输入选手信息界面
(2)投票界面
(3)排序界面
(4)排序结果页面
(5)保存到文件
(6)保留到文件的界面:
经编译完成,此次设计程序已完成选手信息输入、投票、排序及保存到文件等功能
第五章课程设计分析总结与心得体会
此次实习为期一周,时间虽然不多但是我学到了很多,也知道了很多的不足。
通过老师的精心指导带领下,我不仅获得了很多新知识,还好好复习了一下以前学的知识。
作为一个电子专业的学生,C语言是一门必须要熟练掌握的重要语言。
在这之前,我们已经对C语言这门课程学习了一个学期,对其有了一定的了解,但是更多的还是停留在学习了解的范围,对里面的好多东西还是很陌生,并不是很熟练,有着许多欠缺,更多的在运用起来的时候还是感到很不好动手。
C语言课堂上许多关于C语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。
然而要使用C语言这个工具解决实际问题,又必须掌握它。
通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握C语言的语法规定。
对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,更加巩固了学过的知识,而且在设计的时候学要系统的知识,也是一个较大的挑战,某一方面知识的欠缺都将影响到整个程序的设计。
我所编的虽然只是一个小程序,但是每一步的编的过程,让我懂得很多。
重温一下C语言,因为过了计算机二级,因而编程比较容易懂,但是通过练习,发现理论与实际的差距。
编程从一开始全部编到一个main函数中到,最后逐个分块,到添加功能,到最后的进行代码的优化,使程序的可用性和智能性都有进一步的提高,一点一点的进步让我很欣喜,对编程的兴趣也更加浓厚。
此次实习,不仅了有关c语言的知识,还掌握了一些现实中编程的一些小技巧,实际的编程能力也得到了历练,本次课程设计是很好的一次锻炼机会!
附录程序源代码
#include
#include//动态存储分配函数头文件
#defineLIST_INIT_SIZE3//#define指令,指定用一个符号名称代表常量
#defineLIST_INCREMENT3
typedefstructnode//结构体定义,命名一个新的类型名代表结构体类型
{
charname[9];//选手姓名
intnum;//选手编号
intscore;//选手得分
inttax;//选手名次
}ElemType;//新的类型名
typedefstruct
{
ElemType*data;//定义结构体指针变量data,指向此结构体类型数据
intlen;
intlistsize;
}SeqList;//新的类型名
voidInit_sq(SeqList*L,intn)//定义函数Init_sq,为选手个数分配动态内存
{
L->data=(ElemType*)malloc(n*sizeof(ElemType));//用malloc函数分配动态内存
if(!
L->data)
exit
(1);//存储分配失败
L->len=n;//空表长度为0
L->listsize=n;//初始存储容量
}
voidInit(SeqList*L)//定义函数Init,用于完成选手信息的输入
{
ElemType*newbase;//定义结构体指针变量指向ElemType结构体类型数据
inti,n;
printf("请输入选手个数:
");
scanf("%d",&n);
Init_sq(L,n);
printf("请输入选手姓名和编号\n");
printf("姓名\t编号\t\n");
if(L->len>=L->listsize)
{
newbase=(ElemType*)realloc(L->data,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));//用ralloc函数重新分配动态空间
if(!
newbase)
exit
(1);//分配失败
L->data=newbase;
L->listsize+=LIST_INCREMENT;
}
for(i=1;i<=L->len;i++)//for循环输入选手信息
{
scanf("%s%d",L->data[i].name,&L->data[i].num);
L->data[i].score=L->data[i].tax=0;
}
}
voidVote(SeqList*L)//定义Vote函数用以实现投票的功能
{
inti,num;
printf("请输入您要为几号选手投票:
(0结束)\n");
do
{
scanf("%d",&num);
if(num<0||num>L->len)
{
printf("你输入的编号错误请重新输入(1--%d)\n",L->len);
continue;
}
else
for(i=1;i<=L->len;i++)
if(L->data[i].num==num)
L->data[i].score+=1;
}while(num!
=0);//for循环实现为某号选手投票使其得分增加
}
voidShellsort(SeqList*L)//希尔排序
{
inti,j;
intincrement=L->len;
do
{
increment=increment/3+1;//增量序列
for(i=increment+1;i<=L->len;i++)
{
if(L->data[i].score>L->data[i-increment].score)//需将L->r[i]插入有序增量子表
{
L->data[0]=L->data[i];//暂存在L->r[0]
for(j=i-increment;j>0&&L->data[0].score>L->data[j].score;j-=increment)
L->data[j+increment]=L->data[j];//记录后移,查找插入位置
L->data[j+increment]=L->data[0];//插入
}
}
}while(increment>1);
}
/*计算选手名次*/
voidRank(SeqList*L)//Rank函数,用以计算选手名次
{
inti;
L->data[1].tax=1;
for(i=2;i<=L->len;i++)
if(L->data[i-1].score==L->data[i].score)
L->data[i].tax=L->data[i-1].tax;
else
L->data[i].tax=L->data[i-1].tax+1;
printf("正在计算选手名次请稍后\n排序成功\n");
}
voidDisplay(SeqList*L)//定义Display函数,用以输出最终结果
{
inti;
printf("姓名\t编号\t票数\t名次\t\n");
for(i=1;i<=L->len;i++)
printf("%s\t%d\t%d\t%d\t\n",L->data[i].name,L->data[i].num,L->data[i].score,L->data[i].tax);
printf("\n");
}
voidSave(SeqList*L)//定义Save函数,实现文件的生成
{
FILE*fp;//定义一个指向文件的指针变量fp
inti;
charfilename[20];
printf("请输入目标文件名:
\n");
scanf("%s",filename);
fp=fopen(filename,"w");//建立新文件将fopen函数的返回值赋给指针
//变量fp,fp指向了名为filename的文件
fprintf(fp,"姓名\t编号\t票数\t名次\n");
for(i=1;i<=L->len;i++)
fprintf(fp,"%s\t%d\t%d\t%d\t\n",L->data[i].name,L->data[i].num,L->data[i].score,L->data[i].tax);
fclose(fp);
printf("数据已成功保存!
\n");
}
voidMeun()//Meun函数,生成系统主界面
{
printf("************电视大赛观众投票及排名系统*************\n");
printf("****1、输入选手信息(姓名、编号)****\n");
printf("****2、开始投票****\n");
printf("****3、排序****\n");
printf("****4、查看结果****\n");
printf("****5、保存到文件****\n");
printf("****6、退出****\n");
printf("***************************************************\n");
}
voidmain()//主函数
{
intsel;
SeqListL;
SeqListP;
while
(1)
{
Meun();
printf("\n请输入您要选择的操作序号,按回车键确认:
");
scanf("%d",&sel);
while(sel<1||sel>6)
{
printf("输入有误,请重新输入:
");
scanf("%d",&sel);
}
switch(sel)
{
case1:
Init(&L);break;
case2:
Vote(&L);break;
case3:
Shellsort(&L);Rank(&L);break;
case4:
Display(&L);break;
case5:
Save(&L);break;
case6:
printf("谢谢使用,再见!
\n");exit(0);
}
}
}
参考文献
[1].谭浩强.C程序设计(第4版).清华大学出版社,2010.6
[2].严蔚敏吴伟民.数据结构(C语言版).清华大学出版社,2012