if(p1->grades[j]>p1->grades[j+1])
{
t=p1->grades[j];
p1->grades[j]=p1->grades[j+1];
p1->grades[j+1]=t;
}
p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一个最高分,去掉一个这一低分,得出最后的平均分
2、文件操作
包括了文件的写入和读取两个方面。
运用指针程序文件的写入操作,用于保存录入的数据,也用于保存所修改的数据。
例如下段程序。
voidsave()//将数据保存到文件
{
FILE*fp;
S_MESSAGE*p1;//=(S_MESSAGE*)malloc(LEN);
p1=head;
fp=fopen("参赛选手名单.txt","w");
fprintf(fp,"--------|--------\n");
fprintf(fp,"编号|姓名\n");
while(p1!
=NULL)
{
fprintf(fp,"--------|--------\n");
fprintf(fp,"%-9d%-6s\n",p1->num,p1->name);
p1=p1->next;
}
fprintf(fp,"--------|--------\n");
fclose(fp);
printf("\n\t文件已将保存到\"参赛选手名单.txt\"");
}
3、关于删除算法
实现从系统中删除某位同学的相关信息的算法稍微复杂一些,其实质是对数组某个或某些元素的删除操作。
对数组元素的删除操作完成后,再将数组写入到文件中,就完整地实现了“删除”。
voiddel()
{
S_MESSAGE*node;//=(S_MESSAGE*)malloc(LEN);
S_MESSAGE*p1;
intcheck=0;//用来进行判断,是否找到了要删除的信息
longdel_num;
printf("\n请输入要删除的选手的编号:
");
scanf("%d",&del_num);
if(head==NULL&&tail==NULL)
{
printf("\n当前信息记录为空,删除失败!
\n");
}
else
{
node=head;
p1=head;
while(node!
=NULL)
{
if(node->num==del_num)
{
printf("\n--------要删除的选手信息--------\n");
printf("--------|--------\n");
printf("编号|姓名\n");
printf("--------|--------\n");
printf("%-9d%-6s\n",node->num,node->name);//在这里找到了要删除的选手信息
printf("--------|--------\n");
check=1;//找到要删除的信息,赋为真
if(node==head&&head->next==NULL)//是头结点,并且只有一个结点
{
head=NULL;
tail=head;
free(node);
printf("\n--------删除信息成功--------\n");//删除唯一的节点
}
elseif(node==head&&head->next!
=NULL)//删除头节点
{
node=head;
head=head->next;
free(node);
printf("\n--------删除信息成功--------\n");//头节点删除成功
n=n-1;
}
elseif(node->next!
=NULL)//删除中间节点
{
p1->next=node->next;
free(node);
printf("\n--------删除信息成功--------\n");//中间节点删除成功
n=n-1;
}
elseif(node->next==NULL)//删除尾节点
{
p1->next=NULL;
tail=p1;
free(node);
printf("\n--------删除信息成功--------\n");//尾节点删除成功
n=n-1;
}
getchar();
return;
}
else
{
p1=node;
node=node->next;
}
}
}
if(head!
=NULL&&check==0)
{
printf("\n对不起,你要删除的选手信息不存在!
\n");
}
getchar();
五、个人总结
自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,这毕竟独立做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师的辛勤指导下,终于游逆而解。
对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
六、参考文献
(参考的书籍或互联网资源)
[1]谭浩强.C程序设计.北京:
清华大学出版社,2005
[2]网络资源加密程序
七、源程序
/*密码:
123456只有密码输入正确,才能进入plus程序.*/
#include
#include
#include
#include
#include
#defineLENsizeof(S_MESSAGE)
#defineN7
typedefstructsonger//定义选手信息链表结构
{
longnum;//选手编号
charname[20];//选手姓名
floatgrades[N];//选手成绩
doubleave;//平均成绩
structsonger*next;//链表的结点,next是指针变量,指向结构体变量
}S_MESSAGE;
S_MESSAGE*head;//定义链表的头指针
S_MESSAGE*tail;//定义链表的尾指针
intn=0;//n为全局变量,用于统计结点的个数
voidcreat();//建立单向动态链表。
此函数带回一个指向链表头的指针,用于参赛选手的录入
voiddel();//用于删除结点,用于参赛选手的删除
voidsearch();//参赛选手成绩的查询
voidprint();//用于输出链表
voidrank();//按个人平均成绩从高到低的顺序进行排序
voidupdate();//参赛选手的修改
voidmenu();//操作系统菜单界面
voidmenu_select();//菜单选择界面
voidbrowse();//选手信息浏览
voidsave();//选手信息保存
voidquit();//退出系统界面
/*------------------------------------rank函数-----------------------------------------*/
voidrank()
{
S_MESSAGE*p1,*p2,*endpt,*p;//*endpt/*控制循环比较*/*p/*临时指针变量*/
n=0;
p1=head;
if(head==NULL&&tail==NULL)
{
printf("\n--------当前信息记录为空--------\n");
}
else
{
p1=(S_MESSAGE*)malloc(LEN);
p1->next=head;/*注意理解:
我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。
因为第一个节点没有前驱,我们不能交换地址。
*/
head=p1;/*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/
for(endpt=NULL;endpt!
=head;endpt=p)/*结合第6点理解*/
{
for(p=p1=head;p1->next->next!
=endpt;p1=p1->next)
{
if(p1->next->avenext->next->ave)/*如果前面的节点键值比后面节点的键值小,则交换*/
{
p2=p1->next->next;//1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:
p2=p1->next->next
p1->next->next=p2->next;//2、顺着这一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->next
p2->next=p1->next;//3、p2->next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next
p1->next=p2;//4、p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q的,所以p1->next=p2
p=p1->next->next;//5、至此,完成了相邻两节点的顺序交换
}
}
}
p1=head;/*把p1的信息去掉*/
head=head->next;/*让head指向排序后的第一个节点*/
free(p1);/*释放p1*/
printf("\n-----------选手成绩排名信息如下---------\n");
printf("--------|--------|--------|--------\n");
printf("编号|姓名|平均成绩|名次\n");
p1=head;
while(p1!
=NULL)
{
printf("--------|--------|--------|--------\n");
printf("%-9d%-9s%-9.1lf%-5d\n",p1->num,p1->name,p1->ave,n+1);
n++;
p1=p1->next;
}
printf("--------|--------|--------|--------\n");
}
getchar();
}
/*------------------------------------print函数-----------------------------------------*/
voidprint()
{
S_MESSAGE*p1=(S_MESSAGE*)malloc(LEN);
intcheck=0,i;
longseeknum;
printf("\n请输入要查找的选手编号:
");
scanf("%d",&seeknum);
if(head==NULL&&tail==NULL)
{
printf("\n对不起,当前记录为空!
\n");
}
else
{
p1=head;
printf("\n-----------你要找的选手的成绩如下---------\n");//在这里找到了要查找的选手成绩
printf("------|------|-----|----|----|----|----|----|----|----|----------|--------\n");
printf("编号|姓名|成绩|1|2|3|4|5|6|7|平均成绩\n");
printf("------|------|-----|----|----|----|----|----|----|----|----------|--------\n");
while(p1!
=NULL)
{
if(p1->num==seeknum)
{
printf("%-7d%-6s",p1->num,p1->name);
printf("");
for(i=0;i{
printf("%.1f",p1->grades[i]);
}
printf("%-6.2lf\n",p1->ave);
check=1;
getchar();
return;
}
else
{
p1=p1->next;
}
}
}
if(head!
=NULL&&check==0)
{
printf("\n对不起,你查看的选手成绩不存在!
\n");
}
getchar();
}
/*---------------------------search函数-------------------------------*/
voidsearch()
{
intc;
printf("\n请选择查询内容:
\n");
printf("1.选手详细成绩查询2.选手排名查询\n请输入您的选择:
");
scanf("%d",&c);
switch(c)
{
case1:
system("cls");print();break;
case2:
system("cls");rank();break;
}
}
/*-------------------------------save函数------------------------------*/
voidsave()//将数据保存到文件
{
FILE*fp;
S_MESSAGE*p1;//=(S_MESSAGE*)malloc(LEN);
p1=head;
fp=fopen("参赛选手名单.txt","w");
fprintf(fp,"--------|--------\n");
fprintf(fp,"编号|姓名\n");
while(p1!
=NULL)
{
fprintf(fp,"--------|--------\n");
fprintf(fp,"%-9d%-6s\n",p1->num,p1->name);
p1=p1->next;
}
fprintf(fp,"--------|--------\n");
fclose(fp);
printf("\n\t文件已将保存到\"参赛选手名单.txt\"");
}
/*------------------------update函数--------------------------*/
voidupdate()
{
S_MESSAGE*p1;//=(S_MESSAGE*)malloc(LEN);
intcheck=0;//用来进行判断,是否找到了要修改的信息
longupdatenum;
printf("\n请输入要修改的选手编号:
");
scanf("%d",&updatenum);//查找到要修改的选手
if(head==NULL&&tail==NULL)
{
printf("\n--------当前信息记录为空--------\n");
}
else
{
p1=head;
while(p1!
=NULL)
{
if(p1->num==updatenum)
{
printf("\n-----------你要修改的选手信息如下---------\n");
printf("--------|--------\n");
printf("编号|姓名\n");
printf("--------|--------\n");
printf("%-9d%-6s\n",p1->num,p1->name);
printf("--------|--------\n");
printf("\n-----------请重新写入此选手信息:
---------\n");
check=1;//从新写入修改项目
printf("\n修改选手编号为:
");
scanf("%d",&p1->num);
printf("\n修改选手姓名为:
");
scanf("%s",p1->name);
return;
}
else
{
p1=p1->next;
}
}
}
if(head!
=NULL&&check==0)
{
printf("\n对不起,你要修改的选手信息不存在!
\n");
}
getchar();
}
/*----------------------browse函数-----------------------------*/
voidbrowse()
{
S_MESSAGE