第四次作业-----------数组
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.同学代码整体看起来符合思考问题的思路,比较清晰,条例分明,我的代码则比较绕,数学逻辑性比较强