C语言博客作业04--数组
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.1.1 数组中查找数据:顺序查找和二分查找,
- 如果数组的顺序是从小到大或者从大到小用二分查找更为方便。
- 如果数组的顺序杂乱,用顺序查找更为妥当。
1.1.2 数组中插入数据:
- 如果是在杂乱的数组中插入一个数据到特定的位置,例如数组a[]中有20个元素,现将一个数x(已知数)插入到某个下标k(1~19)则可以
a[i+1]=a[i]; a[k]=x;````将下标k及k之后的数往后移一个位置,再将x赋值给a[K]。
- 如果是在按一定排列的顺序的数组中插入一个数并排列好,例如数组a[]中有20个元素,现要将x插入,则可以:
if(x<a[i]) a[i+1]=a[i]; else a[i+1]=x;````(数组a[]从小到大排序)将比x大的往后移就可以达到插入并排序的目的。
1.1.3数组中如何删除数据:
- 第一种方法:将要删除的数据往后移并将数组的长度减小。如图
上图的代码就是将要删除的数往后移,这样能导致前面的n-k个数为没被删除的数而输出。
- 第二种方法:用后面的来覆盖前面的
将要删除的第k个数用它后面的数来覆盖。
1.1.4数组中目前学到排序方法:
- 冒泡排序法:对相邻的两个数进行比较并将大的数转移到前面,重复多次(具体凭感觉,没感觉的多测试几次找到规律)
- 选择排序法:让k=i并将a[k]与i之后的元素进行比较,比a[k]大则交换。
1.1.5数组做枚举用法案例:
- 如c07中的7-11 求整数序列中出现次数最多的数,将用户输入的数与之前的数进行比较并存入另一个数组,若遇见重复的数则让零一数组的值累加,并比较出最多的数输出。
1.1.6哈希数组的用法:
- 如c07中的7-5有重复数据,将每个数与之后的数比较,如果有相等,就代表有重复的数据。
1.2本章学习体会:
1.2.1学习感受:
- 本章的学习,让我学到了一个存储变量的变量,让我之前每次只能定义一个变量,怎么能过存多个变量的疑惑得到了解决。
1.2.2本章的代码量:
- 共957行,还不够努力。。。
2.PTA作业:
2.1c07一维数组 7-9调查电视节目受欢迎程度:
2.1.1伪代码:
#define N 9 宏定义N=9
static int a[N]; 定义一个含有九个数整型数组,并初始化为0
int i; 定义一个整型变量i,作为循环变量
int n; 定义一个整型变量n,用来存储调查的人数
int num; 定义一个整型变量num,用来存储用户的投票
从键盘抓取调查人数n
for
抓取用户的投票num;
对应的num下标的a数组+1;
end for
for
输出节目1-8和1-8的投票情况
end for
2.1.2代码截图:
2.1.3造测试数据:
调查人数 | 投票情况 | 运行结果 |
---|---|---|
10人 | 如题目 | 答案正确 |
10人 | 全部投1号 | 答案正确 |
2.1.3PTA提交列表及说明:
- 部分正确:刚开始我用的是另一种代码,因为做这题时我们是把二维数组教完了,我看着输出的样例就用了二维数组,所以出现了一些错误,当时找不到错误。
- 答案正确:然后就改为用一维数组的再做了一遍,就没出现这种错误了。
2.2c0二维数组 7-7螺旋方阵:
2.1.1伪代码:
int a[N][N];定义一个二维数组
int n;定义一个整型n用于获取用户输入的方阵的长宽
int i=0;定义一个i用于循环
int j=0;定义一个j用于循环
int flag=0;定义一个flag用于判断累加输出的方向
int count=1;定义一个count用于判断累加输出的方向
从键盘抓取n
while
if判断是否加到了n*n
for循环累加
if循环再次判断
for循环累加
if循环再次判断
for循环累加
if循环再次判断
for循环累加
flag累加使for循环的累加规则改变
if循环判断是否退出while循环
for循环输出
end for
2.2.2代码截图:
2.2.3造测试数据:
行数 | 运行结果 |
---|---|
1行 | 答案正确 |
5行 | 答案正确 |
10行 | 答案正确 |
2.2.4PTA提交列表及说明:
- 虽然我提交列表是一遍过,但我是在VS上测试修改直到最后运行的结果和答案一样才在PTA上提交。
- 选这题是因为我想要告诉自己在VS上运行调试的好处,在VS上运行好的可能在PTA上就可以一遍过。
2.3c09 7-7 jmu-c-大数加法:
2.3.1伪代码:
int i;循环变量i
int j;循环变量j
int k;循环变量k
int sum;定义变量sum用于计算每一位的和
int answer[1001];定义数组answer用于储存和
char num1[1001];定义字符数组num1用于存储输入第一个数
char num2[1001];定义字符数组num2用于存储输入第二个数
while循环获取num1
end while
while循环获取num2
end while
用'\0'取代num1,num2中的最后一个'\n'
for循环计算并储存在answer
if判断是否有一个数组小于另一个
将大的数组存储进answer
输出answer数组代表答案
2.3.2代码截图:
2.3.3造测试数据
输入数据 | 输出答案 | 运行结果 |
---|---|---|
如题目 | 如题目 | 答案正确 |
第一个数组小 | 答案正确 | 答案正确 |
第二个数组小 | 答案正确 | 答案正确 |
2.3.4PTA提交列表及说明:
- 1.2.答案错误:我将结果存储在其中一个数组中,发现数组过小,导致少输出了第一个1
- 2.3.4.5.6.部分正确:我交给数组扩大,将题目的输入数据达成了,但没达到另外两个测试点,还多次修改。
- 7.答案错误:我另造了一个数组,但出现了没有存储的数。
- 8.9.部分正确:经修改,题目的实现了,但还是没有实现另外两个测试点。
- 10.答案正确:加入了if判断有无数组小后答对了题目。
3.阅读代码:
代码来源:朱振豪同学pta作业c07一维数组7-6数组元素的删除
小朱同学用了覆盖的方法,将要删除的第i个数组元素用i之后的元素将之覆盖,然后输出n-k个数(n表示数组原有的元素,k表示要删除的数)
这题他用到了宏定义N=100,这点值得学习,使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。
相比于我的代码,小朱同学的代码更加简便,可读性更高