C语言博客作业04--数组

0.展示PTA总分



1.本章学习总结

1.1 学习内容总结

  • 数组中可以用for语句来一个一个的查找对应的数,即下标法;在字符数组中也可以用结束符\0来判断查找数据。
  • 数组中插入数据可以将该数据放在该数组对应位置后,把该位置后的数组数据往后移一个位置,该位置前面的数据位置不变;也可以重新定义一个数组,重新存放插入数据后的数组数据。
  • 数组中删除数据可以将重该位置开始的数据,把所有数据都往前移一个位置,也就是将该位置的数据用后一个数据来代替。也可以重新定义一个数组,重新存放除要删除的数据之外的所有数据。也可以用下标法来删除数据,即删除该数据所对应的数据下标,然后将之后的数组下标往前移一格。
  • 数组中目前学到的排序方法有:冒泡排序法,选择排序法。冒泡排序法就是运用循环语句对比每两个相邻数据大的往下沉,小的往上浮。选择排序法就是先固定一个数,然后将该数与数组中的其他数据一一对比,如果该数大于或者小于另一个数(主要看题目要求是从大到小还是从小到大),就将两个数的位置互换。
  • 数组做枚举法的案例:例如pta里面那题观众对电视节目满意度的调查。就是用电视节目的编号作为数组下标,这样子可读性比较强,也更方便操作。
  • 哈希数组用法:就是将一个数组中的内容作为另一个数组(该数组的数据全部初始化为零)的下标,然后输入一个数时,直接将该数作为另一个下标数组的下标,以此来统计一个数出现的次数或者判断有无重复数据。目前学过的案例有pta里的判断重复数据,就是用上述方法来判断是否出现重复数据,如果输入一个数,该数所对应的下标数组内容如果是0的话就将其改为1,如果是一的话就说明该数已经出现过一次了,就说明该数是重复数据。

1.2 本章学习体会

  • 学习感受:跟前几章不一样,到数组这一章节开始感觉力不从心了,一方面有我代码量不足的问题,另一方面就是我感觉数组有点抽象,不太好理解。
  • 不理解的地方:对字符数组的概念还有范围不太理解。是不是目前所接触到的所有数据除了结束符\0外都可以算在作字符数组范围内?
  • 代码量:粗略计算,这两周代码量应该在1500行左右,感觉代码量还是太少不达标,接下去得多抽点时间打打代码。

2.PTA实验作业

2.1 7-5 有重复的数据

2.1.1 伪代码

  • 数据处理:
变量 作用 类型
n 控制输入数组的数据个数 int
i 控制输入数组操作的循环 int
data 作为输入数组的值 int
  • 伪代码:
    声明一个整型函数hash来完成重复数据的判断;
    定义一个数组数据个数上限N,值为100001;
    输入一个数n作为数组中的数据数量;
if 
Same(n)==1;
有重复数据;printf "YES"
else
printf "NO"

函数的定义:
用静态数组来初始化hash数组,使其中的所有元素都为0

输入一个数据
if
hash[data]==1
有重复数据
return 1;
else
hash[data]=1
end if;
end for;
return 0

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
5;1 2 3 1 4 YES 有重复数据
5;1 2 3 4 5 NO 没有重复数据
-1 error input 非法输入

2.1.4 PTA提交列表及说明

  • 提交列表说明:
1.一开始我在VS中做的时候错误挺多的,所以没有上传到PTA上,不然会有更多的提交列表,我是做到题目所给测试数据能过之后才提交到PTA的,然而还是过不了所有的测试点。
2.部分正确:主要是运行超时,因为用了太多的for语句和嵌套for语句,而题目所给的数据量可以达到惊人的十万,所以当数据量太大时,就会导致运行超时。
3.答案正确:我苦思冥想想不出解决办法,于是便去看MOOC教学视频,才了解到可以用时间换空间的做法来实现这个代码,而且只需要用一层循环即可,大大地节省了效率,也顺利过了所有测试点。
4.答案正确:但是我发现如果输入非法数据的话还是会输入NO,于是我就自己加了一条if语句,使当输入的数据是非法数据时输出“error input”。

2.2 7-5 找鞍点

2.2.1 数据处理

变量 作用 类型
n 矩阵的边长 int
maxIndex 该行上最大数的列标 int
minIndex 该列上最小数的行标
flag 判断所找到的数的行标是否符合条件 int

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
2 1 鞍点所在位置为行2列1
NONE 没有鞍点
1 0 0 单位矩阵

2.2.4 PTA提交列表及说明

  • 提交列表说明:
1.部分正确:一开始做的时候**完全没有头绪**,只知道要先找行上的最大数和列上的最小数,结果代码写的有点乱,只过了一个测试点,也就是最简单的单位矩阵的情况。
2.部分正确:忘记考虑题目所给的n的**取值范围**是闭区间的,导致两个测试点没过。
3.部分正确:**这个是不小心多点了一下**。
4.部分正确:修改完上面的问题之后还有一个测试点过不了,经过反复调试之后发现是当n=1的时候也就是矩阵只有一个数的时候出问题,重新加了一条if语句单独判断n=1的情况后就解决了。
5.答案正确:大功告成了。

2.3 7-3 字符串转换成十进制整数

2.3.1 数据处理

变量 作用 类型
count1 判断负号前面是否有十六进制数 int
flag 判断正负号 int
sum 将十六进制数转换为十进制数 int

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
+-P-xf4+-1!# -3905 正常数据
15698# 87704 正常数据
ad-SAF48-s5# 182121605 正常数据

2.3.4 PTA提交列表及说明

  • 提交列表说明:
1.这题我也是在VS中调试至题目所给测试数据通过之后才提交到PTA的,然而一提交就过了,我就随便举几个错误吧。
2.当我第一次写完这个代码的时候运行总是运行超时,经过多次检查和断点调试之后才发现我忘记给十六进制数组加上结束符\0了,导致出现死循环。
3.在VS上写的时候没有考虑题目要求的是:**在第一个十六进制字符之前存在字符“-”,则代表该数是负数**,而我当时写的代码是每一次遇到负号就将flag取反,导致出来的结果常常正负号颠倒,后来加了一个count1变量来判断负号前是否存在十六进制数后就解决了这个问题。

3.阅读代码

代码功能:

  • 将数组重新排序
  • 重新排序后判断相邻两个元素是否相等,如果相等说明有重复数据。

代码优点:

  • 不同于mooc平台上老师的做法,该代码运用的是先排序后找判断相邻两个元素是否相等来判断是否有重复数据,也是一个很新奇很好的做法。
  • 相比较于mooc上老师的做法,这种做法虽然多了一个for语句来进行判断,比老师的效率低了一点,但是也不会出现运行超时的情况,因为该代码,没有将for语句进行嵌套,从而避免了运行超时的问题。
  • 该代码将a变量置为const,使其不可被改变,避免因不小心而错改变量的情况。

值得学习的地方:

  • 该代码作者的思路很新颖,选择了将数组重新排序后再找重复数据,简单易懂,值得学习。
  • 该代码判断数据重复的方法是判断排序后相邻两个数是否相等进而判断数据是否重复,对比我自己一开始的想法:一个一个数的进行判断。效率提高了不止一点点,这种方法虽然没有mooc上老师的方法效率高,但也是一个值得我学习的点,毕竟我自己的思路还不如人家的思路。
  • 该代码还用到了const来固定变量的值,使其不可被修改,这很有效的防止了因参数传递或者不小心而改变变量的值,这点值得我学习。
posted @ 2019-11-17 17:09  Kevin。  阅读(306)  评论(0编辑  收藏  举报