2019年春季学期第三周作业

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;   
}

流程图

遇到问题

一开始就想好可以用穷举法找出最大子数组,但是我感觉这个方法运行效率太低了,于是去网上找比较高的办法,最后办法是找到了,但是太复杂了我就没有写了.........主要是还用了一些我此前不知道的东西。如果不照抄,等我学完估计要错过上交时间了(毕竟一开始没注意到有作业..)。

最后还是用最低效但是简单的办法做了这个题目.

预习题目

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


代码如下
#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

二维数组,文件各种读取和输入的方法。找数组中最大子数组的方法。

 
 
原文地址:https://www.cnblogs.com/807194965lxy/p/10537043.html