设定姓名长度不超过20字符。每个项目结束时,将其编号、类型符(区分取前3名还是前5名)输入,并按名次顺序输入运动员姓名、学校和成绩。程序已做改动,增加了一些代码以提高程序的健壮性。本题完整的c程序如下,在win-tc和Dev-c++下调试通过,运行正确。 #include <> #include <> #include <> #include <> #define n 5 /*设定,可更改*/#define m 3 /*设定,可更改*/#define w 2 /*设定,可更改*/struct achievement /* 定义表示成绩的结构体 */ {int schoolnumber;/* 学校编号 */ char name[20]; /* 姓名 */ int mark; /* 分数 */ int result;}; struct pro /* 表示项目的结构体 */ {int tag;/* 项目编号 */ struct achievement ach[m+w]; int number; }; struct Node {struct pro date; struct Node *next; }; main() { int i,j,t; int x[n]={0};int y[n]={0}; /* x[n]和y[n]分别表示男子和女子团体总分 */ struct Node *head; struct Node *p; struct Node *q; if((head=(struct Node*)malloc(sizeof(struct Node)))==NULL) exit(1); head->next=NULL; /* 初始化单链表 */ p=head; for(i=0;i; printf("所取的名次数为:"); scanf("%d",&p->); while(p->!=3&&p->!=5) { printf("输入有误,请重新输入!"); getchar(); /*加入此函数清空输入缓冲区,避免输入错误时程序进入无限循环*/ getchar(); printf("所取的名次数为:"); scanf("%d",&p->); } t=1; while(t<=p->) { printf("第%d名的名字:",t); scanf("%s",p->[t-1].name); printf("第%d名的学校:",t); scanf("%d",&p->[t-1].schoolnumber); printf("第%d名的分数:",t); scanf("%d",&p->[t-1].mark); p->[t-1].result=t; t++; } if(j!=m+w)/* 注意这里 */ {q=(struct Node*)malloc(sizeof(struct Node)); /* 生成新结点 */ p->next=q; p=q; p->next=NULL; } } for(i=0;i) { if(p->[t-1].schoolnumber==j) { printf("获奖项目:%d ",p->); printf("名次:%d ",p->[t-1].result); printf("获奖人姓名:%s ",p->[t-1].name); printf("所得分数:%d \n",p->[t-1].mark); if(p-><=m) x[i]=x[i]+p->[t-1].mark; else y[i]=y[i]+p->[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;inext; free(head); head=p; } getch(); }