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



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

  • 相关阅读:
    angularjs的$on、$emit、$broadcast
    angularjs中的路由介绍详解 ui-route(转)
    ionic入门教程-ionic路由详解(state、route、resolve)(转)
    Cocos Creator 加载使用protobuf第三方库,因为加载顺序报错
    Cocos Creator 计时器错误 cc.Scheduler: Illegal target which doesn't have uuid or instanceId.
    Cocos Creator 构造函数传参警告 Can not instantiate CCClass 'Test' with arguments.
    Cocos Creator 对象池NodePool
    Cocos Creator 坐标系 (convertToWorldSpaceAR、convertToNodeSpaceAR)
    Cocos Creator 常驻节点addPersistRootNode
    Cocos Creator 配合Tiled地图的使用
  • 原文地址:https://www.cnblogs.com/201218zx/p/11875337.html
Copyright © 2011-2022 走看看