数组的学习

目录

一.数组概念的引用

二.一维数组

三.一维数组程序举例

四.认识二维数组

五.二维数组程序举例

六.字符数组


一.数组概念的引用

1.特点: 具有相同的数据类型

         使用过程中需要保留原始数据

2.数组的定义:所谓数组就是一组具有相同数据类型的数据的有序集合

   数组是一组有序数据的集合 :数组中各数据的排列是有一定规律的,下标【1】代表数据在数组中的序号

   数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据放在同一个数组中

   用一个数组名和下标来唯一确定数组中的元素例如,a[8]代表下标为8元素的值

二.一维数组

1.定义格式:

      类型说明符  数组名[常量表达式];

2.说明:  类型说明符:数组的类型

        数组名规则和变量名相同,遵循标识符命名规则

        常量表达式可以包括常量和符号常量,但不能包含变量

        C中不允许对数组变量大小定义

        数组说明(定义[]里的数字)语句必须在可执行语句之前

        常量表达式指明数组中元素的个数,必须大于0

        必须用方括号!

        Float score[30];

        Char str[50];

        Float a[3][4];

       Score str a是数组名

       30 50 3 4是数组长度

        下标个数为数组维数

         数组成员称为数组元素       

数组初始化:在数组定义时为数组元素赋初值成为数组初始化

1.在定义数组时对数组元素赋以初值

方法:将数组元素的初值一次放在一对花括弧内

例如: int a[10]={2,3,5,6,7,18,20,45,43,90};

2.可以只给一部分元素赋值,其他按零来处理。

例如: int a[10]={0,1,2,3,4};

表示只给前面五个元素赋初值,后五个元素值为0

3.对全部数组元素赋初值时,可以不指定数组长度。

例如: int a[5]={1,2,3,4,5};

           也可以写成int a[]={1,2,3,4,5};

  1. 一维数组赋初值的个数不能超过数组总元素的个数

       

C语言规定,只能引用单个数组元素,不能一次引用整个数组

      数组元素的引用形式:数组名[下标]

说明:

 下标是指在数组中第几个元素

例如:a[3]就是数组中序号为3的元素,它和简单变量地位 和作用相似

 下标可以是整型常量,整型变量和整形表达式

例如:a[4]=a[0]+a[i+1];

下标的值是数组元素序号,从0开始,到0-1结束

例如:int a[10];说明数组a有十个元素a[0]到a[9]

区分数组定义和数组元素引用

数组定义时有类型说明符

 一维数组的输入:

#include<stdio.h>
int main()
{
    int a[10];
    int i;
    for(i=0;i<10;i++)
     scanf ("%d",&a[i]);
     return 0;
     
}

一维数组的输出:

#include<stdio.h>
int main()
{
    int a[10];
    int i;
    for(i=0;i<10;i++)
       printf("%8d",a[i]);
    return 0;
}

如何对数组进行引用

      可以对数组中任意一个元素进行单独的输入输出,每个元素等同于一个普通常量。

      数组的引用离不开循环。将数组的下标作为循环变量,通过循环,就可以对数组的所有元素逐个进行处理

三.一维数组程序举例

     例子1同数组来处理求fibonacci数列问题(1,1,2,3,5,8,13)

F[0]=1(n=0)

F[1]=1(n=1)

F[n]=F[n-1]+F[n-2]  (n>=2)

#include<stdio.h>
int main()
{
    int i;
    int f[20]={1,1};
    for(i=2;i<20;i++)
        f[i]=f[i-2]+f[i-1];     //用于推出数列后边的值
    for(i=0;i<20;i++)
    {
        if(i%5==0)printf("\n");   //i%5==0   每五个就换个行
        printf("%12d",f[i]);   //用来输出数列的值,12d 每个数站12个
    }
    printf("\n");
}
 

例子2   已知一组数,要求对他们按由小到大的顺序排列

     冒泡法基本思想:每次将相邻两个比较,将小的调到前面

      如果有n个数,要进行n-1次比较

     第j趟比较要进行n-j次比较

#include<stdio.h>
#define N 10
int main()
{
    int a[N],i,j,t;
    printf("input %D numbers:\n",N);
    for (i=0;i<N;i++)
        scanf("%d",&a[i]);
    printf("\n");
    for(j=0;j<N-1;j++)       //进行N-1次循环,实现N-1趟比较
      for(i=0;i<N-1-j;i++)       //在每一趟中进行N-1-j次比较
         if (a[i]>a[i+1])      //对相邻两个数比较
            {t=a[i];a[i]=a[i+1];a[i+1]=t;}
    printf("the sorted numbers:\n");
    for(i=0;i<N;i++)
          printf("%5d",a[i]); 
    printf("\n");
}

四.认识二维数组

一般形式   类型说明符 数组名[常量表达式1] [常量表达式2];

二维数组有两个下标

常量表达式1为行数;常量表达式为2为列数

