C语言博客作业04--数组
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| :----: | :----: | :----: |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 姓名 | 陈宇杭 |
0.展示PTA总分
1. 本章学习总结
1.1 学习内容总结
- 查找数据
- 顺序(遍历)查找
通过循环结构来从数组头(尾)进行遍历,并将数组的每一项与查找的数进行对比查找,如;
int count = 0;
for (int i = 0; i < n; i++)
{
if (numberList[i] == x)
{
count++;
}
}
- 二分查找
将所欲查找的有序数列一分为二,并将中间数与查找的数进行比较;
若所查找的数不为中间值,则在所对应大小的二分数列中继续进行二分查找;
说明:元素必须是有序的,如果是无序的则要先进行排序操作;
- 插入数据
在有序数组中插入数据,首先需找到数值所插入的位置,然后将插入位置及以后的数值向后移位即可;
Begin
for i = 0 to n-1 //n为数组最大值
if 找到插入位置
记录插入位置下标
end if
end for
for i = n to 插入位置
从数组最后一位开始到插入位置,每一位数向后移动一位
end for
将数据插入
end
- 删除数据
- 重构数组
遍历数组,并将不需要删除的数据依次放入另一个数组;
适用于所要删除的数据偏多,数组长度偏长的数据;
for(int i = 0, j = 0, count = 0; i < n; i++)
{
if(a[i] != key) //a[]为原数组;key为删除数据;
b[j++] = a[i]; //b[]为重构后数组;
else
count++;
}
- 移位法
遍历数组,若遍历到要删除的数据,将此数据后的数据依次前移一位,覆盖原数据;
节省空间;
int count = 0
for(int i = 0; i < n - count; i++)
{
if(a[i] == key)
{
for(int j = i; j < n - count - 1; j++)
{
a[j] = a[j + 1];
}
count++;
}
}
n -= count;
- 数组排序
- 选择法排序
遍历数组,将数组中的最小(大)值与数组头的值进行交换, 然后将数组的次小(大)值与数组的第二位的值进行交换,重复操作,依次排序;
for (int i = 0; i < N - 1; i++)
{
for (int j = i + 1; a < N; a++)
{
if (integer[i] <= integer[j])
{
temp = integer[i];
integer[i] = integer[j];
integer[j] = temp;
}
}
}
- 冒泡法排序
遍历数组,将相邻两位按要求交换排序,并重复操作直到排序完成;
for (int a = 0; a < K; a++)
{
for (int i = 0; i < N - 1; i++)
{
if (integer[i] >= integer[i + 1])
{
temp = integer[i];
integer[i] = integer[i + 1];
integer[i + 1] = temp;
}
}
}
- 哈希数组
哈希(Hash)是类似 "key" => "value" 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。
Hash 的索引(或者叫"键")几乎可以是任何对象。
Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。——菜鸟教程
- 字符数组、字符串特点及编程注意事项。
- 字符数组
正如名字所写,字符数组是由字符组成的数组,它拥有数值型数组的特点,也有一些自己的特色;
它的定义方式与数值型数组相同char s[100];
,在内存中各个元素也同样是按顺序排列; - 字符串特点
字符串简而言之是一串字符数组加上结束符'\0';
字符串在static
下的初始化的值为'\0'(也就是0,好像没啥区别); - 编程注意事项
字符串大小不只是根据输入的字符长度定义,还需考虑结束符'\0'与回车'\n'(fgets()
)
遍历字符串时可以以是否为结束符为判断结束条件;
fgets()
函数读取字符串时会读入额外的回车'\0',而gets()
不会;它们都接受带空格的字符串;
scanf("%s",str);
以%s只能读入连续的字符串,也就是第一个空格前的所有字符;
- 字符数组
2. PTA实验作业
2.1 数组循环左移
2.1.1 伪代码
Begin
get 数组长度n 与 移动长度m
get 数组a[]
for i = 0 to m
保留数组首位数据temp = a[0]
for j = 0 to n - 2
a[j] = a[j + 1] //前移一位
end for
将数组头数据放入数组尾a[n - 1] = temp
end for
put a[]
end
2.1.2 代码截图
2.1.3 余智康同学的代码
智康同学将代码封装函数,提升了代码的可读性;
将交换数据处理,使其小于数组长度便于处理;
通过定义额外一个数组来进行一次交换,通过牺牲小部分空间来换取时间;
2.2 找鞍点
2.2.1 伪代码
Begin
get 矩阵长宽n
get n*n矩阵
int 判断是否找到鞍点flag = 0
for i = 0 to n
for j = 0 to n
if a[i][j] = 行最大值
if a[i][j] = 列最小值
put i, j; flag = 1;
end if end if end for end for
if flag = 0
没找到 输出NONE
end
2.2.2 代码截图
2.2.3 与超星视频做法区别,以及各自优缺点
我通过一个sort()
函数来进行列与行的排序,再将每一行的各个元素与最大值或最小值进行比较,耗费计算机资源较多;
超星则是直接通过if语句进行寻找最大值下标,在进行列上的比较,若不为最小值则跳出循环,耗费资源少,高效;
2.3 切分表达式
2.3.1 伪代码
Begin
get 字符串s[]
int numberFlag = 0;
/*已知有多重情况需要处理:数字,算式开头的负数(无括号),算式中间的负数(有括号),减号后带的正数*/
for i = 0 to s[i] = 0
if 字符串首为'-'
通过numberFlag与continue语句输出负数
if 字符为连续'(''-'
通过numberFlag与continue语句输出负数
if 字符为数字
通过numberFlag与continue语句输出整数
if 字符为其他字符
输出字符
put '\n'
end for
end
2.3.2 代码截图
2.3.3 与超星视频做法区别,以及各自优缺点
思路上区别不大,超星视频中对数据的处理和资源的占用上考虑的较为周到,值得学习;