鉴于一个小粉求助,我决定帮助他写一下这一个小的项目,希望能够帮助到大家!在这个下午写的过程中,也出现过一点点小的差池,顺便在这里记录一下,方便以后的复习!
完整程序先放下面,有一定代码能力的小伙伴应该可以直接看的明白:
1. #define _CRT_SECURE_NO_WARNINGS 2. #include<stdio.h> 3. #include<string.h> 4. #define player_num 5 5. #define judges_num 5 6. 7. 8. //构建选手结构体信息 9. struct player 10. { 11. char name[20];//选手姓名 12. char passage[20];//选手文章 13. 14. int score;//选手得分 15. 16. 17. }; 18. //初始化结构体数组 19. struct player p[player_num] = 20. { 21. {"刘二","《春之美》",0}, 22. {"张三","《春的祖国》",0}, 23. {"李四","《春天来了》",0}, 24. {"王五","《春天》",0}, 25. {"丁六","《春的味道》",0} 26. 27. }; 28. 29. 30. //排序函数 31. void bubblesore(struct player *p, int len) 32. { 33. for (int i = 0; i < len; i++) 34. { 35. for (int j = 0; j < len - i - 1; j++) 36. { 37. if (p[j].score < p[j + 1].score) 38. { 39. //名字交换 40. char tem_name[20] = { 0 }; 41. 42. strcpy(tem_name , p[j].name); 43. 44. strcpy(p[j].name, p[j + 1].name); 45. 46. strcpy(p[j+1].name, tem_name); 47. //文章交换 48. char tem_passage[20] = { 0 }; 49. 50. strcpy(tem_passage, p[j ].passage); 51. 52. strcpy(p[j].passage, p[j + 1].passage); 53. 54. strcpy(p[j+1].passage, tem_passage); 55. 56. //分数交换 57. int temp_score = p[j].score; 58. 59. p[j].score = p[j + 1].score; 60. 61. p[j + 1].score = temp_score; 62. 63. } 64. } 65. } 66. } 67. //打印函数 68. void printfInfo(struct player * p, int len)//输出结构体信息 69. { 70. for (int i = 0; i < len; i++) 71. { 72. 73. printf("第%d名: %s %s %d\n", (i+1),p[i].name,p[i].passage,p[i].score); 74. 75. } 76. } 77. 78. int main() 79. { 80. int arr[player_num] = { 0 };//用来存放5个选手的得分 81. 82. 83. 84. int pf = 0;//评委打分 85. int sum = 0;//记录得分 86. int i = 0; 87. int j = 0; 88. //主体部分,评委老师打分 89. for (i = 1; i <= 5; i++) 90. { 91. sum = 0; 92. 93. printf("请%s选手入场演讲!\n", p[i-1].name); 94. printf("%s选手演讲完毕!请各位评论老师打分!\n", p[i - 1].name); 95. for (j = 0; j < 5; j++) 96. { 97. scanf("%d", &pf); 98. sum += pf; 99. 100. } 101. arr[i-1] = sum; 102. printf("%s选手演讲的得分为:%d\n", p[i - 1].name, arr[i-1]); 103. p[i-1].score = arr[i - 1]; 104. 105. } 106. //排序 107. //排序利用排序函数 108. bubblesore(p, 5); 109. 110. //打印出排名 111. printf("名次 姓名 文章 分数\n"); 112. printf("_____________________________________________________\n"); 113. printfInfo(p, 5); 114. 115. printf("根据比赛规则,获奖名单如下:\n"); 116. printf("获得一等奖的是:%s\n", p[0].name); 117. printf("获得二等奖的是:%s\n", p[1].name); 118. printf("获得三等奖的是:%s\n", p[2].name); 119. return 0; 120. }
然后我们来说一下具体的思路:
首先我们想到:对于演讲的选手,有他的名字,题目,和分数等信息,所以我们会想到要使用结构体,另外,由于选手的数量问题,我们又考虑到了结构体数组,所以我们可以先写出这样的程序:
1. #define _CRT_SECURE_NO_WARNINGS 2. #include<stdio.h> 3. 4. #define player_num 5 5. #define judges_num 5 6. 7. 8. //构建选手结构体信息 9. struct player 10. { 11. char name[20];//选手姓名 12. char passage[20];//选手文章 13. 14. int score;//选手得分 15. 16. 17. }; 18. //初始化结构体数组 19. struct player p[player_num] = 20. { 21. {"刘二","《春之美》",0}, 22. {"张三","《春的祖国》",0}, 23. {"李四","《春天来了》",0}, 24. {"王五","《春天》",0}, 25. {"丁六","《春的味道》",0} 26. 27. }; 28. 29. 30. int main() 31. { 32. int arr[player_num] = { 0 };//用来存放5个选手的得分 33. 34. 35. 36. int pf = 0;//评委打分 37. int sum = 0;//记录得分 38. int i = 0; 39. int j = 0; 40. //主体部分,评委老师打分 41. for (i = 1; i <= 5; i++) 42. { 43. sum = 0; 44. 45. printf("请%s选手入场演讲!\n", p[i-1].name); 46. printf("%s选手演讲完毕!请各位评论老师打分!\n", p[i - 1].name); 47. for (j = 0; j < 5; j++) 48. { 49. scanf("%d", &pf); 50. sum += pf; 51. 52. } 53. arr[i-1] = sum; 54. printf("%s选手演讲的得分为:%d\n", p[i - 1].name, arr[i-1]); 55. p[i-1].score = arr[i - 1]; 56. 57. }
这个程序中要注意的是一些细节:
然后基本的结构体完善之后,我们要想到,有一个大小排序的问题,从大到小排序,我们想到再熟悉不过的冒泡排序。由于我们在排序过程中,每一个名字对应的文章和分数都是相对应的,所以,在排序交换的过程中,我们要把结构体中的数据一起交换掉,而对于字符串的交换,我们要用到一个函数strcpy,具体的用法在博主的一篇博客有相应的内容,链接放下面了
想到这些之后我们写出的程序就是这样的啦:
1. #define _CRT_SECURE_NO_WARNINGS 2. #include<stdio.h> 3. #include<string.h> 4. #define player_num 5 5. #define judges_num 5 6. 7. 8. //构建选手结构体信息 9. struct player 10. { 11. char name[20];//选手姓名 12. char passage[20];//选手文章 13. 14. int score;//选手得分 15. 16. 17. }; 18. //初始化结构体数组 19. struct player p[player_num] = 20. { 21. {"刘二","《春之美》",0}, 22. {"张三","《春的祖国》",0}, 23. {"李四","《春天来了》",0}, 24. {"王五","《春天》",0}, 25. {"丁六","《春的味道》",0} 26. 27. }; 28. 29. 30. //排序函数 31. void bubblesore(struct player *p, int len) 32. { 33. for (int i = 0; i < len; i++) 34. { 35. for (int j = 0; j < len - i - 1; j++) 36. { 37. if (p[j].score < p[j + 1].score) 38. { 39. //名字交换 40. char tem_name[20] = { 0 }; 41. 42. strcpy(tem_name , p[j].name); 43. 44. strcpy(p[j].name, p[j + 1].name); 45. 46. strcpy(p[j+1].name, tem_name); 47. //文章交换 48. char tem_passage[20] = { 0 }; 49. 50. strcpy(tem_passage, p[j ].passage); 51. 52. strcpy(p[j].passage, p[j + 1].passage); 53. 54. strcpy(p[j+1].passage, tem_passage); 55. 56. //分数交换 57. int temp_score = p[j].score; 58. 59. p[j].score = p[j + 1].score; 60. 61. p[j + 1].score = temp_score; 62. 63. } 64. } 65. } 66. } 67. 68. 69. int main() 70. { 71. int arr[player_num] = { 0 };//用来存放5个选手的得分 72. 73. 74. 75. int pf = 0;//评委打分 76. int sum = 0;//记录得分 77. int i = 0; 78. int j = 0; 79. //主体部分,评委老师打分 80. for (i = 1; i <= 5; i++) 81. { 82. sum = 0; 83. 84. printf("请%s选手入场演讲!\n", p[i-1].name); 85. printf("%s选手演讲完毕!请各位评论老师打分!\n", p[i - 1].name); 86. for (j = 0; j < 5; j++) 87. { 88. scanf("%d", &pf); 89. sum += pf; 90. 91. } 92. arr[i-1] = sum; 93. printf("%s选手演讲的得分为:%d\n", p[i - 1].name, arr[i-1]); 94. p[i-1].score = arr[i - 1]; 95. 96. } 97. //排序 98. //排序利用排序函数 99. bubblesore(p, 5); 100. 101. 102. return 0; 103. }
当时博主在第一次写的时候把这下面的这一段写出来了bug
1. if (p[j].score < p[j + 1].score) 2. { 3. //名字交换 4. char tem_name[20] = { 0 }; 5. 6. strcpy(tem_name , p[j].name); 7. 8. strcpy(p[j].name, p[j + 1].name); 9. 10. strcpy(p[j+1].name, tem_name); 11. //文章交换 12. char tem_passage[20] = { 0 }; 13. 14. strcpy(tem_passage, p[j ].passage); 15. 16. strcpy(p[j].passage, p[j + 1].passage); 17. 18. strcpy(p[j+1].passage, tem_passage); 19. 20. //分数交换 21. int temp_score = p[j].score; 22. 23. p[j].score = p[j + 1].score; 24. 25. p[j + 1].score = temp_score; 26. 27. }
此前写成了这样:
1. if (p[j].score < p[j + 1].score) 2. { 3. //名字交换 4. 5. 6. strcpy(p[j].name, p[j + 1].name); 7. 8. //文章交换 9. 10. strcpy(p[j].passage, p[j + 1].passage); 11. //分数交换 12. int temp_score = p[j].score; 13. 14. p[j].score = p[j + 1].score; 15. 16. p[j + 1].score = temp_score; 17. 18. }
这样就把p[j+1].name赋值给了p[j].name。但是p[j+1].name并没有改变,所以大家要避免犯这种小错误哈。
排序后,我们需要把它打印出来,这里考虑编写这样一个函数:
1. //打印函数 2. void printfInfo(struct player * p, int len)//输出结构体信息 3. { 4. for (int i = 0; i < len; i++) 5. { 6. 7. printf("第%d名: %s %s %d\n", (i+1),p[i].name,p[i].passage,p[i].score); 8. 9. } 10. }
这样以后基本就算搞定了!!,在主函数中调用一下就打印出来了排名的情况。然后我们可以根据获奖的要求,(比如第一名一等奖,第二名二等奖,第三名三等奖等等),将他们的获奖情况也打印出来。
1. //打印出排名 2. printf("名次 姓名 文章 分数\n"); 3. printf("_____________________________________________________\n"); 4. printfInfo(p, 5); 5. 6. printf("根据比赛规则,获奖名单如下:\n"); 7. printf("获得一等奖的是:%s\n", p[0].name); 8. printf("获得二等奖的是:%s\n", p[1].name); 9. printf("获得三等奖的是:%s\n", p[2].name); 10. return 0;
这样以后完整的程序就同最初的一样了!!!
放一下运行的结果吧!
各位想要更改选手和评委的数量可以在程序开头的#define处进行修改,并添加自己喜欢的元素即可!!
相应代码的变动我就不多说了,希望对大家有帮助吧!我们一起进步!加油!!
加油!技术人!