2019年春季学期第二周作业
基础作业
请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。
输入:
请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的情况下,将最大值和对应的最小下标数值写入文件。
挑战作业
有能力的同学可以挑战一下:
给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
具体要求参看邹欣老师博客 现代程序设计作业2
基础作业是必做项,挑战作业作为加分项。
以上两项作业,完成后请写好编程总结,并在博客园提交。
编程总结要求:
格式标准,程序正确,思路清晰(有流程图),有对自己作业的评价(存在的问题和解决办法、心得、完成作业的时间消耗),程序运行结果的截图或者效果录像。
最初看到这个作业的时候,我的理解貌似与其他同学不同(至少和我室友不一样),所以我写了另一个东西。当然为了防止写错,两个版本我都上传了吧。
普通作业版
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { FILE *fp; int i,n,max; char a[100]; if((fp=fopen("D:\ocean.txt","w+"))==NULL) //创造文件 ,并且输入数组 { printf("File opren error! "); exit(0); } scanf("%d",&n); fprintf(fp,"%d ",n); for(i=0;i<n;i++) { scanf("%d",&a[i]); fprintf(fp,"%d,",a[i]); } max=a[0]; for(i=0;i<n;i++) { if(a[i]>=max) { max=a[i]; } } for(i=0;i<n;i++) { if(a[i]==max) { break; } } fprintf(fp," %d %d",max,i); fclose(fp); return 0; }
这个其实是有钻空子嫌疑的,我就是吧之前的代码复制了一遍,然后加了个打开文件,和输入数组的代码。
全程之打开了一次,把题目想要看到的答案输进去罢了。
流程图
然后就是我最初的看到题目的思路了,首先题目要求创建一个文件并且输入一个数组。然后要求在不删除原有数据的情况下,将max和下标输入。
所以我写了以下这个尽可能的从逻辑上完成题目。
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { FILE *fp; int i,x=0,y,n,max; char a[100],b[100]; if((fp=fopen("D:\ocean.txt","w+"))==NULL) //创造文件 ,并且输入数组 { printf("File opren error! "); exit(0); } scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); fprintf(fp,"%d,",a[i]); } fclose(fp); if((fp=fopen("D:\ocean.txt","r+"))==NULL) //读取文件数据 { printf("File opren error! "); exit(0); } for(i=0;i<n;i++) //对数据进行处理 { fscanf(fp,"%d,",&y); b[i]=y; } max=b[0]; for(i=0;i<n;i++) { if(b[i]>=max) { max=b[i]; } } for(i=0;i<n;i++) { if(b[i]==max) { break; } } fclose(fp); //printf("%d %d",max,i); debug if((fp=fopen("D:\ocean.txt","a+"))==NULL) //将处理完的最终结果输入文件 { printf("File opren error! "); exit(0); } fprintf(fp," %d %d",max,i); fclose(fp); }
首先创建文件并且输入数组。
第二部,读取文件中我所需要的数据并且进行处理。
第三步,重新打开文件并且在后面追加我处理后算出的max和其下标。
流程图
遇到的问题
在写第一个的时候倒是没有什么问题,很顺利的写出来了,但是在写第二个的时候遇到过很多。
首先,我最初对于fscanf的理解是非常浅显的,所以为了之读取出数字而忽略其他字符,我尝试了好多其他的办法,包括读取后在进行一次筛选。
不过在想办法解决之前,顺便学会了一些其他的类似作用的东西,比如sscanf,fwrite,fputs,fgets等...虽然最后发现fscanf本身就可以做到删选,然后这些东西都貌似用不上就是....
其次就是,我最后再一个东西下卡了很久,我最初以为用a+打开,就可以读取并且写入,于是我的代码就没有最后再一次打开写入那一步,而是在第而是读取后没有关闭就又写入了。我不知道是我理解有问题还是本来就这样。我尝试后发现,无论什么方式打开的文件,都只能单独进行读取 或者写入而不能两者一起进行。引以为戒。
以下为笔记,不属于作业部分.
fscanf(指针,"格式",变量);