zoukankan      html  css  js  c++  java
  • C语言博客作业04--数组

    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.阅读代码



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

  • 相关阅读:
    CodeForces
    CodeForces
    CodeForces
    HDU 6704 K-th occurrence(后缀数组,主席树,st表,二分)
    AcWing 1004. 品酒大会 (后缀数组,并查集)
    Gym
    codeforces 2100左右的DS题 做题记录
    P4768 [NOI2018] 归程 做题记录
    CSP 2021 智熄记
    「随笔」论打羽毛球的正确姿势
  • 原文地址:https://www.cnblogs.com/201218zx/p/11875337.html
Copyright © 2011-2022 走看看