0.展示PTA总分
一维数组
二维数组
字符数组
1.本章学习总结
1.1学习内容总结
1.1。1一维数组
1.定义
一维数组定义的一般形式:
类型名 数组名 [数组长度];
类型名指定数组中每个元素的类型;数组名是数组变量的名称,是一个合法的标识符;数组长度是一个整型常量表达式,设定数组大小。
例如:
int a[N];
2.引用
数组元素的引用要指定下标,形式为:
数组名 [下标]
下标可以是整型表达式。数组下标从0开始,下标不能越界。下标的合理取值范围是[0,数组长度-1].
例如:
a[101]
3.初始化
在定义数组时,也可以对数组元素赋初值。一般形式为:
类型名 数组名 [数组长度] = {初值表};
初值表中依次存放着数组元素的初值。例如:
int a[5] = {0,1,4,5,7};
也可以只针对部分元素,例如:
static int b[5] = {1,2,3};
数组初始化时,如果对全部元素都赋了初值,就可以省略数组长度,例如:
int a{} = {1,2,3,4,5,6,7,8,9};
1.1.2二维数组
1.定义
二维数组的定义形式为:
类型名 数组名 [行长度][列长度];
例如:
int a[MAX][MAX];
2.引用
引用二维数组的元素要指定两个下标,即行下标和列下标,形式为:
数组名 [行下标][列下标]
行下标的合理取值范围是[0,行长度-1],列下标的合理取值范围是[0,列长度-1]。
例如:
a[0][1]
3.初始化
(1)分行赋初值
一般形式为:
类型名 数组名 [行长度][列长度] = {{初值表0},···,{初值表k},···};
例如:
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
二维数组的元素也可以只针对部分元素,例如:
static int b[4][3] = {{1,2,3},{},{4,5}};
(2)顺序赋初值
一般形式为:
类型名 数组名 [行长度][列长度] = {初值表};
例如:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
(3)如果对全部元素赋了值,或分行赋值时,在初值表列出了全部行,就可以省略行长度,例如:
int a[][3] = {1,2,3,4,5,6,7,8,9};
1.1.3一维字符数组
1.定义、引用、初始化
一维字符数组用于存放字符型数据。定义、初始化和引用与其他类型的一维数组一样。例如:
char str[80];
char t[5] = {'h','a','p','p','y'};
static char s[6] = {'h','a','p','p','y',0};
static char s[6] = {'h','a','p','p','y',' '};
static char s[] = {'h','a','p','p','y',' '};
2.字符串
(1)字符串的存储-数组初始化
字符串可以存放在一维数组中。例如:
static char s[6] = {'h','a','p','p','y',' '};
字符串的初始化还可以使用字符串常量,如:
static char s[6] = {“happy"};
或
static char s[6] =“happy";
字符串由有效字符和字符串结束符' '组成。
(2)字符串的操作
用结束符' '来控制循环。
(3)字符串的存储-赋值和输入
例如:
static char s[80];
s[0] ='a';
s[1] =' ';
等价于
static char s[80] ="a";
"a"是字符串常量,包括'a'和' '两个字符;'a'是字符常量,只有一个字符。
用字符串结束符' '来判断是否结束字符串的操作。
(4)将十六进制字符hexad[i]转换成十进制数number的表达式如下
number=number*16+hexad[i]-'0'
number=number*16+hexad[i]-'A'+10
number=number*16+hexad[i]-'a'+10
1.1.4数组数据的处理
1.在数组中查找数据
(1)顺序查找法
一般从第一个元素开始,按照数据的顺序查找指定的关键值;如果被查找数据和关键值相匹配,则表示找到;否则表示查找失败。
例如:
for (i = 1;i < n;i++)
{
if (a[i] < a[minindex])
{
minindex = i;
}
}
temp1 = a[minindex];
a[minindex] = a[0];
a[0] = temp1;
for (i = 1;i < n;i++)
{
if (a[i] > a[maxindex])
{
maxindex = i;
}
}
temp2 = a[maxindex];
a[maxindex] = a[n-1];
a[n-1] = temp2;
(2)二分查找法
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
例如:
while (left <= right)
{
int mid = (left + right) / 2;
if (key > arr[mid])
{
left = mid + 1;
}
else if (key < arr[mid])
{
right = mid - 1;
}
else
{
printf("weizhi:%d", mid);
break;
}
}
2.在数组中插入数据
输入一个数据x,将数组中的数据与x逐一比较,如果大于x,记录下数据的下标,然后此数据下标和其后的数据的下标都加一,相当于都向后挪一位,然后将x赋值给数组的那个下标。
例如:
while (a[i] < x && i < n)
{
i++;
}
for (j= n - 1; j >= i; j--)
{
a[j + 1] = a[j];
}
a[i] = x;
3.在数组中删除数据
(1)直接删除数组元素
如果知道要删除的数组元素是什么,可以直接删除这个元素。
例如:for i=1 to n-1
if(a[i]==要删除元素) a[i]=a[i+1];
(2)通过元素位置删除
遍历数组找到所在元素的下标,删除该下标的元素。
例如:
for (j = 0; j < k; j++)
{
scanf("%d", &x);
for (i = 1; i <= n; i++)
{
if (i == x)
{
for(i=x;i<=n;i++)
a[i] = a[i + 1];
}
}
}
4.数组中的排序方法
(1)直接排序法
未排序的数组元素中,最小(或最大)的元素依次按照获得顺序放入已排序的元素中。
例如:
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
int swap = arr[j];
if (swap < arr[i]) {
arr[j] = arr[i];
arr[i] = swap;
}
}
}
(2)冒泡排序法
在每次循环排序过程中,每次交换需要交换的相邻两个元素。
例如:
for (j = 0; j < k; j++)
{
for (i = 1; i < n; i++)
{
if (a[i] > a[i+1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
(3)数组做枚举用法
(4)哈希数组用法
例如:
#include<stdio.h>
#define MAX 100001
int IsSame(int n);
int main()
{
int n;
scanf("%d
", &n);
if (IsSame(n))
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int IsSame(int n)
{
int date;
int i;
static int hash[MAX];
for (i = 1; i <= n; i++)
{
scanf("%d", &date);
if (hash[date] == 1)
{
return 1;
}
else
{
hash[date] = 1;
}
}
return 0;
}
1.2 本章学习体会
1.需要做的题目很多,每个类型的数组题都有,让我感觉有点力不从心。
2.老师讲课不太按课本顺序来,希望能尽量按课本上的来。
3.对冒泡排序法、枚举法不是太懂。
两周代码量:913行
2.PTA实验作业
2.1求整数序列中出现次数最多的数
2.1.1 数据处理
定义一个整型数组a[MAX]存放输入的数据;定义一个整型数组b[MAX]记录每个数出现的次数。
伪代码:
for 1 to 整数个数(遍历输入的数据)
for 1 to 整数个数(再次遍历输入数据)
if(两次遍历的数有相等的)数组b[i]加一
max=b[0];
for 1 to N
if(max小于每个数出现的次数)max=b[i];i就是出现次数最多的数
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
10 3 2 -1 5 3 4 3 0 3 2 | 3 4 | 测试数据正常 |
5 2 4 3 5 2 | 2 2 | 测试数据正常 |
2.1.4 PTA提交列表及说明
提交列表说明:
虽然一次就提交正确,但在这之前在vs上调试了好多遍。一开始甚至不会做,还是后来请教了同学,讲解了思路,才会了一点!
2.2 求矩阵中的最大小值
2.2.1 数据处理
定义整型变量n,m分别代表矩阵的行数和列数。定义整型变量row,col为找到后的行标和列标
伪代码:令max=min=第一个数;row=col=0;
for 1 to n
for 1 to m
if(数组中的数大于max) max=这个数;row=行标;col=列标;
end 找最小值一样
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
正常 |
2.2.4 PTA提交列表及说明
提交列表说明:
答案错误:求最大最小值只遍历了一遍数组
答案错误:没有给row和col赋初值
答案错误:求最大值前赋了,求最小值前没赋值
2.3 有重复的数据I
2.3.1 数据处理
定义一个辅助数组hash[?],下标为数组元素,数组初值为0。
伪代码:初始化hash数组为0
for i=1 to n
输入一个数data
if(hash[data]==1:有重复数据) return 1;
else hash[data]=1;
end if
end for
return 0;
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
YES | 测试正常 | |
4 1 2 3 4 | NO | 测试正常 |
2.3.4 PTA提交列表及说明
提交列表说明:
部分正确:辅助数组赋值相反,反复调试解决问题。
部分正确:返回值没写对。
3.阅读代码
代码功能:构造螺旋方阵。
优点:有注释;代码可读性高,将复杂问题简单化。