用c语言完成任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 功能要求: 1) 可以输入各个项目的前三名或前五名的成绩; 2) 能统计各学校总分, 3) 可以按学校编号或名称、学校总分、男女团体总分排序输出; 4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 5) 数据存入文件并能随时查询 6) 规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称 输出形式:有中文提示,各学校分数为整形
时间: 2024-02-12 17:04:33 浏览: 125
运动会分数统计,c语言
3星 · 编辑精心推荐
好的,这是一个比较复杂的任务,需要用到文件操作、排序算法等。以下是一个可能的实现方案:
1. 定义数据结构
首先,我们需要定义一些数据结构来存储比赛结果和学校信息。这里我们可以使用结构体。
```
// 学校信息结构体
typedef struct {
int id; // 学校编号
char name[20]; // 学校名称
int total_score; // 总分
int male_score; // 男子团体总分
int female_score; // 女子团体总分
} School;
// 比赛结果结构体
typedef struct {
int school_id; // 学校编号
int event_id; // 项目编号
int rank; // 名次
} Result;
```
2. 输入比赛结果
我们可以从文件中读取比赛结果,也可以手动输入。这里为了方便,我们使用手动输入的方式。
```
// 读入比赛结果,并更新学校分数
void input_result(Result results[], int n, School schools[], int m, int event_type) {
int i, j, rank, score;
for (i = 0; i < n; i++) {
printf("请输入第%d个学校的比赛成绩:\n", i + 1);
scanf("%d", &results[i].school_id); // 输入学校编号
scanf("%d", &results[i].event_id); // 输入项目编号
scanf("%d", &rank); // 输入名次
if (event_type == 1) { // 男子项目
if (rank <= 5) {
score = (rank == 1) ? 7 : ((rank == 2) ? 5 : ((rank == 3) ? 3 : ((rank == 4) ? 2 : 1)));
schools[results[i].school_id - 1].male_score += score;
schools[results[i].school_id - 1].total_score += score;
}
} else { // 女子项目
if (rank <= 5) {
score = (rank == 1) ? 7 : ((rank == 2) ? 5 : ((rank == 3) ? 3 : ((rank == 4) ? 2 : 1)));
schools[results[i].school_id - 1].female_score += score;
schools[results[i].school_id - 1].total_score += score;
}
}
results[i].rank = rank;
}
}
```
3. 统计学校总分
我们可以在输入比赛结果的时候,同时更新每个学校的总分和男女团体总分。
```
// 计算各学校总分和男女团体总分
void calculate_score(School schools[], int n) {
int i, j;
for (i = 0; i < n; i++) {
schools[i].total_score = schools[i].male_score + schools[i].female_score;
}
}
```
4. 排序
我们可以按照学校编号、学校名称、学校总分、男女团体总分等方式进行排序。这里我们使用快速排序算法来实现。
```
// 按学校编号排序
int cmp_school_id(const void *a, const void *b) {
School *pa = (School *)a;
School *pb = (School *)b;
return pa->id - pb->id;
}
// 按学校名称排序
int cmp_school_name(const void *a, const void *b) {
School *pa = (School *)a;
School *pb = (School *)b;
return strcmp(pa->name, pb->name);
}
// 按学校总分排序
int cmp_school_total_score(const void *a, const void *b) {
School *pa = (School *)a;
School *pb = (School *)b;
return pb->total_score - pa->total_score;
}
// 按男女团体总分排序
int cmp_school_gender_score(const void *a, const void *b) {
School *pa = (School *)a;
School *pb = (School *)b;
return pb->male_score + pb->female_score - pa->male_score - pa->female_score;
}
// 快速排序算法
void quick_sort(void *arr, int len, int elem_size, int (*cmp)(const void *, const void *)) {
if (len <= 1) return;
void *pivot = arr;
void *left = arr + elem_size;
void *right = arr + (len - 1) * elem_size;
while (left <= right) {
while (left <= right && cmp(left, pivot) < 0) {
left += elem_size;
}
while (left <= right && cmp(right, pivot) > 0) {
right -= elem_size;
}
if (left <= right) {
void *tmp = malloc(elem_size);
memcpy(tmp, left, elem_size);
memcpy(left, right, elem_size);
memcpy(right, tmp, elem_size);
free(tmp);
left += elem_size;
right -= elem_size;
}
}
void *tmp = malloc(elem_size);
memcpy(tmp, arr, elem_size);
memcpy(arr, right, elem_size);
memcpy(right, tmp, elem_size);
free(tmp);
quick_sort(arr, (right - arr) / elem_size, elem_size, cmp);
quick_sort(right + elem_size, len - (right - arr) / elem_size - 1, elem_size, cmp);
}
```
5. 查询
我们可以按照学校编号或名称查询学校,按照项目编号查询取得前三或前五名的学校。
```
// 按学校编号查询学校
void search_school_by_id(School schools[], int n, int id) {
int i;
for (i = 0; i < n; i++) {
if (schools[i].id == id) {
printf("学校编号:%d\n", schools[i].id);
printf("学校名称:%s\n", schools[i].name);
printf("总分:%d\n", schools[i].total_score);
printf("男子团体总分:%d\n", schools[i].male_score);
printf("女子团体总分:%d\n", schools[i].female_score);
return;
}
}
printf("没有找到该学校!\n");
}
// 按学校名称查询学校
void search_school_by_name(School schools[], int n, char name[]) {
int i;
for (i = 0; i < n; i++) {
if (strcmp(schools[i].name, name) == 0) {
printf("学校编号:%d\n", schools[i].id);
printf("学校名称:%s\n", schools[i].name);
printf("总分:%d\n", schools[i].total_score);
printf("男子团体总分:%d\n", schools[i].male_score);
printf("女子团体总分:%d\n", schools[i].female_score);
return;
}
}
printf("没有找到该学校!\n");
}
// 按项目编号查询前三或前五名的学校
void search_school_by_event(Result results[], int n, int event_id, int rank) {
int i;
for (i = 0; i < n; i++) {
if (results[i].event_id == event_id && results[i].rank <= rank) {
printf("学校编号:%d\n", results[i].school_id);
}
}
}
```
6. 文件操作
我们可以将比赛结果和学校信息存入文件中,以便下次查询时使用。
```
// 将比赛结果写入文件
void write_results(Result results[], int n, char filename[]) {
FILE *fp = fopen(filename, "wb");
fwrite(results, sizeof(Result), n, fp);
fclose(fp);
}
// 将学校信息写入文件
void write_schools(School schools[], int n, char filename[]) {
FILE *fp = fopen(filename, "wb");
fwrite(schools, sizeof(School), n, fp);
fclose(fp);
}
// 从文件中读取比赛结果
int read_results(Result results[], int n, char filename[]) {
FILE *fp = fopen(filename, "rb");
int count = fread(results, sizeof(Result), n, fp);
fclose(fp);
return count;
}
// 从文件中读取学校信息
int read_schools(School schools[], int n, char filename[]) {
FILE *fp = fopen(filename, "rb");
int count = fread(schools, sizeof(School), n, fp);
fclose(fp);
return count;
}
```
完整代码如下:
阅读全文