c语言第07章数组
该语句执行: num[0]=1;num[1]=2;num[2]=3;num[3]=0;num[4]=0;
数组
注意:
放在{ }内的初始数据个数不一定要与数组大小一致。所以: 如果初始化数据个数少于数组元素的个数,剩余元素将被自动 初始化为0。因此可以采用语句 int cj[10]={0};将数组cj的元 素初始化为0。 特别地:数组的元素不能自动初始化,程序设计人员至少要将 第一个数组元素初始化为0才能使所有剩余元素自动被初始化为0。 如果初始化数据过多,会出现一条警告信息。
for (i=0;i<=SIZE-1;i++) if(a[i] == x)break; if (i< SIZE) printf(“%d,poster is %d\n”,x,i); else printf(“no find %d \n”,x); } 演示6_2.C
数组
【例13】已知一维数组中存放10个互不相同的整数,从键盘输入 一个数,并从数组中删除与该值相同的元素中的值。 #include<stdio.h> 说明: 做删除操作时,首先要 #define SIZE 10 找到删除元素的位置, main() 找到后,立即用break语 {int a[SIZE]={1,2,35,6,39,47,53,4,5,10}; int i,j,x; 句推出循环并进行删除 for (i=0;i<SIZE;i++) 操作,删除操作实质是 printf(“%4d”,a[i]); 把一些数组元素向前移 printf(“please enter a x:\n”); 动一位。最后一位的删 scanf(“%d”,&x); 除不必移位,直接输出 for (i=0;i<SIZE;i++) 前size-1位。 if(a[i]= =x)break; for (j=i;j<SIZE-1;j++) a[j]=a[j+1]; for (i=0;i<SIZE-1;i++) printf(“%4d”,a[i]); printf(“\n”); } 演示6_3.C
num[0] num[1] num[2] num[3] num[4]
该语句执行后: num[0]=1;num[1]=2;num[2]=3;num[3]=4;num[4]=5;
数组
注意:
如果在定义一维数组的同时给出全部元素的初始值,则数组 长度可以省略。C 语言编译系统将自动根据初始化数据的个数来 确定数组的长度。数组元素的个数就是初始化数据列表中数据的 个数。例如:int a[ ]={1,2,3,4,5};编译系统将确定数组a 的 长度为5。 2)对数组的部分元素赋初值。 例如: int num[5]={1,2,3} ; num 1 2 3 0 0 num[0] num[1] num[2] num[3] num[4]
数组
【例9】: int a[2]; scanf(“%d%d”, &a[1],&a[2]); ——??
错误: 在C语言中数组元素的下标由 0开始,一个数组的下标的合 法范围在0~n-1,因此该题正确的写法是: int a[2]; scanf(“%d%d”, &a[0],&a[1]);
【例10】:int a[10]; float i=3; a[i]=10; ——?? 错误: 数组元素是通过数组名[下标]来访问的,其中下标必须是 大于0的整数、整型变量或整型表达式,在这段程序中,i是浮 点数,不能做数组元素的下标。
数组元素名 指定该数组 的数据个数 数组长度 cj[0] cj[1] cj[2] ……………………cj[9] cj[10] 数组名: 数组中的所有元素具有相同的名字cj。
数组
使用下标的优点?
由于有了下标,元素在数组中的位置(或者说是排列顺序)就 被唯一的确定下来。我们采用数组名+[下标]就可以准确访问到数组 中的每一个元素。 如图所示: cj[0]代表cj数组中的第一个元素。cj[9]代表cj数组中的第十个元 素。一般地: cj[i-1]引用了数组cj的第i个元素。C语言是一个有 趣的语言,它喜欢从0开始计数,而不是从1开始,所以这10个元素 的编号是从0到9。
数组
什么是数组???
这些数据称为 数组元素
就是一组具有固定数目的、有序的、类型相同的数据 的集合。根据数组下标的多少,数组可以分为一维数组和 多维数组。
车厢号10
…
车名
车厢号2 车厢号1
火车
数组
一个数组就是一组连续的内存空间,用来保存数据, 数组中的每一项称为一个元素。
用于访问的、具有相 同的数据类型。在程 序设计中相当于变量 名的用法。 为标识数组中的每个 元素,C语言对其进 行编号。这个编号称 之为数组元素下标。 (C语言规定下标从0 数组元素下标 开始)。
C语言程序设计
数组
学习目标:
数组是程序设计语言中最基本、最重要的组成 部分。在本章中将学习数组的特点和使用方法,并 通过典型例题学习数组的一般应用。
• 清楚数组的基本概念 • 理解数组的声明、初始化及引用方式
• 学会数组的编程
数组
数组是C语言中较为简单和常用的一种构造型的数据类型。
用变量来解决: 例如: #include <stdio.h> 计算10个同学 main() 的成绩:计算 { float cj1,cj2,cj3, …cj10; /*定义10个变量*/ 平均成绩、打 float pj; 印低于平均成 scanf(“%f”,&cj1); /*输入10个数据*/ 绩的同学成绩。 scanf(“%f”,&cj2); … scanf(“%f”,&cj10); pj=cj1+cj2+…+cj10; pj=pj/10; /*求平均值*/ /*打印低于平均成绩的同学成绩*/ if (cj1<pj) printf(“%f\n”,cj1); if (cj1<pj) printf(“%f\n”,cj2); … if (cj1<pj) printf(“%f\n”,cj10); }
1)对整个数组的引用;只给出数组名即可。
2)对数组元素的引用;需要给出数组名[下标]的形式。 可以是整型常 量、整型变量 或整型表达式 数组元素的引用类似于单个变量,可以自由存取。但是它与一 般变量相比有以下几个特点: 1. 数组元素是通过数组名加上该元素在数组中的位置(既数组元素 下标)来访问的。例如:a[3]代表的是数组a的第4个元素。其中 下标是整数或整型表达式。
数组
【例11】:指出并改正下列程序段中的错误。 (1)#define SIZE 100; (2)正确 (2)int b[10]={0} ,i; (3)for (i=0;i<=10;i++) b[i]=1; (4)SIZE=10; (1) 错误:使用了“;” 改正:去掉“;”
(3) 错误:引用了越界元素b[10]; 改正:循环控制最终值为9。
(4)数组说明中的数组长度说明,在以下两种情况下不必或不能 予以说明:一种情况是数组作为函数的参数,在函数的参数 说明部分不必予以说明;第二种情况是在定义数组时,如果 直接对数组进行初始化赋值,则可以省略长度说明,数组的 长度由所赋初值的个数决定。
数组
(2)一维数组的初始化
在声明数组的同时可以对数组进行初始化赋值,其方法是将初 值放在定义中的{}内,初值相互之间“,”隔开。并用“=”将其赋给 数组。 1)对数组的全部元素赋初值。 例如: num 1 int num[5]={1,2,3,4,5}; 2 3 4 5
数组
2. 数组元素的下标是由0开始的,因此一个数组a[n]的合法下标范 围是0~n-1。 使用时超过这个范围的下标访问元素将得到数组 有效元素之外的一个随机值。例如:a[-1];a[n]等。 但是C语言编译系统不检查数组下标的越界的错误。所以在编程 时要注意避免这类问题发生。 常见的错误就是引用了超出数组范围的数组元素。 3. 数组元素的赋值是逐个元素的进行,不允许将一个数组作为一个 整体赋值给另外一个数组。例如:int a[3],b[5];语句 b=a; 的赋值方式是错误的,除了数组初始化外,也不允许采用在{} 中列表的方式对数组元素整体赋值。 例如:int a[5]; a={1,2,3,4,5};是错误的。 但: int a[5] ={1,2,3,4,5};是正确的。 4. 数组名num代表的是数组num在内存中的首地址,因此可以用数组名 num来代表数组元素num[0]的地址。 scanf(“%d”,&num[0]); scanf(“%d”,num);
初始化数据元素的个数允许少于数组的长度;但不 能多于数组的长度。 常见错误:
在应该对数组元素初始化时忘记了数组元素的初始化。从而导 致运行结果出错。
数组
【例6】:int a[ ]; ——?? 错误: 只有在进行初始化的数据说明是才 能允许省略长度。在仅进行说明而 没有初始化数据时,不能省略长度。 因为编译系统无法知道这个数组的 究竟有多大。
C语言的数组有两个特点:
(1)数组的个数必须确定,不允许变动,但数组元素的 值可以改变; (2)数组元素的类型必须是相同的,不允许混合的。
数组
一维数组:只有一个下标的数组。
(1)一维数组的定义 格式: 类型说明符
指明数组中每个 元素的数据类型
数组名[常量表达式];
数组大小: 指明数组中所包含 的元素的个数
【例7】:float f[10]={1.1,2.2}; ——?? 可以: 初始化数据的个数允许少于数组长 度,此时,未被初始化的数据部分 将被编译系统自动请0。语句执行 后:f[0]=1.1;f[1]=2.2; f[2]=f[3]=…=f[9]=0;
数组
(3)一维数组的引用
C语言对数组引用有两种形式: