凉城有梦

导航

 

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=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", &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  凉城有梦  阅读(783)  评论(1编辑  收藏  举报