C语言数据结构题目
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) 可以按学校编号查询学校某个项目的情况;
(5) 可以按项目编号查询取得前三或前五名的学校。
规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
输出形式:有中文提示,各学校分数为整数
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
代码如下↓
|
|
|
|
|
|
|
|
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
int n; //学校
int m; //男子项目
int w; //女子项目
struct pro
{
string name; //学校名称
int schoolnum[5]; //前5名学校的编号
int schoolnumy[3]; //前3名学校的编号
}p[21];
struct school //表示学校的结构体
{
int num;
string name; //学校名称
int score; //学校总分
int male; //男子总分
int female; //女子总分
}sch[21];
//前五得分、前三得分
int integral[5] = { 7,5,3,2,1 };
int integraly[3] = { 7,5,3 };
void input()
{
int i, j, y, x, q;
printf("输入学校数目:");
y = 0;
while (1)
{
scanf_s("%d", &n); //学校数目
if (n >= 1 && n <= 20)y = 1;
if (y)break;
else printf("输入数据有误,请重新输入:");
}
for (i = 1; i <= n; i++)
{
printf("输入第%d个学校的名称:", i);
cin >> sch[i].name; //给学校结构体的成员初始化为
sch[i].score = 0;
sch[i].female = 0;
sch[i].male = 0;
sch[i].num = i;
}
printf("输入男子项目数和女子项目数:");
y = 0;
while (1)
{
scanf_s("%d%d", &m, &w);
if (m <= 20 && m >= 1 && w <= 20 && w >= 1)y = 1;
if (y)break;
else printf("输入数据有误,请重新输入:");
}
for (i = 1; i <= m + w; i++)
{
printf("输入第%d个项目的名称:\n", i);
cin >> p[i].name;
printf("该项目取前三名选0,取前5名选1:");
scanf_s("%d", &q);
if (q == 1)
{
printf("输入第%d个项目的前5名的学校编号:\n", i);
for (j = 1; j <= 5; j++)
{
y = 0;
while (1)
{
scanf_s("%d", &x); //学校编号
if (x >= 1 && x <= 20)y = 1;
if (y)break;
else printf("输入数据有误,请重新输入:");
}
p[i].schoolnum[j] = x; //给项目结构体的成员赋值
sch[x].score += integral[j - 1]; //给学校结构体成员赋值
if (i <= m)sch[x].male += integral[j - 1]; //学校结构体赋值,男子总分
else sch[x].female += integral[j - 1]; //学校结构体赋值,女子总分
}
}
if (q == 0)
{
printf("输入第%d个项目的前3名的学校编号:\n", i);
for (j = 1; j <= 3; j++)
{
y = 0;
while (1)
{
scanf_s("%d", &x); //学校编号
if (x >= 1 && x <= 20)y = 1;
if (y)break;
else printf("输入数据错误,请重新输入:");
}
p[i].schoolnumy[j] = x; //给项目结构体的成员赋值
sch[x].score += integraly[j - 1]; //给学校结构体成员赋值
if (i <= m)sch[x].male += integraly[j - 1]; //学校结构体赋值
else sch[x].female += integraly[j - 1]; //学校结构体赋值
}
}
}
}
void print(int i)
{
cout << sch[i].num << setw(10) << sch[i].name << setw(8) << sch[i].score << setw(9) << sch[i].male << setw(10) << sch[i].female << endl;
}
//按编号排序
void bianhao()
{
int i, j;
school t;
for (i = 1; i < n; i++)
{
for (j = i; j <= n; j++)
if (sch[i].num > sch[j].num)
{
t = sch[i]; sch[i] = sch[j]; sch[j] = t;
}
}
printf("\n按编号排列:\n");
printf("编号 学校名称 总分 男子总分 女子总分\n");
for (i = 1; i <= n; i++)
print(i);
}
//按学校总分排序
void zongfen()
{
int i, j;
school t;
for (i = 1; i < n; i++)
{
for (j = i; j <= n; j++)
if (sch[i].score < sch[j].score)
{
t = sch[i]; sch[i] = sch[j]; sch[j] = t;
}
}
printf("\n按学校总分排列:\n");
printf("编号 学校名称 总分 男子总分 女子总分\n");
for (i = 1; i <= n; i++)
print(i);
ofstream fout;
fout.open("运动会分数统计.txt");
fout << "编号 学校名称 总分 男子总分 女子总分" << endl;
for (i = 1; i <= n; i++)
{
fout << sch[i].num << setw(13) << sch[i].name << setw(8) << sch[i].score << setw(9)
<< sch[i].male << setw(10) << sch[i].female << endl;
}
fout.close();
}
void malezf() //按学校男总分排序
{
int i, j;
school t;
for (i = 1; i < n; i++)
{
for (j = i; j <= n; j++)
if (sch[i].male < sch[j].male)
{
t = sch[i]; sch[i] = sch[j]; sch[j] = t;
}
}
printf("\n按学校男子总分排列:\n");
printf("编号 学校名称 总分 男子总分 女子总分\n");
for (i = 1; i <= n; i++)
print(i);
}
void femalezf() //按学校女总分排序
{
int i, j;
school t;
for (i = 1; i < n; i++)
{
for (j = i; j <= n; j++)
if (sch[i].female < sch[j].female)
{
t = sch[i]; sch[i] = sch[j]; sch[j] = t;
}
}
printf("\n按学校女子总分排列:\n");
printf("编号 学校名称 总分 男子总分 女子总分\n");
for (i = 1; i <= n; i++)
print(i);
cout << endl;
}
void cxsch() //查询学校信息
{
int i, y, s;
printf("输入需要查询的学校编号:");
y = 0;
while (1)
{
scanf_s("%d", &s);
if (s >= 1 && s <= n)y = 1;
if (y)break;
else printf("输入数据有误,请重新输入:");
}
printf("该学校相关信息:\n");
printf("编号 学校名称 总分 男子总分 女子总分\n");
for (i = 1; i <= n; i++)
{
if (sch[i].num == s)
{
print(i);
break;
}
}
cout << endl;
}
void cxxm() //查询项目信息
{
int i, y, s, v;
printf("输入需要查询的项目编号:");
y = 0;
while (1)
{
scanf_s("%d", &s);
if (s >= 1 && s <= n)y = 1;
if (y)break;
else printf("输入数据有误,请重新输入:");
}
printf("该项目取的前三名选0,取的前5名选1: ");
scanf_s("%d", &v);
if (v == 1)
{
cout << p[s].name << "前5名学校编号及名称为:" << endl;
printf("名次 编号 学校名称\n");
for (i = 1; i <= 5; i++)
cout << " " << i << " " << p[s].schoolnum[i] << setw(12) << sch[p[s].schoolnum[i]].name << endl;
}
if (v == 0)
{
cout << p[s].name << "前3名学校编号及名称为:" << endl;
printf("名次 编号 学校名称\n");
for (i = 1; i <= 3; i++)
cout << " " << i << " " << p[s].schoolnumy[i] << setw(12) << sch[p[s].schoolnumy[i]].name << endl;
}
cout << endl;
}
void solve() //菜单函数
{
int z;
while (1)
{
printf("\n选择您需要的操作(选择序号):\n");
printf("1.按学校编号排序输出\n");
printf("2.按学校总分排序输出\n");
printf("3.按学校男总分排序输出\n");
printf("4.按学校女总分排序输出\n");
printf("5.查询某个学校成绩\n");
printf("6.查询某个项目成绩\n");
printf("7.结束\n\n");
scanf_s("%d", &z);
if (z == 1)bianhao();
if (z == 2)zongfen();
if (z == 3)malezf();
if (z == 4)femalezf();
if (z == 5)cxsch();
if (z == 6)cxxm();
if (z == 7)break;
}
}
int main() //主函数
{
input();
solve();
return 0;
}