题目:运动会分数统计
参加这动会有 n 个学收,学校编号为 1 ~ n。比赛 分成 m 个男子项目,和 w 个女子项目,项目编号为 1 ~ n + w。不同的项目取前五名或前三名获得积分:取前五名的得分分别为:7、5、3、2、1;取前三名的得分分别为:5、3、2;。哪些项目取前五名或前三名由用户自己设定。(15 < n <= 20, 15 < n + w <= 20)。
要求
1、可以输入各个项目的前三名或前五名的成绩。
2、能统计各学校的积分总分。
3、可以按学校编号或名称、学核总分、男女生团体总排序输出。
4、数据存入文件并能随时查询。
5、可以按学校编号查询学校某个硕旦的精况;也可以按项目编号查询取得前三或前五名的学较。
界面要求
有合理的提示,每个功能可以设立菜单。
存储结构
运动会的相关数据要存储在数据文牛中。
输入数据
完整代码(C)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct score // 总分结构类型
{
int schoolNum, boyEventNum, girlEventNum; // 学校、男子、女子项目的数量
char boyEvent[21][110], girlEvent[21][110]; // 男子、女子项目的名称
int boyTop[21][6], girlTop[21][6]; // 这两个数组记录男、女子每个项目前三名或前五名的编号
int flag; // fasle == 0 表明分数还未统计过,需要统计
}ScoreInit;
typedef struct school // 学校的结构类型
{
char name[110]; // 该学校名字
int boyEventGrade[21], girlEventGrade[21]; // 该学校男子、女子项目的成绩
int boyTotalScore, girlTotalScore, totalScore; // 该学校男子、女子项目的总得分
}SchoolInit;
// 全局变量定义
ScoreInit Score; // 分数结构变量
SchoolInit School[21];
int topThreeScore[4] = {-1, 5, 3, 2}; // 前三名的积分
int topFiveScore[6] = {-1, 7, 5, 3, 2, 1}; // 前五名的积分
void Interface() // 打印界面的函数 none
{
printf("\t\t运动会积分统计\n\n");
printf("1. 添加学校以及各项目成绩 \n");
printf("2. 统计所有学校的得分结果 \n");
printf("3. 按男子项目总分排序输出 \n");
printf("4. 按女子项目总分排序输出 \n");
printf("5. 按学校编号或名称排序输出 \n");
printf("6. 按学校编号查询各项目得分 \n");
printf("7. 按项目编号查询前三或前五 \n");
printf("8. 保存信息 \n");
printf("9. 清屏 \n");
printf("10.退出 \n");
}
void Init() // 对数组相关数据初始化的函数
{
Score.flag = 0;
int i = 0, j, k; // i, j, k, 用于标记循环次数
while (i < 21) // 对前几名数组初始化
{
j = 0;
while (j < 6)
{
Score.boyTop[i][j] = 0;
Score.girlTop[i][j] = 0;
++j;
}
++i;
}
i = 0;
while (i < 21) // 对 School 数组进行初始化
{
j = k = 0;
while (j < 21)
School[i].boyEventGrade[j++] = 0;
while (k < 21)
School[i].girlEventGrade[k++] = 0;
School[i].boyTotalScore = School[i].girlTotalScore = School[i].totalScore = 0;
++i;
}
}
void GetScoreData() // 数据读取函数 none
{
int i = 1, j, k; // i, j, k, 用于标记循环次数
printf("请依次输入学校、男子项目和女子项目的数量(均为至少三个):\n");
scanf("%d%d%d", &Score.schoolNum, &Score.boyEventNum, &Score.girlEventNum);
i = j = 1;
printf("请依次输入男子项目、女子项目的名称(每个名称输入后需回车):\n");
printf("男子项目:\n");
while (i <= Score.boyEventNum)
scanf("%s", Score.boyEvent[i++]);
printf("\n女子项目:\n");
while (j <= Score.girlEventNum)
scanf("%s", Score.girlEvent[j++]);
i = 1;
printf("\n请依次输入各个学校的名称、男子项目的分数和女子项目的分数:\n");
while (i <= Score.schoolNum)
{
j = k = 1;
scanf("%s", School[i].name); // 输入学校的名称
while (j <= Score.boyEventNum) // 输入男子项目的分数
scanf("%d", &School[i].boyEventGrade[j++]);
while (k <= Score.girlEventNum) // 输入女子项目的分数
scanf("%d", &School[i].girlEventGrade[k++]);
printf("\n");
++i;
}
getchar();
printf("\n请输入任意键继续...");
getchar();
Clear(); // 由于输入的数据比较多,因为执行完输入函数后清一次屏
}
void CountTotalScore() // 各学校总分统计函数 none
{
int topNum = 0;
int i = 1, j = 1, k;
printf("\n请依次输入各男子项目取前几名的成绩\n");
while (i <= Score.boyEventNum)
{
printf("%s:", Score.boyEvent[i]);
scanf("%d", &topNum);
CountRank(i, topNum, Score.schoolNum + 1, 0);
++i;
}
printf("\n请依次输入各女子项目取前几名的成绩\n");
while (j <= Score.girlEventNum)
{
printf("%s:", Score.girlEvent[j]);
scanf("%d", &topNum);
CountRank(j, topNum, Score.schoolNum + 1, 1);
++j;
}
Score.flag = 1;
}
void CountRank(int number, int topNum, int border, int sex) // number 是项目编号,topNum 代表前 topNum 名
{ // border 表示循环的边界值,sex 表示男子还是女子项目 none
int *A = (int*)malloc(sizeof(int) * border); // 定义一个长度为 border 的数组,其中的元素是学校的编号
for (int i = 1; i < border; ++i) // 给数组元素赋值
A[i] = i;
if (sex == 0) // 如果是男子项目
{
int i, j;
for (i = 2; i < border; ++i) // 利用直接插入排序
{ // 将 topNum 个成绩最好的学校的编号移到数组的最前面
if (School[i].boyEventGrade[number] > School[i - 1].boyEventGrade[number])
{
A[0] = A[i];
for (j = i - 1; A[0] > A[j]; --j)
A[j + 1] = A[j];
A[j + 1] = A[0];
}
}
for (int i = 1; i <= topNum; ++i) // 将前几名的编号赋值给 top 数组
{
Score.boyTop[number][i] = A[i];
if (topNum == 3) // 依照名次给各个学校添加总分
School[A[i]].boyTotalScore += topThreeScore[i];
else
School[A[i]].boyTotalScore += topFiveScore[i];
}
}
else
{
int i, j;
for (i = 2; i < border; ++i) // 利用冒泡排序,只进行 topNum 趟排序
{
if (School[i].girlEventGrade[number] > School[i - 1].girlEventGrade[number])
{
A[0] = A[i];
for (j = i - 1; A[0] > A[j]; --j)
A[j + 1] = A[j];
A[j + 1] = A[0];
}
}
for (int i = 1; i <= topNum; ++i)
{
Score.girlTop[number][i] = A[i];
if (topNum == 3) // 依照名次给各个学校添加总分
School[A[i]].girlTotalScore += topThreeScore[i];
else
School[A[i]].girlTotalScore += topFiveScore[i];
}
}
}
void EventTotalScoreSort(int sex) // 该函数实现按照各学校的总分进行排序
{
int *A = (int*)malloc(sizeof(int) * (Score.schoolNum + 1)); // 定义一个长度为 Score.schoolNum + 1 的数组,其中的元素是学校的编号
for (int i = 1; i <= Score.schoolNum; ++i) // 给数组元素赋值
A[i] = i;
if (sex == 0) // 如果是男子项目
{
int i, j;
for (i = 2; i <= Score.schoolNum; ++i) // 直接插入排序
{
if (School[i].boyTotalScore > School[i - 1].boyTotalScore)
{
A[0] = A[i];
for (j = i - 1; A[0] > A[j]; --j)
A[j + 1] = A[j];
A[j + 1] = A[0];
}
}
printf("男子项目总分排名是:\n");
for (int i = 1; i <= Score.schoolNum; ++i)
printf("%s\n", School[A[i]].name);
}
else
{
int i, j;
for (i = 2; i <= Score.schoolNum; ++i) // 直接插入排序
{
if (School[i].girlTotalScore > School[i - 1].girlTotalScore)
{
A[0] = A[i];
for (j = i - 1; A[0] > A[j]; --j)
A[j + 1] = A[j];
A[j + 1] = A[0];
}
}
printf("女子项目总分排名是:\n");
for (int i = 1; i <= Score.schoolNum; ++i)
printf("%s\n", School[A[i]].name);
}
}
void SchoolNumberSort()
{
printf("参赛的学校分别是:\n");
for (int i = 1; i <= Score.schoolNum; ++i)
printf("编号%d--%s\n", i, School[i].name);
}
void SchoolQuery() // 该函数依据学校编号查询各项目成绩和总得分 none
{
int number;
printf("请输入需要查询的学校编号:");
scanf("%d", &number);
int i = 1, j = 1;
printf("编号%d:%s\n", number, School[number]);
printf("\n男子项目的成绩如下\n");
while (i <= Score.boyEventNum)
{
printf("%s:%d\n", Score.boyEvent[i], School[number].boyEventGrade[i]);
++i;
}
printf("\n女子项目的成绩如下\n");
while (j <= Score.girlEventNum)
{
printf("%s:%d\n", Score.girlEvent[j], School[number].girlEventGrade[j]);
++j;
}
printf("\n男子项目的总得分是:%d\n", School[number].boyTotalScore);
printf("女子项目的总得分是:%d\n", School[number].girlTotalScore);
}
void EventQuery() // 该函数依据项目的编号查询各学校的成绩排名 none
{
if (Score.flag)
{
int number;
printf("请输入需要查询的项目编号:");
scanf("%d", &number);
printf("\n编号为%d的男子项目%s的排名分别是:", number, Score.boyEvent[number]);
for (int i = 1; i < 6; ++i) // 依据 top 数组中记录的学校编号输出名字,前提是编号不为0
if (Score.boyTop[i] != 0)
printf("%s ", School[Score.boyTop[number][i]].name);
printf("\n编号为%d的女子项目%s的排名分别是:", number, Score.girlEvent[number]);
for (int i = 1; i < 6; ++i)
if (Score.girlTop[i] != 0)
printf("%s ", School[Score.girlTop[number][i]].name);
printf("\n");
}
else printf("您还未查询过总分!\n");
}
void SaveData() // 该函数将数据存入文件 output.txt 中
{
if (Score.flag)
{
FILE *fp;
fp = fopen("output.txt", "w"); // 令 fp 指向输出的文件
// 先输出 Score 中的数据
fprintf(fp, "学校数量:%d 男子项目数量:%d 女子项目的数量:%d\n", Score.schoolNum, Score.boyEventNum, Score.girlEventNum);
fprintf(fp, "男子项目有:");
for (int i = 1; i <= Score.boyEventNum; ++i)
fprintf(fp, "%s ", Score.boyEvent[i]);
fprintf(fp, "\n");
fprintf(fp, "女子项目有:");
for (int i = 1; i <= Score.girlEventNum; ++i)
fprintf(fp, "%s ", Score.girlEvent[i]);
fprintf(fp, "\n\n");
// 然后按学校顺序输出相关数据
for (int i = 1; i <= Score.schoolNum; ++i)
{
fprintf(fp, "编号%d-%s\n", i, School[i].name); // 输出学校名称
fprintf(fp, "男子项目成绩为:");
for (int j = 1; j <= Score.schoolNum; ++j)
fprintf(fp, "%d ", School[i].boyEventGrade[j]);
fprintf(fp, "\n女子项目成绩为:");
for (int j = 1; j <= Score.schoolNum; ++j)
fprintf(fp, "%d ", School[i].girlEventGrade[j]);
fprintf(fp, "\n男子项目总得分为:%d\n女子项目总得分为:%d\n\n", School[i].boyTotalScore, School[i].girlTotalScore);
}
fclose(fp);
printf("文件写入完成!\n");
system("output.txt"); // 打开 output.txt 文件
}
else printf("还没统计分数呢!\n");
}
void Clear() // 该函数实现清屏的功能 none
{
system("cls");
Interface();
}
void Exit() // none
{
exit(0);
}
int main()
{
Interface(); // 打印界面的函数
Init(); // 调用初始化函数
int choice = 0;
while (1)
{
printf("\n请输入您的选择(1-10):\n");
scanf("%d", &choice);
if (choice < 1 || choice > 10)
printf("输入非法!请重新输入!\n");
switch(choice) // 根据用户输入进入不同的模块
{
case 1:
GetScoreData();
break;
case 2:
CountTotalScore();
break;
case 3:
EventTotalScoreSort(0);
break;
case 4:
EventTotalScoreSort(1);
break;
case 5:
SchoolNumberSort();
break;
case 6:
SchoolQuery();
break;
case 7:
EventQuery();
break;
case 8:
SaveData();
break;
case 9:
Clear();
break;
case 10:
Exit();
}
}
}
希望本篇博客能对你起到一点的帮助作用,也希望能动动小手点个赞哟~~。