学员周报展示(9)

发布者:管理员发布时间:2018-12-17浏览次数:207

第十二周

12.10  Mon.

写了一下黄健学长讲过的第六题优化之后的代码:

 

     

           

思路:  键盘输入(x1,y1)(x2,y2)两点之间连线作为斜边存在一个形成的直角三角形,此时求出两个直角边a,b的长度并求取最大公因数t。此时a=a/t,b=b/ta,b作为直角边所形成的小直角三角形作为“模板”。该小直角三角形的斜边不会经过整点,因此我们在找拐弯后的第一个整点时就可以利用这个“模板”来求。省去了寻找并判断y是否为整数和类型。


  1. 计算(x,y)时只需分别加上或减去模板三角形的两条直角边。上周的周报里写到在拐点处的走向有四种判断,这里求x,y分别只需要一个公式就可以。x=x2+b;y=y2-a;两点形成的线段可以看做是带有方向的线段,那么求取最小三角形也是具有方向的,所以不管怎么走都满足上面的公式。

  2. 上面情况不包括两点之间线段垂直或平行于坐标轴的情况,所以仍需加上这种情况出现的可能。


12.11  Tues.

校赛的第一题看似简单,但实则存在很多陷阱。比如:

  1. 题中说输入排好序的数组并没有明确说明是正序还是倒序,只是单纯的要求去掉重复的数字,并不需要对数组进行排序。

  2. 题中说包含多组数据,并不是只处理一组数。准确意思是输入n个数,再输入-1时对该组数处理并在下一行输出结果。接着还能够输入第二组想要处理的数据,在输入-1时能够再处理并输出···

所以,我又重新做了一下第一题:


       

在之前的基础上,在最外层多加了一个while循环。当每个数组输完之后都会输入一个-1,此时可以令-1既是上个数组的结束指令也是下个数组进行再次处理的指令。

  1. 最开始定义m=-1while(m==-1)时则进入循环体,进行处理。因为每次输入数组的末尾都需要输入-1,所以while循环体会一直有效并执行。

  2. 在每次处理完一组数组之后(最后一个for循环)会“清空”数组。避免与下一组数据冲突。


12.12  Wed.

晚上瞿学长给我讲了一下K-mean算法,然后讲了一些关于MATLAB的基本使用。














矩阵绘图:给出A矩阵后,x=1:3:15表示从第1个元素值开始到第15个元素值,每次步数为3.同样的y也是。plot是将x,y对应的元素定义的点依次用实线连接起来,这里向量x,y的维数必须相同。

















注意:

  1. 不想输出的值在后面加“;”

  2. for循环和if条件语句的使用都需要用end来结尾,并层次对应。

  3. MATLAB里面没有i++的使用只能用i=i+1来表示。



12.13-12.14  Thur-Fri.

晚上做数据。


12.15  Sat.

做了一下之前没做出来的第四周题目:





































思路:  20*20的像素为一个字,共有六个字的信息需要“翻译”。可以看作是一个字需要占20*20的数组。因此需要建立一个20*120的数组来存放六个字所有的二进制的信息。

  1. fun函数的调用使键盘输入的数字转换为二进制数并存入数组的每行,r=j+19r>=j表示一个结果占20

  2. 主函数中j表示列,j0开始到19存放第一个字的信息,当第一个字存完后,令j+=20,从20开始存放第二个字的信息,以此类推···j=100时开始存放最后一个字,存完之后跳出循环输出结果。


  • 后来用MATLAB尝试做这道题:

  









B=fun(A)A矩阵输进去之后在fun函数里面处理。思路与上面C语言写的相同。

注意:

  1. remx,y):求整除x/y的余数

  2. floorx)负方向取整(例:floorpi=3

ceilx)正方向取整(例:ceilpi=4

roundx)四舍五入

因为MATLAB存储数值的类型都为double型,但题中需要处理的数值全部是正整数且除法过后需要负方向取整,所以用floor函数。

  1. 定义函数:需要定义函数名,输入变量和输出变量。

  2. 若只取A矩阵中的第一行做处理则表示为B=funA1,:)

12.16 Sun














MATLAB绘图结果:




















一开始出现的结果是反向的,后来把转换后的二进制数存放的顺序修改了一下。

  1. scatterx,y,S,C)中x,y表示数据;S为大小一般默认为50C为颜色,根据matlab资料上相对应的字符需要加上单引号

  2. hold onhold off相对使用,使其间的图像共存。