zoukankan      html  css  js  c++  java
  • 听翁恺讲C语言7-数组

    数组

    printf("输入一些数,最后输入-1结束:
    ");      
    int x;             
    double sum = 0;     
    int cnt = 0;        
    int number[100];   //可以放100个int  定义数组            
    scanf("%d", &x);             
    while ( x!= -1 )           
    {            
       number[cnt] = x;  //对数组中的元素进行赋值  cnt那个位置上的元素等于x。      
       sum += x;               
       cnt ++;               
       scanf("%d", &x);  //读下一个x,前面的scanf只读第一个出现的数,而while条件里的x值并不会改变。 
    }           
    if ( cnt >0 )        
    {            
       printf("%f
    ", sum/cnt);     
       int i;               
       for ( i=0; i<cnt; i++ )               
       {                
          if (number[i] > sum/cnt)          
          {                   
             printf("%d
    ", number[i]);   //使用数组中的元素       
          }              
       }                     //遍历数组,把数组中的每一个单元走透透         
    }
    

    a、<类型> 变量名称[元素数量]

    I、int grades[100];

    //grades数组,有一百个单元。

    ·元素数量必须是整数,c99之后可以用变量来定义数组的大小。也就是int a[x]

    变量表示数组

    int x;  
    double sum = 0;      
    int cnt;           
    printf("请输入数字的数量:");  
    scanf("%d",&cnt);          
    if( cnt>0 )  
    {  int number[cnt];           
     scanf("%d",&x);          
     while ( x!= -1 )       
     {                   
        number[cnt] = x;          
        sum += x;                    
        cnt ++;                      
        scanf("%d",&x);             
     }             
    }            
    
    II、数组就是一个容器(放物品的东西),

    特点是:

    ·其中所有元素的数据类型一致。

    ·一旦创建就无法改变大小。

    ·数组中的元素在内存中是连续依次排列的。(而且是紧密排列的)

    III、

    ·可以出现在赋值的左边或右边。

    ·a[2]=a[1]+6 //a[1]的值读出来+6后,写入到a[2]里去。

    ·在赋值左边的叫做左值。

    IV、

    ·数组的每一个单元就是数组类型的一个变量。

    ·使用数组时放在[]中的数字叫做下标或索引,从零开始编号。每次都是n-1

    ·编译器和运行环境都不会检查数组下标是否越界,注意不要越界。 越界错误提示:segmentation fault

    V、int a[0]

    可以存在,但并没有什么用处。

    b、初始化数组的例子。

    c、数组的集成初始化,

    eg、int a[] = {2,4,5,6,7,1,8,9,11,33,45,67,22}

    eg:a[3]={22,33,44}

    若写成a[3]={22},则后面的33,44都会被认为是0

    I、集成初始化时的定位。

    ​ ·用[n]在初始化数据中给出定位。

    ​ ·没有定义的数据接在前面的位置后面。

    ​ ·其他位置的值补零。

    ​ ·也可以不给出数组大小,让编译器算。

    ​ ·特别适合初始数据稀疏的数组。

    eg:int a[13] ={[1]=2, 4, [5]=6,} //此逗号有必要,为下一步写数据进数组提供便利。 输出结果为:0 2 4 0 0 6 0 0 0 0 0 0 0 //c99才适合

    若为a[]={[1]=2, 4, [5]=6,} 输出结果就为:0 2 4 0 0 6

    d、数组的大小

    ·sizeof:给出整个数组所占据的内容的大小,单位是字节。 (是一个数组总共的字节数哈) sizeof(a)/sizeof(a[0]) //得到的结果就是数组的大小

    ·sizeof(a[0])给出数组单个元素的大小。 sizeof(a[0])就是一个元素占的字节数

    初始化数组的三种方法:            
    1、       
    void function1()                
    {                  
      char array[ARRAY_SIZE_MAX] = {0}; //声明时使用{0}初始化为全0        
    }           
    2、              
    void function2()              
    {                
       char array[ARRAY_SIZE_MAX];               
       memset(array, 0, ARRAY_SIZE_MAX); //使用memset方法            
    }           
    3、            
    void function3()           
    {                 
       int i = 0;                
       char array[ARRAY_SIZE_MAX];           
       for (i = 0; i < ARRAY_SIZE_MAX; i++) //for循环赋值         
       {                    
          array[i] = 0;     
       }                
    }
    

    f、数组的赋值

    能不能 int a[]={1,3,4,5,6,};

    ​ int b[]= a;

    无法将一个数组变量赋值给另一个数组变量的

    ·数组变量本身不能被赋值

    ·要把一个数组的所有元素交给另一个数组,必须采取遍历,也就是写一个循环,将一个数组的每个元素,赋给另一个数组

    遍历数组赋值:                 
    	for ( i=0; i<length; i++ )       
    	{                       
       b[i] = a[i];        
    	}                  
    遍历数组做初始化                    
       for ( i=0; i<length; i++ )              
       {                        
          count[i] = 0;              
       }                
    判断
    

    ·通常都是使用for循环,让循环变量i从0到<1数组的长度,这样的循环体内最大的i正好是数组最大的有效下标。

    ·常见错误:

    ​ ·循环条件是<=数组长度,/离开循环体后,继续用i的值来做数组元素的下标! //因为离开循环后,i的值正好是无效的下标。eg i=0; i<length; i++ 此时i的值正好是length.

    g、数组作为函数参数的时候,往往必须再用另一个参数来传入数组的大小。

    h、数组作为函数的参数时:

    ·不能在[]中给出数组的大小。

    ·不能再利用sizeof来计算数组的元素个数。

     int search(int key, int a[], int length)   //作为函数的参数 
     {          
        int ret = -1;        
        int i;        
        for ( i=0; i<length; i++ )   
        {            
           if( a[i] ==key )       
           {        
              ret = i;           
              break;        
           }    
        }       
        return ret;    
     }
    

    ​ 2、二维数组 int a[3][5]; //通常理解为3行5列的矩阵。

    a、二维数组的遍历。

    for ( i=0; i<3; i++ )            
    {              
    	for( j=0; j<5; j++)              
    	{                
    	a[i][j] = i*j;         //a[i][j]是一个int,表示第i行第j列上的单元              
    	}                            
    }            //二维数组,两重循环,才能遍历。     
    

    ​ a[i,j] 错误表达二维数组的方式

    b、二维数组的初始化

    int a[][3] ={                  
       {1,3,4},                   
       {2,3,4},                 
    };                                   //列数必须有,行数可省略,每个每行一个{},逗号隔开
    

  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/wpoem/p/12448513.html
Copyright © 2011-2022 走看看