匿名用户
1级
2014-11-27 回答
举手之劳,帮你写了。
这里设定姓名长度不超过20字符。每个项目结束时,将其编号、类型符(区分取前3名还是前5名)输入,并按名次顺序输入运动员姓名、学校和成绩。程序已做改动,增加了一些代码以提高程序的健壮性。本题完整的c程序如下,在win-tc和Dev-c++下调试通过,运行正确。
#include
#include
#include
#include
#definen5/*设定,可更改*/
#definem3/*设定,可更改*/
#definew2/*设定,可更改*/
structachievement/*定义表示成绩的结构体*/
{intschoolnumber;/*学校编号*/
charname[20];/*姓名*/
intmark;/*分数*/
intresult;};
structpro/*表示项目的结构体*/
{inttag;/*项目编号*/
structachievementach[m+w];
intnumber;
};
structNode
{structprodate;
structNode*next;
};
main()
{
inti,j,t;
intx[n]={0};inty[n]={0};/*x[n]和y[n]分别表示男子和女子团体总分*/
structNode*head;
structNode*p;
structNode*q;
if((head=(structNode*)malloc(sizeof(structNode)))==NULL)exit(1);
head->next=NULL;/*初始化单链表*/
p=head;
for(i=0;i
{
j=i+1;
printf("请输入第%d个项目的信息\n",j);
p->date.number=j;
printf("所取的名次数为:");
scanf("%d",&p->date.tag);
while(p->date.tag!=3&&p->date.tag!=5)
{printf("输入有误,请重新输入!");
getchar();/*加入此函数避免输入错误时程序进入无限循环*/
getchar();
printf("所取的名次数为:");
scanf("%d",&p->date.tag);
}
t=1;
while(t<=p->date.tag)
{
printf("第%d名的名字:",t);
scanf("%s",p->date.ach[t-1].name);
printf("第%d名的学校:",t);
scanf("%d",&p->date.ach[t-1].schoolnumber);
printf("第%d名的分数:",t);
scanf("%d",&p->date.ach[t-1].mark);
p->date.ach[t-1].result=t;
t++;
}
if(j!=m+w)/*注意这里*/
{q=(structNode*)malloc(sizeof(structNode));/*生成新结点*/
p->next=q;
p=q;
p->next=NULL;
}
}
for(i=0;i
{
j=i+1;
printf("\n学校%d成绩单:\n",j);
p=head;
while(p!=NULL)
{
t=1;
while(t<=p->date.tag)
{
if(p->date.ach[t-1].schoolnumber==j)
{
printf("获奖项目:%d",p->date.number);
printf("名次:%d",p->date.ach[t-1].result);
printf("获奖人姓名:%s",p->date.ach[t-1].name);
printf("所得分数:%d\n",p->date.ach[t-1].mark);
if(p->date.number<=m)
x[i]=x[i]+p->date.ach[t-1].mark;
else
y[i]=y[i]+p->date.ach[t-1].mark;
}
t++;
}
p=p->next;
}
printf("\n男子团体总分:%d",x[i]);
printf("女子团体总分:%d\n",y[i]);
printf("团体总分:%d\n",x[i]+y[i]);
}
for(i=0;i
{p=head->next;
free(head);
head=p;
}
getch();
}