void sortStudents() { int i, j; Student temp; for (i = 0; i < studentCount - 1; ++i) { for (j = i + 1; j < studentCount; ++j) { if (students[i].id > students[j].id) { temp = students[i]; students[i] = students[j]; students[j] = temp; } } } printf("Sorting successful!\n"); } void saveToFile() { FILE *fp; int i; fp = fopen("E:/C language flie/students.txt","w"); if (!fp) { printf("Unable to open file!\n"); return; } fprintf(fp, "Student ID\nName\nGender\nAddress\nPhone number\nChinese score\nMath score\nEnglish score\nAverage score\nEtiquette score\nComprehensive ranking\nComprehensive score\n"); for (i = 0; i < studentCount; ++i) { fprintf(fp, "%d\n%s\n%s\n%s\n%s\n%d\n%d\n%d\n%.1f\n%d\n%d\n%.1f\n", students[i].id, students[i].name, students[i].gender, students[i].address, students[i].phone, students[i].chinese, students[i].math, students[i].english, students[i].average, students[i].etiquette, students[i].rank, students[i].score); } fclose(fp); printf("Save successful!\n"); }
时间: 2024-02-14 11:32:18 浏览: 78
这段代码是上述学生信息管理系统的两个附加功能:对学生信息进行排序并将学生信息保存到文件中。
函数`sortStudents()`用于对学生信息按照学生ID进行排序。它使用了两个嵌套的循环,分别遍历每一个学生信息,并比较其ID与后面学生信息的ID大小。如果前面学生信息的ID大于后面学生信息的ID,则将两个学生信息交换位置。最后输出一个排序成功的提示信息。
函数`saveToFile()`用于将所有学生信息保存到文件中。它首先打开一个名为`students.txt`的文件,并将文件指针存储在`fp`变量中。如果无法打开文件,则输出一个提示信息并返回。接着,它在文件中写入一行表头,包含了学生信息的各个字段。然后,它遍历所有学生信息,并将各个字段的值按照指定的格式写入文件中。最后,它关闭文件,并输出一个保存成功的提示信息。
需要注意的是,函数`saveToFile()`中的文件路径是写死的,因此如果需要在其他位置使用该函数,需要修改文件路径。
相关问题
void sortRecords() { printf("1.按学号排序\n"); printf("2.按姓名排序\n"); printf("3.按平均成绩排序\n"); printf("请选择排序方式:"); int sortChoice; scanf("%d", &sortChoice); if(sortChoice==1) { // 按学号排序(选择排序法) for (int i=0;i<studentCount-1;i++) { int minIndex=i; for (int j=i+1;j<studentCount;j++) { if (students[j].id<students[minIndex].id) { minIndex=j; } } struct Student temp=students[i]; students[i]=students[minIndex]; students[minIndex]=temp; } } else if(sortChoice==2) { // 按姓名排序(冒泡排序法) for(int i=0;i<studentCount-1;i++) { for(int j=0;j<studentCount-i-1;j++) { if(strcmp(students[j].name, students[j+1].name)>0) { struct Student temp=students[j]; students[j]=students[j+1]; students[j+1]=temp; } } } } else if(sortChoice==3) { // 按平均成绩排序(冒泡排序法) for(int i=0;i<studentCount-1;i++) { for(int j=0;j<studentCount-i-1;j++) { if(students[j].average>students[j+1].average) { struct Student temp=students[j]; students[j]=students[j+1]; students[j+1]=temp; } } } } else { printf("无效的排序方式!\n"); return; } printf("成绩排序成功!\n"); listRecords(); }的算法思想
这段代码实现了对学生记录的排序功能,包括按学号、姓名、平均成绩三种排序方式。其中,按学号排序采用选择排序法,按姓名和平均成绩排序采用冒泡排序法。
选择排序法的基本思想是:每次从待排序的元素中选出最小的元素,将其放到已排序部分的末尾。具体实现过程是,从第一个元素开始,依次比较后面的元素,找到最小的元素,并与第一个元素交换位置。然后从第二个元素开始,继续这个过程,直到所有元素都被排序。
冒泡排序法的基本思想是:依次比较相邻的两个元素,如果它们的顺序不对则交换它们的位置。具体实现过程是,从第一个元素开始,依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们的位置。这样一趟比较下来,最大的元素就被排到了最后面。然后从第二个元素开始,继续这个过程,直到所有元素都被排序。
在这段代码中,首先根据用户选择的排序方式,分别采用不同的排序算法进行排序。其中,选择排序法用于按学号排序,冒泡排序法用于按姓名和平均成绩排序。排序完成后,再调用listRecords函数输出排序后的学生记录。
void Order(struct Student *PArr) { int op; struct Student temp; printf("<1>学号升序 <2>姓名升序 <3>打卡次数降序\n"); scanf("%d",&op); if(op==1) { //将学生信息按学号排序 for(int i=0;i<numCount-1;i++) { for(int j=0;j<numCount-i-1;j++) { if(PArr[j].num>PArr[j+1].num) {temp=PArr[j]; PArr[j]=PArr[j+1]; PArr[j+1]=temp;} } } } //将学生信息按姓名排序 else if(op==2) { void StudentNameAsc(struct Student *PArr); { struct Student temp; for(int i=0;i<numCount-1;i++) { for(int j=0;j<numCount-i-1;j++) { if(PArr[j].name[0]>PArr[j+1].name[0]) { temp=PArr[j]; PArr[j]=PArr[j+1]; PArr[j+1]=temp; } } } } } //将学生信息按打卡次数排序 else { struct Student temp; for(int i=0;i<numCount-1;i++) { for(int j=0;j<numCount-i-1;j++) { if(PArr[j].num1<PArr[j+1].num1) { temp=PArr[j]; PArr[j]=PArr[j+1]; PArr[j+1]=temp; } } } } Output(PArr); }这个代码怎么描述,运用了什么函数
这段代码是一个排序函数,用于按照学号升序、姓名升序或者打卡次数降序对学生信息进行排序。在函数中,使用了scanf函数获取用户输入的排序方式,然后分别使用冒泡排序算法以及结构体变量交换来实现排序。其中,按照姓名排序时使用了strcmp函数来比较学生姓名的大小。最后,通过调用Output函数来输出排序后的学生信息。
阅读全文