鉴于一个小粉求助,我决定帮助他写一下这一个小的项目,希望能够帮助到大家!在这个下午写的过程中,也出现过一点点小的差池,顺便在这里记录一下,方便以后的复习!

完整程序先放下面,有一定代码能力的小伙伴应该可以直接看的明白:

#define _CRT_SECURE_NO_WARNINGS#include#include#define player_num 5#define judges_num 5//构建选手结构体信息struct player{char name[20];//选手姓名char passage[20];//选手文章int score;//选手得分};//初始化结构体数组struct player p[player_num] ={{"刘二","《春之美》",0},{"张三","《春的祖国》",0},{"李四","《春天来了》",0},{"王五","《春天》",0},{"丁六","《春的味道》",0}};//排序函数void bubblesore(struct player *p, int len) {for (int i = 0; i < len; i++){for (int j = 0; j < len - i - 1; j++){if (p[j].score < p[j + 1].score){//名字交换char tem_name[20] = { 0 };strcpy(tem_name , p[j].name);strcpy(p[j].name, p[j + 1].name);strcpy(p[j+1].name, tem_name);//文章交换char tem_passage[20] = { 0 };strcpy(tem_passage, p[j ].passage);strcpy(p[j].passage, p[j + 1].passage);strcpy(p[j+1].passage, tem_passage);//分数交换int temp_score = p[j].score;p[j].score = p[j + 1].score;p[j + 1].score = temp_score;}}}}//打印函数void printfInfo(struct player * p, int len)//输出结构体信息{for (int i = 0; i < len; i++){printf("第%d名:%s %s %d\n", (i+1),p[i].name,p[i].passage,p[i].score);}}int main(){int arr[player_num] = { 0 };//用来存放5个选手的得分int pf = 0;//评委打分int sum = 0;//记录得分int i = 0;int j = 0;//主体部分,评委老师打分for (i = 1; i <= 5; i++){sum = 0;printf("请%s选手入场演讲!\n", p[i-1].name);printf("%s选手演讲完毕!请各位评论老师打分!\n", p[i - 1].name);for (j = 0; j < 5; j++){scanf("%d", &pf);sum += pf;}arr[i-1] = sum;printf("%s选手演讲的得分为:%d\n", p[i - 1].name, arr[i-1]);p[i-1].score = arr[i - 1];}//排序//排序利用排序函数bubblesore(p, 5);//打印出排名printf("名次姓名 文章分数\n");printf("_____________________________________________________\n");printfInfo(p, 5);printf("根据比赛规则,获奖名单如下:\n");printf("获得一等奖的是:%s\n", p[0].name);printf("获得二等奖的是:%s\n", p[1].name);printf("获得三等奖的是:%s\n", p[2].name);return 0;}

然后我们来说一下具体的思路

首先我们想到:对于演讲的选手,有他的名字,题目,和分数等信息,所以我们会想到要使用结构体,另外,由于选手的数量问题,我们又考虑到了结构体数组,所以我们可以先写出这样的程序:

#define _CRT_SECURE_NO_WARNINGS#include#define player_num 5#define judges_num 5//构建选手结构体信息struct player{char name[20];//选手姓名char passage[20];//选手文章int score;//选手得分};//初始化结构体数组struct player p[player_num] ={{"刘二","《春之美》",0},{"张三","《春的祖国》",0},{"李四","《春天来了》",0},{"王五","《春天》",0},{"丁六","《春的味道》",0}};int main(){int arr[player_num] = { 0 };//用来存放5个选手的得分int pf = 0;//评委打分int sum = 0;//记录得分int i = 0;int j = 0;//主体部分,评委老师打分for (i = 1; i <= 5; i++){sum = 0;printf("请%s选手入场演讲!\n", p[i-1].name);printf("%s选手演讲完毕!请各位评论老师打分!\n", p[i - 1].name);for (j = 0; j < 5; j++){scanf("%d", &pf);sum += pf;}arr[i-1] = sum;printf("%s选手演讲的得分为:%d\n", p[i - 1].name, arr[i-1]);p[i-1].score = arr[i - 1];}

这个程序中要注意的是一些细节:

 然后基本的结构体完善之后,我们要想到,有一个大小排序的问题,从大到小排序,我们想到再熟悉不过的冒泡排序。由于我们在排序过程中,每一个名字对应的文章和分数都是相对应的,所以,在排序交换的过程中,我们要把结构体中的数据一起交换掉,而对于字符串的交换,我们要用到一个函数strcpy,具体的用法在博主的一篇博客有相应的内容,链接放下面了

