《C语言chap7多维数组.ppt》由会员分享,可在线阅读,更多相关《C语言chap7多维数组.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、7.1 一维数组一维数组第第 7 章章 多维数组多维数组1一维数组的定义一维数组的定义语句形式:语句形式:类型说明符类型说明符 数组名数组名常量常量表达式表达式说明:说明:数组名定名规则和变量名相同。数组名定名规则和变量名相同。常量表达式表示数组元素的个数,即数组的长度。如:常量表达式表示数组元素的个数,即数组的长度。如:int a10;表表示示a数数组组有有10个个元元素素:a0,a1,a2,a9,没没有有a10。注意注意:数组的下标是从数组的下标是从0开始的开始的。2一维数组元素的引用一维数组元素的引用 C不允许对数组进行动态定义。以下作法是错误的。不允许对数组进行动态定义。以下作法是错误
2、的。int n;scanf(“%d”,&n);int an;数数组组必必须须先先定定义义,然然后后再再使使用用。C的的数数组组元元素素只只能能逐个引用而不能一次引用整个数组。逐个引用而不能一次引用整个数组。一维数组元素的表示形式为:一维数组元素的表示形式为:数组名数组名下标下标下标可以是整型常量或整型表达式。下标可以是整型常量或整型表达式。例例7.1 main()int i,a10;for(i=0;i=0;i-)printf(“%2d”,a i);输出结果:输出结果:10 9 8 7 6 5 4 3 2 13一维数组的初始化一维数组的初始化赋赋值值语语句句和和输输入入语语句句均均可可使使数数组
3、组中中的的元元素素赋赋初初值值,但但占占用用运行时间。简捷的方法是在程序运行之前使数组初始化。运行时间。简捷的方法是在程序运行之前使数组初始化。对数组元素初始化的方法有:对数组元素初始化的方法有:1)在定义数组时对数组元素赋以初值。如:在定义数组时对数组元素赋以初值。如:static int a10=0,1,2,3,4,5,6,7,8,9;说明:说明:依次赋予数组元素的初值必须用依次赋予数组元素的初值必须用 括起来。括起来。“static”是是C的一个关键字,意为的一个关键字,意为“静态存储静态存储”。C规定只规定只有静态存储有静态存储(static)数组和外部存储数组和外部存储(extern
4、)数组才能初始化。数组才能初始化。2)可以只给一部分元素赋值。如:可以只给一部分元素赋值。如:static int a10=0,1,2,3,4;3)在在C中系统会自动对所定义的静态数组的每个元素赋初值中系统会自动对所定义的静态数组的每个元素赋初值0。4)对全部数组元素赋初值时,可以不指定数组长度。如:对全部数组元素赋初值时,可以不指定数组长度。如:static int a5=1,2,3,4,5;可以写成:可以写成:static int a=1,2,3,4,5;例例7.2 将一个十进制正整数转换成二进制数。将一个十进制正整数转换成二进制数。main()int i,k,r,x,b16;printf
5、(“Enter an integer x:”);scanf(“%d”,&x);printf(“%6d binary number is:n”,x);k=-1;do r=x%2;b+k=r;x/=2;while(x!=0);for(i=k;i=0;i-)printf(“%d”,bi);printf(“n”);例7.3 用冒泡法将用冒泡法将10个数按从小到大排序。个数按从小到大排序。当有当有n个数时需要作个数时需要作n1趟这样的搜索,每趟搜趟这样的搜索,每趟搜索要作索要作n1次比较。次比较。main()int i,j,t,a11;printf(“input 10 numbers:n”);for(i
6、=1;i11;i+)scanf(“%d”,&ai);printf(“n”);for(j=1;j=9;j+)for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(“the sorted numbers:n”);for(i=1;i11;i+)printf(“%d ”,ai);7.2.二维数组二维数组语句形式语句形式:类型说明符类型说明符 数组名数组名常量表达式常量表达式1 常量表达式常量表达式2如:如:float a34;定义定义a是一个是一个3x4(3行行4列列)的数组,即的数组,即a数组有数组有12个元素。个元素。但不得写成:但不得写成:float a3,4;注意:
7、注意:二二维维数数组组中中元元素素的的排排列列顺顺序序为为按按行行按按列列。即即存存放放完完第第1 行的元素后再接着存放第行的元素后再接着存放第 2 行的元素,依次类推。行的元素,依次类推。C允许定义多维数组。如:允许定义多维数组。如:float a345;static int a34=1,5,9;static int a34=1,0,6,0,0,11;static int a34=1,5,6;static int a34=1,9;注意:注意:所赋给的值是所赋给的值是按行按列按行按列对号入座的。对号入座的。对对二二维维数数组组的的全全部部元元素素赋赋初初值值时时,可可以以不不指指定定第第一一维
8、维的长度,但不得省去第二维的长度。如:的长度,但不得省去第二维的长度。如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成:可以写成:static int a 4=1,2,3,4,5,6,7,8,9,10,11,12;同样,同样,static int a 4=0,0,3,0,10;也是正确的。也是正确的。可以对部分元素赋初值。如:可以对部分元素赋初值。如:例例7.4 将一个二维数组行和列的元素互换后存到另一个数组中。如:将一个二维数组行和列的元素互换后存到另一个数组中。如:main()static int a23=1,2,3,4,5,6;static
9、 int b32,i,j;printf(“array a:n”);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(“%5d”,ai j);b ji=ai j;/元元素素互互换换 /printf(“n”);printf(“array b:n”);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(“%5d”,bi j);printf(“n”);例例7.5 输输出出一一个个3 4数数组组中中每每行行中中的的最最大大元元素素之之值值及及其其位位置。置。main()int i,j,c,max;static int a34=6,-5,11,3,8,9,4,
10、7,2,13,1,-10;for(i=0;i=2;i+)max=a i0;c=0;for(j=0;jmax)max=ai j;c=j;printf(“max=%2d,row=%d,colum=%dn”,max,i+1,c+1);输出结果:输出结果:max=11,row=1,colum=3max=9,row=2,colum=2max=13,row=3,colum=27.3 多维数组多维数组与二维数组的定义类似与二维数组的定义类似例如例如:int a345,b2453;分别为定义的三维、四维数组。分别为定义的三维、四维数组。其中,其中,a有有60个元素,个元素,b有有120个元素。个元素。7.4字
11、符数组与字符串字符数组与字符串7.4.1 字符数组的逐个字符操作例例7.6 从从键键盘盘输输入入一一个个字字符符串串,回回车车键键结结束束,并并将将字字符符串串在在屏屏幕上输出。幕上输出。main()int i;static char str80;clrscr();for(i=0;i80;i+)stri=getch();/*逐逐次次给给数数组组元元素素stri赋赋值值,但不回显在屏幕上但不回显在屏幕上*/printf(*);/*以以星星号号代代替替输输入入字字符符的的个个数数*/if(stri=x0d)break;/*若输入回车则终止循环若输入回车则终止循环*/i=0;while(stri!=
12、x0d)printf(%c,stri+);/*逐逐次次输输出出字字符符数数组组的的各各个元素个元素*/printf(n);getch();/*程序暂停程序暂停*/1字符数组的定义字符数组的定义1维维字字符符数数组组,用用于于存存储储和和处处理理1个个字字符符串串,其其定定义格式与义格式与1维数值数组一样。维数值数组一样。2维维字字符符数数组组,用用于于同同时时存存储储和和处处理理多多个个字字符符串串,其定义格式与其定义格式与2维数值数组一样。维数值数组一样。2字符数组的初始化字符数组的初始化字字符符数数组组的的初初始始化化,可可以以通通过过为为每每个个数数组组元元素素指指定初值字符来实现。定初
13、值字符来实现。3字符数组的引用字符数组的引用 字字符符数数组组的的逐逐个个字字符符引引用用,与与引引用用数数值值数数组组元元素类似。素类似。(1)字符数组的输入)字符数组的输入 除除了了可可以以通通过过初初始始化化使使字字符符数数组组各各元元素素得得到到初初值值外外,也也可可以以使使用用getchar()或或scanf()函函数数输输入入字符。字符。例如:例如:char str10;for(i=0;i10;i+)scanf(%c,&stri);fflush(stdin);/*清除键盘输入缓冲区清除键盘输入缓冲区*/(2)字符数组的输出)字符数组的输出 字字符符数数组组的的输输出出,可可以以用用
14、putchar()或或printf()函函数。数。例如:例如:char str10=c language;for(i=0;i10;i+)printf(%c,stri);printf(n);注注意意:逐逐个个字字符符输输入入、输输出出时时,要要指指出出元元素素的的下下标标,而而且且使使用用“%c”格格式式符符。另另外外,从从键键盘盘上上输输入入字字符符时时,无无需需输输入入字字符符的的定定界界符符单单引引号号;输出时,系统也不输出字符的定界符。输出时,系统也不输出字符的定界符。Scanf(“%s”)方式输入字符串时:方式输入字符串时:从第一个非空白字符开始,遇到第一从第一个非空白字符开始,遇到第
15、一个空白字符结束;并在末尾自动补上个空白字符结束;并在末尾自动补上一个字符一个字符0#include main()char name13;int i;for(i=0;i=12;i+)scanf(“%c”,&namei);for(i=0;i=12;i+)printf(“%c”,namei);scanf(“%s”,name);printf(“%s”,name);例例7e_1:采用不同的方式输入输出字符串采用不同的方式输入输出字符串运行结果运行结果:Pear&Apple Pear&ApplePear&Apple Pear#include#include main()int i;char name74
16、=sun,mon,tue,wed,thu,wen,sat;printf(Result is:n);name03=&;name23=&;name53=&;for(i=0;i7;i+)printf(%sn,namei);getch();例例:7e_2字符串数组值的改变。字符串数组值的改变。程序运行结果程序运行结果:sun&monmontue&wedwedthuwen&satsat赋初值:改变后:7.4.2 字符数组的整体操作例例7.7 字符数组的整体输入与输出。字符数组的整体输入与输出。将将2维字符数组进行初始化,并在屏幕上输出维字符数组进行初始化,并在屏幕上输出*/main()int i;cha
17、r name510=“zhangshan,“lisi,“wangwu,“zhaolui,“luiqi;for(i=0;i5;i+)printf(n%st,namei);/*namei代代表表该该行行数数组组元元素素的首地址的首地址*/getch();1字符串及其结束标志字符串及其结束标志 所谓字符串,是指若干有效字符的序列。所谓字符串,是指若干有效字符的序列。C语言中的字符串,语言中的字符串,可以包括字母、数字、专用字符、转义字符等。可以包括字母、数字、专用字符、转义字符等。C语言规定:语言规定:以以0作为字符串结束标志作为字符串结束标志(0代表代表ASCII码为码为0的字符,表示一个的字符,
18、表示一个“空操作空操作”,只起一个标志作用),只起一个标志作用)。因此可以对字符数组采用另一种方式进行操作了。因此可以对字符数组采用另一种方式进行操作了字符数组字符数组的整体操作。的整体操作。注注意意:由由于于系系统统在在存存储储字字符符串串常常量量时时,会会在在串串尾尾自自动动加加上上1个结束标志,所以无需人为地再加个结束标志,所以无需人为地再加1个。个。另另外外,由由于于结结束束标标志志也也要要在在字字符符数数组组中中占占用用一一个个元元素素的的存存储储空空间间,因因此此在在说说明明字字符符数数组组长长度度时时,至至少少为为字字符符串串所所需需长度加长度加1。2字符数组的整体初始化字符数组
19、的整体初始化字字符符串串设设置置了了结结束束标标志志以以后后,对对字字符符数数组组的的初初始始化化,就就可以用字符串常量来初始化字符数组。可以用字符串常量来初始化字符数组。3字符数组的整体引用字符数组的整体引用(1)字符串的输入)字符串的输入除除了了可可以以通通过过初初始始化化使使字字符符数数组组各各元元素素得得到到初初值值外外,也也可以使用可以使用scanf()函数输入字符串。函数输入字符串。(2)字符串的输出)字符串的输出printf()函函数数,不不仅仅可可以以逐逐个个输输出出字字符符数数组组元元素素,还还可可以以整体输出存放在字符数组中的字符串。整体输出存放在字符数组中的字符串。7.4
20、.3 常用的字符串处理函数字符串标准函数的原型在头文件字符串标准函数的原型在头文件string.h中。中。1输入字符串输入字符串gets()函数函数(1)调用方式:)调用方式:gets(字符数组字符数组)(2)函函数数功功能能:从从标标准准输输入入设设备备(stdin)键键盘盘上上,读读取取1个个字字符符串串(可可以以包包含含空空格格),并并将将其其存存储到字符数组中去。储到字符数组中去。(3)使用说明)使用说明 1)gets()读读取取的的字字符符串串,其其长长度度没没有有限限制制,编编程程者者要要保保证证字字符符数数组组有有足足够够大大的的空空间间,存存放放输输入入的的字字符串。符串。2)
21、该该函函数数输输入入的的字字符符串串中中允允许许包包含含空空格格,而而scanf()函数不允许。遇到回车输入结束!函数不允许。遇到回车输入结束!2输出字符串输出字符串puts()函数函数(1)调用方式:)调用方式:puts(字符数组字符数组)(2)函函数数功功能能:把把字字符符数数组组中中所所存存放放的的字字符符串串,输输出出到到标标准准输输出出设设备备中中去去,并并用用n取取代代字字符符串串的的结结束束标标志志0。所所以以用用puts()函函数数输输出出字字符符串串时时,不要求另加换行符。不要求另加换行符。(3)使用说明)使用说明1)字字符符串串中中允允许许包包含含转转义义字字符符,输输出出
22、时时产产生生一一个控制操作。个控制操作。2)该该函函数数一一次次只只能能输输出出一一个个字字符符串串,而而printf()函数也能用来输出字符串,且一次能输出多个。函数也能用来输出字符串,且一次能输出多个。1.输入输入(用用scanf(“%s”)(2)输入多个字符串输入多个字符串,可用空格隔开。可用空格隔开。static char str15,str25,str35;scanf(%s%s%s,str1,str2,str3);(1)输入字符串时输入字符串时,系统自动加上系统自动加上0输入输入 How are you str1得到得到:H o w0 str2得到得到:a r e0 str3得到得到
23、:y o u 02.2.输入输入(用用gets()gets()static char str 15,gets(str);输入:how are you 则则str得到得到:how are you0 例例7e_3(演示演示)#include#include main()static char str15,str25,str35,str15;scanf(%s%s%s,str1,str2,str3);/*/*输入输入 how are youhow are you回车回车*/printf(%s%s%s%sn,str1,str2,str3);puts(str1);puts(str2);puts(str3)
24、;/*puts()/*puts()将将00转换为转换为n*/n*/fflush(stdin);/*/*清除键盘缓冲区清除键盘缓冲区,內部位置指针置首位內部位置指针置首位*/gets(str);/*/*输入输入 how are youhow are you回车回车*/puts(str);运行屏幕显示运行屏幕显示:how are youhowareyouhowareyouhow are youhow are you例例7e_4(演示演示)从键盘按下面次序输入从键盘按下面次序输入,分析程序结果分析程序结果:aa bb回车回车cc dd回车回车#include#include main()char a
25、15,a25,a35,a45;scanf(“%s%s”,a1,a2);gets(a3);gets(a4);puts(a1);puts(a2);puts(a3);puts(a4);程序运行结果程序运行结果:aabbcc dd说明说明:输入流为一队列输入流为一队列 aabbaabbccddccddscanf(“%sscanf(“%s”,);”,);从队列中一个一个地读字符从队列中一个一个地读字符,每每读一个读一个,标准输入设备文件标准输入设备文件stdinstdin内部指针内部指针向右移向右移动一个字符位置动一个字符位置;以非空白字符开始以非空白字符开始,以第一个空以第一个空白字符结束白字符结束.
26、gets();gets();从队列中一个一个地读字符从队列中一个一个地读字符,每读一个每读一个,标准输入设备文件内部指针向右移动一个字符位标准输入设备文件内部指针向右移动一个字符位置置;以以为串输入结束标志为串输入结束标志.则则:a15:a15:aa0 aa0 a25:a25:bb0bb0a35:a35:0 0 a45:a45:ccdd0ccdd03字符串比较字符串比较strcmp()函数函数(1)调用方式:)调用方式:strcmp(字符串字符串1,字符串字符串2)其中其中“字符串字符串”可以是串常量,也可以是可以是串常量,也可以是1维字符数组。维字符数组。(2)函数功能:比较两个字符串的大小
27、。)函数功能:比较两个字符串的大小。如果:字符串如果:字符串1=字符串字符串2,函数返回值等于,函数返回值等于0;字符串字符串1字符串字符串2,函数返回值正整数。,函数返回值正整数。(3)使用说明)使用说明1)如如果果一一个个字字符符串串是是另另一一个个字字符符串串从从头头开开始始的的子子串串,则则母串为大。母串为大。2)不不能能使使用用关关系系运运算算符符“”来来比比较较两两个个字字符符串串,只只能用能用strcmp()函数来处理。函数来处理。例7.8 gets函数和函数和strcmp函数的应用。函数的应用。/*功能:简单密码检测程序功能:简单密码检测程序*/#include stdio.h
28、main()char pass_str80;/*定义字符数组定义字符数组pass_str*/int i=0;/*检验密码检验密码*/while(1)clrscr();printf(请输入密码请输入密码n);gets(pass_str);/*输入密码输入密码*/*假定正确口令为假定正确口令为password*/if(strcmp(pass_str,“password”)!=0)printf(口令错误,按任意键继续口令错误,按任意键继续);else break;/*输入正确的密码,中止循环输入正确的密码,中止循环*/getch();i+;if(i=3)exit(0);/*输入三次错误的密码,退出程
29、序输入三次错误的密码,退出程序*/*以下为输入正确密码所进入的程序段以下为输入正确密码所进入的程序段*/printf(密码正确密码正确!欢迎你进入欢迎你进入!);4拷贝字符串拷贝字符串strcpy()函数函数(1)调用方式:)调用方式:strcpy(字符数组字符数组,字符串字符串)其中其中“字符串字符串”可以是串常量,也可以是字符数组。可以是串常量,也可以是字符数组。(2)函函数数功功能能:将将“字字符符串串”完完整整地地复复制制到到“字字符符数数组组”中,字符数组中原有内容被覆盖。中,字符数组中原有内容被覆盖。(3)使用说明)使用说明1)字字符符数数组组必必须须定定义义得得足足够够大大,以以
30、便便容容纳纳复复制制过过来来的的字符串。复制时,连同结束标志字符串。复制时,连同结束标志0一起复制。一起复制。2)不不能能用用赋赋值值运运算算符符“”将将一一个个字字符符串串直直接接赋赋值值给给一个字符数组,只能用一个字符数组,只能用strcpy()函数来处理。函数来处理。5连接字符串连接字符串strcat()函数函数(1)调用方式:)调用方式:strcat(字符数组字符数组,字符串字符串)(2)函函数数功功能能:把把“字字符符串串”连连接接到到“字字符符数数组组”中中的的字字符符串串尾尾端端,并并存存储储于于“字字符符数数组组”中中。“字字符符数数组组”中中原原来来的的结结束束标标志志,被被
31、“字字符符串串”的的第第一一个个字字符符覆覆盖盖,而而“字符串字符串”在操作中未被修改。在操作中未被修改。(3)使用说明)使用说明 1)由由于于没没有有边边界界检检查查,编编程程者者要要注注意意保保证证“字字符符数数组组”定定义义得得足足够够大大,以以便便容容纳纳连连接接后后的的目目标标字字符符串串;否否则则,会因长度不够而产生问题。会因长度不够而产生问题。2)连连接接前前两两个个字字符符串串都都有有结结束束标标志志0,连连接接后后“字字符符数数组组”中中存存储储的的字字符符串串的的结结束束标标志志0被被舍舍弃弃,只只在在目目标串的最后保留一个标串的最后保留一个0。6求字符串长度求字符串长度s
32、trlen()函数函数(len是是length的缩写)的缩写)(1)调用方式:)调用方式:strlen(字符串字符串)(2)函函数数功功能能:求求字字符符串串(常常量量或或字字符符数数组组)的的实实际长度(际长度(不包含结束标志不包含结束标志)。)。7将字符串中大写字母转换成小写将字符串中大写字母转换成小写strlwr()函数函数(1)调用方式:)调用方式:strlwr(字符串字符串)(2)函函数数功功能能:将将字字符符串串中中的的大大写写字字母母转转换换成成小小写写,其它字符(包括小写字母和非字母字符)不转换。其它字符(包括小写字母和非字母字符)不转换。8将字符串中小写字母转换成大写将字符串
33、中小写字母转换成大写strupr()函数函数(1)调用方式:)调用方式:strupr(字符串字符串)(2)函函数数功功能能:将将字字符符串串中中小小写写字字母母转转换换成成大大写写,其它字符(包括大写字母和非字母字符)不转换。其它字符(包括大写字母和非字母字符)不转换。7.5 数组作为函数参数数组作为函数参数数组用作函数参数有两种形式:一种是把数数组用作函数参数有两种形式:一种是把数组元素(又称下标变量)作为实参使用;另一组元素(又称下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。种是把数组名作为函数的形参和实参使用。7.5.1 数组元素作为函数参数 7.5.2 数组名作为函
34、数的形参和实参 7.5.1 数组元素作为函数参数 数组元素就是下标变量,它与普通变量并无数组元素就是下标变量,它与普通变量并无区别。数组元素只能用作函数实参,其用法与普区别。数组元素只能用作函数实参,其用法与普通变量完全相同:在发生函数调用时,把数组元通变量完全相同:在发生函数调用时,把数组元素的值传送给形参,实现素的值传送给形参,实现单向值单向值传送。传送。例例7.9 写一函数,统计字符串中字母的个数。写一函数,统计字符串中字母的个数。/*功能:数组元素作为函数实参功能:数组元素作为函数实参*/int isalp(char c)if (c=a&c=A&c=Z)return(1);else r
35、eturn(0);main()int i,num=0;char str255;printf(Input a string:);gets(str);for(i=0;stri!=0;i+)if(isalp(stri)num+;puts(str);printf(num=%dn,num);getch();说明:说明:(1)用用数数组组元元素素作作实实参参时时,只只要要数数组组类类型型和和函函数数的的形形参参类类型型一一致致即即可可,并并不不要要求求函函数数的的形形参参也也是是下下标标变变量量。换换句句话话说说,对对数数组组元元素素的的处处理理是是按普通变量对待的。按普通变量对待的。(2)在在普普通通变
36、变量量或或下下标标变变量量作作函函数数参参数数时时,形形参参变变量量和和实实参参变变量量是是由由编编译译系系统统分分配配的的两两个个不不同同的的内内存存单单元元。在在函函数数调调用用时时发发生生的的值值传传送送,是是把实参变量的值赋予形参变量。把实参变量的值赋予形参变量。7.5.2 数组名作为函数的形参和实参数数组组名名作作函函数数参参数数时时,既既可可以以作作形形参参,也也可可以以作实参。作实参。数数组组名名作作函函数数参参数数时时,要要求求形形参参和和相相对对应应的的实实参参都都必必须须是是类类型型相相同同的的数数组组(或或指指向向数数组组的的指指针针变量),都必须有明确的数组说明变量),
37、都必须有明确的数组说明例例7.10 已知某个学生已知某个学生5门课程的成绩,求平均成绩。门课程的成绩,求平均成绩。float aver(float a)/*求平均值函数求平均值函数*/int i;float av,s=a0;for(i=1;i5;i+)s+=ai;av=s/5;return av;void main()float sco5,av;int i;printf(ninput 5 scores:n);for(i=0;i5;i+)scanf(%f,&scoi);av=aver(sco);/*调用函数,实参为一数组名调用函数,实参为一数组名*/printf(average score is%5.2fn,av);getch();说明说明:(1)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。例如,在本案例中,形参数组为float a,实参数组为float sco,它们的数据类型相同。(2)C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。例如,本案例中的形参数组a。如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。本章本章习题习题P163 7.31 7.32 7.33P164 7.37 7.40 7.44 7.45
限制150内