1、1,第6章 数 组,西安电子科技大学,C 语言程序设计,2019/6/9,2,第6章 数组,内容提要:6.1 数组的基本概念6.2 一维数组6.3 二维数组6.4 字符数组,2019/6/9,3,6.1 数组的基本概念,计算机处理数据时,经常出现数据是用某种有序的形式进行组织的情况。比如:按学号排列的成绩表、线性方程组的系数矩阵。 这些数据共同的特点:由若干分量组成诸分量具有相同的数据类型诸分量按一定的顺序排列为了方便地使用这些数据,C语言提供了一种构造数据类 型:数组。 数组:按一定顺序排列的具有相同类型的数据的集合。 用数组名和下标来唯一地确定数组中的元素。,2019/6/9,4,6.2
2、一维数组,例如: int a10;()float score5; ()int an;() C语言不允许定义动态数组,即不能用变量来定义数组的长度。,6.2.1 一维数组的定义,数据类型 数组名常量表达式;,合法标识符,表示元素的数据类型, :下标运算符 优先级(1) 不能用( ),表示元素个数 必须是正的整型常量表达式,2019/6/9,5,6.2.2 一维数组在内存的存放,数组下标从0开始。 一维数组的元素在内存里按下标递增的顺序连续存放。 数组名代表数组的首地址,即score的值与score0 的地址值相同。,float score5;,2019/6/9,6,6.2.3 一维数组的引用,数
3、组必须先定义后使用 C语言规定只能逐个引用数组元素,而不能一次引用整个数组。 引用数组元素的一般形式:,数组名下标表达式,例如:int a10;scanf (“%d“, () /* 下标越界 */,C编译系统不做越界检查,不给错误提示。大家要格外注意!,下标是整型表达式 数组元素与同类型的变量使用方法相同 下标的范围为0N-1(N为数组的长度) 数组应配合循环使用,2019/6/9,7,6.2.4 一维数组的初始化,1.在定义数组时对数组全部元素赋初值。例如:int a5=0,1,2,3,4; 2.只给部分数组元素赋初值例如:int a5=1,2,3;只给前几个元素赋值,其余元素初值为0。 3
4、.对全部元素赋初值时,可以不指定长度。例如:int a=0,1,2,3,4;自动定义a数组长度为5。 4.当初值的个数多于数组元素的个数时,编译出错例如: int a5=0,1,2,3,4,5;,2019/6/9,8,6-1 求解Fibonacci数列的前20个数,其规律是F11,F21, Fn= Fn-1+ Fn-2,6.2.5 一维数组的应用举例,void main( ) int i;long int f1,f2;f1=1;f2=1;printf(“%12d%12d”,f1,f2);for(i=2;i=10;i+)f1=f1+f2;f2=f2+f1;printf(“%12d%12d”,f1
5、,f2);if(i%2=0) printf(“n”); ,void main( ) int i;long int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+) if(i%4=0) printf(“n”);printf(“%12d”,fi); ,算法复杂 少占内存,算法简单 多占内存,2019/6/9,9,6.2.5 一维数组的应用举例,6-2 冒泡法排序(从小到大)。以6个数:3、7、5、6、8、0为例。 冒泡法的思路:将相邻的两个数比较,将小的交换到前头。,经第一趟排序(共5次比较),6个数中的最大数8沉底,小数浮起。,经第二趟排序(
6、共4次比较),得到次大数7排在倒数第二位置。,如此进行下去,可以推知,6个数要比较5趟。如果有n个数,则要进行n-1 趟比较,在第i趟中,要进行n-i次两两比较(因为已有i-1个数排好序)。,2019/6/9,10,冒泡法排序 (续),由前面分析可知: 要排序的数必须放入数组中 用二重循环控制排序过程外循环i控制比较趟数(n-1趟)内循环j控制一趟比较的次数(n-i次),2019/6/9,11,#define N 6 void main( ) int aN;int i,j,t;for (i=0; iaj+1) t=aj;aj=aj+1;aj+1=t; printf(“The sorted nu
7、mbers: n“);for(i=0; iN; i+)printf(“%2d“, ai); ,程序运行情况如下: 3 7 5 6 8 0 0 3 5 6 7 8,冒泡法排序 (续),2019/6/9,12,6-3 选择法排序(从小到大)。以6个数:3、7、5、6、8、0为例。 选择法的思路: (1)首先通过n-1次比较,从n个数中选出最小的数,将它与第一个数交换-第一趟选择排序,结果最小的数被安置在第一个元素位置上。 (2)抛开a0,再通过n-2次比较,从剩余的n-1个数中找出次小的数,将它与第二个数a1交换-第二趟选择排序。 (3)重复上述过程,共经过n-1趟排序后,排序结束。,6.2.5
8、一维数组的应用举例,2019/6/9,13,6-3 选择法排序(从小到大)。以6个数:3、7、5、6、8、0为例。,6.2.5 一维数组的应用举例,结 果 0 3 5 6 7 8,2019/6/9,14,选择法排序(续),#define N 6 void main( ) int aN;int i,j,k,t;for (i=0; iN; i+)scanf(“%d“, ,2019/6/9,15,6.3 二维数组,数据类型 数组名常量表达式1常量表达式2;,例如: float a23; 我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。如 int a34; 可将a数组看作是一个一
9、维数组,它有3个元素:a0,a1,a2,每个元素又是一个包含4个元素的一维数组.,6.3.1 二维数组的定义,行数,列数,元素个数=行数*列数,2019/6/9,16,6.3.2 二维数组的存储,二维数组从概念上可理解为行列矩阵,但存储器是一维的,需按一定的规则转换。 在内存中,二维数组元素的排列顺序是按行存放的。 如:float a23; 数组元素的实际存放顺序是右边下标比左边下标变化得快!,2019/6/9,17,6.3.3 二维数组元素的引用,数组名行下标表达式列下标表达式,二维数组的引用形式 :,下标表达式可以是整型常量或整型表达式例:int a34;a00=3; a01=a00+10
10、; 注意下标的取值范围如:int a34;下标的下限值为a00下标的上限值为a23,2019/6/9,18,6.3.4 二维数组的初始化,例:int a23=1,2,3,4,5,6; 结果同上。,1按行赋初值,例:int a23=1,2,3,4,5,6; 初始化后结果:x00=1, x01= 2, x02=3x10=4, x11= 5, x12=6,2按数组元素在内存中排列的顺序对各元素赋初值,3给部分元素赋初值,例:int a23=1,2,4; /*按行赋*/ 初始化后结果: a00=1, a01=2, a02=0 a10=4, a11=0, a12=0 例:int a23= 1,2,4;
11、/*按内存排列顺序赋*/ 初始化后结果: a00=1, a01=2, a02=4 a10=0, a11=0, a12=0,2019/6/9,19,6.3.4 二维数组的初始化,4二维数组初始化时,行长度可省,列长度不能省 例如:int a3=1,2,3,4,5,6,7;int b4=1,4,5; 初始化结果: (1)a00=1, a01=2, a02=3 a10=4, a11=5, a12=6a20=7, a21=0, a22=0 (2) b00=1, b01=0, b02=0, b03=0 b10=4, b11=5, b12=0, b23=0 5.当初值个数多于数组元素的个数时,编译出错,2
12、019/6/9,20,6.3.5 二维数组应用举例,6-3 有一个NM矩阵,编程序求出其中最大的那个元素的值及其所在的行、列位置。,2019/6/9,21,#include #define N 4 #define M 5 main( ) int i,j,row,colum,max,aNM;printf(“input number:n”); /* 输入数据 */for (i=0; imax) max=aij; row=i; colum=j;printf(“max=%d ,row=%d,colum=%dn”,max,row,colum); ,6.3.5 二维数组应用举例,#include #def
13、ine N 4 #define M 5 void main( ) int i,j,row,colum; float n,max,aNM;printf(“input number:n”); /* 输入数据 */for (i=0; imax) max=aij; row=i; colum=j;printf(“max=%.2f ,row=%d,colum=%dn”,max,row,colum); ,注意:输入浮点数时,不能直接给二维数组元素赋值,需要借助临时变量。,程序运行情况如下: 34 56 12 67 23 12 67 43 98 54 65 45 66 16 24 37 83 25 64 19
14、 max=98,row=1,colum=3,2019/6/9,22,6.4 字符数组,6.4.1 字符数组的定义 C语言中,没有专门的字符串变量,而是将字符串存入字符数组来处理。即用一个一维数组来存放一个字符串,每个元素存放一个字符。 字符数组是数组的一个特殊情况,它的定义方法与上述介绍的数值数组类似,但引用方法有它独特的方面。 定义的一般形式:char 数组名常量表达式;如:char c5; c0=h; c1=a; c2=p; c3=p; c4=y; 字符型与整型是互相通用的。每个字符数组的元素都是小于255的整数。,2019/6/9,23,6.4.2 字符数组的初始化,1. 按元素赋初值,
15、如:char c10 = s,t,o,r,e;,2. 使用字符串常量给字符数组元素赋初值 如:char c6=“china”;或char c6=“china”;或char c=“china”; 在C语言中,将字符串作为字符数组来处理,即用一个一维数组来存放一个字符串。 为了测定实际字符串的长度,C语言规定了一个“字符串结束标志”,用0表示。即遇到字符0时表示字符串结束。,注意:以字符串赋初值时必须保证数组长度字符个数+1(字符串后面自动加上一个0),2019/6/9,24,6.4.3 字符数组的引用与输入输出,对于字符数组,在程序中既可以逐个引用字符串中的单个字符(数组元素) 也可以一次引用整
16、个字符串(数组) 1.逐个字符数组元素输入输出:用c格式符描述例:scanf(“c”, 结果为: china,数组名 (首地址),结果为: * * *,注1:用s输出,输出字符不包括结束符0。 注2:无论数组元素有多少个,只要遇到0便结束。 如:char star34=“*”,“*”,“*”;printf(“%sn%sn%sn”,star0,star1,star2);,2019/6/9,25,6.4.3 字符数组的引用与输入输出,注3:s要求的是地址,对一维数组,数组名就是地址,对二维数组,只写行下标时也是地址(行首地址)。 如:char str15,str25,str35;scanf(“%s
17、%s%s”,str1,str2,str3);输入:how are you?,注4:用s输入时,遇空格或回车便认为一个字符串结束。,在内存中:str1:str2:str3:,2019/6/9,26,6.4.4 字符串处理函数,C语言的库函数中提供了一些用来处理字符串的函数 ANSI C标准要求使用字符串函数要包含头文件,字符串输入函数gets( ) 格式:gets(字符数组) 功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加0作为字符串的结束 说明:输入串长度应小于字符数组维数(长度),字符串输出函数puts( ) 格式:puts(字符数组) 功能:将数组中的字符串(以0结束的字符序
18、列)输出到显示器,输出完换行,注意:使用gets( )和puts( )函数要包含头文件,2019/6/9,27,6.4.4 字符串处理函数,字符串拷贝函数strcpy( ) 格式:strcpy(字符数组1,字符串2) 功能:将字符串2拷贝到字符数组1中去 返值:返回字符数组1的首地址 说明:字符数组1必须足够大拷贝时连同0一同拷贝不能使用赋值语句为一个字符数组赋值,例 char str120,str220;str1=“Hello!”; ()str2=str1; (),字符串连接函数strcat( ) 格式:strcat(字符数组1,字符数组2) 功能:把字符数组2接到字符数组1后面 返值:返回
19、字符数组1的首地址 说明:字符数组1必须足够大连接前,两串均以0结束;连接后,串1的0取消,新串最后加0,2019/6/9,28,6.4.4 字符串处理函数,字符串比较函数strcmp( ) 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止 返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数c. 若字符串1 字符串2, 返回零 说明:字符串比较不能用“、”,必须用strcmp函数,字符串的比较、拷贝、连接 都必须用相应的函数,2019/6/9,29,6.4.4 字符串处理函数,字符串转换
20、函数strlwr( ) 格式:strlwr(字符串) 功能:将字符串中的大写字母转化为小写字母,字符串长度测试函数strlen( ) 格式:strlen(字符串) 功能:计算字符串长度 返值:返回字符串实际长度,不包括0在内,字符串转换函数strupr( ) 格式:strupr(字符串) 功能:将字符串中的小写字母转化为大写字母,2019/6/9,30,6.5 程序设计举例,6-4 输入一行字符,统计其中有多少个单词,#include void main() char string80;int i,num=0,word=0;char c;gets(string);for(i=0;(c=stringi)!=0;i+)if(c= ) word=0;else if(word=0) word=1; num+; printf(“There are %d words in the linen“,num); ,2019/6/9,31,6.5 程序设计举例,6-5 编程序实现strcat的功能,2019/6/9,32,上机作业,1.用选择排序法对10个整数排序。 2.输入一字符串,将其中的字符按逆序输出。 3.编写程序,实现strcat的功能。,