用数据结构(C语言)编写运动会分数统计程序

参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2.写一个程序产生各种成绩单和得分报表。
产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。
(要求一定要是没错误的程序,拜托拜托各位!!!)

第1个回答  推荐于2021-01-01
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <conio.h> /*屏幕操作函数*/
#define MAX 50
typedef struct node1{
int school; /*学校编号*/
int record; /*项目成绩*/
struct node1 *next; /*链域*/
}Schools;
typedef struct {
int item; /*项目编号*/
Schools *firstschool; /*链域指向链表中第一个结点*/
}ITEM;
typedef struct {
int z; /* 项目总数 */
ITEM a[MAX];
}ALLitems;
typedef struct node2 {
int item; /*该学校获奖的项目*/
int record; /*项目成绩*/
struct node2 *next; /*链域*/
}Items;
typedef struct {
int school; /*学校编号*/
int score; /*学校总分*/
int boys; /*男团体总分*/
int girls; /*女团体总分*/
Items *firstitem; /*链域指向链表中第一个获奖项目的结点*/
}SCHNode;
typedef struct {
int n; /* 学校总数 */
SCHNode b[MAX];
}ALLNode;
ALLitems *g1;
ALLNode *g2;
void funct1(ALLitems *g1,ALLNode *g2)
{
Schools *p1;
Items *p2;
int i,j,k,m,w,h,x;
p1=(Schools *)malloc(sizeof(Schools));
p2=(Items *)malloc(sizeof(Items));
if(!p1||!p2)
exit(1);
printf("\n ******输入各个项目信息 ****** 13 \n\n");
printf(" 输入男子项目总数m:"); scanf("%d",&m);
if(m<0||m>20)
{
printf(" 输入有误,m是20以内的整数,请重新输入:"); scanf("%d",&m);
}
printf(" 输入女子项目总数w:"); scanf("%d",&w);
if(w<0||w>20)
{
printf(" 输入有误,w是20以内的整数,请重新输入:"); scanf("%d",&w);
}
printf(" 输入参加运动会的学校总数n:"); scanf("%d",&g2->n);
if(g2->n<0||g2->n>20)
{
printf(" 输入有误,n是20以内的整数,请重新输入:"); scanf("%d",&g2->n);
}
g1->z=m+w;
printf(" 则项目编号为男子1-%d,女子%d-%d",m,m+1,g1->z);
printf("\n\n ****记录运动会成绩****");
printf("\n\n (输入0标志结束)\n");
for(k=1;k<=g1->z;k++)
{
g1->a[k].item=k;
g1->a[k].firstschool=NULL;
}
for(k=1;k<=g2->n;k++)
{
g2->b[k].school=k;
g2->b[k].firstitem=0;
g2->b[k].score=0;
g2->b[k].boys=0;
g2->b[k].girls=0;
}
g2->b[0].score=0;
g2->b[0].boys=0;
g2->b[0].girls=0;
while(i!=0)
{
printf("\n 项目:");
scanf("%d",&i);
if(i!=0)
{
printf(" 1.前三名 2.前五名\n");
printf(" 请选择:");
scanf("%d",&j);
if(j!=1&&j!=2)
{
printf(" 输入有误,请重新选择:");
scanf("%d",&j);
}
if(j==1)
{
h=3;
do{ printf(" 第%d名:学校(学校编号为数字)",h); scanf("%d",&x);
p1=(Schools *)malloc(sizeof(Schools));
p1->school=x;
p2=(Items *)malloc(sizeof(Items));
p2->item=i;
if(h==3) p2->record=p1->record=2;
if(h==2) p2->record=p1->record=3;
if(h==1) p2->record=p1->record=5;
p1->next=g1->a[i].firstschool;
g1->a[i].firstschool=p1;
p2->next=g2->b[x].firstitem;
g2->b[x].firstitem=p2;
g2->b[x].score=g2->b[x].score+p2->record; /* 累计总分 */
if(i<=m) g2->b[x].boys=g2->b[x].boys+p2->record; /* 累计男团体总分 */
else
g2->b[x].girls=g2->b[x].girls+p2->record; /* 累计女团体总分 */
h--;
}while(x!=0&&h!=0);
}
if(j==2)
{
h=5;
do{
printf(" 第%d名:学校(学校编号为数字)",h);
scanf("%d",&x);
p1=(Schools *)malloc(sizeof(Schools));
p1->school=x;
p2=(Items *)malloc(sizeof(Items));
p2->item=i;
if(h==5) p2->record=p1->record=1;
if(h==4) p2->record=p1->record=2;
if(h==3) p2->record=p1->record=3;
if(h==2) p2->record=p1->record=5;
if(h==1) p2->record=p1->record=7;
p1->next=g1->a[i].firstschool;
g1->a[i].firstschool=p1;
p2->next=g2->b[x].firstitem;
g2->b[x].firstitem=p2;
g2->b[x].score=g2->b[x].score+p2->record; /* 累计总分 */
if(i<=m) g2->b[x].boys=g2->b[x].boys+p2->record; /* 累计男团体总分 */ else g2->b[x].girls=g2->b[x].girls+p2->record; /* 累计女团体总分 */ h--;
}while(x!=0&&h!=0);
}
}
}
}
void save()
{
FILE *fp1,*fp2;
fp1=(FILE *)malloc(sizeof(FILE));
fp2=(FILE *)malloc(sizeof(FILE));
if((fp1=fopen("sports1","wb"))==NULL)
{
printf("cannot open file.\n");
return;
}
if(fwrite(g1,sizeof(ALLitems),1,fp1)!=1)
printf("file write error.\n");
fclose(fp1);
if((fp2=fopen("sports2","wb"))==NULL)
{ printf("cannot open file.\n");
return;
}
if(fwrite(g2,sizeof(ALLNode),1,fp2)!=1)
printf("file write error.\n");
fclose(fp2);
}
void funct2(ALLNode *g2) /* 输出各学校总分 */
{
int k;
printf("\n\n ****** 输出各学校总分 ******\n");
printf(" 学校编号\t 总分 \n");
for(k=1;k<=g2->n;k++)
printf(" %d\t\t\t %d\n",k,g2->b[k].score);
printf("\n");
system("pause");
printf(" 按任意键返回主菜单......");
getchar();
}
void funct3(ALLNode *g2) /* 按学校编号排序输出 */
{
int k;
Items *p2;
p2=(Items *)malloc(sizeof(Items));
printf("\n\n ****** 按学校编号排序输出 ******\n");
printf(" 学校编号\t\t\t获奖情况 \n");
scanf("%d",&k);
for(k=1;k<=g2->n;k++)
{
printf("\t\t\t\t\t\t%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{
printf("项目%d:得%d分 ",p2->item,p2->record);
p2=p2->next;
}
printf("\n");
}
printf("\n");
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void funct4(ALLNode *g2) /* 按学校总分排序输出 */
{
int i,j,k;
Items *p2;
printf("\n\n ****** 按学校总分排序输出 ******\n");
printf(" 学校编号\t\t总分 \n");
scanf("%d",&k);
//printf("输入要查询的项目编号:");
for(i=2;i<=g2->n;i++)
{
printf("%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{
printf("%d \t\t%d\n",g2->b[k].school,g2->b[k].score);
p2=p2->next;
}
printf("\n");
g2->b[0].score=g2->b[i].score;
g2->b[0].boys=g2->b[i].boys;
g2->b[0].girls=g2->b[i].girls;
g2->b[0].school=g2->b[i].school;
j=i-1;
while(g2->b[0].score<g2->b[j].score&&j>0)
{
g2->b[j+1].score=g2->b[j].score;
g2->b[j+1].boys=g2->b[j].boys;
g2->b[j+1].girls=g2->b[j].girls;
g2->b[j+1].school=g2->b[j].school;
j--;
}
g2->b[j+1].score=g2->b[0].score;
g2->b[j+1].boys=g2->b[0].boys;
g2->b[j+1].girls=g2->b[0].girls;
g2->b[j+1].school=g2->b[0].school;
}
for(k=1;k<=g2->n;k++)
printf("%d \t\t%d\n",g2->b[k].school,g2->b[k].score);
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void funct5(ALLNode *g2) /* 按男团体总分排序输出 */
{
int i,j,k;
Items *p2;
p2=(Items *)malloc(sizeof(Items));
printf("\n\n ****** 按男团体总分排序输出 ******\n");
printf("学校编号\t\t男团体总分 \n");
scanf("%d",&k);
//printf("输入要查询的学校编号:");
for(i=2;i<=g2->n;i++)
{
printf("%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{ printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].boys);
p2=p2->next;
}
printf("\n"); g2->b[0].score=g2->b[i].score;
g2->b[0].boys=g2->b[i].boys;
g2->b[0].girls=g2->b[i].girls;
g2->b[0].school=g2->b[i].school;
j=i-1;
while(g2->b[0].boys<g2->b[j].boys&&j>0)
{
g2->b[j+1].score=g2->b[j].score;
g2->b[j+1].boys=g2->b[j].boys;
g2->b[j+1].girls=g2->b[j].girls;
g2->b[j+1].school=g2->b[j].school;
j--;
}
g2->b[j+1].score=g2->b[0].score;
g2->b[j+1].boys=g2->b[0].boys;
g2->b[j+1].girls=g2->b[0].girls;
g2->b[j+1].school=g2->b[0].school;
}
for(k=1;k<=g2->n;k++)
printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].boys);
system("pause"); // 暂停等待
printf("按任意键返回主菜单......");
getchar();
}
void funct6(ALLNode *g2) /* 按女团体总分排序输出 */
{
int i,j,k;
Items *p2;
p2=(Items *)malloc(sizeof(Items));
printf("\n\n ****** 按女团体总分排序输出 ******\n");
printf("学校编号\t\t女团体总分 \n");
scanf("%d",&k);// printf("输入要查询的项目编号:");
for(i=2;i<=g2->n;i++)
{
printf("%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{ printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].girls);
p2=p2->next;
}
printf("\n");
g2->b[0].score=g2->b[i].score;
g2->b[0].boys=g2->b[i].boys;
g2->b[0].girls=g2->b[i].girls;
g2->b[0].school=g2->b[i].school;
j=i-1;
while(g2->b[0].girls<g2->b[j].girls&&j>0)
{ g2->b[j+1].score=g2->b[j].score;
g2->b[j+1].boys=g2->b[j].boys;
g2->b[j+1].girls=g2->b[j].girls;
g2->b[j+1].school=g2->b[j].school;
j--;
}
g2->b[j+1].score=g2->b[0].score;
g2->b[j+1].boys=g2->b[0].boys;
g2->b[j+1].girls=g2->b[0].girls;
g2->b[j+1].school=g2->b[0].school;
}
for(k=1;k<=g2->n;k++)
printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].girls);
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void funct7(ALLNode *g2) /* 按学校编号查询学校某个项目情况 */
{
int i,j;
Items *p2;
printf("\n ****** 按学校编号查询学校某个项目情况 ******\n");
printf(" 输入要查询的学校编号:");
scanf("%d",&i);
printf(" 输入要查询的项目编号:");
scanf("%d",&j);
p2=g2->b[i].firstitem;
while(p2!=NULL)
{
if(p2->item==j)
printf(" 学校编号:%d\t项目%d:得%d分\n",i,p2->item,p2->record); p2=p2->next;
}
printf("\n");
system("pause");
printf(" 按任意键返回主菜单......");
getchar();
}
void funct8(ALLitems *g1) /* 按项目编号查询取得名次的学校 */
{
int i;
Schools *p1;
printf("\n*** 按项目编号查询取得名次的学校 ***\n");
printf("输入要查询的项目编号:");
scanf("%d",&i);
printf("项目编号\t\t\t取得名次的学校\n");
printf("%d\t",i);
p1=g1->a[i].firstschool;
while(p1!=NULL)
{ printf(" 学校%d:得%d分 ",p1->school,p1->record);
p1=p1->next;
}
printf("\n\n");
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void main()
{
int t;
g2=(ALLNode*)malloc(sizeof(ALLNode));
g1=(ALLitems*)malloc(sizeof(ALLitems));
if(!g2||!g1)
exit(1);
system("cls");
for(;;)
{
printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\t\t 运动会分数统计系统 \n");
printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\t\t* 1.输入各个项目成绩并存储文件 *\t \n");
printf("\t\t* 2.统计各学校总分 *\t \n");
printf("\t\t* 3.按学校编号排序输出 *\t \n");
printf("\t\t* 4.按学校总分排序输出 *\t \n");
printf("\t\t* 5.按男团体总分排序输出 *\t \n");
printf("\t\t* 6.按女团体总分排序输出 *\t \n");
printf("\t\t* 7.按学校编号查询学校某个项目情况 *\t \n");
printf("\t\t* 8.按项目编号查询取得名次的学校 *\n");
printf("\t\t* 0.退出 *\n");
printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\t\t \n"); printf("\t\t \n"); printf("\t\t \n"); printf("\t\t 请选择(0-8):");
loop:scanf("%d",&t);
system("cls");
switch(t)
{
case 1:funct1(g1,g2);save();break;
case 2:funct2(g2);break;
case 3:funct3(g2);break;
case 4:funct4(g2);break;
case 5:funct5(g2);break;
case 6:funct6(g2);break;
case 7:funct7(g2);break;
case 8:funct8(g1);break;
case 0:exit(0);
default:{ printf("输入有误,请重新选择:");
goto loop;}
}//clrscr();
system("cls");
}
}
相似回答