c博客作业-数组
0.
1.本章学习总结
1.1学习内容总结
1.1.1一维数组
-
1.一般定义形式:类型名 数组名 [数组长度];类型名指定数组中每个元素的类型,数组名是数组变量的名称,是一个合法的标识符,数组长度是一个整型常量表达式,设定数组的大小;
-
2.数组是一些具有相同类型数据的集合;数组名是一个地址常量,存放数组内存空间的首地址;数组元素的引用要指定下标,它的合理取值范围是[0,数组长度-1],下标不能越界。
-
3.数组定义时需要初始化,静态数组不全部赋值,未赋值的元素自动为0,动态数组值随机;
1.1.2二维数组
-
1.一般定义形式:类型名 数组名 [行长度] [列长度];音乐二维数组要指定两个下标,即行下标和列下标;
-
2.二维数组初始化的方法有两种:a.分行赋初值;b.顺序赋初值;其中分行赋初值的方法直观清晰,不易出错,是二维数组初始化最常用的方法;
二维数组初始化时,如果对全部元素赋了初值,或分行赋初值时,在初值表中列出了全部行,就可以省略行长度。 -
3.一般使用二维数组编程时会需要二重循环;
1.1.3一维字符数组
-
1.一维字符数组用于存放字符型数据,它的定义初始化和引用与其他类型的一维数组一致;
-
2.字符串就是用一对双引号括起来的字符序列,它有一个结束标志'\0';
将字符串存入字符数组时,由于它有一个结束符'\0',数组长度至少是字符串的有效长度+1,第一个'\0'后的其他数组元素与该字符串无关; -
3.字符串输入:a.scanf:scanf("%s",str);输入参数:字符数组名,不加地址符,遇回车或空格输入结束,并自动将输入的一串字符和'\0'送入数组中;b.fgets函数:fgets(buf,10,stdin);stdin表示标准输入流;fgets函数读取文件当中的n-1个字符到s中,从标准输入流中读取字符串,输入的字符个数超出了字符数组的大小不会导致溢出的问题;gets函数:用于从缓冲区中读取字符串,直到出现换行符或读到文件尾为止,由于gets不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃。
-
4.字符串输出:a.循环输出;b.printf("%s",str),printf("%s","hello");c.puts(str),puts("hello");
1.1.4数组中如何查找数据
- a.已知需要查找的数据:通过循环,历遍数组,与数组元素比较,直到找到所需要的数据
- b.已知需要查找数据的地址,直接读取地址找出数据;
- c.二分查找法
1.1.5数组中如何插入数据
读取需要插入的数据x;
if (x < a[0])
{
for (k = N - 1 to 0; k--)
挪动数组a[k + 1] = a[k];
end for
a[0] = x;
}
end if
else if (x > a[N - 1])
a[N] = x;
end if
else
for (i = 0; i < N - 1; i++)
{
if (a[i]<x && a[i + 1]>x)
{
for (k = N - 1;to i; k--)
挪动数组a[k + 1] = a[k];
end for
a[i + 1] = x;
break;
}
end if
}
end for
}```
###1.1.6数组中如何删除数据
定义循环变量 i, j,m;
定义需要删除的位置的元素x;
for (m= 0 to k)
{
scanf("%d", &x);
for (j = x-1 to n-1)
{
a[j] = a[j + 1];
}
end for
n = n - 1;
}
end for
若删除数据但不知道位置,方法相似
- 题目例子:PTA一维数组7-6
###1.1.7数组中目前学到排序方法
- a.冒泡法:通过相邻两个数不断交换,将数据往前或者后移动,经历n轮后达到排序的目的
- b.选择法:经过n-1轮循环,依次从下一个数据历遍数组来进行移动,达到排序的目的,需要两层循环
###1.1.8数组做枚举用法
- 寻找重复数据:在数组中寻找重复数据时,有时简单直接的方法就是直接历遍数组,一个个去看元素是否重复出现,将数据一个个列举,方法一个个举出,列出所有可能性,就是枚举,一个个拿出数据,一个个比较就是数组中的枚举
###1.1.9哈希数组用法
- 重复数据的判断,通过对哈希数组初始化全部赋零,再对需要判断的数组历遍,若出现过则赋1,当再次遇到时哈希数组值已经赋1则确定重复
- 哈希数组是偏向辅助的数组,在代码中作为一个辅助的存在来实现代码功能要求
##1.2本章学习体会
- 数组的学习对c语言很有用,在大数据型的代码中作用很大,但是多个数组的同时使用,让人觉得眼花缭乱,会出现分不清或者思路突然不清晰的情况,但是数组的学习确实大大缩减了代码量,非常好用。
| 周 | 代码量 |
| ----- | --------- |
| 十一周 | 380~400 |
| 十二周 | 410~430 |
|代码总量|790~~830|
#2.PTA实验作业
##2.1数组元素的删除
###2.1.1伪代码
``` 定义数组 a[M],M为最大范围
定义数组的实际范围 n;
定义需要删除的次数k;
定义循环变量 i;
调用具体范围n;
for (i 0 to n)
{
调用数组所有元素a[i]
}
end for
调用 k;
删除函数Delete(a, n, k);
for (i to n-k)
{
判断第几次输出,以控制空格;
输出数组
}
end for
return 0;
}
删除函数
{
定义循环变量 i, j,m;
int x;
for (m to k)
{
调用需要删除的位置x
for (j x-1 to n-1)
{
将元素后挪
}
end for
n = n - 1;
}
}```
###2.1.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117132701265-657760966.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117132721707-1881492807.png)
###2.1.3造测试数据
| 输入数据 | 输出数据 | 说明 |
| ----- | --------- | ----------- |
| 10 | | |
|1 2 3 4 5 6 7 8 9 10| | |
| 4 ;3 2 4 6 | 1 4 5 7 8 10 | 正常数据 |
| 3 | | |
|3 4 5 | | |
|4 ;1 2 3 4 | | 删除超出数组上限 |
| 3 | | |
|1 2 3| | |
|0 |1 2 3|不删除数据|
###2.1.4 PTA提交说明及说明
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117133843117-105967208.png)
提交列表说明
- 格式错误:输出时数组之间需要空格,我的没有空格;
- 格式错误:输出时,最后一个数据最后没有空格,我的最后一个数据仍然有空格;
- 答案正确:通过确定是第几次输出,如果是第一次就不要空格,不然就在前面带空格,以保证最后一个数据没有空格;
##2.2 7-3上三角矩阵
###2.2.1伪代码
```定义二维数组a[M][M];
定义循环变量,需要判断的矩阵个数;
定义一个初始化为零的矩阵
for (k = 0 to T)
{
调用第i to n个矩阵
for (i = 0to n)
{
for (j = 0 to n)
{
调用二维数组
}
end for
}
end for
for (i = 0 to n)
{
for (j = 0 to n)
{
if (在下三角中出现0以外的数)
count++;
end if
}
end for
}
end for
if (count == 0)
{
对第k个矩阵赋1
}
else
{
对第k个矩阵赋0
}
初始化count ;
}
end for
for(k=0 to T)
{
if (b[k] == 1)
{
printf("YES\n");
}
end if
else
{
printf("NO\n");
}
end else
}
end for```
###2.2.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117213444772-1652846597.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117213500936-433985649.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117213513808-1916478256.png)
###2.2.3造测试数据
| 输入数据 | 输出数据 | 说明 |
| ----- | --------- | ----------- |
| 1 2 3 4 5 6| | |
|0 2 3 4 5 6 | |
|0 0 3 4 5 6 | |
|0 0 0 0 0 0 | |
|0 1 0 0 1 0 | |
|1 2 3 4 5 6|NO | 正常数据 |
| 1 2 3 | | |
| 0 4 5 | | |
| 0 0 6 | | |
| 1 0 | | |
|-8 24 | YES;NO | 正常数据 |
###2.2.4PTA提交列表及说明
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117214227155-1674015171.png)
提交列表说明
- 答案错误:一开始我的代码是根据题目测试数据写的,但是改变后就不对了,当n最大我的代码就出错了
- 答案错误:改数据后,没有考虑n最小,最大的情况,所以还是错误
- 答案正确:我因为修改一直不对,就直接重新写了一个代码,这个代码比之前的好很多
##2.3字符串转换成十进制整数
###2.3.1伪代码
定义字符串数组 str[M],十六进制储存 hexad[M];
长整型数据 number;
循环变量 i,j, k=0;
定义两个判断以控制输出数的正负的两个开关
flag = 1;
point = 0;
i = 0;
while (读取字符串)
{
通过i自增控制循环
}
str[i] = '\0';
for (i 0 to '\0')
{
if (出现'-',且开关为零)
{
flag = -1;
}
end if
if (str[i] 为十六进制数)
{
改变point值,使后面才出现符号的情况无效
储存十六进制数到hexad函数
k++;
}
end if
}
end for
hexad[k] = '\0';
number = 0;
for (hexad!='\0')
{
if (数组元素是数字)
{
number = number * 16 + hexad[i] - '0';
}
end if
else if (数组元素是大写字母)
{
number = number * 16 + hexad[i] - 'A'+10;
}
end if
else if (数组元素是小写字母)
{
number = number * 16 + hexad[i] - 'a'+10;
}
end if
}
end for
通过flag控制number正负
number = flag * number;
printf("%ld\n", number);
return 0;
###2.3.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117223238415-1190884629.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117223251149-1027426337.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117223303477-1189377511.png)
###2.3.3造测试数据
| 输入数据 | 输出数据 | 说明 |
| ----- | --------- | ----------- |
| +-P-xf4+-1!#| -3905 | 正常数据,十六进制数前有负号 |
| f4+-1!#| 3905 |正常数据,十六进制数后才出现负号|
| hjkk#| 0| 无十六进制数|
###2.3.4PTA提交列表及说明
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117224056997-1976823497.png)
提交列表说明
- 部分正确:考虑了测试数据,但是造其他测试数据时值正确,正负却不对
- 部分正确:用flag,point后,题目所给数据直接为正
- 答案正确:控制负号出现的同时point为正,并将flag取负,之后不再在意flag,point改变值,若没出现负号,point也改变值,保证flag不能取负
#3.阅读代码
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095847470-980957361.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095904048-496454282.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095919716-2065559283.png)
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095933818-1182431251.png)
- 题目大意:该题目意思是确定一张数字为2n的票前n位和与后n位和是否相等若相等则为幸运票,若不相等则计算还需要多少张才买到幸运票
- 代码理解:该代码为c++类,具体是通过数组存放票上的数字,再通过循环将前n为和放到sum[0]后n位放到sum[1],通过比较二者来确定幸运票,以及确定距离幸运票的张数
- 该代码亮点在于对sun[0]sum[1]的大小判断通过temp来计算差距,以及代码尾carry的使用,使代码计算避免了许多麻烦。