2019春第二周作业+一些的挑战作业
基础作业
请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。
输入:
请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的情况下,将最大值和对应的最小下标数值写入文件
1实验代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 FILE*fp; 6 int a[10]; 7 int i,max=0,n; 8 char op; 9 if((fp=fopen("D:\\peizeng.txt","r+"))==NULL){ 10 printf("File open error!\n"); 11 exit(0); 12 } 13 fscanf(fp,"%d",&n); 14 fscanf(fp,"%d%c",&a[max],&op); 15 for(i=1;i<n;i++){ 16 fscanf(fp,"%d%c",&a[i],&op); 17 if(a[max]<a[i]){ 18 max=i; 19 } 20 } 21 fprintf(fp,"\n"); 22 fprintf(fp,"%d %d",a[max],max); 23 if(fclose(fp)){ 24 printf("can not close the file!\n"); 25 exit(0); 26 } 27 return 0; 28 }
设计思路流程图
本题调试过程碰到问题及解决办法
在刚开始写本题时,没有去考虑逗号的问题,导致一直无法把答案写进去,通过调试发现,原来程序不会像我想的那样可以直接跳过逗号继续输入后面的文件,因为有逗号,整形变量无法读入,导致后面的元素就也读入不了,之后我加了一个字符变量去储存逗号,就解决了这个问题。
运行结果截图
挑战题
题目要求是让我们求二维数组的最大子数组的和,让我们先看看一维数组的最大子数组怎么求
求一维数组的最大子数组:首先什么是子数组呢,就是一个数组中,他的几个连续的元素组成的数组就叫这个数组的子数组,最大子数组就是组成子数组的元素相加最大。
实验代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 FILE*fp; 6 int i,j,sum=0,item=0,maximum=0,n;//sum为子数组和,item为当前的子数组和,maximum为最大的子数组和 7 if((fp=fopen("D:\\peizengyiweishuzu.txt","r"))==NULL) 8 { 9 printf("File open error!\n"); 10 exit (0); 11 } 12 fscanf(fp,"%d",&n); 13 int a[n]; 14 for(j=0;j<n;j++) 15 { 16 for(i=j;i<n;i++) 17 { 18 fscanf(fp,"%d",&a[i]); 19 item=item+a[i]; 20 if(item>sum) 21 sum=item; 22 } 23 if(sum>maximum) 24 maximum=sum; 25 sum=item=0; 26 } 27 printf("%d",maximum); 28 if(fclose(fp)) 29 { 30 printf("can not close the file!\n"); 31 exit (0); 32 } 33 return 0; 34 }
设计思路流程图
运行结果截图
求二维数组的最大子数组:二维数组的最大子数组有很多情况,我发现以我目前的能力根本无法全部解决,所以我就只去写了当最大子数组为矩形时候的情况。
我的思路是先找出二维数组中最大值的所在位置,然后在把最大值所在的那一行的最大子数组找出并记录是那些元素,然后再把这些元素所在的列全部求最大子数组,然后再根据某一列的上下元素确定最大的二维数组最大子数组的矩形大小(是不是看起来很复杂= =,好吧我承认我不太会表达我的想法,那我就尽量在代码中解释清楚吧,这里没有考虑数的溢出与当输入文件的参数有错误程序能正常退出, 并显示相应的错误信息)
实验代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 FILE*fp; 6 int i,j,m,n,maxi=0,maxj=0,sum=0,item=0,maximum=0; 7 if((fp=fopen("D:\\peizengerweishuzu.txt","r"))==NULL) 8 { 9 printf("File open error!\n"); 10 exit (0); 11 } 12 fscanf(fp,"%d",&m); 13 fscanf(fp,"%d",&n);/*读出二维数组的行列*/ 14 int a[m][n]; 15 for(i=0;i<m;i++){ 16 for(j=0;j<n;j++){ 17 fscanf(fp,"%d",&a[i][j]); 18 if(a[i][j]>a[maxi][maxj]) maxi=i,maxj=j; 19 } 20 } /*找出二维数组中最大值的所在位置*/ 21 printf("%d %d %d\n",a[maxi][maxj],maxi,maxj); 22 int left=0,right=0,maxleft=0,maxright=0; 23 for(j=0;j<n;j++) 24 { 25 for(i=j;i<n;i++) 26 { 27 item=item+a[maxi][i]; 28 if(item>=sum) 29 sum=item,left=j,right=i; 30 } 31 if(sum>=maximum) 32 maximum=sum,maxleft=left,maxright=right; 33 sum=item=0; 34 } /*找出最大值所在的那一行中最大子数组的左右边界*/ 35 printf("%d %d\n",maxleft,maxright); 36 maximum=0; 37 int top=0,low=0,maxtop=0,maxlow=0,p,maxpsum=0; 38 for(p=maxleft;p<=maxright;p++){ 39 for(j=0;j<m;j++) 40 { 41 for(i=j;i<m;i++) 42 { 43 item=item+a[i][p]; 44 if(item>=sum) 45 sum=item,top=j,low=i; 46 } 47 if(sum>=maximum) 48 maximum=sum,maxtop=top,maxlow=low; 49 item=0; 50 } 51 sum=0; 52 if(maximum>=maxpsum) maxtop=top,maxlow=low; 53 } /*找出满足最大矩形的上下边界*/ 54 printf("%d %d\n",maxtop,maxlow); 55 int maxsum=0; 56 for(i=maxtop;i<=maxlow;i++){ 57 for(j=maxleft;j<=maxright;j++){ 58 maxsum=maxsum+a[i][j]; 59 } 60 } 61 printf("%d",maxsum); /*找到矩形后就直接把矩形里的元素相加就可以了*/ 62 if(fclose(fp)) /*关闭文件*/ 63 { 64 printf("can not close the file!\n"); 65 exit (0); 66 } 67 return 0; 68 }
运行结果截图
学习进度条
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
3月4-3月10 | 4天 | 130行 | 如何读取文件中的数据并写入数据 |
学习感悟
本周我们进入了处理文件的学习,因为突然的进入,我还没有预习过,所以一开始也是乱的一锅粥,但是我通过自己的学习,基本了解了一些处理文件语句