在C中的结构中进行冒泡排序

v8wbuo2f  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(132)

我已经编写了一个基于结构数组的程序,它的所有部分都很好,但是我的一个函数sort_student函数有一个bug。在这个代码中,首先用户将输入一些学生和他们的信息,包括名字,姓氏,id和平均值,之后用户将有几个选项,除了排序功能外,所有选项都可以。这个函数的主要问题是,它只能对平均值进行排序,然后它会把第一个学生的名字,姓氏和id放在所有学生的结构中,我不知道怎么解决这个问题。我想我不得不说,我是业余的编码,所以请帮助,如果你想帮助,如果你不想请不要发表负面评论。谢谢.
这是有问题的函数:

  1. void sort_student()
  2. {
  3. float selected_item;
  4. int j;
  5. for (int i = 0; i < students_count; i++)
  6. {
  7. selected_item = student[i].average;
  8. j = i - 1;
  9. while ((j >= 0) && (selected_item < student[j].average))
  10. {
  11. student[j + 1].average = student[j].average;
  12. strcpy(student[j + 1].first_name, student[j].first_name);
  13. strcpy(student[j + 1].last_name, student[j].last_name);
  14. strcpy(student[j + 1].id, student[j].id);
  15. j--;
  16. }
  17. student[j + 1].average = selected_item;
  18. }
  19. printf("The students are sorted now.");
  20. }

