凉城有梦

导航

 

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','\0'};
static char s[] = {'h','a','p','p','y','\0'};
2.字符串
(1)字符串的存储-数组初始化
字符串可以存放在一维数组中。例如:
static char s[6] = {'h','a','p','p','y','\0'};
字符串的初始化还可以使用字符串常量,如:
static char s[6] = {“happy"};

static char s[6] =“happy";
字符串由有效字符和字符串结束符'\0'组成。
(2)字符串的操作
用结束符'\0'来控制循环。
(3)字符串的存储-赋值和输入
例如:
static char s[80];
s[0] ='a';
s[1] ='\0';
等价于
static char s[80] ="a";
"a"是字符串常量,包括'a'和'\0'两个字符;'a'是字符常量,只有一个字符。
用字符串结束符'\0'来判断是否结束字符串的操作。
(4)将十六进制字符hexad[i]转换成十进制数number的表达式如下
number=number16+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", &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.阅读代码



代码功能:构造螺旋方阵。
优点:有注释;代码可读性高,将复杂问题简单化。

posted on 2019-11-17 22:55  凉城有梦  阅读(1008)  评论(1)    收藏  举报