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;
}