// 按照总成绩排序的功能 void sort() { for (int i = 0; i < stu_num - 1; i++) { for (int j = 0; j < stu_num - i - 1; j++) { if (stu[j].total_score < stu[j+1].total_score) { Student temp = stu[j]; stu[j] = stu[j+1]; stu[j+1] = temp; } } } printf("排序成功!\n"); }
时间: 2024-01-15 14:03:08 浏览: 67
这段代码实现了按照学生总成绩进行排序的功能。具体来说,函数使用了冒泡排序的思想,将学生按照总成绩从大到小进行排序。
这段代码的实现比较简单,但存在以下几个问题。首先,函数中使用了硬编码的方式来访问数组元素,这样会导致代码的可读性和可维护性较差。其次,函数中没有对输入参数进行充分的检查和容错处理,可能会导致程序的运行错误。最后,函数中没有考虑到学生总成绩可能存在相同的情况,需要进行额外的处理。
因此,如果我要对该函数进行改进,我会考虑以下几点:
1. 使用指针或迭代器的方式来访问数组元素,避免硬编码带来的问题。
2. 对函数的输入参数进行充分的检查和容错处理,比如判断数组长度是否为0等,避免程序的运行错误。
3. 考虑学生总成绩可能存在相同的情况,需要进行额外的处理。可以使用稳定排序算法来进行排序,或者在比较两个学生总成绩相同时再比较其它属性,确保排序结果的正确性。
4. 可以考虑使用C++标准库中的算法函数来实现排序,避免重复造轮子,同时可以提高代码的可读性和可维护性。
通过以上改进,可以使得函数更加健壮、易读、易懂,并且可以使用标准库中的算法函数来实现排序,避免重复造轮子。
相关问题
void sort() { int i, j, m = 0; int ch; FILE *fp; struct student temp; if ((fp = fopen("C:\Users\裴浩华\Desktop\新建文件夹(1)\stu.txt", "rb")) == NULL) { printf("文件打开失败\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) { m++; } } fclose(fp); if (m == 0) { printf("文件中没有内容\n"); } printf("1:学号升序,2:英语成绩升序,3:C语言升序,4:总成绩升序,5:平均成绩升序\n"); printf("请选择显示形式:"); scanf("%d", &ch); switch (ch) { case 1: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].num > stu[j].num) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 2: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].Eng_score > stu[j].Eng_score) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 3: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].C_score > stu[j].C_score) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 4: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].total > stu[j].total) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 5: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].aver > stu[j].aver) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; } printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n"); for (i = 0; i < m; i++) { printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n", stu[i].num, stu[i].name, stu[i].clas, stu[i].sex, stu[i].Eng_score, stu[i].C_score, stu[i].total, stu[i].aver); } } 画流程图
这是一段 C 语言的代码,它的功能是将文件中的学生成绩按照学号从小到大的顺序进行排序。
具体来说,代码首先打开了一个文件 "C:\Users\裴浩华\Desktop\新建文件夹(1)\stu.txt",如果打开失败就输出 "文件打开失败" 并退出函数。然后,代码使用 fread 函数从文件中读取学生成绩的信息,每次读取一个结构体 student 类型的数据。如果读取成功,就将读取到的学生成绩存储在一个数组 student_array 中,并将 m 变量加 1。代码使用双重循环来排序,每次比较两个学生的学号,如果前者的学号大于后者的学号,就交换两个学生的信息。最后,代码使用 fwrite 函数将排序后的学生成绩写回文件中。
void sort() { int i, j, m = 0; int ch; FILE *fp; struct student temp; if ((fp = fopen("C:\\Users\\裴浩华\\Desktop\\新建文件夹(1)\\stu.txt", "rb")) == NULL) { printf("文件打开失败\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) { m++; } } fclose(fp); if (m == 0) { printf("文件中没有内容\n"); } printf("1:学号升序,2:英语成绩升序,3:C语言升序,4:总成绩升序,5:平均成绩升序\n"); printf("请选择显示形式:"); scanf("%d", &ch); switch (ch) { case 1: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].num > stu[j].num) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 2: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].Eng_score > stu[j].Eng_score) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 3: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].C_score > stu[j].C_score) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 4: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].total > stu[j].total) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 5: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].aver > stu[j].aver) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; } printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n"); for (i = 0; i < m; i++) { printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n", stu[i].num, stu[i].name, stu[i].clas, stu[i].sex, stu[i].Eng_score, stu[i].C_score, stu[i].total, stu[i].aver); } }
这是一个使用 C 语言写的函数,它的作用是对一个文件中的学生信息进行排序。
首先,它声明了几个变量,包括文件指针 fp,和一个临时变量 temp。
然后,它使用 fopen 函数打开文件 "C:\\Users\\裴浩华\\Desktop\\新建文件夹(1)\\stu.txt",如果打开失败,就输出 "文件打开失败" 并退出函数。
接着,它使用一个 while 循环来读取文件中的每一个学生信息。如果已经到达文件的末尾,就退出循环。否则,使用 fread 函数读取一个学生信息到 temp 中。
在循环中,它还使用了一个 for 循环和一个 if 语句来实现学生信息的排序。
最后,它使用 fclose 函数关闭文件。
阅读全文