C博客作业04--数组

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]='';不小心写成b[i]='';

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.代码语句构造简单直接,功能与性能良好,一行一条语句,程序逻辑结构层次分明,结构清楚。
原文地址:https://www.cnblogs.com/4-Real/p/11871303.html