#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main(){
int a[10],i,j,max1,max2;
FILE*fp;
srand((unsigned)time(NULL));
fp=fopen("618.txt,w+");
for(i=0;i<10;i++){
a[i]=rand()%100;
for(j=1;j<=i;j++)
if(a[j]==a[i])
i--;
}
for(i=0;i<10;i++)
fscanf("fp,%d",&a[i]);
max1=max2=a[0];
for(i=1;i<10;i++)
if(a[i]>max1){
max2=max1;
max1=a[i];
}
else if(a[i]>max2)
max2=a[i];
printf("最大值为%d, 次大值为 %d",max1,max2);
fscanf("fp,%d%d",&max1,&max2);
fclose(fp);
}
请问程序为什么编译不起来,麻烦大家看一下,谢谢!
这个题目的目标是随机产生10个100以内的不重复整数写入文件,然后再从文件读取出来,计算其最大值和次最大值并打印吗?下面的代码以这种思路,做了一下修改。
修改如下:
参考链接:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main(){
int a[10],i,j,max1,max2;
FILE * fp;
srand((unsigned)time(NULL));
// int b[10];
// 产生10个100以内不重复的整数,存入数组a中
for(i=0;i<10;i++){
a[i]=rand()%100;
for(j=0;j<i;j++)
if(a[j]==a[i]){
i--;
break;
}
}
fp=fopen("618.txt","w");
if(fp==NULL){
printf("文件打开失败!\n");
return 0;
}
// 将数组a内10个整数写入文件"618.txt"中
for(i=0;i<10;i++){
// printf("a[%d]=%d\n",i,a[i]);
fprintf(fp,"%d ",a[i]);
}
fclose(fp);
// getchar();
// 从文件中读取写入的10个整数,并存入数组a中
fp=fopen("618.txt","r");
for(i=0;i<10;i++)
fscanf(fp,"%d",&a[i]);
fclose(fp);
// getchar();
// for(i=0;i<10;i++){
// printf("a[%d]=%d\n",i,a[i]);
//
// }
// 下面的代码会在当产生的10个整数,最大值为第一个值时,最大值和次最大值都是第一个最大的数
// max1=max2=a[0];
// for(i=1;i<10;i++)
// if(a[i]>max1){
// max2=max1;
// max1=a[i];
// }
// else if(a[i]>max2)
// max2=a[i];
// 遍历数组a,寻找数组最大值和次最大值
// 先从大到小排序数组,然后数组第一个元素即最大值,第二个元素即次最大值
for(int j=0;j<9;j++){
for(int k=j+1;k<10;k++){
if(a[j]<a[k]){
int temp = a[j];
a[j]=a[k];
a[k]=temp;
}
}
}
max1=a[0];
max2=a[1];
printf("最大值为%d, 次大值为 %d",max1,max2);
fp=fopen("618.txt","a+");
// 将计算出的最大值和次最大值追加到文件 "618.txt"中
fprintf(fp,"\n%d %d",max1,max2);
fclose(fp);
return 0;
}
fopen("618.txt","w+");
【以下回答由 GPT 生成】
这个程序无法编译起来的原因是因为在第19行和第26行的fscanf函数使用了一个未打开的文件指针。具体来说,在第19行的fscanf函数中,程序试图从fp指向的文件中读取整数数据,并将其存储到a[i]中,但是在这之前没有执行过任何向文件中写入整数数据的操作。同样,在第26行的fscanf函数中,程序试图从fp指向的文件中读取两个整数数据,并将其存储到max1和max2中,但是在这之前也没有执行过任何向文件中写入整数数据的操作。
为了解决这个问题,可以在循环中通过fprintf函数将数组a的数据写入到文件中,然后在读取数据之前使用fseek函数将文件指针重新定位到文件的开头。以下是修改后的代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int a[10], i, j, max1, max2;
FILE *fp;
srand((unsigned)time(NULL));
fp = fopen("618.txt", "w+");
for(i=0; i<10; i++){
a[i] = rand()%100;
for(j=1; j<=i; j++){
if(a[j] == a[i]){
i--;
break;
}
}
}
for(i=0; i<10; i++){
fprintf(fp, "%d ", a[i]); // 将数组a的数据写入到文件中
}
fseek(fp, 0, SEEK_SET); // 将文件指针重新定位到文件的开头
for(i=0; i<10; i++){
fscanf(fp,"%d", &a[i]); // 从文件中读取数据到数组a中
}
max1=max2=a[0];
for(i=1; i<10; i++){
if(a[i]>max1){
max2=max1;
max1=a[i];
}
else if(a[i]>max2){
max2=a[i];
}
}
printf("最大值为%d, 次大值为 %d", max1, max2);
fclose(fp);
return 0;
}
这样修改后的代码应该可以正确编译和执行,且可以正确输出最大值和次大值。
【相关推荐】