C语言博客作业04--数组
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
- 数组可通过下标查找数据,每个下标就像是“地址”,可通过找下标查找数据。还可以通过数组中的特殊元素查找,比如字符串数组中的'\0'等。
- 数组插入数据时,可先找到插入位置,然后将插入位置后的全部元素右移一位,在将数据放入插入位置。
for n to loc do//从数组最后到插入位置将数组右移一位
a[n+1]=a[n];
a[loc]=number;//插入位置放入插入数据
- 数组删除数据
1.找到要删除元素的下标,删除值后面的元素都往前移一位, 要删除的值直接被覆盖。
2.将要删除的元素赋特殊值,将除特殊值外的元素放入另一数组。
3.字符型数组可从第一个字符开始对比,凡是非删除对象都按下标顺序赋值回字符串,最后重新加上'\0'。 - 数组中数据的的排序
1.顺序排序法,主要思路:从首位循环到末位,每次循环中都找到最大(小)值的下标,交换两个位置的数,从下个位置继续在剩余数中寻找最大(小)值的下标,保证每次循环都把一个较大(小)的数放在循环开头。
2.冒泡排序法,主要思路:对比相邻两数的大小,交换两数位置,每轮循环都把最大(小)数放到循环末位,经n-1轮循环即可实现排序。 - 数组做枚举用法。
1.调查电视节目受欢迎程度,用数组下标1~8作为节目名称,在数组中存放每个节目得分。
2.找是否有重复数据中用hash数组通过下标的方式,存放每个数是否重复的信息。
3.在阅览室题目中,可用数组的下标作为书号的存放。 - 哈希数组用法。
1.判断数组是否存在重复数据。主要思路:遍历一遍原数组,遇到的每个元素都将其当做哈希数组的下标,并将哈希数组该下标对应的数由0改为1,若某个元素对应哈希数组的值已经为1则说明该数据重复,退出循环。
2.将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。主要思路:将ASCII码由小到大作为哈希数组的下标并初始化为0。遍历原数组,按ASCII码存入哈希数组对应位置,输入哈希数组中不为0的数据即为去掉重复的字符后的排序好的数据。
1.2 本章学习体会
- 本章的难度明显较前几章有很大的提高,代码的理解难度更大,对读代码能力要求更高。
- 解决问题的方法思路更加丰富多样,对数组的操作有多种类型,而每种类型又有多种方法,熟练掌握每种方法就要加强代码的理解记忆。
- 在数组操作方法上,有时会混淆或记忆错误。
- 在VS编译器上对数组的操作时,各种问题浮出水面,经常出现各种看不懂的错误警告和提示。
- PTA题中代码出错后,查错也变的更加困难。
- 涉及字符数组的操作总是复杂、繁琐和易错,各种输入和输出字符串的方法差异微妙。
- 这两周的代码量约为:970行。
2.PTA实验作业
2.1大数加法
2.1.1 伪代码
char a[1000];
char b[1000];//两个相加数存放在数组a和b中
static int c[1100];//和存放数组c中
int i=0 , j=0 , k=0 ;//循环变量,顺带记录a、b数组长度
int up, m;//up为两数相差的位数,m为循环变量
循环计数,得出a,b两数的位数和位数差
if(up>0)//a的位数多于b
数组b右移up位,前面补上'\0'
else if(up<0)//a的位数小于b
数组a右移up位,前面补上'\0'
while (i >= 0 && j >= 0)
{
c[k++] += (a[i--] - '0') + (b[j--] - '0');//a+b的和放入数组c
if (c[k - 1] > 9) 该位减10,下一位加1
}
逆序输出数组c即为a+b的和
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
大数 | ||
最高位进位 | ||
最高位不进位 | ||
个位 |
2.1.4 PTA提交列表及说明
1.部分正确:a、b两数位数不相等时,只能进行两数等位部分的计算,导致答案错误。最开始想让多余的数直接输出在计算出的和之前。
2.部分正确:最开始的想法是错误的,当需要进位时,该方法就不适用了。后来想让短的数前补上0让两数位数相同。
3.答案正确:先计算出两个数的长度差(a-b),差大于0表示a数位数多于b,让数组b右移差值位并在b数组前补差值个'\0'使两数位数相等后再进行计算。
2.2删除重复字符
2.2.1 数据处理
char s[80];//存放输入的字符
static char hash[256];//,初始化为'\0',作用:覆盖重复字符,按ASCII码输出
int i;//循环变量
int k;//hash数组的下标
i=0;
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
hellowworld11 | 1dehlorw | 字母和数字无空格 |
wwe 22 | 2ew | 存在空格重复 |
------ | - | 全空格('-'代表一个空格) |
2.2.4 PTA提交列表及说明
1.部分正确:hash数组的长度不足,当字符串中的字符ASCII码过大时会出现错误。修改hash数组长度。
2.部分正确:出现有空格的情况出现错误,原因是使用了scanf("%s",s)语句导致遇到空格输入就结束了,之后将输入语句改为while循环输入解决空格的问题。
2.编译错误:修改输入语句时,最后一个分号变成中文的分号了。
3.答案正确:检查更改符号,将scanf("%s",s)语句更改为其它的输入语句,更改hash数组长度为127。
2.3螺旋方阵
2.3.1 数据处理
int n;//矩阵阶数
static int a[10][10];//储存矩阵中数据,使用静态数组为了后面的递增和螺旋条件判断
int i = 0;//行标
int j = 0;//列标
int k = 0;//循环变量
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 | 1 | 最小n |
9 | 最大n | |
6 | 偶数n |
2.3.4 PTA提交列表及说明
1.部分正确:在某个转弯处行列的变化出现错误,导致某些阶数的螺旋矩阵出错。
2.部分正确:当n=1时,答案错误。
2.答案正确:首先单独处理n=1的情况,其次仔细跟着编译器一步一步差错找规律,看行列的变化情况,更改行列的数值以及自增符。
3.阅读代码
插入排序,代码如下:
演示:
- 该代码介绍了一种新的排序方法,思路上与数组插入数据类似。
- 插入排序的基本思想是将每步将一个待排序的记录,按其关键码值的大小插入到前面已经排序的数组中的适当位置上,直到全部插入完为止。
- 该排序方法和冒泡排序与选择排序相比较为直观,比较不同的排序方法对比它们之间的差异可以拓展思路,学习分析解决问题的方法