0.展示PTA总分

一维数组:

二维数组:

字符数组:

1.本章学习总结

1.1 学习内容总结

  • 数组中如何查找数据,有哪些做法?

定义一个数组a[],假设这个数组中元素的下标为i,如果已经知道元素内容比如x,就可以通过条件语句if(a[i]==x)来判断和查找数据了,这是在元素数量比较有限的情况下;如果是在元素数量比较大的情况下,可以用二分法来查找数据,在有序数组中不断判断中间数据和目标数据的大小,缩小范围,大大减少了运行时间,提高效率。同样查找数据的方法比如查找最大最小值可以使用冒泡法和选择排序法。

  • 数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法?

  • 过程:先找出插入点,再通过循环把插入点后面的数字向后移一位,给插入点空出空间,再让插入点的值赋值为确定的数;
  • 伪代码:
for i=0 to i=n-1 do
    if x<数组元素 then
        已找出切入点跳出循环
    end if
end for
for i=n to i=lop-1 do
    插入点后的数字后移一位
end for
    输出改变后数组内容
在插入点放入已知数
  • 数组中如何删除数据,这个有多种做法,请一一展示。

  1. 覆盖删除:从要删除的数开始到数组末尾,让数组前一位等于后一位,即数组左移,直接覆盖要删除的数字,还要考虑数组下标的特别情况;

  2. 当有重复数字时可以调用辅助数组,时间和空间转换,比如超星平台的hash数组,用数组内容作为hash数组的下标,遍历数组一一核对;

  • 数组中目前学到排序方法,主要思路?

1.冒泡排序:
临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束。最后一个数不需要比较,遍历完n-1次之后会自动把最大最小值排到末尾开头。
2.选择排序:
算法思路:选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
比冒泡排序的思路更直观;

  • 数组做枚举用法,有哪些案例?

枚举在c语言中表示一个被命名的整型常数的集合,
数组的枚举和重复数字的删除极为相似;用hash数组进行空间转换为时间
课堂派中也有利用枚举求值的例题比如输入两个数第一个数不小于1,第二个数不大于100的判断输入是否正确,利用枚举来定义可能的结果;

  • 哈希数组用法,目前学过哪些案例,举例展示。

重复数组的删除:如下是对使用hash的函数的定义

1.2 本章学习体会

本章学习中,开始慢慢找到了pta题集做题的感觉,虽然还是停留在比较肤浅的阶段,但是还是能感到做题不再没有头绪,但是粗心大意的坏习惯还没有改掉,对于题集题目的理解还有认知盲区,在c语言小测时可以感觉到对题目很熟悉但是有一个或者几个必要的点就是想不起来,也就是说我根本没有完全的理解那种题型该怎么做,没有转化为自己的东西,这是很致命的问题,实践编程能力较差,对各种题型的思路不清晰,就造成不友好的局面。还有对作业总是不及时完成的反省,着实感到不妥。已认识到存在的问题,会努力改正并努力追赶大家的步伐;

2.PTA实验作业

2.1 题目名1

7-6 数组元素的删除
完成数组元素的移动功能:假设数组有n个元素,输入一个数x,把数组的第x个位置的元素删除了,后面的元素依次前进一个位置。 重复若干次这样的删除,得到最后的结果。

2.1.1 伪代码

for i=0 to i=k do
    输入x即要删除的第几个数
    for i=x-1 to i=数组最大下标 do
        数组元素左移以覆盖第x个数
    数组最大下标递减
    end for
end for
for i=0 to i=数组最大下标 do
    输出带空格的数组元素
end for
if i=数组最大下标
    输出不带空格的尾数元素
end if

2.1.2 代码截图

2.1.3 造测试数据

输入数据n 输入数据k 输入数据x 输出数据 说明
10 4 3 2 4 6 1 4 5 7 8 10 正常数据
1 4 3 2 4 6 1 n=1时数据
4 4 1 2 3 4 全部删除数据

2.1.4 PTA提交列表及说明

  • PTA提交列表:

  • PTA提交列表说明:

结果 原因
多种错误 输出数组元素时选择的数组下标最大值较大
格式错误 空格的问题没考虑
答案正确 改了下标加了空格换了代码方式多次提交

2.2 题目名2

  • 7-4 求矩阵中的最大小值
    向一个n×m的数组中输入一组整数(n<=10,m<=10),然后输出其中的最大值、最小值,并输出这两个值的下标。

2.2.1 数据处理

伪代码:

while 输入的n和m都为有效数字 do
    row,col初始化
    输入数组
    max和min初始化
    for i=0 to n do
        for j=0 to m do
            if max小于数组元素 do
                数值交换
                row,col的值随之变化
            end if
        end for
    end for
    最小值的求法同理

2.2.2 代码截图



2.2.3 造测试数据

输入数据n 输入数据m 输出数据 说明
3 5 max=98 row=0 col=4 min=11 row=1 col=0 正常数据
2 5 max=98 row=0 col=4 min=11 row=1 col=0 正常数据
2 2 max=93 row=1 col=1 min=11 row=1 col=0 正常数据

2.2.4 PTA提交列表及说明

  • PTA提交列表:

  • PTA提交列表说明:

结果 原因
段错误 多加了一个行列初始化
答案错误 没有注意n和m的有效情况
编译错误 col和row没有用上

2.3 题目名3

7-3 字符串转换成十进制整数
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

2.3.1 数据处理

int a[800];
int b[800];//存储过滤后的数组元素
int flag;//判断是否有‘-’
int t;//判断是否为十六进制数
int sum//存储最后结果

2.3.2 代码截图


2.3.3 造测试数据

输入 输出 说明
+-P-xf4+-1!# -3905 正常数据
135+-Pdac# 1269164 正常数据
0zr19*%D# 413 正常数据

2.3.4 PTA提交列表及说明

  • PTA提交列表:

  • PTA提交列表说明:

结果 原因
编译错误 没有考虑第二个for循环k=0的情况
部分正确 最后输出没有注意格式
答案正确 错误改正审核通过

3.阅读代码


代码特点:
1.关于用后一个数描述前一个数的代码描写这方面比较细致,考虑的非常全面;
2.编写的代码也简单易懂,给读者能留下深刻印象;
3.但是类似于cin >> TestCase;这样的语句看不太懂。