C语言开发日记(6)数组的初步应用

目录

一,数组(有序的元素序列)介绍

二,案例


导言:在初步了解C语言的if条件语句,while循环语句和for循环语句后,我们可以编程一些简单的,基础的指令;但是,当我们要储存,抽取一组同类数据(如何处理一个班的学习成绩?如何对一列数进行排序?如何储存一行数字?)时,会无从下手,因此,计算机领域引进了数组的概念。接下来我会分析数组的性质以及应用

一,数组(有序的元素序列)介绍

        定义:数组(Array)是用于储存多个相同类型数据的集合,其长度固定,并且储存在一段连续的内存中。

(一)根据定义,数组有以下的特点

       ①数组是一组有序数据的集合。数组各个数据在内存中排列有一定的规律,下标代表数组中的序号,如:int a【10】

       ②数组中的每一个元素属于同一个数据类型。所以不能把不同类型的数据放入同一个数组中,如:int a【10】;里面的所有数据都是整形,且储存的时候不同类型的数据不能春分在该数组中

       ③用一个数组名和下标来唯一一个数组中的元素。例如,定义一个int a【4】={1,2,3,4},查询一个数时,输入“a【3】”,a【3】代表下标为3元素的值“4”;同理,输入“a【4】”,我们不会查询到任何值

(二)数组分为一维数组二维数组(多维数组)

1,一维数组的性质

一维数组的定义格式:类型说明符 数组名【常量表达式】;        

|数据类型说明符| 数组名【下标n】={元素0,元素1......元素n-1};

int a【10】={1,1,1,1,1,1,1,1,1,1};
float b【3】={1.0,1.0,1.0};
int a【10】={0,1,1,1,1};\\给前5个数赋值,后面没赋值一律按0处理
int a【】={1,1,1,1,1};


\*其中:a,b为数组名,下标【】个数为数组维数,方括号内的数值为数组长度*\

①在数组定义时为数组元素赋初始值称为数值初始化,这些定义的值依次放在一对花括号“{}”内;

②在数组中可以给一部分元素赋值,其他按照0来处理,如上面代码所示;

③已对全部元素赋值时,可以不在【】里指定数组长度,如上面代码所示;

④一维数组赋值个数不能超过总元素个数,例如:int a【3】={1,1,1,1};是错误的;

⑤定义时【】里面不可以表达未知数(如x,y,z),这是错误的;

值得注意的是,常量表达式必须明确数组中的元素个数,且必须大于0

2,一维数组的引用

C语言规定,只能引用单个元素,不能一次性引用所有的数组;如果想显示出所有元素,需使用循环语句依次在屏幕显现

一维数组的引用形式:数组名 【下标】

①下标指的是在组数中第n+1个元素

例如:a【3】是数组中序号为3的元素(第四个元素,第一个元素下标号为0);

不同于数组的声明形式引用式中下标可以是整型常量,整型变量和整型表达式

 例如:a【3】=a【0】+a【i+1】;

3,二维数组的性质

二维数组的定义格式:类型说明符 数组名【常量表达式1】【常量表达式2】;

其中:常量表达式1为行数,常量表达式2为列数

注意:一对【】内不能写两个下标;除此之外元素个数必须常量,不能使用未知数

二维数组可以被看作一种特殊的一维数组:它的元素是一个一维数组

例如: int a【2】【2】;可以把a看作一个一维数组,有两个元素a【0】,a【1】,每个元素里面可看作一个数组,里面又包含两个元素;

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

4,二维数组的赋值

①分括号赋值法。如:int a【2】【3】={{1,2,3},{4,5,6}};

②内存赋值法。把所有数据填写在“{}”内,按数组元素在内存中排列顺序对各个元素赋值,如果值缺,系统会填充0进行补位;

 ③部分元素赋值法。可以填写部分值在小花括号内,出现值缺现象,系统会填充0进行补位

如:int a【3】【4】={{1},{4},{2}};系统会在1,4,2后面填充3个0进行补位

5,二维数组的引用

二维数组引用和一维数组一样都要采用下标法,且只能引用单个元素;如果想要在屏幕打出所有元素,需要使用循环语句

二维数组元素引用形式:数组名 【下标1】【下标2】

说明:二维数组的数组名a代表数组a在内存中的首址,因此二维数组可以等价于指针;可以用数组名a表示数组元素a【0】【0】的地址;除此之外,数组名是常量,不可赋值

①二维数组的输入输出要用到双重循环方式进行

(三)一维数组和二维数组都包含字符数组

1,定义:存放字符数据的数组是字符数组。定义格式为 char 数组名【常量表达式】

例如 char a【3】;常量表达式“3”代表存放不超过三个字符串长度

值得注意的是:字符串实际占有单元数量为字符串长度+1,末尾必须跟着“\0”;也就是说 char a【3】实际上只存放两个你输入的字符;若你输入的字符远远少于规定的长度,系统会使用“\0”补位

2,字符数组初始化

单字符初始化。用双引号对它们分别括起来,例如:char a【4】={“a”,“r”,“e”,“\0”};

值得注意的是:如果不进行初始化,那么数组内的值将会是不确定的;

字符串常量初始化。用一个双引号把它们全部括起来,例如:char a【4】={“are”};

值得注意的是:在这种方法里,花括号{}可以省略,下标里面的数字也可以省略

3,字符的输入输出

用格式符%c进行单个输入输出操作

char a【4】={“are”};

scanf(“%c”,&a【i】);

用格式附%s对整体输入输出

char a【4】={“are”};

scanf(“%s”,a);(与上面只能单字符输人输出没有矛盾,因为这个时候数组看作指针)

二,案例

★例题4,将矩阵a中的行和列的元素转置到矩阵b中

思路:用数组a,b分别代表矩阵a,b;执行b【j】【i】=a【i】【j】

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

上面例子中,使用了两个双重循环完成数组的转置。

★例题5,已知一组数(2,6,7,5,8,4)要求它们从小到大排序

思路:每次两两比较,将小的数调到前面;出现n个数就要比较n-1趟,第j趟比较n-j次;采用双重循环

#include<stdio.h>
int main()
{
  int a[N],i,j,t;
  for(i=0;i<N;i++)
  {
     scanf("%d",&a[i]);
  }
  printf("\n");
  for(j=0;j<N;j++)                    //进行N-1次循环,实现N-1趟比较
  {
     for(i=o;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;    //相邻两个数比较,如果前者大于后者,二者交换
         }
      }
   }
  for(i=0;i<N;i++)
  printf("%d",a[i]);
}

以上是本人的日记和日常操练,都是自己的笔记记录以及自己的理解,如有错误欢迎指正,本人洗耳恭听  PS:入门小白,技术力不高,如果各位大佬要喷,请嘴下留情,谢谢;除此之外这个网站有其他非常优秀的博主和文章,欢迎大家去关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值