如果你需要,这是我所有的代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. struct school
  5. {
  6. char first_name[80];
  7. char last_name[80];
  8. char id[12];
  9. float average;
  10. };
  11. struct school *student;
  12. int students_count;
  13. int con = 1;
  14. int chosen_option;
  15. FILE *fptr;
  16. void options();
  17. void add_student();
  18. void remove_student();
  19. void search_student();
  20. void sort_student();
  21. void save_to_file();
  22. void upload_students();
  23. int main() {
  24. student = calloc(300, sizeof *student);
  25. printf("How many students do you have ? (MAX = 300)\n");
  26. scanf("%d", &students_count);
  27. for (int i = 0; i < students_count; i++)
  28. {
  29. printf("Whats your student number %d first name ? \n", i+1);
  30. scanf("%79s", student[i].first_name);
  31. printf("Whats your student number %d last name ? \n", i+1);
  32. scanf("%79s", student[i].last_name);
  33. printf("Whats your student number %d id ? \n", i+1);
  34. scanf("%11s", student[i].id);
  35. printf("Whats your student number %d average ? \n", i+1);
  36. scanf("%f", &student[i].average);
  37. }
  38. printf("\nOK! you've entered the students and their information successfully.\n");
  39. while (con == 1)
  40. {
  41. options();
  42. }
  43. return 0;
  44. }
  45. void options()
  46. {
  47. printf("\nOK! Do you want to continue? (Yes : 1/N : 0)");
  48. scanf("%d", &con);
  49. if (con == 1)
  50. {
  51. printf("What do you want to do now ? \n");
  52. printf("\n1. Add student\n");
  53. printf("\n2. Remove student\n");
  54. printf("\n3. Search student\n");
  55. printf("\n4. Sort by average\n");
  56. printf("\n5. save the students information in a file\n");
  57. printf("\n6. upload all of students information\n");
  58. printf("\nPlease enter the number of you choice : ");
  59. scanf("%d", &chosen_option);
  60. switch (chosen_option) {
  61. case 1:
  62. add_student();
  63. break;
  64. case 2:
  65. remove_student();
  66. break;
  67. case 3:
  68. search_student();
  69. break;
  70. case 4:
  71. sort_student();
  72. break;
  73. case 5:
  74. save_to_file();
  75. break;
  76. case 6:
  77. upload_students();
  78. break;
  79. default:
  80. printf("Your chosen option is invalid\n");
  81. break;
  82. }
  83. }
  84. else if (con == 0)
  85. {
  86. printf("OK! You don't want to continue. Bye!\n");
  87. exit(0);
  88. } else
  89. {
  90. printf("You can't continue with invalid options.\n");
  91. exit(0);
  92. }
  93. }
  94. void add_student()
  95. {
  96. printf("Whats your (new) student number %d first name ? \n", students_count+1);
  97. scanf("%79s", student[students_count].first_name);
  98. printf("Whats your (new) student number %d last name ? \n", students_count+1);
  99. scanf("%79s", student[students_count].last_name);
  100. printf("Whats your (new) student number %d id ? \n", students_count+1);
  101. scanf("%11s", student[students_count].id);
  102. printf("Whats your (new) student number %d average ? \n", students_count+1);
  103. scanf("%f", &student[students_count].average);
  104. students_count ++;
  105. printf("OK! You've entered the new student information successfully.\n");
  106. }
  107. void remove_student()
  108. {
  109. char removing_id[12];
  110. int i;
  111. printf("\nPlease enter the id of student that you want to remove : ");
  112. scanf("%11s", removing_id);
  113. for (i = 0; i < students_count; i++)
  114. {
  115. if (strcmp(removing_id, student[i].id) == 0)
  116. {
  117. for (int j = i; j < students_count - 1; j++)
  118. {
  119. strcpy(student[j].first_name, student[j+1].first_name);
  120. strcpy(student[j].last_name, student[j+1].last_name);
  121. strcpy(student[j].id, student[j+1].id);
  122. student[j].average = student[j+1].average;
  123. }
  124. break;
  125. }
  126. }
  127. if(i == students_count)
  128. {
  129. printf("The id is not available!");
  130. exit(0);
  131. }
  132. else
  133. {
  134. students_count--;
  135. printf("The student removed successfully.");
  136. }
  137. }
  138. void search_student()
  139. {
  140. char searching_id[12];
  141. int i;
  142. printf("\nPlease enter the id of student that you want to search : ");
  143. scanf("%11s",searching_id);
  144. for (i = 0; i < students_count; i++)
  145. {
  146. if (strcmp(searching_id, student[i].id) == 0)
  147. {
  148. printf("\nFIRSTNAME LASTNAME ID AVERAGE\n");
  149. printf("\n%s\t%s\t%s\t%.2f\n", student[i].first_name, student[i].last_name, student[i].id,
  150. student[i].average);
  151. }
  152. }
  153. if (i == students_count)
  154. {
  155. printf("We don't have student with this id.");
  156. }
  157. }
  158. void sort_student()
  159. {
  160. float selected_item;
  161. int j;
  162. for (int i = 0; i < students_count; i++)
  163. {
  164. selected_item = student[i].average;
  165. j = i - 1;
  166. while ((j >= 0) && (selected_item < student[j].average))
  167. {
  168. student[j + 1].average = student[j].average;
  169. strcpy(student[j + 1].first_name, student[j].first_name);
  170. strcpy(student[j + 1].last_name, student[j].last_name);
  171. strcpy(student[j + 1].id, student[j].id);
  172. j--;
  173. }
  174. student[j + 1].average = selected_item;
  175. }
  176. printf("The students are sorted now.");
  177. }
  178. void save_to_file()
  179. {
  180. fptr = fopen("MY SCHOOL FILE.txt", "w");
  181. fprintf(fptr, "# FIRSTNAME LASTNAME ID AVERAGE\n");
  182. for(int i = 0; i < students_count; i++)
  183. {
  184. fprintf(fptr, "%d\t%s\t%s\t%s\t%.2f\n", i+1, student[i].first_name, student[i].last_name,
  185. student[i].id, student[i].average);
  186. }
  187. fclose(fptr);
  188. printf("\nThe file is in project folder.\n");
  189. }
  190. void upload_students()
  191. {
  192. printf("# FIRSTNAME LASTNAME ID AVERAGE\n");
  193. for (int i = 0; i < students_count; i++)
  194. {
  195. printf("%d\t%s\t%s\t%s\t%.2f\n", i+1, student[i].first_name, student[i]. last_name,
  196. student[i].id, student[i].average);
  197. }
  198. }
kqqjbcuj

kqqjbcuj1#

对于初学者来说,函数sort_student中没有使用冒泡排序方法。实际上,你正在尝试实现插入排序方法。
在这个while循环中

  1. while ((j >= 0) && (selected_item < student[j].average))
  2. {
  3. student[j + 1].average = student[j].average;
  4. strcpy(student[j + 1].first_name, student[j].first_name);
  5. strcpy(student[j + 1].last_name, student[j].last_name);
  6. strcpy(student[j + 1].id, student[j].id);
  7. j--;
  8. }

元素student[i]的所有数据成员都被覆盖。
该函数可以如下所示

  1. void sort_student( void )
  2. {
  3. for ( int i = 1; i < students_count; i++ )
  4. {
  5. struct school current_student = student[i];
  6. int j = i;
  7. for ( ; j != 0 && current_student.average < student[j - 1].average; --j )
  8. {
  9. student[j] = student[j-1];
  10. }
  11. if ( j != i ) student[j] = current_student;
  12. }
  13. printf("The students are sorted now.");
  14. }
展开查看全部

相关问题