1、12022-10-142数组数组2022-10-14382945637617188888888881111111111111118 8 88888888数组数组2022-10-1442022-10-1452022-10-146 6.1 一维数组一维数组的定义:数据类型 数组名常量或常量表达式;合法标识符表示元素个数下标从0开始例 int a6;编译时分配连续内存内存字节数=数组定义的元素个数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量a014523a00145a1a2a3a4a523a2022-10-147一维数组的引用v数组必须先定义,后使用v只能逐个引用数组元素,不能一次
2、引用整个数组v数组元素表示形式:数组名下标其中:下标可以是整型常量或整型表达式 以0开始,到n-1结束例 int a10;printf(“%d”,a);()必须 for(j=0;j10;j+)printf(“%dt”,aj);()例 int data5;data5=10;/C语言对数组不作越界检查,使用时要 注意下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果2022-10-1482022-10-149一维数组的初始化v初始化方式 在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)int a5=1,2,3,4,5;等价于:a0=1;a1=
3、2;a2=3;a3=4;a4=5;v说明:l数组不初始化,其元素值为随机数l对static数组元素不赋初值,系统会自动赋以0值l当全部数组元素赋初值时,可不指定数组长度如 int a5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;如 int a3=6,2,3,5,1;()static int a5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;l只给部分数组元素赋初值 int a=1,2,3,4,5,6;编译系统根据初值个数确定数组元素个数2022-10-14102022-10-14112022-10-1412只能逐个对数组元素进行操作(字符数组例外)只能
4、逐个对数组元素进行操作(字符数组例外)int a10,i;scanf(%d,&ai);for(i=0;i10;i+)scanf(%d,&ai);printf(%d,ai);for(i=0;i10;i+)printf(%d,ai);2022-10-1413程序举例例 将10个整数存入数组,并打印输出。#include#define SIZE 10main()int xSIZE=0,1,2,3,4,5,6,7,8,9;int i;for(i=0;iSIZE;i+)printf(%d ,xi);#include#define SIZE 10main()int xSIZE,i;printf(Enter
5、 10 integers:n);for(i=0;iSIZE;i+)scanf(%d,&xi);for(i=1;iSIZE;i+)printf(%d,xi);2022-10-1414程序举例例 读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x0(b)依次用xi和max,min比较(循环)若maxxi,令min=xi3.输出:max和min#include#define SIZE 10main()int xSIZE,i,max,min;printf(Enter 10 integers:n);for(i=0;iSIZE;i+)
6、scanf(%d,&xi);max=min=x0;for(i=1;iSIZE;i+)if(maxxi)min=xi;printf(Maximum value is%dn,max);printf(Minimum value is%dn,min);2022-10-14152022-10-14162022-10-1417j=0j=1j=2j=3ab2022-10-1418k=0k=1k=2k=3j=0abj=12022-10-14192022-10-14202022-10-142112121(1)2(2)(3)nnnfnfnfffn总兔子对数2022-10-142212121(1)2(2)(3)nn
7、nfnfnfffn总兔子对数2022-10-14232022-10-1424max(i=0)max(i=2)max(i=3)2022-10-14252022-10-14262022-10-14272022-10-14282022-10-14292022-10-1430 实参 实参 实参 主调函数 被调函数 形参 形参 形参 调用时 执行被调函数 从被调函数返回 地址值 地址值 地址值 地址值 地址值 地址值 修改 已改变 数组 实参 实参 实参 主调函数 被调函数 形参 形参 形参 调用时 执行被调函数 从被调函数返回 变量值 变量值 变量值 变量值 变量值 变量值 修改 未变化 2022-1
8、0-1431 用数组名作函数参数时,此时形参应当用数组名或用指针变量。例例-L函数地址传递函数地址传递.c有一个一维数组有一个一维数组score,内放,内放3个学个学生成绩,求平均成绩。生成绩,求平均成绩。2022-10-1432#include float average(float array3);/*函数声明函数声明*/void main()float score3,aver;int i;printf(input 3 scores:n);for(i=0;i3;i+)scanf(%f,&scorei);printf(n);aver=average(score);printf(average
9、 score is%5.2fn,aver);2022-10-1433float average(float array3)int i;float aver,sum=0;for(i=0;iamid,low=mid+1第二次循环:第二次循环:99011 99013 99015 99017 99019 low=mid high x=amid,找到,找到哈,找到了!2022-10-1445数组下标数组下标 0 1 2 3 4 5 6第一次循环:第一次循环:99011 99013 99015 99017 99019 查找值查找值x=99016 low mid high xamid,low=mid+1第二
10、次循环:第二次循环:99011 99013 99015 99017 99019 low=mid high xamid,high=mid-1第三次循环:第三次循环:99011 99013 99015 99017 99019 high low 不满足不满足low=high,循环结束循环结束,未找到未找到 唉,没找到!2022-10-14462022-10-14472022-10-1448类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式;例如:例如:定义定义a a为为3 34(34(3行行4 4列列)的数组,的数组,b b为为5 510(510(5行行1010列列)的数组。
11、如下:的数组。如下:float afloat a3 34 4,b b5 51010;不能写成不能写成 float afloat a3 3,4 4,b b5 5,1010;2022-10-1449注意注意我们可以把二维数组看作是一种特殊的一维数组:我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。它的元素又是一个一维数组。例如,可以把例如,可以把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素:a0、a1、a2,每个元素又是一个包含,每个元素又是一个包含4个元素的一维数组。个元素的一维数组。2022-10-1450 二维数组中的元素在内存中的排列顺序是:按行
12、存放,即先顺序存放第一行的元素,再存放第二行的元素 2022-10-1451b b0000b b0101b b0202b b1010b b1111b b1212b b2020b b2121b b22223003000 0H H3003002 2H H3003004 4H H3003006 6H H3003008 8H H300300A AH H300300C CH H300300E EH H30301010H H例如:整型数组例如:整型数组 b33=1,2,3,4,5,6,7,8,9;1234567892022-10-1452二维数组元素的表示形式为:二维数组元素的表示形式为:数组名下标下标数
13、组名下标下标 例如:例如:a a2 23 3下标可以是整型表达式,下标可以是整型表达式,如如 a a2-12-12 2*2-12-1数组元素可以出现在表达式中,也可以被赋值,例如:数组元素可以出现在表达式中,也可以被赋值,例如:b b1 12 2=a=a2 23 3/2/2注意注意不要写成不要写成 a a2 2,3 3,a a2-12-1,2 2*2-12-1形式形式2022-10-1453常出现的错误有:常出现的错误有:int a34;/*定义定义a a为为3 34 4的数组的数组 */a34=3;在使用数组元素时,应该注意下标值应在已定义在使用数组元素时,应该注意下标值应在已定义的数组大小
14、的范围内。的数组大小的范围内。2022-10-1454可以用下面可以用下面4 4种方法对二维数组初始化种方法对二维数组初始化数据类型数据类型 数组名数组名 常量表达式常量表达式1 1常量表达式常量表达式2 2 初始化数据初始化数据;(1)(1)分行给二维数组赋初值。分行给二维数组赋初值。如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(2)(2)可以将所有数据写在一个花括弧内,按数组排列可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。的顺序对各元素赋初值。如:如:intint a a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7
15、7,8 8,9 9,1010,1111,12;12;2022-10-1455(3)(3)可以对部分元素赋初值。可以对部分元素赋初值。如如 int a34=1,5,9;1 0 0 01 0 0 05 0 0 0 5 0 0 0 9 0 0 0也可以对各行中的某一元素赋初值,如int a34=1,0,6,0,0,0,0,11;1 0 0 01 0 0 00 6 0 00 6 0 00 0 0 0 110 0 11 1 0 0 01 0 0 05 6 0 0 5 6 0 0 0 0 0 0也可以只对某几行元素赋初值。如:也可以只对某几行元素赋初值。如:int a34=1,5,6;2022-10-14
16、56(4)(4)如果对全部元素都赋初值,则定义数组时对第一维如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。的长度可以不指定,但第二维的长度不能省。如:如:intint a a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;它等价于:它等价于:intint a a4 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;在定义时也可以只对部分元素赋初值而省略第一维的在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:
17、长度,但应分行赋初值。如:intint a a4 4=0=0,0 0,33,00,10;10;0 0 3 00 0 0 00 10 0 02022-10-1457数组的输入和输出只能逐个对数组元素进行操作数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)(字符数组例外)int b23,i,j;输入第输入第i行第行第j列元素:列元素:scanf(“%d”,&aij);输入整个数组元素:输入整个数组元素:for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,&aij);输出第输出第i行第行第j列元素:列元素:printf(“%d”,aij);输出整个数组元素:输出整
18、个数组元素:for(i=0;i2;i+)for(j=0;j3;j+)printf(“%d”,aij);2022-10-1458例例kw1 kw1 将一个二维数组行和列元素互换,存到另一个将一个二维数组行和列元素互换,存到另一个 二维数组中。二维数组中。#include void main()int a23=1,2,3,4,5,6;int b32,i,j;printf(array a:n);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(%5d,aij);/*打印输出矩阵a的元素,先行后列*/bji=aij;/*给矩阵b赋值*/printf(n);/*下一行输出前,先换
19、行*/例如:a=1 2 3 1 4 4 5 6 b=2 5 3 62022-10-1459printf(array b:n);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(%5d,bij);/*打印输出矩阵b的元素,先行后列*/printf(n);/*程序结束*/运行结果如下:array a:1 2 3 4 5 6array b:1 4 2 5 3 6 2022-10-1460例例kw2:kw2:有一个有一个34的矩阵,要求编程序求出其中值最大的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。的那个元素的值,以及其所在的行号和列号。先用先用N-
20、S流程图表示算法流程图表示算法,如下:如下:2022-10-1461#include void main()int i,j,row=0,colum=0,max;int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;/*最大值为当前值*/row=i+1;/*记录行、列号*/colum=j+1;printf(max=%d,row=%d,colum=%dn,max,row,colum);/*程序结束*/2022-10-1462a00a01a02a10a11a12a00a01a02a10a11a1
21、22022-10-14632022-10-14642022-10-14652022-10-14662022-10-14672022-10-14682022-10-1469 字符数组的输入输出字符数组的输入输出 字符数组的输入输出可以有两种方法:字符数组的输入输出可以有两种方法:逐个字符输入输出。用格式符逐个字符输入输出。用格式符“%c”%c”输入或输出输入或输出一个字符。一个字符。将整个字符串一次输入或输出。用将整个字符串一次输入或输出。用“%s”%s”格式符,格式符,意思是对字符串的输入输出。意思是对字符串的输入输出。2022-10-1470char cchar c=China;=China
22、;printf(%sprintf(%s,c);c);例如例如在内存中数组c的状态2022-10-14712022-10-1472如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔(scanf函数遇空格、回车、制表符结束)。例如:char str1char str15 5,str2str25 5,str3str35 5;scanf(%s%s%sscanf(%s%s%s,str1str1,str2str2,str3);str3);输入数据:How are you?数组中未被赋值的元素的值自动置0。scanf(%s,str1);输入:输入:How are you?数组数组str1中的字符
23、串为中的字符串为“how”,而不是而不是“How are you?”2022-10-14732022-10-1474在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C编译系统都提供这些函数。下面介绍几种常用的函数。1.puts1.puts函数函数其一般形式为:puts(puts(字符数组字符数组)其作用是将一个字符串其作用是将一个字符串(以以0结束的字结束的字符序列符序列)输出到终端。假如已定义输出到终端。假如已定义str是一个字是一个字符符数组名,且该数组已被初始化为数组名,且该数组已被初始化为ChinaChina。则执行则执行puts(strputs(str););其
24、结果是在终端上输出其结果是在终端上输出ChinaChina。由于可以用printf函数输出字符串,因此puts函数用的不多。2022-10-1475用用putsputs函数输出的字符串中可以包含转义字函数输出的字符串中可以包含转义字符。例如:符。例如:char str=ChinanBeijing;puts(str);输出结果:输出结果:ChinaBeijing 同时同时,在输出时,将字符串在输出时,将字符串结束标志结束标志0转换成转换成n,即输出完字符串后换行。即输出完字符串后换行。2022-10-14762.gets2.gets函数函数其一般形式为:其一般形式为:gets(gets(字符数组
25、字符数组)其作用是从终端输入一个字符串到字符数组,函数其作用是从终端输入一个字符串到字符数组,函数值返回值为字符串的首地址。该函数值是字符数组值返回值为字符串的首地址。该函数值是字符数组的起始地址。如执行下面的函数:的起始地址。如执行下面的函数:gets(strgets(str);可以输入空格!可以输入空格!从键盘输入:Computer2022-10-1477将输入的字符串将输入的字符串ComputerComputer送给字符数组送给字符数组strstr(请注意送给数组的共有(请注意送给数组的共有9 9个字符,而不是个字符,而不是8 8个个字符。字符。注意:注意:用puts和gets函数只能输
26、入或输出一个字符串,不能写成 puts(str1 puts(str1,str2)str2)或或 gets(str1gets(str1,str2)str2)2022-10-14782022-10-14792022-10-14802022-10-14811.1.strcatstrcat函数函数其一般形式为其一般形式为:strcatstrcat(字符数组字符数组1 1,字符数组,字符数组2)2)Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。2022-10-1482例如:例如:char str130=Peo
27、ples Republic of ;char str2char str2=China;=China;printf(%sprintf(%s,strcat(str1strcat(str1,str2);str2);或或printf(%sprintf(%s,str1);str1);输出:PeoplesPeoples Republic of China Republic of China 2022-10-14832.strcpy函数函数 其一般形式为其一般形式为:strcpy(字符数组字符数组1,字符串,字符串2)strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:char s
28、tr1char str11010,str2str2=China;=China;strcpy(str1,str2);str1:2022-10-14841.1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。2.2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,China);3.3.复制时连同字符串后面的0一起复制到字符数组1中。4.4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2);作用是将str2中前面
29、2个字符复制到str1中去,然后再加一个0。2022-10-14855.5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的:str1=China;str1=China;str1=str2;str1=str2;而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:char achar a5 5,c1c1,c2;c2;c1=A;c2=B;c1=A;c2=B;a a0 0=C;a=C;a1 1=h;a=h;a2 2=i;=i;a a3 3=n;a=n;a4 4=a;=a;2022-1
30、0-14863.strcmp函数函数 其一般形式为其一般形式为:strcmp(字符串字符串1,字符串,字符串2)strcmp的作用是比较字符串1和字符串2。例如:例如:strcmp(str1,str2);strcmp(China,Korea);strcmp(str1,Beijing);2022-10-1487AA,computercompare,36+54!$,CHINACANADA,DOG字符串2,函数值为一正整数。(3)(3)如果字符串1str2)if(str1str2)printf(yesprintf(yes););而只能用if(strcmp(str1if(strcmp(str1,s
31、tr2)0)str2)0)printf(yesprintf(yes););2022-10-14894.strlen函数函数 其一般形式为其一般形式为:strlen(字符数组字符数组)strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括0在内)。如:char char strstr1010=China;=China;printf(%dprintf(%d,strlen(strstrlen(str););输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(China);2022-10-1490例例kw4 kw4 有有3 3个字符串个字符串,要求找出
32、其中最大者要求找出其中最大者#include#includevoid main()char string20;char str320;int i;for(i=0;i0)/*str0比比str1大大*/strcpy(string,str0);/*把把str0赋值个字符串赋值个字符串string大大*/else strcpy(string,str1);if(strcmp(str2,string)0)strcpy(string,str2);printf(nthe largest string is:%sn,string);2022-10-1491运行结果如下:CHINAHOLLANDAMERICA the largest string isHOLLAND2022-10-14922022-10-14932022-10-14942022-10-1495