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

0.展示PTA总分

一维数组:

二维数组:

字符数组:

1.本章学习总结

1.1 学习内容总结

1、关于数组中如何查找数据
·一维数组中:
利用一次循环进行查找,若数组中数值为我们所要查找内容,记下行标列标后break结束循环。
具体代码如下:

·二维数组中:
利用嵌套循环,对数组进行扫描直到我们查找到我们所需要的内容,其做法与一维数组大致相同,也需记下所要行标列标。
具体代码如下:

2、关于数组中如何插入数据
·方法1:
先把所需要插入的数据与数组进行比较,判断所要插入的位置,再将后面的数组进行往后移的操作。最后,将数值插入数组中。
具体代码如下:

·方法2:
将数据放于数组的最后面,再利用排序法整理数组。
具体代码如下:

注:这类型的数组必须为有序数列,这样才能对位置进行判断。
3、关于数组中如何删除数据
·一维数组
在输入所需要删除元素的下标,读取到下标后利用循环直接将后面的数据对这一元素进行覆盖,从而形成一个完整数组。
具体代码如下:

·二维数组
关于删除重复字符这一题

4、排序方法
(1)选择排序法
若我们现在要进行的是一个从小到大的排序
具体思路:
扫描数组,从第一个数开始与后面的数进行比较,后面的数据比它小就进行交换。然后第二个数,第三个...都与后面数据进行比较直到结束。
其主要流程图如下:

伪代码:

(2)冒泡排序法
若我们现在要进行的是一个从小到大的排序
具体思路:对相邻的两个数值进行比较,进行n趟比较。在嵌套循环中的内循环中,每一次比较都可以把该次比较的最大值放于最后。
我们来看看2 3 5 1 6 4这组数据的变化过程:

具体代码如下:

关于选择排序和冒泡排序:
·两者都使用了嵌套循环
·两个方法的思维方式是不同的。单单看代码要进行区分的话可以从嵌套循环中区分,选择排序法中在内循环中j是从i+1开始的,而冒泡循环中内循环是从j=0开始的。选择排序中的外循环代表的是第几个数与后面数值比较,而冒泡排序是指比较n趟。
5、数组做枚举用法
这让我想到了电视节目受欢迎程度这道题目。
具体代码如下:

巧妙地将电视台节目序号作为数组下标,有人投这个节目,那么他的数值就+1,就这样循环唱票结束后。我们就能得到所有节目所得到的票数。巧妙地将时间换空间解决了这道题目。
6、哈希数组用法
·通过超星平台上的视频我了解了关于hash[]数组的用法。下面就是利用hash[]解决问题的一道题目:

具体代码如下:

我们通过设置一个hash[]数组并且将其初始化为0,接着对原数组进行扫描,将数值作为hash数组的下标。扫描到该数据就将该数据下标的hash数组赋值为1,当有重复数据我们已经将该hash数组赋值为1了,这就说明了有重复,所以返回1输出YES。

1.2 本章学习体会

学习体会
感觉数组所要学习的内容较多也都较为重要。感觉数组跟循环一样,思路较不清晰就容易乱...我就很容易思路中断或者突然乱掉,逻辑思维能力又很差。害...所以我做题目有些吃力。记得高三那时候很爱说的一句话:守得云开见月明。我也很喜欢这句话,我会冲破云雾的桎梏而终得月明。一维,二维,字符这主要的三大部分呢,我个人觉得字符数组较有难度,关于一些fgets()等输入我也并不能很熟练的掌握。而且我也需要多读读别人的优秀代码,每次自己写起来就十分冗长麻烦,看得又不清晰...总之,继续加油啊。
代码量:
一维数组:388
二维数组:331
字符数组:337
总计:1056

2.PTA实验作业

2.1 判断上三角矩阵

2.1.1 数据处理

·k:用于判断趟数
·n:表示为n×n的矩阵
·i,j:表示数值的行列标
·flag:引入flag进行判断
伪代码:

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
正常数据
只有一个0
全为0

2.1.4 PTA提交列表及说明


·部分正确:写完代码,提交pta我并不是很能理解pta上的最后一个测试点:

这是我初步代码的部分截图:

后来我认为可能是n=0或n=1的情况,于是我加入了下列语句

结果可以看得出他十分的冗长麻烦,但还是过不了测试点,emmmmm...之后我拿着我的代码去询问林丽老师。

之后我看了我舍友的代码,我没有很用心的去了解上三角矩阵的特性。只要使i>j就可以说明数值处于下三角,判断是否为0就可以说明是否为上三角矩阵。真的是比我原来的简便太多。
后来终于答案正确了...也说明确实阅读别人好的代码很重要。

2.2 删除重复字符

2.2.1 数据处理

a[]:定义字符串数组
op:定义op用于数组交换
len:用于储存数组长度
flag:引入flag进行判断
伪代码:

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
ad2f3adjfeainzzzv 23adefijnvz 正常数据
ad2f3adj fea in zzzv 23adefijnvz 字符中含有空格

2.2.4 PTA提交列表及说明


部分正确:刚开始我的思路是把相同的字符变为‘ ’,然后不输出空格输出其他就行了。但是如果遇到中间有空格就行不通这个思路就错啦
格式错误:我用了fgets()方法进行输入,但是它会吸收换行符,所以就格式错误啦。
答案正确:后来我就改成了VS并不支持的gets(),然后就对了。

2.3 求矩阵中的最大小值

2.3.1 数据处理

变量:
·a[][]:定义一个二维数组
·i,j:i代表行标 j代表列标
·max,min:定义最大值最小值
·row1,col2:最大值的下标
·row2,col2:最小值的下标
伪代码:

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
正常数据
正常数据

2.3.4 PTA提交列表及说明

答案错误:
·首先我的代码是这样的:

我觉得非常奇怪,因为我在VS上测试有着和pta上一模一样的输出样例。
·后来林丽老师说是用ACM的测试点需要加上while ((scanf("%d %d", &n, &m))==2),这条语句呢主要是想表达输入的数据是为两个整数
·再后来,他还是显示错误,我询问舍友,发现他们的做法是将行和列分开表示。思路确实不容易混乱,但是再看我的代码,我感觉没什么问题
·最后,拿去询问林丽老师,终于找出来答案,在关于题目的
标识中,我思考有误,我先扫描了行,但是题目要求的是先扫描列。所以,最终就正确了。
·在过程中我们也可以发现是无法跳出循环的,这就关于其中的while语句了,我们只需要输入两个不是整数的字符就可以跳出循环了。

3.阅读代码

题目:

输入输出样例:

代码如下:

·可以看出这段代码其实大部分都在进行输入,36行13在进行数据的输入。
·他非常巧妙地利用了sign[]来输入“am”,如果时间是在下午,便利用<string.h>头文件中的strcpy()函数将sign[]里面的内容更换成“pm”,之后直接输出sign就可以啦。
·整段代码的思路十分清晰,将中午12时作为一个分界线,将上午和下午进行处理
·值得学习的是代码的简洁直接,可能换做我来写,又要写了一大堆。并且关于strcpy()函数的利用,让我对于新学习到的一个知识点有了更好的理解。我也更加明白了,新学习的内容需要去应用去实践才能真正掌握。

posted @ 2019-11-17 22:17  林浈  阅读(310)  评论(0编辑  收藏  举报