2019年春季学期第三周作业

一、本周完成的作业

题目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循环来分别循环输入矩阵的行与列。之后我在书上了看到如何判断对角线以下的部分,这才慢慢写出了这题。并且通过这题,我学到了可以利用一维数组进行多个结果记录。
原文地址:https://www.cnblogs.com/xw1203/p/10532613.html