2019年春季学期第三周作业

第一题:
7-1 判断上三角矩阵
上三角矩阵指主对角线以下的元素都为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)实验代码

#include<stdio.h>
int main()
{
  int n,m;
  scanf("%d %d\n",&n,&m);
  if(n<=m)
  m=m-n;
  int a[n],i=0;
  for(i=0;i<n;i++)
  {
  int s=i+m;
  if(s<n)
  scanf("%d",&a[s]);
  else if(s>=n)
  scanf("%d",&a[s-n]);
  }
  for(i=0;i<n;i++)
  {
    if(i<(n-1))
    printf("%d ",a[i]);
    else
    printf("%d",a[i]);
  }
}
  1. 设计思路

3.本题调试过程碰到问题及解决办法

问题:各答案错误,在DEV—C上运行时发现无法输入第二个矩阵

解决方法:发现了在第一个FOR语句后的分号,删除后即正确

4.运行截图

第二题:
给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
输入:
请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的情况下,将最大子数组以及子数组的和写入文件。
1,实验代码

#include<iostream>
using namespace std;
int main()
{
    int Array[100],i=1,dp[100][2],j,MaxSum;
    int s0=-1,e0=-1,s1=0,e1=0;
    cout<<"请输入一组数组:";
    cin>>Array[0];
    while(getchar()!='\n')   //输入数组部分,空格表示输入结束
    {
        cin>>Array[i++];
    }
    int S[i],start[i],end[i],n,finalStart,finalEnd;
    for(n=0;n<i;n++)
    {
        dp[0][0]=Array[n];
        dp[0][1]=Array[n];
        for(j=1;j<i;j++)
        {
            if(dp[j-1][0]<dp[j-1][1])
            {
                dp[j][0]=dp[j-1][1];
                s0=s1,e0=e1;
            }
            else
            {
                dp[j][0]=dp[j-1][0];
            }
            if(Array[j]<(dp[j-1][1]+Array[(j+n)%i]))
            {
                dp[j][1]=dp[j-1][1]+Array[(j+n)%i];
                e1=j+n;
            }
            else
            {
                dp[j][1]=Array[(j+n)%i];
                s1=e1=j+n;
            }
        }
        if(dp[j-1][0]>dp[j-1][1])
        {
            S[n]=dp[j-1][0];
            start[n]=s0;
            end[n]=e0;
        }
        else
        {
            S[n]=dp[j-1][1];
            start[n]=s1;
            end[n]=e1;
        }  
    }
    MaxSum=S[0];
    finalStart=start[0];
    finalEnd=end[0];
    for(n=0;n<i;n++)
    {
        if(MaxSum<S[n])
        {
            MaxSum=S[n];
            finalStart=start[n];
            finalEnd=end[n];
        }
    }
    cout<<"最大子数组为和:"<<MaxSum<<"\n最大子数组为:";
    for(int q=finalStart;q<=finalEnd;q++)
    {
        cout<<Array[q%i]<<" ";
    }
    return 0;
 }

2.设计思路

这题难度太大,问的同学。

3.运行编辑图

4.学习感悟
(1)这两周你学习了哪些内容?收获了什么?

这两周我主要学习了数组,二维数组方面的知识,在我看来在编程平日中,如果我们有一组相同数据类型的数据,例如有50个数字,这时候如果要用变量来存放它们的话,就要分别定义50个变量,并且要记下这50个变量的名字,这会相当麻烦,这时候就可以用一个数组变量来存放他们,大大方便了我们的操作;

(2)本周所学内容中你觉得哪些是难点?有哪些知识点还不明白?

在这两周的学习内容中我觉得数组的下标这一块是一个难点,我经常会从1开始计数导致数组下标超出,还是需要多多练习;

5.学习进度条

周/日期 这周所花的时间 代码行 学习的知识点 目前比较迷惑的问题
3/2-3/8 两天 30 文件的处理 文件指针的用法
3/9-3/15 三天 45 数组的使用 数组的下标
posted @ 2019-03-14 22:09  tanghongsheng  阅读(166)  评论(1编辑  收藏  举报