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

0.展示PTA总分(0----2)

1.本章学习总结(2分)

1.1 学习内容总结

  • 一维数组的定义和引用

    • 一维数组的定义方式:类型说明符 数组名 [常量表达式];

    • 其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。

  • 一维数组的初始化

    • 一般形式为:类型说明符 数组名[常量表达式]=

  • 对于一维数组类型说明的注意点:

    • 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

    • 数组名的书写规则应符合标识符的书写规定。

    • 数组名不能与其它变量名相同。

    • 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。

    • 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。

    • 允许在同一个类型说明中,说明多个数组和多个变量。

  • 二维数组的定义和使用

    • 二维数组的定义方式:类型说明符 数组名 [行长度][列长度];

    • 其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。

  • 二维数组的初始化

    • 一般形式为:类型说明符 数组名[整常量表达式][ 整常量表达式]={ 初始化数据 };

  • 对于二维数组类型说明的注意点:

    • 可以省略第一维的定义,但不能省略第二维的定义。

  • 一维字符数组的定义和使用

    • 一维字符数组的定义方式:char 数组名[数组大小];

  • 字符串

    • 字符串的定义:使用 null 字符 '\0' 终止的一维字符数组。

    • 注意点:字符串常量可以为空,如""就是一个空的字符串常量,但是即使为空,还是存在一个终止符 NUL 的。

  • 数组中查找数据的方法

方法1:遍历法——通过循环对数组中的元素逐个取值,并与参考值(要查询的值)做比对,并处理结果。

方法2:二分法——通过对数组的不断折半判断,找出对应的查找值。(仅限有序数列)

  • 数组中插入数据的方法

方法1:输入一个数据x,将数组中的数据与x逐一比较,如果大于x,记录下数据的下标,然后此数据下标和其后的数据的下标都加一,相当于都向后挪一位,然后将x赋值给数组的那个下标。

方法2:将要插入的数据放在数组最后,然后和前面的数据逐一比较,如果x小于某元素a[i],则将a[i]后移一个位置,否则将x至于a[i+1]的位置。

  • 数组中删除数据的方法

方法:将对应元素下标所在位置的中的内容置为空(也就是0),然后从此位置开始,后面的内容前移,再把最后那个位置的置为空(就是0)。

  • 数组中目前学到排序方法

方法1:交换排序——把第一个位置的数字拿出来,依次合后面位置的数字比较,若比后面数字大,则交换。

方法2:冒泡排序

方法3:选择排序

  • 数组做枚举用法及案例

用法:

通常情况下定义数组都是顶一个什么类型的数组然后下标或者脚标就是从0开始+

但是用0-N这种整形数字做下标可读性非常不高。所以这里可以使用枚举变量作为下标来访问数组。

案例:

  • 哈希数组用法及案例

用法:构造一个函数使得某个变量i有对应值。

案例:

1.2 本章学习体会

数组可以帮助我们方便解决需要大量输入数据的题目,比如输入大量数字或是字符串等,对于解决矩阵问题可以使用二维数组解决。在做数组这一部分的题目时,可以明显感觉到难度的提升,与之前的题目相比完全不是一个级别,在数组的题目中往往伴随着大量的输入和输出,这对我们程序的精细程度提出了巨大考验,稍有差错便导致无法输出想要的结果;时程序的长度也变长了许多,不在像之前一样短短几行便可以解决,数十行是常有的事,所以我们一定要耐得住性子。

2.1 7-7 冒泡法排序

2.1.1 伪代码

定义整型变量n、k,来自题目要求;定义整型数组str,用于存放n个输入的整型变量;定义整型变量temp,用于数组元素的交换保留;定义整型变量i、j,用于#### 参与for循环的条件。

输入n和k的值

for(int i=0;i<n-1;i++)

输入前n-1个值

end for

输入第n个值

while(k--){

从左往右开始逐组判断两个元素的大小关系并交换

}

end while

for(int q=0;q<n-1;q++)

输出排序后的数组元素

end for

返回0

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
6 2\n2 3 5 1 6 4 2 1 3 4 5 6 正常数据
0 2\n3 4 error 异常数据

2.1.4 PTA提交列表及说明

提交列表说明:

1.格式错误:输入时没有按照格式要求将前n-1个元素和第n个元素分开输入。

2.格式错误:输出数组元素时没有按照题目要求的空格格式输出。

3.答案正确:。。。

2.2 7-4 求矩阵中的最大小值

2.2.1 伪代码

定义整型变量m、n,来自题目输入要求;定义二维数组a,用于存放输入的数组;定义整型变量max、min(存放最大值和最小值)、i、j(循环计数)、maxRow、minRow、maxCol、minCol(最大值和最小值的上下标)。

输入m和n的值

while((scanf("%d %d", &n, &m))==2)

调用FindTheMaximumAndMinimumValues函数

{

for-for循环遍历数组元素

if(...)

判断元素的大小关系并替换max和min的值

输出最大值和最小值以及其对应的下标

}

end while

返回0

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
3 5\n57 30 66 41 98\n11 93 54 62 31\n49 87 71 70 37 max=98 row=0 col=4\nmin=11 row=1 col=0 正常数据

2.2.4 PTA提交列表及说明

提交列表说明:

1.编译错误:使用flag却没有定义flag变量。

2.格式错误:输出格式没有按照题目要求的换行格式。

3.答案正确:。。。

2.3 7-2 IP地址转换

2.3.1 伪代码

定义整型变量i、j,用于行列循环;定义整型变量k,参与十进制的转换;定义字符数组str,存放输入的数组元素;定义字符变量ch,用于字符0/1的输入;定义整型数组sum,存放str数组每行转换后的十进制数。

for-for循环输入数组

end for

for (i = 0; i < M; i++)

将str数组每行的所有元素转换为十进制数存入sum数组

end for

for (i = 0; i < M; i++)

{

输出sum数组的各个元素

当输出最后一个元素时不添加符号'.'

}

end for

输出换行符

返回0

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
11001100100101000001010101110010 204.148.21.114 正常数据
11001100100101000001011101001110 204.148.23.78 正常数据
00000000000000000000000000000000 0.0.0.0 全0数据

2.3.4 PTA提交列表及说明

提交列表说明:

1.答案错误:在转换十进制的循环中没有在每轮循环结束后将k的值加一。

2.答案错误:在输出sum数组的最后一个元素时没有使用判断语句,导致在最后依旧输出符号'.'。

3.答案正确:。。。

3.阅读代码(-2--1分)

题目说明

代码截图

优点解读

将排序和双指针相结合,没有使用暴力枚举的方法,降低了时间复杂度。

在遍历中双指针应用自如,很好地结合各个元素进行转换操作,是个很值得参考与学习的算法思想。

posted @ 2019-11-17 21:57  BaiYi#  阅读(467)  评论(0编辑  收藏  举报