2019年春季学期第三周作业
基础作业
本周没上课,但是请大家不要忘记学习。
本周请大家完成上周挑战作业的第一部分:给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
输入:
请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的情况下,将最大子数组以及子数组的和写入文件。
预习作业
预习“7.2 二维数组”,并完成PTA上的第三周作业:判断上三角矩阵
预习可以参看翁恺老师的MOOC视频:https://www.icourse163.org/course/ZJU-9001 ,第八周 数组—》8.2 数组运算
以上两项作业,完成后请写好编程总结,并在博客园提交。
请注意:题目做起来难说明我们还有提升的空间,请大家相信自己的能力是可以不断提升的,我对大家有信心!
编程总结要求:
格式标准,程序正确,思路清晰(有流程图),有对自己作业的评价(存在的问题和解决办法、心得、完成作业的时间消耗),程序运行结果的截图或者效果录像。
题目1
代码
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { int i,j,x=0,y,n,max,sum,head,tail; char a[100],b[100]; FILE *fp; 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; } fclose(fp); for(i=0;i<n;i++) { sum=0; for(j=i;j<n;j++) { sum=sum+b[j]; if(sum>max) max=sum; } } for(i=0;i<n;i++) { sum=0; for(j=i;j<n;j++) { sum=sum+b[j]; if(sum==max) { head=i; tail=j; break; } } } if((fp=fopen("D:\ocean.txt","a+"))==NULL) { printf("File opren error! "); exit(0); } //debug head和tail数值无问题 for语句不执行, 待尝试方案:重写试试。 //debug printf(" 最大子数组是"); fprintf(fp," 最大子数组是"); for(i=head;i<=tail;i++) { fprintf(fp,"%d,",b[i]); //debug printf ("%d",b[j]); } fprintf(fp," 其和为%d",max); fclose(fp); //debug printf("%d",max); return 0; }
流程图
遇到问题
一开始就想好可以用穷举法找出最大子数组,但是我感觉这个方法运行效率太低了,于是去网上找比较高的办法,最后办法是找到了,但是太复杂了我就没有写了.........主要是还用了一些我此前不知道的东西。如果不照抄,等我学完估计要错过上交时间了(毕竟一开始没注意到有作业..)。
最后还是用最低效但是简单的办法做了这个题目.
预习题目
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例:
2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
输出样例:
YES
NO
代码如下
#include<stdio.h> int main() { int n,x,t,j,i; int a[20][20]; int flag[11]={0}; scanf("%d",&t); for(x=1;x<=t;x++) { scanf("%d",&n); for(i=1;i<=n;i++) //存入数组中 { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } for(i=2;i<=n;i++) //数组对应元素判断 { for(j=1;j<i;j++) { if(a[i][j]!=0) flag[x]=1; } } } for(x=1;x<=t;x++) { if(flag[x]==1) //打印结果 { printf("NO "); } else printf("YES "); } return 0; }
流程图
遇到问题:无,很简单的预习题目..............
四、学习进度条。
周日期 |
这周所花时间 |
代码行数 |
学到的知识点简介 |
目前比较迷惑的问题 |
314-315 |
约8小时 |
120 |
二维数组,文件各种读取和输入的方法。找数组中最大子数组的方法。 |
|