例如  float a[3][4],b[5][10]。

注意:

一对方括号内不能写两个下标。

 例如:float a[3,4]  是错的

数组元素个数必须是常量表达式,不能使用变量。

用于定义数组长度的常量表达式必须为大于零的正整数。

理解:

二维数组可以被看做一种特殊的一维数组:他的元素又是一个一维数组。

float a[3][4]:可以把a看做一个一维数组,他有三个元素:a[0]a[1]a[2]

而这三个元素又是一个包含四个元素的一维数组

存储:

C语言中,二维数组中元素在内存中排列阿顺序是按行存放的

  注意:用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列关系。

        而在内存中,各元素是连续存放的,不是二维的,是线性的。

初始化:

  1. 分行给二维数组赋初值。(最清楚直观)

        Int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

  1.   可以将所有数据卸载一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
  2.    可以对部分元素赋初值

        Int a[3][4]={{1},{5},{9}};

         也就是对每行第一个元素赋值,然后其它的是0

      也可以对每行的某个元素赋初值

         Int a[3][4]={{1},{0,6},{0,0,0,11}};

      也可以只对某几行元素赋初值

         Int a[3][4]={{1},{5,6}};

(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,单第二维的长度不能省。

        int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};  是等价的   

在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值

引用:

        二维数组元素医用与一维数组元素引用一样,也要采用下标法。

          引用形式:  数组名[下标1][下标2]

       说明:

           下标1和下标2 可以是整型常量,整型变量和整型表达式。其编号从0开始

       注意:下表不要越界

        数组名a代表的是数组a在内存中的首地址,

        可以用数组名a来代表数组元素a[0][0]的地址

         数组名是常量,不可对他赋值

输入输出:

      采用双重循环方式进行。

#include <stdio.h>
int main()
{
    int a[2][3],i,j;
    for(i=0;i<2;i++)
       for(j=0;j<3;j++)
         scanf("%d",&a[i][j]);

       
 return 0;
}

#include <stdio.h>
int main()
{
    int a[2][3],i,j;
    for (i=0;i<2;i++)
       for(j=0;j<3;j++)
           printf("%5d",a[i][j]);
    return 0;

 

五.二维数组程序举例

     将数组a,的行和列互换得到数组b

b[j][i]=a[i][j];

#include<stdio.h>
int main()
{
    int a[2][3]={{1,2,3},{4,5,6}},b[3][2],i,j;
    printf("array a:\n");
    for (i=0;i<2;i++)     //处理a数组中的一行各元素
     { for(j=0;j<3;j++)    //处理a数组中某一列中各元素
        {printf("%5d",a[i][j]);   //输出a数组中i行i列元素
          b[j][i]=a[i][j];    //将a数组元素的值赋给b数组相应元素
        }
        printf("\n");
     }
     printf("array b:\n");    //输出b数组各元素
     for(i=0;i<3;i++)        //输出b数组中一行中各元素
       {   
           for(j=0;j<2;j++)    //处理b数组中一列中各元素
           printf("%5d",b[i][j]); //输出b数组元素
           printf("\n");
       }
      
}

六.字符数组

 定义:

     用来存放字符数据的数组是字符数组

   C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的个字符

 格式:char 数组名[常量表达式]

       Char c[6]

         c数组具有6个元素,可以存放长度小于或等于5的字符串。

         字符串的个数<=数组的元素个数

强调:字符串实际占有单元的数量等于字符串长度+1

      m定义时注意考虑元素总个数应比实际长度多1

初始化:

  1. 用单个字符对字符数组初始化

     说明:1 如果在定义字符数组时不尽兴舒适化,则数组中各元素的值是不可预料的

           2.如果花括号中提供的初值个数(即字符个数)大于数组航渡,则出现语法错误;

          3 .如果提供的处置个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。

           4.如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即’\0’)。

2.  用字符串常量对字符数组初始化

       例如  char str[6]={“CHINA”};  {}可以省略,6也可以省略

      说明 :

         将字符串存储到字符数组中,字符串和第一个‘\0’构成有效字符串。对字符串的操作,就是对字符数组的操作。

         普通数组的元素是确定的,一般用下标控制循环;而字符串使用结束符‘\0’来控制循环。

输入输出:

  1. 单个字符输入输出(用格式符%c或字符输入函数)
  2. 字符串整体或部分输入输出(用格式符%s)

      Char str[6];

            Scanf(“%s”,str);

           输入输出必须是以字符串的地址形式出现;

           也可以是字符串常量:printf(“%s\n”,”book”);

           只能输入不包括空格、\t和\n的字符串;

           若要输入空格,用gets函数;

           数组名前不加&符号

  例如char str[10];

      Printf(“%s\n”,str);

      不能用scanf输入带有空格的字符串

       用%s输出字符串时,从输出项提供的地址开始输出,直到遇到字符串结束串‘\0’为止

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值