【数据结构】运动会分数统计系统课程设计

时间:2025-03-28 20:03:29

1.问题描述

参加运动会有 n 个学校,学校编号为1...... n 。比赛分成 m 个男子项目,和 w 个女子项目。项目编号为男子1~ m ,女子 m +1~ m + w 。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2:哪些项目取前五名或前三名由学生自己设定。( m <=20, n <=20)

建议输入学校的名称,运动项目的名称等,其余信息学生自行设计;输出形式:有合理的提示,各学校分数为整形;

2.需求分析

(1)可以输入各个项目的前三名或前五名的成绩;

(2)能统计各学校总分,

(3)可以按学校编号或名称、学校总分、男女团体总分排序输出:

(4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。

【使用两个结构体】

(用链表的方法)

typedef struct Lnode
{
    char sch[20];//学校名称 
    int num, schsum, sum;//学校总分,男团体总分,女团体总分
    struct Lnode* next;
}Lnode, * LinkList;
typedef struct Lnode1
{
    char sch[20];//项目名称
    char sch1[20], sch2[20], sch3[20], sch4[20], sch5[20];//该项目前5名学校名称 
    int num1, num2, num3, num4, num5;//该项目前5名学校分数
    struct Lnode1* next;
}Lnode1, * LinkList1;

【输入学校名称】

void schoolname(LinkList& L1, int n)
{
    int i;
    LinkList p, q;
    L1 = (LinkList)malloc(sizeof(Lnode));
    printf("请输入%d个学校的名字:\n", n);
    p = (LinkList)malloc(sizeof(Lnode));
    if (L1 == nullptr ||p==nullptr)
    {
        printf("未分配内存!");
    }
    else
    {
        L1->next = p;
        scanf("%s", &p->sch);
        for (i = 1; i <n; i++)
        {
            q = p;
            p = (LinkList)malloc(sizeof(Lnode));
            scanf("%s", &p->sch);
            q->next = p;
        }
    }

【输入男子运动会项目名称】

void mansports(LinkList1& L2, int n2)
{
    int i;
    LinkList1 r, s;
    L2 = (LinkList1)malloc(sizeof(Lnode1));
    printf("请输入这%d个项目的名字:\n", n2);
    r = (LinkList1)malloc(sizeof(Lnode1));
    if (L2 == nullptr || r == nullptr)
    {
        printf("未分配内存!");
    }
    else
    {
        L2->next = r;
        scanf("%s", &r->sch);
        for (i = 2; i <= n2; i++)
        {
            s = r;
            r = (LinkList1)malloc(sizeof(Lnode1));
            scanf("%s", &r->sch);
            s->next = r;
        }
    }   

【输入女子运动会项目名称】

void womansports(LinkList1& L3, int n3)
{
    int i;
    LinkList1 r, s;
    L3 = (LinkList1)malloc(sizeof(Lnode1));
    printf("请输入这%d个项目的名字:\n", n3);
    r = (LinkList1)malloc(sizeof(Lnode1));
    if (L3 == nullptr || r == nullptr)
    {
        printf("未分配内存!");
    }
    else
    {
        L3->next = r;
        scanf("%s", &r->sch);
        for (i = 2; i <= n3; i++)
        {
            s = r;
            r = (LinkList1)malloc(sizeof(Lnode1));
            scanf("%s", &r->sch);
            s->next = r;
        }
    }

【学校总分排名】

void schoolrankings(LinkList& L1, int n)
{
    LinkList p;
    int z = 1, i, j, y;
    printf("参加这次比赛的学校的总分排名:\n");
    p = L1->next;
    for (i = 0; i < n; i++)
    {
        a[i] = p->num;//将学校总分全部赋值给全局变量
        p = p->next;
    }
    for (i = 0; i < n - 1; i++)//交换法排序
    {
        for (j =i+ 1; j <n; j++)
        {
            if (a[i] > a[j])
            {
                y = a[i];
                a[i] = a[j];
                a[j] = y;
            }
        }
    }
    for (i = n-1 ; i >= 0; i--)//倒序
    {
        p = L1->next;
        if (i > 0)
            while (a+i==a+i-1)
            {
                i--;
            }
        for (j = 1; j <=n; j++)
        {
            if (a[i] == p->num)
            {
                printf("第%d名%s:%d分\n", z, p->sch, p->num);
                z++;
            }
            p = p->next;
        }
    }

【男子项目成绩排名】

void manrankings(LinkList& L1, int n)
{
    LinkList p;
    int z = 1, i, j, y;
    printf("参加这次比赛的男子项目总分排名:\n");
    p = L1->next;
    for (i = 0; i < n; i++)
    {
        a[i] = p->schsum;
        p = p->next;
    }
    for (i = 0; i < n - 1; i++)//交换法排序
    {
        for (j = i + 1; j < n; j++)
        {
            if (a[i] > a[j])
            {
                y = a[i];
                a[i] = a[j];
                a[j] = y;
            }
        }
    }
    for (i = n -1; i >=0; i--)
    {
        p = L1->next;
        if (i > 0)//如果两个相等,直接下一个总分
            while (a+i == a+i-1)
            {
                i--;
            }
        for (j = 1; j <=n; j++)
        {
            if (a[i] == p->schsum)
            {
                printf("第%d名%s:%d分\n", z, p->sch, p->schsum);
                z++;
            }
            p = p->next;
        }
    }

}

【女子项目成绩排名】

void womanrankings(LinkList& L1, int n)
{
    LinkList p;
    int z=1, i, j, y;//z从第一名开始
    printf("参加这次比赛的女子项目总分排名:\n");
    p = L1->next;
    for (i = 0; i < n; i++)
    {
        a[i] = p->sum;
        p = p->next;
    }
    for (i = 0; i < n - 1; i++)//交换法排序
    {
        for (j = i + 1; j < n; j++)
        {
            if (a[i] > a[j])
            {
                y = a[i];
                a[i] = a[j];
                a[j] = y;
            }
        }
    }
    for (i = n -1; i >=0; i--)
    {
        p = L1->next;
        if (i > 0)
            while (a+i == a+i-1)
            {
                i--;
            }
        for (j = 1; j <= n; j++)
        {
            if (a[i] == p->sum)
            {
                printf("第%d名%s:%d分\n", z, p->sch, p->sum);
                z++;
            }
            p = p->next;
        }
    }
}
 

#include<>
#include<>
#include<> 
typedef struct Lnode
{
	char sch[20];//学校名称 
	int num, schsum, sum;//学校总分,男团体总分,女团体总分
	struct Lnode* next;
}Lnode, * LinkList;
typedef struct Lnode1
{
	char sch[20];//项目名称
	char sch1[20], sch2[20], sch3[20], sch4[20], sch5[20];//该项目前5名学校名称 
	int num1, num2, num3, num4, num5;//该项目前5名学校分数
	struct Lnode1* next;
}Lnode1, * LinkList1;
int a[20];
//输入各学校名称
void schoolname(LinkList& L1, int n)
{
	int i;
	LinkList p, q;
	L1 = (LinkList)malloc(sizeof(Lnode));
	printf("请输入%d个学校的名字:\n", n);
	p = (LinkList)malloc(sizeof(Lnode));
	if (L1 == nullptr ||p==nullptr)
	{
		printf("未分配内存!");
	}
	else
	{
		L1->next = p;
		scanf("%s", &p->sch);
		for (i = 1; i <n; i++)
		{
			q = p;
			p = (LinkList)malloc(sizeof(Lnode));
			scanf("%s", &p->sch);
			q->next = p;
		}
	}
}

//输入男子运动项目名字
void mansports(LinkList1& L2, int n2)
{
	int i;
	LinkList1 r, s;
	L2 = (LinkList1)malloc(sizeof(Lnode1));
	printf("请输入这%d个项目的名字:\n", n2);
	r = (LinkList1)malloc(sizeof(Lnode1));
	if (L2 == nullptr || r == nullptr)
	{
		printf("未分配内存!");
	}
	else
	{
		L2->next = r;
		scanf("%s", &r->sch);
		for (i = 2; i <= n2; i++)
		{
			s = r;
			r = (LinkList1)malloc(sizeof(Lnode1));
			scanf("%s", &r->sch);
			s->next = r;
		}
	}
	
}

//女子运动项目
void womansports(LinkList1& L3, int n3)
{
	int i;
	LinkList1 r, s;
	L3 = (LinkList1)malloc(sizeof(Lnode1));
	printf("请输入这%d个项目的名字:\n", n3);
	r = (LinkList1)malloc(sizeof(Lnode1));
	if (L3 == nullptr || r == nullptr)
	{
		printf("未分配内存!");
	}
	else
	{
		L3->next = r;
		scanf("%s", &r->sch);
		for (i = 2; i <= n3; i++)
		{
			s = r;
			r = (LinkList1)malloc(sizeof(Lnode1));
			scanf("%s", &r->sch);
			s->next = r;
		}
	}
	
}

//学校总分排名
void schoolrankings(LinkList& L1, int n)
{
	LinkList p;
	int z = 1, i, j, y;
	printf("参加这次比赛的学校的总分排名:\n");
	p = L1->next;
	for (i = 0; i < n; i++)
	{
		a[i] = p->num;//将学校总分全部赋值给全局变量
		p = p->next;
	}
	for (i = 0; i < n - 1; i++)//交换法排序
	{
		for (j =i+ 1; j <n; j++)
		{
			if (a[i] > a[j])
			{
				y = a[i];
				a[i] = a[j];
				a[j] = y;
			}
		}
	}
	for (i = n-1 ; i >= 0; i--)//倒序
	{
		p = L1->next;
		if (i > 0)
			while (a+i==a+i-1)
			{
				i--;
			}
		for (j = 1; j <=n; j++)
		{
			if (a[i] == p->num)
			{
				printf("第%d名%s:%d分\n", z, p->sch, p->num);
				z++;
			}
			p = p->next;
		}
	}
}

//男子项目成绩排名
void manrankings(LinkList& L1, int n)
{
	LinkList p;
	int z = 1, i, j, y;
	printf("参加这次比赛的男子项目总分排名:\n");
	p = L1->next;
	for (i = 0; i < n; i++)
	{
		a[i] = p->schsum;
		p = p->next;
	}
	for (i = 0; i < n - 1; i++)//交换法排序
	{
		for (j = i + 1; j < n; j++)
		{
			if (a[i] > a[j])
			{
				y = a[i];
				a[i] = a[j];
				a[j] = y;
			}
		}
	}
	for (i = n -1; i >=0; i--)
	{
		p = L1->next;
		if (i > 0)//如果两个相等,直接下一个总分
			while (a+i == a+i-1)
			{
				i--;
			}
		for (j = 1; j <=n; j++)
		{
			if (a[i] == p->schsum)
			{
				printf("第%d名%s:%d分\n", z, p->sch, p->schsum);
				z++;
			}
			p = p->next;
		}
	}

}

//女子项目成绩
void womanrankings(LinkList& L1, int n)
{
	LinkList p;
	int z=1, i, j, y;//z从第一名开始
	printf("参加这次比赛的女子项目总分排名:\n");
	p = L1->next;
	for (i = 0; i < n; i++)
	{
		a[i] = p->sum;
		p = p->next;
	}
	for (i = 0; i < n - 1; i++)//交换法排序
	{
		for (j = i + 1; j < n; j++)
		{
			if (a[i] > a[j])
			{
				y = a[i];
				a[i] = a[j];
				a[j] = y;
			}
		}
	}
	for (i = n -1; i >=0; i--)
	{
		p = L1->next;
		if (i > 0)
			while (a+i == a+i-1)
			{
				i--;
			}
		for (j = 1; j <= n; j++)
		{
			if (a[i] == p->sum)
			{
				printf("第%d名%s:%d分\n", z, p->sch, p->sum);
				z++;
			}
			p = p->next;
		}
	}
}

int main()
{
	int i, j, z, x, n, m, w;
	LinkList p, q, L1;
	LinkList1 r, s, L2 = NULL, L3 = NULL;
	do
	{
		printf("************************************\n");
		printf("****1	输入基本信息		****\n");
		printf("****2	查询某校各个项目的成绩	****\n");
		printf("****3	查询某个项目的结果	****\n");
		printf("****4	结束程序		****\n");
		printf("************************************\n");
		printf("请选择你的操作:\n");
		scanf("%d", &z);
		if (z == 2)
		{
			r = L2->next;
			printf("请输入你像查询学校的名字:\n");
			s = (LinkList1)malloc(sizeof(Lnode1));
			scanf("%s", &s->sch);
			for (i = 1; i <= m; i++)
			{
				if (strcmp(r->sch1, s->sch) == 0)
					printf("贵校荣获男子项目%s的第1名,他的成绩是:%d\n", r->sch, r->num1);
				if (strcmp(r->sch2, s->sch) == 0)
					printf("贵校荣获男子项目%s的第2名,他的成绩是:%d\n", r->sch, r->num2);
				if (strcmp(r->sch3, s->sch) == 0)
					printf("贵校荣获男子项目%s的第3名,他的成绩是:%d\n", r->sch, r->num3);
				if (strcmp(r->sch4, s->sch) == 0)
					printf("贵校荣获男子项目%s的第4名,他的成绩是:%d\n", r->sch, r->num4);
				if (strcmp(r->sch5, s->sch) == 0)
					printf("贵校荣获男子项目%s的第5名,他的成绩是:%d\n", r->sch, r->num5);
				r = r->next;
			}
			r = L3->next;
			for (i = 1; i <= w; i++)
			{
				if (strcmp(r->sch1, s->sch) == 0)
					printf("贵校荣获女子项目%s的第1名,他的成绩是:%d\n", r->sch, r->num1);
				if (strcmp(r->sch2, s->sch) == 0)
					printf("贵校荣获女子项目%s的第2名,他的成绩是:%d\n", r->sch, r->num2);
				if (strcmp(r->sch3, s->sch) == 0)
					printf("贵校荣获女子项目%s的第3名,他的成绩是:%d\n", r->sch, r->num3);
				if (strcmp(r->sch4, s->sch) == 0)
					printf("贵校荣获女子项目%s的第4名,他的成绩是:%d\n", r->sch, r->num4);
				if (strcmp(r->sch5, s->sch) == 0)
					printf("贵校荣获女子项目%s的第5名,他的成绩是:%d\n", r->sch, r->num5);
				r = r->next;
			}
		}
		if (z == 3)
		{
			printf("请输入你要查询的项目的名字:\n");
			s = (LinkList1)malloc(sizeof(Lnode1));
			scanf("%s", &s->sch);
			r = L2->next;
			for (i = 1; i <= m; i++)
			{
				if (strcmp(r->sch, s->sch) == 0)
				{
					if (strlen(r->sch4) == 0)
						printf("第1名%s,第2名%s,第3名%s\n", r->sch1, r->sch2, r->sch3);
					if (strlen(r->sch4) > 0)
						printf("第1名%s,第2名%s,第3名%s,第4名%s,第5名%s\n", r->sch1, r->sch2, r->sch3, r->sch4, r->sch5);

				}
				r = r->next;
			}
			r = L3->next;
			for (i = 1; i <= w; i++)
			{
				if (strcmp(r->sch, s->sch) == 0)
				{
					if (strlen(r->sch4) == 0)
						printf("第1名%s,第2名%s,第3名%s\n", r->sch1, r->sch2, r->sch3);
					if (strlen(r->sch4) > 0)
						printf("第1名%s,第2名%s,第3名%s,第4名%s,第5名%s\n", r->sch1, r->sch2, r->sch3, r->sch4, r->sch5);

				}
				r = r->next;

			}
		}
		if (z == 1)
		{
			printf("请输入参加这次比赛的学校个数:\n");
			scanf("%d", &n);
			schoolname(L1, n);
			q = L1->next;
			for (i = 0; i < n; i++)
			{
				q->num = 0;
				q->schsum = 0;
				q->sum = 0;
				q = q->next;
			}
			printf("请输入这次比赛男子项目的个数:\n");
			scanf("%d", &m);
			mansports(L2, m);
			r = L2->next;
			for (i = 1; i <= m; i++)
			{
				printf("如果此次%s比赛只取前3名的成绩请输入1,取前5名请输入2!\n", r->sch);
				scanf("%d", &z);
				printf("请输入第1名所来自的学校的名字和他该项目的成绩:\n");
				scanf("%s%d", &r->sch1, &r->num1);
				q = L1->next;
				for (j = 0; j < n; j++)
				{
					if (strcmp(r->sch1, q->sch) == 0)//比较r->sch1这个学校是不是q->sch这个学校,直接将结构体1与2连接起来
					{
						if (z == 1 || z == 2)
						{
							q->num = q->num + r->num1;
							q->schsum = q->schsum + r->num1;
						}
						/*if (z == 2)
						{
							q->num = q->num + r->num1;
							q->schsum = q->schsum + r->num1;
						}*/
					}
					q = q->next;
				}
				printf("请输入第2名所来自的学校的名字和他该项目的成绩:\n");
				scanf("%s%d", &r->sch2, &r->num2);
				q = L1->next;
				for (j = 1; j <= n; j++)
				{
					if (strcmp(r->sch2, q->sch) == 0)
					{
						if (z == 1 || z == 2)
						{
							q->num = q->num + r->num2;
							q->schsum += r->num2;
						}
						/*if (z == 2)
						{
							q->num += r->num2;
							q->schsum += r->num2;
						}*/
					}
					q = q->next;
				}
				printf("请输入第3名所来自的学校的名字和他该项目的成绩:\n");
				scanf("%s%d", &r->sch3, &r->num3);
				q = L1->next;
				for (j = 1; j <= n; j++)
				{
					if (strcmp(r->sch3, q->sch) == 0)
					{
						if (z == 1 || z == 2)
						{
							q->num = q->num + r->num3;
							q->schsum += r->num3;
						}
						/*if (z == 2)
						{
							q->num += r->num3;
							q->schsum += r->num3;
						}*/
					}
					q = q->next;
				}
				if (z == 2)
				{
					printf("请输入第4名所来自的学校的名字和他该项目的成绩:\n");
					scanf("%s%d", &r->sch4, &r->num4);
					q = L1->next;
					for (j = 1; j <= n; j++)
					{
						if (strcmp(r->sch4, q->sch) == 0)
						{
							q->num = q->num + r->num4;
							q->schsum += r->num4;
						}
						q = q->next;
					}
					printf("请输入第5名所来自的学校的名字和他该项目的成绩:\n");
					scanf("%s%d", &r->sch5, &r->num5);
					q = L1->next;
					for (j = 1; j <= n; j++)
					{
						if (strcmp(r->sch5, q->sch) == 0)
						{
							q->num = q->num + r->num5;
							q->schsum += r->num5;
						}
						q = q->next;
					}
				}
				r = r->next;
			}
			printf("输入比赛中女子项目的个数:\n");
			scanf("%d", &w);
			womansports(L3, w);
			r = L3->next;
			for (i = 1; i <= w; i++)
			{
				printf("如果此次%s比赛只取前3名的成绩请输入1,取前5名请输入2!\n", r->sch);
				scanf("%d", &x);
				printf("请输入第1名所来自的学校的名字和他该项目的成绩:\n");
				scanf("%s%d", &r->sch1, &r->num1);
				q = L1->next;
				for (j = 1; j <= n; j++)
				{
					if (strcmp(r->sch1, q->sch) == 0)
					{
						if (x == 1)
						{
							q->num = q->num + r->num1;
							q->sum = q->sum + r->num1;
						}
						if (x == 2)
						{
							q->num = q->num + r->num1;
							q->sum = q->sum + r->num1;
						}
					}
					q = q->next;
				}
				printf("请输入第2名所来自的学校的名字和他该项目的成绩:\n");
				scanf("%s%d", &r->sch2, &r->num2);
				q = L1->next;
				for (j = 1; j <= n; j++)
				{
					if (strcmp(r->sch2, q->sch) == 0)
					{
						if (x == 1)
						{
							q->num = q->num + r->num2;
							q->sum += r->num2;
						}
						if (x == 2)
						{
							q->num += r->num2;
							q->sum += r->num2;
						}
					}
					q = q->next;
				}
				printf("请输入第3名所来自的学校的名字和他该项目的成绩:\n");
				scanf("%s%d", &r->sch3, &r->num3);
				q = L1->next;
				for (j = 1; j <= n; j++)
				{
					if (strcmp(r->sch3, q->sch) == 0)
					{
						if (x == 1)
						{
							q->num = q->num + r->num3;
							q->sum += r->num3;
						}
						if (x == 2)
						{
							q->num += r->num3;
							q->sum += r->num3;
						}
					}
					q = q->next;
				}
				if (x == 2)
				{
					printf("请输入第4名所来自的学校的名字和他该项目的成绩:\n");
					scanf("%s%d", &r->sch4, &r->num4);
					q = L1->next;
					for (j = 1; j <= n; j++)
					{
						if (strcmp(r->sch4, q->sch) == 0)
						{
							q->num = q->num + r->num4;
							q->sum += r->num4;
						}
						q = q->next;
					}
					printf("请输入第5名所来自的学校的名字和他该项目的成绩:\n");
					scanf("%s%d", &r->sch5, &r->num5);
					q = L1->next;
					for (j = 1; j <= n; j++)
					{
						if (strcmp(r->sch5, q->sch) == 0)
						{
							q->num = q->num + r->num5;
							q->sum += r->num5;
						}
						q = q->next;
					}
				}
				r = r->next;
			}
			p = L1->next;
			printf("参加这次比赛的学校的成绩为:\n");
			for (i = 0; i < n; i++)
			{
				printf("%s:总分:%d分,男子团体总分:%d,女子团体总分:%d分\n", p->sch, p->num, p->schsum, p->sum);
				p = p->next;
			}
			schoolrankings(L1, n);
			manrankings(L1, n);
			womanrankings(L1, n);
		}
	} while (z != 4);
	printf("\n");
	return 0;
}