一、本周完成的作业
题目1:
本周请大家完成上周挑战作业的第一部分:给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
输入:
请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的情况下,将最大子数组以及子数组的和写入文件。
输入样例
8
1 -2 3 10 -4 7 2 -5
输出样例
18
1)实验流程
2)实验代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp; /*定义文件指针*/
int i,n,b,sum=0;
/*打开文件,进行写入追加操作*/
if((fp=fopen("E:\第x周作业\William2.txt","w+"))==NULL)
{
printf("File open error!
");
exit(0);
}
scanf("%d",&n); /*定义数组内元素个数*/
fprintf(fp,"%d
",n); /*写入文件*/
int a[n],max=a[0]; /*定义整型数组,并且最大值最初必为数组第一个元素*/
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
fprintf(fp,"%d",a[i]); /*逐个写数组元素入文件*/
if(b!=n-1)
{
fprintf(fp,","); /*应题目要求,写逗号入文件隔开元素*/
}
}
/*寻找最大子数组*/
for(i=0;i<n;i++)
{
sum+=a[i]; /*逐个累加数组中的元素*/
if(sum<a[i]) /*若已相加的元素之和比当前的元素小,则与之进行替换*/
{
sum=a[i];
}
if(max<sum) /*若最大初始值比 累加元素综合小 ,则与之替换*/
{
max=sum;
}
}
printf("%d",max);
fprintf(fp,"
%d",max); /*写最大值入文件*/
if(fclose(fp))
{
printf("Can not close the file!
");
exit(0);
}
return 0;
}
3)本体调试过程中遇到的问题及解决方法
问题一:定义输入数组元素的变量有误
问题一的解决办法:
由于 j 并没有赋值,且只能定义一个量,而数组a需要多个量,且在此处需要递增的量,所以 可以将a[j] 改成 a[ i ] ;
问题二:5 6 行代码 的位置反了
问题二的解决办法:
应先给 n 赋值,因为 数组a的 元素个数是个变量,若不先给定 则 就是随机的,所以会出错。
4)运行结果截图
题目2:
预习“7.2 二维数组”,并完成PTA上的第三周作业:判断上三角矩阵
预习可以参看翁恺老师的MOOC视频:https://www.icourse163.org/course/ZJU-9001 ,第八周 数组—》8.2 数组运算
以上两项作业,完成后请写好编程总结,并在博客园提交。
7-1 判断上三角矩阵 (15 分)
上三角矩阵指主对角线以下的元素都为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
1)实验流程
2)实验代码
#include <stdio.h>
int main()
{
int T,n,i,j,m,s=0;
int a[10] [10],c[10]={0};/*记录判断的结果*/
scanf("%d",&T);
for(m=0;m<T;m++) /*写入矩阵的个数*/
{
/*写入矩阵*/
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&a[i] [j]);
}
}
/*判断矩阵*/
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>j&&a[i] [j]!=0) /*判断对角线以下的部分是否为 0 */
{
s++; /*判断对角线以下的不等于 0 则累加*/
}
}
}
if(s==0)
{
c[m]=1; /*记为上三角矩阵*/
}
else
{
c[m]=0; /*记为非上三角矩阵*/
}
s=0; /*每判断完 一个矩阵 计数值初始化*/
}
for(m=0;m<T;m++)
{
if(c[m]!=0)
{
printf("YES
");
}
else
{
printf("NO
");
}
}
return 0;
}
3)本体调试过程中遇到的问题及解决方法
问题一:无法正常输入一个矩阵
问题一的解决办法:
/*将原来的形式改成*/
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i] [j]);
}
}
问题二:无法正常判断矩阵
问题二的解决办法:
无法正常的原因是起初我直接判断二维数组是否等于零,忽视了题目是要求对角线以下的。所以我添加了一个 对角线以下判断 代码 if(i>j&&a[i] [j])。
问题三:结果有误并且 不能 按照设定只写入两个矩阵
问题三的解决办法:
仔细检查发现第一个for循环有误(多了一次循环)应该将for(m=0;m<=T;m++) 改成 for(m=0;m<T;m++)
问题四:判断条件反了。
问题四的解决办法:
将if(s!=0) 改成 if (s==0)
问题五:答案正确但是无法提交成功
问题五的解决办法:
发现因为这些条件
将他们改成如下
4)运行结果截图
二、学习进度条
周/日期 | 这周所发时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
3/11~3/16 | 8时 | 100 | 学到了怎么使用二位数组,且知道了并且最大值最初必为数组第一个元素。及怎么写入矩阵。 | 最大子数组之和到底是怎么判断的? |
三、学习感悟
本周的作业真心很难,第一题,一开始我以为子数组是在一个数组中镶嵌一个数组,但是并不是,它只是从一个数组中提取一些元素。在写这题的时候我想了很久但是没能相处好的方法,所以我看了别人的代码,然后研究了别人的代码,我才写完的。我一开始也是想到了先求和再做比较,但是不知道怎么去比较。看了别人的才知道一点。第二题,我写之前看了书,发现书上只有输出矩阵,但是,没有输入矩阵,后来我仔细研究了矩阵的结构才发现,可以用二维数组代表矩阵的行与列。所以就需要引入两个for循环来分别循环输入矩阵的行与列。之后我在书上了看到如何判断对角线以下的部分,这才慢慢写出了这题。并且通过这题,我学到了可以利用一维数组进行多个结果记录。