0.展示PTA总分(0----2)
1.本章学习总结(2分)
1.1 学习内容总结
-
数组中如何查找数据?
- 通过循环对数组中的元素逐个取值,并与参考值(要查询的值)做比对,并处理结果。
- 通过二分法对有序数组进行处理,从而查找数据。
-
数组中如何插入数据?
- 以升序数组为例,找到数据需要插入的位置,将此位置之后的数据往右移动一格,最后将数据输入到需要插入的位置。
- 伪代码
for i=0 to 数组最大下标 do
if 插入数大于数组元素 then
退出循环
end if
end for
for j=数组最大下标 to i+1 do
后一个数等于前一个数
end for
在插入位置放入插入数
-
数组中如何删除数据?
- 删除某个位置的数。
for i=0 to 数组最大下标 do
if i大于或等于x-1 then
前一个数等于后一个数
end if
end for
- 删除某数。
for i=0 to 数组最大下标 do
if a[i]等于x then
记住x的下标为t
end if
end for
for i=t to 数组最大下标 do
前一个数等于后一个数
end for
- 删除数组中的重复数据。
for i=0 to 数组最大下标 do
for j=i+1 to 数组最大下标 do
if a[i]等于a[j] then
前一个数等于后一个数
end if
end for
end for
-
数组中目前学到排序方法
- 选择排序法: 相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。
2.冒泡排序法: 每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。
-
数组做枚举用法的案例
- 找鞍点
- c07- 7-5有重复的数据.
- c07- 7-11 求整数序列中出现次数最多的数
-
哈希数组用法
c07- 7-5有重复的数据.
在这一道题中的用法:首先定义一个hash静态数组,用输入数组a[i]作为hash数组的下标。然后判断hash[a[i]]为0或1,若是0则hash[a[i]]==1,若是1,则肯定数组中有重复数。
1.2 本章学习体会
- 在这两周的学习过程中,我尽管挺努力听课的。但是在写pta的话,我还是很慢。总是一题写好久,难一点得,一个小时。 自己是觉得最好能够上课好好听课。
争取在课堂上重复记忆关键知识点,才不会上完一节课,感觉自己脑袋空空。 - 代码量
2.PTA实验作业(7分)
2.1 7-8 二分查找法
2.1.1 伪代码
定义key储存要查找的正整数
定义a[N]储存数据
定义left作为二分法的左边界
定义right作为二分法的右边界
定义mid来判断key是否在数组中
定义flag作为命令标识符
输入要查找的正整数
while left小于右边 then
mid = (left + right)
if a[mid]等于key then
flag等于1
退出循环
end if
else if a[mid]小于等于key then
left 等于 mid +1
end if
else
right等于mid
end if
end while
if flag等于1
输出查找数所在的下标
end if
else
输出not found
end if
2.1.2 代码截图
2.1.3 造测试数据
2.1.4 PTA提交列表及说明
部分正确:将while 里的条件写成left<right,只要改成left>right.
部分正确:左右边界没有定义好,导致总是一个对,一个错。(剩下几个都一样)
2.2 7-1 判断E-mail地址是否合法
定义str[N]储存数据
借用头文件#include<ctype.h>中的isalpha和isdigit函数来判断字符为字母或数字数据,用JudgeAddress函数进行封装。
输入字符串
if JudgeAddress(str)等于1 then
输出YES
else
输出NO
end if
定义JudgeAddress(char str[])
for i=0 to str[i] && str[i] != '\n' do
if 字符为字母或数字或_ then
else if 字符为'@' then
if 此字符前后的字符为数字或字母 then
返回0
end if
else if 字符为'.' then
if 此字符后3个字符依次为com且第4个字符为'\n','\0'. then
返回 0
end if
else
返回 0
end if
end for
返回 1
2.2.2 代码截图
2.2.3 造测试数据
2.2.4 PTA提交列表及说明
段错误 : 数组越界
编译错误:从VS复制到pta 少复制了#
部分正确:思路错误了,把‘@前后只能是字母或者数字’理解成前后都要是,而不是理解成只要@前后2个是,就可以了。
理解完题目之后,重新写题就可以了
2.3 7-5 找鞍点
2.3.1 数据处理
定义a[N][N]储存数据
定义flag作为命令标识符
定义maxr,maxc作为找鞍点的行列下标
输入n
for i=0 to n-1 do
for j=0 to n-1 do
将字符输入a数组
end for
end for
for i=0 to n-1 do
for j=0 to n-1 do
if 本行的数小于本行下一个数 then
maxr,maxc等于较大数的行列标
end if
end for
end for
flag = 1
for k=0 to n-1 do
if a[maxr][maxc] > a[k][maxc then
flag=0
end if
if flag等于1 then
输出 鞍点位置
退出循环
end if
重置maxr和maxc
end for
if flag等于0 then
输出NONE
2.3.2 代码截图
2.3.3 造测试数据
2.3.4 PTA提交列表及说明
部分正确:flag未重置,导致无论输入什么,只会出一个答案。
部分正确:有并列极值时无法移动到下一个极值的位置,只要将a[i][maxc]<a[i][j]改成a[i][maxc]<= a[i][j]。
3.阅读代码(-2--1分)
题目:
代码:
- 我仔细地读完这代码,感觉对数组与指针理解更深一点。通过使用指针会比不使用指针更方便,因为可以直接调用地址,如需要调用单元中地内容,只要加上* 指针名。 当然这代代码借助struct 结构体语句用来定义一系列具有不同类型的数据构成的数据集合,更加便捷。
- 除此之外, 也让我学到了namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。