| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 黄帅 | |
0.展示PTA总分
展示2张关于“数组题目集”分数截图。
1.本章学习总结
1.1 学习内容总结
数组中如何查找数据,有哪些做法
- 1.顺序查找
利用循环语句 若循环到的数与想找的数相等,则找出
for i=0 to n
if 与想找的数相等
break
end for
- 2.二分法
多用于有序数组,定义中值、左界和右界变量
while(high>low) //high一直减小,low一直增大,当high<low时,说明没找到
{
mid=(high+low)/2;
if(a[mid]>key) //
high=mid-1; /修改右界
else if(a[mid]<key)
low=mid+1; //修改左界
else //a[mid]=key
flag=1;
break; // key=mid
}
数组中如何插入数据
学习了同学的代码,比我原来的效率高多了
先判断要插入的x在那个数的后面,然后在判断的数和x交换,就这样一直判断并交换一直到第n-1,然后让第n个数等于x。
for i=0 to n
如果num[i]>插入的数
交换这两个数
if i=n
num[i]=x;
end if
end for
数组中如何删除数据
- 1.在原来的数组中从要删除的元素开始依次赋值为后一位的元素,在把最后一个元素改为'\0'
- 2.在另一个数组中存放删除过的一系列元素
数组中目前学到排序方法
- 1.选择排序法
选出最大的数和第一个位置的数交换,再在剩下的数中选出最大的数和第二个位置的数交换,以此类推
for(m=0;m<n-1;m++)
{
for (j = m+1; j < n; j++)
{
if (a[j] > a[m])
{
temp = a[m];
a[m] = a[j];
a[j] = temp;
}
}
}
- 2.冒泡排序法
相邻两个元素比较交换,从第一个元素依次做到倒数第二个元素,一遍遍扫描,最后最大值或最小值就被放在第一位
for (l = 1; l <= k; l++)
{
for (j = 0; j < x - 1; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
x =x- 1;
}
数组做枚举用法
- 枚举与数组的区别
枚举是标签(定死的),数组是容器(存放数据)
枚举是值类型,数组是引用类型
枚举是常量的集合,数组是变量的集合
枚举对象在任一时刻只能有一个常量值,数组对象在任一时刻可以有多个值
哈希数组用法
做题时我们有时觉得自己明明做的对了,但是却提示运行超时,这时我们可以用到哈希数组,以空间换时间,提高效率
用法是新定义一个数组,存放需要进行判断的元素,对判断元素出现次数进行累计
如数组第8题,有重复的数据I
int a[100000];
static int b[100000];
int flag = 0;
for (j = 0; j < n; j++)
{
b[a[j]]++;
if(b[a[j]]==2)
{
flag=1;
break;
}
}
字符数组、字符串特点及编程注意事项。
1.用字符串给字符数组赋值时会多出一个结束符 '\0',数组长度要比字符串大1
2.scanf("%s",自定义标识符(不用加&));
不能输入空格,碰到空格结输入结束
3.字符串需要用一维数组存储
2.PTA实验作业
2.1 简化的插入排序
2.1.1 伪代码
if 该数小于序列最小的
序列全向右移动一位
第一位为X
else
if X大于序列最大的
序列加一位X
else
for j=0 to n
if X大于这一位小于下一位
flag=1
break
if(flag)
从此位开始全部向右移动一位
此位=X
2.1.2 代码截图
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
他的思路:先判断要插入的x在那个数的后面,然后在判断的数和x交换,就这样一直判断并交换一直到第n-1,然后让第n个数等于x。
我的思路:插入的地方右边全部向右移动一位,再插入
这样一对比,他的代码比我简洁高效多了
2.2 鞍点
2.2.1 伪代码
定义方阵n
定义控制循环变量i,j,k
定义x,y记录鞍点下标
定义数组a
定义最大值max,最小值min
定义控制标志变量flag=1
输入n
用for循环输入矩阵数
for j=1 to n
max = a[j][1]
for k=2 to n
if a[j][k] >= max
max = a[j][k];
min = a[1][x]
for i=2 to n
if a[i][x] <= min
min = a[i][x]
if min == max
输出下标x-1,y-1(因为不是从零开始)
标志flag=0
end for
if flag
输出NONE
2.2.2 代码截图
2.2.3 请说明和超星视频做法区别,各自优缺点。
选择切分表达式这题介绍字符数组。并说明和超星视频做法区别。
我的做法是将某行最大值与所在列的最小值相比,若相等则证明是鞍点,而视频里是判断循环是否做完即j是否等于n来证明是鞍点,相比更简洁,更方便。
视频里使用了函数,与我的代码相比更容易看懂,且便于维护。
我的代码在比较大小后给max的值就是数组元素的值,而视频里给maxIndex的值是数组的下标,相比更加方便,易懂。
总的来说,我需要学习简洁高效的做法,摒弃效率低的做法。
判断有无鞍点,我定义了flag变量作为标志来判断,而视频中是判断i是否等于n,相比起来代码量更少,更简洁。
2.3 切分表达式
2.3.1 伪代码
定义控制变量i
定义数组str
输入字符串str
输出s【0】
for i=1 to str[i]!='\0'&&str[i]!='\n'
if(数字或点)
原样输出
if(左括号)
右边加换行符
if(右括号)
左边加换行符
if(-号)
if前一位是数字
左右加换行符
else
原样输出
if(*号)
左右加换行符
if(/号)
左右加换行符
if(+号)
if是否是第一位
else
左右加换行符
end for
2.3.2 代码截图
2.3.3 请说明和超星视频做法区别,各自优缺点。
我的代码没有想到用函数,视频中用到了函数,方便阅读和维护。
视频中还用到了continue这条语句,提前结束循环,提高效率。
我的思路和视频中的大致相同,但细节上我有些做的不好,如判断‘*’和‘/’没放在一条语句里。