2019春季第三周作业
2019年春季学期第三周作业
基础作业
本周没上课,但是请大家不要忘记学习。
本周请大家完成上周挑战作业的第一部分:给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
输入:
请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的情况下,将最大子数组以及子数组的和写入文件。
1)实验代码
#include<stdio.h> #include<stdlib.h> int main(void) { FILE * fp; int num[8],i,k,j=0,max,n,sum=0,a[30],m; char op; if((fp=fopen("d:\\Alice.txt","r"))==NULL){ printf("File open error!\n"); exit(0); } for(i=0;i<8;i++){ fscanf(fp,"%c%d",&op,&num[i]); printf("%c%d",op,num[i]); } fscanf(fp,"%c",&op); printf("%c",op); for(i=0;i<8;i++){ sum=num[i]; for(k=i+1;k<8;k++){ sum=sum+num[k]; a[j]=sum; j++; } } max=a[0]; for(n=0;n<27;n++){ if(max<=a[n]){ max=a[n]; } } if(fclose(fp)){ printf("Can not close the file!\n"); exit(0); } if((fp=fopen("d:\\Alice.txt","a"))==NULL){ printf("File open error!\n"); exit(0); } j=0; printf("\n["); fprintf(fp,"\n["); for(i=0;i<8;i++){ sum=num[i]; for(k=i+1;k<8;k++){ sum=sum+num[k]; a[j]=sum; j++; if(sum==max){ for(m=i;m<=k;m++){ printf("%d,",num[m]); fprintf(fp,"%d,",num[m]); } break; } } } printf("\b]\n"); printf("%d",max); fprintf(fp,"]\n"); fprintf(fp,"%d",max); if(fclose(fp)){ printf("Can not close the file!\n"); exit(0); } return 0; }
2)流程图
2)本题遇到的问题及解决办法
问题:没办法把内容输入到文件里
解决办法:我把文件先用只读的方式打开在关闭,之后再打开再写文件
4)运行结果截图
5)评价
这次作业我做了很长时间,不知道为什么写的内容进不去文件,还是自己了解的不多,要多多学习才行
用时5小时
预习作业
预习“7.2 二维数组”,并完成PTA上的第三周作业:判断上三角矩阵
预习可以参看翁恺老师的MOOC视频:https://www.icourse163.org/course/ZJU-9001 ,第八周 数组—》8.2 数组运算
1)实验代码
#include<stdio.h> int main(void) { int T,n,a[10][10],k,i,j,count; scanf("%d",&T); for(k=1;k<=T;k++){ scanf("%d\n",&n); count=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&a[i][j]); if(i>j&&a[i][j]==0){ count++; } } } if(count==n*(n-1)/2){ printf("YES\n"); } else{ printf("NO\n"); } } return 0; }
2)流程图
3)本题调试过程中碰到的问题及解决办法
问题:就是设定数组是不能直接是a[n][n],否则会出现段错误,还有就是设定的count不能在最上面否则结果会一直累加,应该在第一个循环里设定count=0.
解决办法:和室友一起想办法,最后进行调试,在调试的时候发现错误了。
4)运行结果截图
5)评价
这道题目做起来其实并不难,但是要仔细,定义是在循环里面还是在外面要分清楚,还有就是调试真的有必要。
用时2小时