#include<stdio.h> #include<stdlib.h> struct stu{ int sno; char sname[20] ; double score; }; # define LEN sizeof(struct stu) int main() { FILE *fp1,*fp2; fp1=fopen("file1.dat","rb"); fp2=fopen("file2.dat","wb"); if(fp1==NULL||fp2==NULL) exit(0); struct stu stus[5]; int i; for(i=0;i<=4;i++) { fread(&stus[i],LEN,1,fp1); } struct stu temp; int j; for(i=0;i<5;i++) { for(j=0;j<5-i+1;j++) if(stus[j].score>=stus[j+1].score) { temp=stus[j]; stus[j]=stus[j+1]; stus[j+1]=temp; } } for(i=0;i<=4;i++) { fwrite(&stus[i],LEN,1,fp2); } return 0; }这个程序有什么问题
时间: 2023-12-04 17:03:30 浏览: 78
#include <stdio.h>
4星 · 用户满意度95%
这个程序有两个问题:
1. 在排序算法中,循环的终止条件应该是j<5-i-1,而不是j<5-i+1。因为数组下标是从0开始的,因此在第i轮比较中,前i个元素已经排好序了,应该从第i+1个元素开始比较。
2. 在文件操作中,应该先判断文件是否打开成功,如果打开失败应该及时退出程序。但是该程序只判断了两个文件是否都打开成功,没有对打开文件失败的情况进行处理。
下面是修改后的程序:
```c
#include<stdio.h>
#include<stdlib.h>
struct stu{
int sno;
char sname[20] ;
double score;
};
#define LEN sizeof(struct stu)
int main() {
FILE *fp1,*fp2;
fp1=fopen("file1.dat","rb");
fp2=fopen("file2.dat","wb");
if(fp1==NULL){
printf("打开 file1.dat 文件失败\n");
exit(0);
}
if(fp2==NULL){
printf("打开 file2.dat 文件失败\n");
exit(0);
}
struct stu stus[5];
int i;
for(i=0;i<=4;i++){
fread(&stus[i],LEN,1,fp1);
}
struct stu temp;
int j;
for(i=0;i<5;i++){
for(j=0;j<5-i-1;j++) // 修改循环终止条件
if(stus[j].score>=stus[j+1].score){
temp=stus[j];
stus[j]=stus[j+1];
stus[j+1]=temp;
}
}
for(i=0;i<=4;i++){
fwrite(&stus[i],LEN,1,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
```
阅读全文