• 第四次作业数组


    1.本章学习总结

    1.1 思维导图

    1.2 本章学习体会及代码量学习体会

    1.2.1 学习体会

         数组,没前面的那么容易学。一开始觉得嵌套循环难,后来觉得函数调用什么的一脸蒙蔽,现在数组又总是各种错误,尤其在螺旋方阵那一题,简直无从下手。初学指针,还竟然上课都听得傻了,于是赶紧去见见翁凯老师,让他给我补补。很多知识点,其实书上也都有,老师也提过,遇到不会,只能百度一下,看是有什么知识点不知道,不然,就会不知道自己在学什么了。
       数组的学习,一个星期就可以结束,pta题集一个接一个地出,每次总是自己还没动手,大佬就已经打完了。很多时候其实看着挺慌的。自己也很想像以前一样,布置的题集马上写完,但是,现在的处境是,上课都有点蒙蔽,要马上刷完题都很困难的。然而,慌也没用,要想不慌只能花时间去把代码给敲完。
       发现自己做题的进度虽然很慢,做了总是有效果的,有空就琢磨琢磨不会的题目,这样也是一种进步吧。刷题刷多了,自然就不会觉得数组难。编程是锻炼人的逻辑思维,所谓熟能生巧,多做做,多想想,就会有感觉,自然,也就没有我想象中的那么难。
       细想一下,前期学习比较轻松,除了知识点比较容易,还有很大一部分是因为暑假自学了,再次拾起的时候,自然就一讲就会,自信也就油然而生。然后,现在的我想的是要好好利用寒假,自学数据结构那一块。题集的话,在之前王俊玲老师说谁要的时候,也申请了,不怕没有题目练手。业精于勤荒于嬉,拼搏过是会有收获的。
        后面的学习不会越来越轻松,只会越来越难,我能做的就是多花些时间,一分耕耘,一分收获,要想让自己变得强大,就要多花些精力去做。
    

    1.2.2 代码累计

    2.PTA总分



    2.2 我的总分:

    一位数组:175
    二维数组:99
    字符数组:135
    数组总分:409
    

    3.PTA实验作业

    3.1 PTA题目1

    7-8 找出不是两个数组共有的元素 (20 分)
    给定两个整型数组,本题要求找出不是两者共有的元素。
    
    输入格式:
    输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
    
    输出格式:
    在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
    

    3.1.1 算法分析

    - int cnt=0;            //控制空格,保证行末无多余空格 
    - for(j=0 to n1)
           scanf读入a中元素
    end for
    - for(j=0 to n2)
           scanf读入b中元素
    end for
    - int n3=n1+n2;
    - int c[n3];        //定义第三个数组存放所有元素 
    - static int flag[40];           //初始化数组元素全为0,发现共有赋值为1 
    - for(i=0 to n3)     // 将两数组元素放入C中 
           - if(i<n1) c[i]=a[i];
             else c[i]=b[i-n1];  //b紧接着放入a后面
           end if
    - for(i=0 to n3)
    	- for(j=i+1 to n3)
    		- if(c[i]==c[j]&&j<n1)  //两元素都在a中,后一个不输出
    			flag[j]=1;
                    end if
    		- if(c[i]==c[j]&&i>=n1)  //两元素都在a中,后一个不输出
    			flag[j]=1;
                    end if
    		- if(c[i]==c[j]&&i<n1&&j>=n1)  //两元素分居于a,b中,则都不输出
    			flag[i]=1;flag[j]=1;
                    end if
             end for
    end for
    - for(i=0 to n3)
    	- if(flag[i]==0)     //不是共有的元素
    		- if(cnt==0)
    			输出该数   //第一个元素前面无空格
    			cnt=1;
    		  else输出空格加上该数组元素
                    end if
            end if
    end for
    		
    

    3.1.2 代码截图

    3.1.3 PTA提交列表及说明

    Q1:发现相同元素就删除,代价比较大,输出会乱掉
    A1:构建新的数组c存放a,b中元素,再定义flag[i]控制输出情况
    Q2:b中有相同元素,a中没有时会重复输出
    A2:n1是b中元素的第一个,判断时应加上等号

    3.2 PTA题目2

    7-3 判断上三角矩阵 (15 分)
    上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
    
    本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
    
    输入格式:
    输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
    
    输出格式:
    每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
    

    3.2.1 算法分析

    - 定义次数repeat定义static int flag[1000]判断是不是上三角矩阵
    - for(k=1 to repeat)
            -for(i=0 to n-1)
                 -for(j=0 to n-1)
                       scanf读入数组元素
                  end for
             end for
    //判断该矩阵是不是上三角矩阵
    - for(i=0 to n-1)
         - for(j=0 to n-1)
                - if(i>j)
                    - if(a[i][j]!=0)
                         flag[k]=1; 
                     end if
          end for
    end for
    //遍历flag[k]输出yes或者no
    - for(k=1 to repeat)
       - if(flag[k]==0)输出yes
        else 输出no
       end if
    end for
    

    3.2.2 代码

    3.2.3 PTA提交列表及说明

    Q1:开始以为题目是如果要输入多个矩阵,先判断一个矩阵判断是不是上三角矩阵后再输入下一个判断
    A1:参考同学思路,定义flag[k],记录每个矩阵最后是不是上三角矩阵,是就为1,否则为0。最后对flag[k]进行遍历,如果值为1就输出yes,否则输出no

    3.3 PTA题目3

    7-3(字符数组做) 切分表达式——写个tokenizer吧 (20 分)
    [正题]
    
    四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个token(标记)。现在,对于给定的一个四则运算表达式,请把她的每个token切分出来。题目保证给定的表达式是正确的,不需要做有效性检查。
    
    输入格式:
    在一行中给出长度不超过40个字符的表达式,其中没有空格,仅由上文中token的字符组成
    
    输出格式:
    依次输出表达式中的tokens,每个token占一行。
    

    3.3.1 算法分析

    - int flag=0;//判断正负号是连接两数还是代表正负
    - 先输出第一个字符
    - if(ch[i]=='-'||ch[i]=='+') //第一个字符为正负号
           flag=1;
      end if
    - if(ch[i])
         - if(0<=ch[i]<=9)
               - if(0<=ch[i-1]<=9或者ch[i-1]='-','+'&&flag=1或者ch[i-1]='.')   //大于一位的数字,有正负号和小数点的情况不用换行
                       printf("%c",ch[i]);
                  else 换行输出
                  esd if
                flag=0;      //重新归零,不影响后面计算
            end if
         - else if(ch[i]=='-')  //字符为负数的情况
                 - if(ch[i-1]=='(')  //该运算符为负号 
                        flag=1;
                    end if
                 换行输出'-'
            end else if
         - else if(ch[i]=='.')  //有小数点时,不要换行输出
         - else  //其他情况,换行输出
         i++
       end if
    

    3.3.2 代码

    3.3.3 PTA提交列表及说明

    Q1:‘-‘是负号不是连接两数字的运算符时,不能和数字一起输出
    A1:定义一个flag判断该字符是不是正负号,初值为0,是就令为1,即可连着输出
    Q2:第一个字符是正负号时格式错误
    A2:在判断一个数字前面有正负号,不换行输出后,还应该将flag的值重新归零

    4.代码互评

    7-5 螺旋方阵 (20 分)
    所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
    
    输入格式:
    输入在一行中给出一个正整数N(<10)。
    
    输出格式:
    输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
    

    4.1 代码截图

    同学的代码

    自己的代码截图

    4.2 二者的不同

    • 1.同学代码是根据螺旋矩阵递增的规律,对向右,向下,向左,向上四种递增情况做循环分析,得出对应的值并放入数组中
    • 2.我的代码是根据每个数对应圈数与边长的关系建立关系式,然后计算得出相应的值
    • 3.同学代码整体看起来符合思考问题的思路,比较清晰,条例分明,我的代码则比较绕,数学逻辑性比较强
  • 相关阅读:
    hdu 6201 dfs
    Oulipo POJ
    Kitchen Measurements UVALive
    Surf Gym
    hoj 13969 Racing Gems
    分块
    分块学习资料
    Jam's problem again HDU
    树的点分治
    Census UVA
  • 原文地址:https://www.cnblogs.com/zhonghaiqing/p/10053554.html
Copyright © 2020-2023  润新知