对C语言函数的再认识_月亮嚼成星~的博客-CSDN博客目录1. 函数是什么2.C语言中函数的分类2.1 库函数2.2 自定义函数3.函数参数3.1 实际参数(实参):3.2 形式参数(形参):4.函数调用4.1 传值调用4.2 传址调用4.3 练习5.函数的嵌套调用和链式访问5.1 嵌套调用5.2 链式访问6. 函数的声明和定义6.1 函数声明6.2 函数定义:7.函数递归7.1 什么是递归?7.2 递归的两个必要条件7.2.1 练习1:7.2.2 练习2:7.3 递.https://blog.csdn.net/m0_67995737/article/details/124789657想到这些之后我们写出的程序就是这样的啦:

#define _CRT_SECURE_NO_WARNINGS#include#include#define player_num 5#define judges_num 5//构建选手结构体信息struct player{char name[20];//选手姓名char passage[20];//选手文章int score;//选手得分};//初始化结构体数组struct player p[player_num] ={{"刘二","《春之美》",0},{"张三","《春的祖国》",0},{"李四","《春天来了》",0},{"王五","《春天》",0},{"丁六","《春的味道》",0}};//排序函数void bubblesore(struct player *p, int len) {for (int i = 0; i < len; i++){for (int j = 0; j < len - i - 1; j++){if (p[j].score < p[j + 1].score){//名字交换char tem_name[20] = { 0 };strcpy(tem_name , p[j].name);strcpy(p[j].name, p[j + 1].name);strcpy(p[j+1].name, tem_name);//文章交换char tem_passage[20] = { 0 };strcpy(tem_passage, p[j ].passage);strcpy(p[j].passage, p[j + 1].passage);strcpy(p[j+1].passage, tem_passage);//分数交换int temp_score = p[j].score;p[j].score = p[j + 1].score;p[j + 1].score = temp_score;}}}}int main(){int arr[player_num] = { 0 };//用来存放5个选手的得分int pf = 0;//评委打分int sum = 0;//记录得分int i = 0;int j = 0;//主体部分,评委老师打分for (i = 1; i <= 5; i++){sum = 0;printf("请%s选手入场演讲!\n", p[i-1].name);printf("%s选手演讲完毕!请各位评论老师打分!\n", p[i - 1].name);for (j = 0; j < 5; j++){scanf("%d", &pf);sum += pf;}arr[i-1] = sum;printf("%s选手演讲的得分为:%d\n", p[i - 1].name, arr[i-1]);p[i-1].score = arr[i - 1];}//排序//排序利用排序函数bubblesore(p, 5);return 0;}

当时博主在第一次写的时候把这下面的这一段写出来了bug

if (p[j].score < p[j + 1].score){//名字交换char tem_name[20] = { 0 };strcpy(tem_name , p[j].name);strcpy(p[j].name, p[j + 1].name);strcpy(p[j+1].name, tem_name);//文章交换char tem_passage[20] = { 0 };strcpy(tem_passage, p[j ].passage);strcpy(p[j].passage, p[j + 1].passage);strcpy(p[j+1].passage, tem_passage);//分数交换int temp_score = p[j].score;p[j].score = p[j + 1].score;p[j + 1].score = temp_score;}

此前写成了这样:

if (p[j].score < p[j + 1].score){//名字交换strcpy(p[j].name, p[j + 1].name);//文章交换strcpy(p[j].passage, p[j + 1].passage);//分数交换int temp_score = p[j].score;p[j].score = p[j + 1].score;p[j + 1].score = temp_score;}

这样就把p[j+1].name赋值给了p[j].name。但是p[j+1].name并没有改变,所以大家要避免犯这种小错误哈。

排序后,我们需要把它打印出来,这里考虑编写这样一个函数:

//打印函数void printfInfo(struct player * p, int len)//输出结构体信息{for (int i = 0; i < len; i++){printf("第%d名:%s %s %d\n", (i+1),p[i].name,p[i].passage,p[i].score);}}

这样以后基本就算搞定了!!,在主函数中调用一下就打印出来了排名的情况。然后我们可以根据获奖的要求,(比如第一名一等奖,第二名二等奖,第三名三等奖等等),将他们的获奖情况也打印出来。

//打印出排名printf("名次姓名 文章分数\n");printf("_____________________________________________________\n");printfInfo(p, 5);printf("根据比赛规则,获奖名单如下:\n");printf("获得一等奖的是:%s\n", p[0].name);printf("获得二等奖的是:%s\n", p[1].name);printf("获得三等奖的是:%s\n", p[2].name);return 0;

这样以后完整的程序就同最初的一样了!!!

放一下运行的结果吧!

 各位想要更改选手和评委的数量可以在程序开头的#define处进行修改,并添加自己喜欢的元素即可!!

相应代码的变动我就不多说了,希望对大家有帮助吧!我们一起进步!加油!!

加油!技术人!