• 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循环来分别循环输入矩阵的行与列。之后我在书上了看到如何判断对角线以下的部分,这才慢慢写出了这题。并且通过这题,我学到了可以利用一维数组进行多个结果记录。
    
  • 相关阅读:
    Round robin
    Linux命令之nslookup
    VLAN
    基础网络概念
    python开发_filecmp
    python开发_stat
    python开发_fileinput
    python开发_os.path
    python开发_bisect
    python开发_copy(浅拷贝|深拷贝)_博主推荐
  • 原文地址:https://www.cnblogs.com/xw1203/p/10532613.html
Copyright © 2020-2023  润新知