我の第五篇博客
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 姓名 | 付峻霖 |
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
⭐1.数组中如何查找数据,有哪些做法
- 顺序查找法
思路:从左到右一个一个找(用循环)
特点:对数组内元素大小排序没有要求
代码:
for (i = 0; i < n; i++) //循环n次
if (a[i] == num2) //找相等的地方
flag = 1; // flag=1代表找到了
break; //找到了就跳出
- 二分查找法
思路:在1 到 99的顺序数组中找17,取中间数50,发现17比中间数50小,那么范围缩小为1到50,如此循环即可。
特点:数组内元素大小需要按照顺序排列
代码:
//以数组 1,2,3,....99做示范
while 当左值小于右值
mid = (low + high)/2 ;//下标的一半,int类型除法取整。
if 查找数 小于 数组中间值
右边界修改到数组中间值
else if 查找数 等于 数组中间值
输出位置,跳出循环
else 查找数 大于 数组中间值
左边界修改到数组中间值
⭐2.数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法
- 数组右移法
思路:找到要插入的地方,用循环将相邻两个元素,右边元素赋值给左边,直接覆盖掉要删除的元素
伪代码:
//第一个循环:用来找 插入元素的位置
for (i = 0; i < N; i++)
if (num < a[i])
break;
//第二个循环:把插入元素位置之后的所有元素 全部往右移动
for (int j = N; j > i; j--)
a[j] = a[j - 1];
a[i] = num; //插入的元素 特殊处理,直接赋值
⭐3.数组中如何删除数据,这个有多种做法,请一一展示。
- 数组左移法
思路1.找到要删除的数据的位置,后面的所有元素往左移动,覆盖掉要删除的数据
思路2.可以把所有要删除的数据,用@取代,最后输出不为 @的元素。
伪代码:
//第一个循环:用来找 删除元素的位置
for (i = 0; i < N; i++)
if (num == a[i])
break;
//第二个循环:把插入元素位置之后的所有元素 全部往左移动
for (int j = i; j < N; j--)
a[j] = a[j + 1];
⭐4.数组中目前学到排序方法,主要思路?
- 冒泡法排序
思路:左右两个元素比较大小,如果位置反了,就交换,一直往右循环下去,每循环一轮,就把本轮循环最大的元素冒到了最右边。循环 n 轮,全部元素就排序好了
- 外层循环: 进行n轮循环,把每轮的最大值依次冒泡到右边去
- 内层循环: 只控制一轮循环 , 将本轮循环中的最大值放到右边去
话不多说,直接放图(来自百度图片)
- 选择法排序
思路:另外定义一个变量,保存一轮循环中的最大值的位置,循环结束后把最大值和它应该待的位置做交换,进行 n 轮循环,就放好 n 个元素的位置。
- 内层循环: 只控制一轮循环,把数组中的每个元素与变量做比较,然后赋值,一轮循环结束后,变量能保存此轮循环中最大值的下标
- 外层循环: 进行n轮循环,把n个最大值依次放到该放的位置
动态图(来自百度图片)
⭐5.数组做枚举用法,有哪些案例?
- 数组枚举的定义
官方:数组的遍历(枚举)对集合中的元素依次不重复的遍历
我:对数组中的元素依次进行不重复的扫描 - 案例:查找整数
- 代码:
//下标遍历,从0到(n-1)
for (i = 0; i < n; i++) //循环n次
if (a[i] == num2) //找相等的地方
flag = 1; // flag=1代表找到了
break; //找到了就跳出
⭐6.哈希数组用法,目前学过哪些案例,举例展示。
-
案例:有重复的数据
-
思路:取一个数和后面所有数比较一次,相等则退出,不相等,重复步骤,直到所有数都比较完
- 内层循环:固定一个数,扫描一轮,如果有重复数据,flag=1,如果无重复数据,flag=0.
- 外层循环:使每轮固定的数都不一样。
- 代码:
int flag = 0;
for (i = 0; i < n - 1; i++) //外层循环 固定元素
{
for (j = i + 1; j < n; j++)//内层循环 扫描元素
{
if (data[i] == data[j])
{
flag = 1;//代表有重复数据
}
}
}
⭐7.字符数组、字符串特点及编程注意事项。
字符串特点:必须以'\0'结尾,而且中间不能有空格,如果有空格,会变成两个字符串
字符数组特点:可以包含多个'\0',也可以不包含'\0'
- 字符数组的初始化
//用单个字符初始数组
char a[5]={'H','e','l','l','o'};
//用字符串初始数组
char a[6]={"Hello"};
Q:为什么两个输出的一样,但字符串的下标却到6了呢?
A:因为字符串必须以'\0'结尾
2.PTA实验作业
2.1 数组循环左移
2.1.1 伪代码
定义数组a[100];
定义数组b[100];
输入n和m;
if m大于n
m ← n%m;
输入a的所有元素
for 计数器 0 to n-m by i++ do
b[i] ← a[i+m];
end
for 计数器 n - m to n by i++ do
b[i] ← a[count];
count++;
end
输出b[]数组
2.1.2 代码截图
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
⭐ 进源同学的思路:是将a数组中的所有元素复制一份放在后面 。如12345 复制后变成1234512345,左移几个单位,用循环赋值到前面,最后输出前五个元素
优点:简单易懂
缺点:如果是右移几个单位呢,下标总不能是负数吧! 也可以右移到后五个中保存,最后输出后五个,但这就比较繁琐了。
⭐ 我的思路:是重新定义一个数组b[],保存移动后的数组。如12345变到45123。那我分为两段赋值给b[],一个循环赋值45,另一个循环赋值123.
优点:左右移动都可以用这个方法
缺点:循环的起始结束位置不好找,而进源的起始结束都是从 0 到 n
2.2 找鞍点
2.2.1 伪代码
输入二维数组
if 是一阶数组 then
输出 0 0
return 0;结束
for (i = 0; i < n; i++)
{
for (j = 1, temp = a[i][0]; j < n; j++) 找此行中的最大值
{
判断是否有temp < a[i][j]
有,则将更大的数赋值给temp
}
for (j = 0; j < n; j++) 有可能一行有多个最大值,扫描出所有最大值
{
if (temp == a[i][j])//有可能每行有多个元素的值等于最大值
for (h = 0, f = 0; h < n; h++)//判断该最大值是否是所在列的最小值
{
判断是否有temp > a[h][l]
有,则flag=1,代表不是鞍点
}
判断flag==0吗
是,则输出这个鞍点
return 0;结束
}
如果走到这一步,说明没有鞍点
输出NONE
return 0;结束
2.2.2 代码截图
2.2.3 请说明和超星视频做法区别,各自优缺点。
⭐1.做法区别
- 共同点:我们的思路相差无几,都是先寻找行中的最大值,再考虑那个最大值是否为列最小值
- 不同点1:超星上判断是否为鞍点,是看循环是否到最后一次了,我是用flag的** 0 或 1 代表是否为鞍点**
- 不同点2:超星用break退出循环,我直接return 0;暴力终止执行
⭐2.优缺点 - 超星优点:思路清晰
- 超星缺点:判断是否为鞍点,用flag的 0 和 1 代表是否为鞍点,可能更好
- 我的优点:flag判断是否是鞍点
- 我的缺点:嵌套层数有点多,return 0;不能经常用,尽量改成break;
2.3 切分表达式
思路:其实这题就是让我们考虑换行的问题,什么情况需要换行,什么情况不需要换行
2.3.1 伪代码
if str[i]是'('或')'或'*'或'/':
输出str[i],换行
if str[i]是数字或小数点:
if后一位是数字或小数点:
输出数字,不换行
else:
输出数字,换行
if str[i]是'+'或'-':
if i==0或前一位是'(':
str[i]是正负符号,直接输出,不换行
else
输出正负符号,换行
2.3.2 代码截图
2.3.3 请说明和超星视频做法区别,各自优缺点。
⭐1.做法区别
相差无几,小声bb: "本来就是从超星上学来的"。
⭐2.优缺点
- 超星优点:第一点思路清晰,把是否换行分为三种情况,第二点 continue可以提前结束本次循环,减少代码运行,提高程序效率
- 超星缺点:无
- 我的优点:思路清晰,把是否换行分为三种情况
- 我的缺点:没把“判断是否换行”封装成函数