C语言之数组(一)

一.数组的基本概念

数组是按序排列的具有相同类型数据集合。用统一的符号 (数组名)来表示,数组中的每一个分量(元素)用下标来区分。

2f3b8d44f220493a868e3e90b0d03686.jpg

  1. 下标标明了元素在数组中的位置,从0开始。
  2. 数组名下标就能惟一确定数组中的元素。

二.数组的分类

1.根据数组的维度不同,分为:

  • 一维数组
  • 二维数组
  • 多维数组

2.根据数组元素的数据类型不同,分为:

  • 数值数组
  • 字符数组

与其他变量相类似,数组也要先定义后使用。

三.一维数值数组的定义

定义形式:

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

类型说明符: 说明数组中各元素的数据类型
常量表达式: 说明数组的大小(即数组中元素的个数)

96ae41e6a81e4c22b65e785f9ce0b427.jpg

 PS:

  1. 数组名的命名规则与变量名相同,遵循标识符命名规则,且数组名不能与程序中其他变量同名。

  2. 说明数组大小的常量表达式必须为整型,并且用方括号括起来(不能用圆括号)。

  3. 说明数组大小的常量表达式中可以包含常量符号常量,但不能是变量

  4. 数组定义之后,其大小不能再改变

  5. 数组被定义后,实际是定义了若干个类型相同的有关联的变量,即数组元素的作用相当于简单变量

四.一维数值数组的引用

形式:

数组名[下标];

PS:

下标可以是整型常量整型表达式,或已经有值的整型变量。

定义数组时,下标表示数组的长度或元素的个数;

引用数组元素时,下标表示元素在数组中的序号或位置。

int a[5];           /*定义数组的长度为10*/
t=a[3];             /*使用数组元素a[6]*/

五.一维数值数组的存储

97a0b424da0e4db3a833dae2c28afb46.jpg

  • 数组名是整个数组的首地址,用来唯一标识该数组,是一个由系统分配的常量值
  • 数组名+下标,表示数组中某元素的地址。
  • 还可以用取地址运算符“&”,表示数组中某元素的地址。

六.一维数值数组的赋值

1.静态赋值

数据类型   数组名[常量表达式]={初始值,初始值,……};

(1)对数组各元素均赋初值。如:

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

此时方括号中的常量表达式也可以省略,即可以写成:

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

(2)可以只给数组的前若干个元素赋初值,此时后面的元素均将自动赋以初值0。如:

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

相当于:

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

部分初始化时,方括号中的常量表达式不能省略

(3)若要全部元素值为0,可以写成:

int a[10]={0};

相当于:

int a[10]={0,0,0,0,0,0,0,0,0,0};

PS:若定义数组长度与提供的初值个数不相同,则数组长度不能缺省

2.动态赋值

定义float类型数组price[4];

009e564250634a18b6efa99ae6fc6ece.jpg

 可以通过scanf函数来进行赋值,例如对第三个元素赋值:

scanf("%f”,&price[2]);

一次只能给一个元素赋值,如果想给数组中多个元素赋值,可以用循环改变下标来实现。例如对这个数组中四个元素进行赋值:

for (i=0;i<= 3; i++)


     scanf(“%f",&price[i]);

   }

对单个元素也可以采用直接赋值,例如直接对第三个元素赋值:

prince[2]=5.2;

常见错误:在执行程序过程中,直接对一个数组赋值。

prince[4]={1.3,2.4,5.12,13.14};

在定义数组时可以对数组初始化赋值,但是在程序运行中,只能对单个元素赋值。

七.一维数值数组的输入和输出

原则:只能逐个对数组元素进行操作。

int a[10];

1.输入法:

输入下标为i的数组元素:

scanf("%d",&a[i]);

输入所有数组元素:

for(i=0;i<10;i++)
scanf("%d",&a[i]);

2.输出方法:

输出下标为i的数组元素

printf("%d",a[i]);

输出所有数组元素:

for(i=0;i<10;i++)
printf("%d",a[i]);

八.一维数值数组的应用

例1:假设某班人数最多不超过40人,具体人数由键盘输入。试编程输出该班某门课成绩的最高分及其学号(学号从0开始顺序编号)。

问题分析:
如何定义数据结构描述该班某门课成绩?
定义一维数组a[40]。

如何输入具体人数?

定义变量n,输入成绩的次数即代表学生人数。

打擂台法:
① 将a[0]作为参考赋给max,将其下标赋给h;
②然后将其它元素依次与max比较,遇到比max大的就将其赋给max,其对应下标赋给h=i;
③全部比较完毕,则max便是最大元素,h就是其学号。

d3482e11920b430c9d8f4eb172da06cc.jpg

 代码如下:

#include<stdio.h>
void main()
{
  int a[40],i,n,max,h;
  printf("请输入学生的人数:");
  scanf("%d",&n);
  printf("请输入学生的成绩");
  for(i=0;i<n;i++)
      scanf("%d",&a[i]);
  max=a[0],h=0;
  for(i=0;i<n;i++)
      if(max<a[i])
      {
        max=a[i];
        h=i;
      }
  printf("最高成绩是%d 其学号为%d:",max,h);
}

例2:将一个数组中的值按逆序重新存放。例如,原来顺序为5,4,3,2,1,要求改1,2,3,4,5。


问题分析:

假设总共有k个值,对应数组元素的下标从0到k-1,将下标为0的数组元素与下标为k-1的数组元素交换,将下标为1的数组元素与下标为k-2的数组元素交换,将下标为2的数组元素与下标为k-3的数组元素交换,..,如此一直交换到中间的数值。

e676b9ee87b64388927ecf8eb7221dcf.jpg

 代码如下:

#include<stdio.h>
void main()
{
  int a[5]={5,4,3,2,1},i,n=4,t;
  printf("原数组:");
  for(i=0;i<5;i++)
      printf("%d ",a[i]);
    printf("\n");
  for(i=0;n>i;i++,n--)
  {
     t=a[i];
     a[i]=a[n];
     a[n]=t;
  }
    printf("逆序后:");
  for(i=0;i<5;i++)
      printf("%d ",a[i]);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值