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小时