0.展示PTA总分
1.本章学习内容总结
1.1学习内容总结
- 数组中查找数据的方法有顺序查找,二分查找
顺序查找:
二分查找:
- 数组中插入数据
输入一个数据x,将数组中的数据与x一个一个比较,如果大于x,记录下数据的下标,然后这个数据下标和其后的数据的下标都加一,后挪一位,然后将x赋值给数组的那个下标。
输入长度为n的一维数组
输入一个数据x
for i=0 to n
if(数组元素大于x)
break;
end if
end for
for n-1 to i
数据下标加一
end for
x=a[i];
- 数组中删除数据
删除算法:
删除某个元素:
输入长度为n的一维数组
输入需要删除的数据x
for i=0 to n
if(x等于数组元素)
for i to n-1
数组下标加一
end for
end if
end for
-
数组中的排序方法有选择排序和冒泡排序
选择排序:第一步找到一个最小数放到最前面,然后第二步在剩下的数里面,再找一个最小的放到剩下的数的最前面,重复步骤二,直到所有数排好
冒泡排序:从左到右,相邻元素进行比较。每次比较一轮,把最大或者最小的放在前面,这样一轮一轮比较,实现排序。
-
哈希数组案例:
思路:设计一个辅助hash[],初值都为零,其下标为数组元素。输入一个数date,判断hash[date]是否为1,若为1,说明有重复数据,若为0,说明该数第一次输入,将它置为1。
1.2本章学习体会
- 本章学习了数组,内容比较多,有一维数组,二维数组,字符数组,需要记的知识点很多,要掌握的算法应用也多,学习下来总是忘记,或者记下来了不会用,对其知识点比较模糊,可能是练习应用还不够多。因此,每一次学习新的东西,都应该及时拿来应用,及时巩固,进行整理,方便记忆。最后一句话总结,要想提高编程能力,一定不能心急浮躁,要不断勤加练习。
- 两周代码代码量在1400以上。
2.PTA实验作业
2.1 7-4 求矩阵中的最大小值
2.1.1伪代码
数据处理:最大值max,最小值min,二维数组a[n][m]表示输入的矩阵,row,col分别表示最大值的行下标和列下标,row1,col1分别表示最小值的行下标和列下标
赋最大值最小值初值都为数组第一个元素
for i=0 to n
for j=0 to m
if(a[i][j]>max)
max=a[i][j]
记录下最大值的行下标和列下标
end if
if(a[i][j]<min)
min=a[i][j]
记录下最小值的行下标和列下标
end if
end for
end for
2.1.2代码截图
2.1.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 5 | max=98 row=0 col=4 | 正常数据 |
57 30 66 41 98 | min=11 row=1 col=0 | |
11 93 54 62 31 | ||
49 87 71 70 37 | ||
----- | --------- | ----------- |
2 4 | max=60 row=0 col=1 | 有相同的最大的数,要求输出行列最小,行优先 |
55 60 43 21 | min=21 row=0 col=3 | |
21 54 60 33 |
2.1.4PTA提交列表及说明
答案错误:把最大行下标和最小行下标搞混
答案错误:我以为没有给最大行下标和最小行下标等变量赋初值是错的,都赋值为0后还是错
答案错误:把最小值初值赋值为数组元素最后一个值
答案错误:运行结果正确,可是提交显示错误,同学告诉要能连续输入,while的循环条件是scanf("%d %d", &n, &m) == 2
格式错误:第二个输出没有加换行符
2.27-3 判断上三角矩阵
2.2.1伪代码
数据处理:T表示矩阵的个数,n为数组长度,cnt为是否是上三角矩阵的标记
输入矩阵的个数
输入数组长度
输入矩阵元素
for j=1 to n
for k=0 to j
if(a[j][k]!=0)
cnt=1;//不是上三角矩阵
break;
end if
end for
if(cnt==1)
break;
end for
2.2.2代码截图
2.2.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
2 | ||
3 | ||
1 2 3 | YES | 正常数据 |
0 4 5 | NO | |
0 0 6 | ||
2 | ||
1 0 | ||
-8 2 | ||
----- | --------- | ----------- |
2 | YES | 最小n |
0 | YES | |
0 |
2.2.4PTA提交列表及说明
段错误:输入二维数组时忘记加上&,提示段错误
答案错误:只遍历对角线下方元素,for循环中j应该从1开始而不是从0开始
答案错误:内层for循环条件不是k<n而是k<j,扫描对角线下方元素
答案错误:if的判断条件是对角线下方元素等于0,若为0退出,应该是若有不为0的就退出。
答案错误:忽略了break只能跳出一层循环,所以要在内层for循环外加上一个判断条件,满足则继续跳出外循环
2.3 A-B
2.3.1伪代码
数据处理:字符数组a存放第一次输入的字符串,字符数组b存放第二次输入的字符串,数组c为静态数组,初值全为0,strlen() 用于计算字符数组长度
输入字符数组a
输入字符数组b
for i=0 to strlen(b)
c[b[i]]=1;
end for
for i=0 to strlen(a)
if(c[a[i]]==0)//说明数组a中没有数组b包含的数据
输出处理后的数组a
end if
end for
2.3.2代码截图
2.3.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
I love GPLT! It's a fun game! | 正常数据 | |
aeiou | I lv GPLT! It's fn gm! | |
----- | --------- | ----------- |
I love GPLT! | 无 | 全部删除 |
I love GPLT! | ||
----- | --------- | ----------- |
It's a fun game! | I's a fun gam! | 要删除的在头和尾 |
te | ||
----- | --------- | ----------- |
I love GPLT! It's a fun game! | 无删除 | |
zbh | I love GPLT! It's a fun game! |
2.3.4PTA提交列表及说明
部分正确:开始用fgets()函数输入字符串,运行没有问题
部分正确:将fgets改成gets居然就对了,但是在vs中显示语法错误,所以还是考虑另一种输入
答案错误:用scanf输入字符串,不小心输入两个相同的字符串,显示答案错误
部分正确:分别用scanf输入两个字符串数组a和b,提交过了几个测试点
答案错误:将scanf中原来的%s改为%c,全部错误
段错误:换用while循环输入,写循环条件时getchar忘记了后面的括号
部分正确:b[j]='\0';不小心写成b[i]='\0';
3.阅读代码
- 代码功能:给出密文C和公钥{E,N},,其中加密由C=(M^E)mod N定义,解密由M=(C^D)mod N定义,代码利用密文C和公钥{E,N}找出明文M。
- 代码优点:
1.用const定义了一个整型常变量S。便于进行类型检查,消除了一些隐患,还可以避免模糊数字的出现,可以很方便地进行参数的调整和修改。
2.巧妙运用了while (~scanf("%lld%lld%lld", &C, &E, &N)),只有scanf返回-1时循环才结束,增强了程序的可读性。
3.代码语句构造简单直接,功能与性能良好,一行一条语句,程序逻辑结构层次分明,结构清楚。