第五章 数组-精品文档资料整理.pptx
第第5 5章章 数组数组 C语言程序设计 数组一维数组的定义和引用二维数组的定义和引用字符数组300 300 名?名?s001,s02s001,s02, ,s300s300, ,a001,a002,a001,a002,a300 300 ? ? C语言程序设计 数组用基本数据类型可以解决所有问题吗?用基本数据类型可以解决所有问题吗?例如例如:输出学生的姓名、年龄等数据。输出学生的姓名、年龄等数据。3 名名?S01S03代表学生姓名代表学生姓名,age01age03表示学生年龄表示学生年龄 数组属于构造类型。数组属于构造类型。 数组数组: :是具有一定是具有一定顺序关系顺序关系的若干的若干相同类型变量的集合相同类型变量的集合, , 用数组名标识。用数组名标识。 元素元素: :组成数组的变量,组成数组的变量,用数组名和下标确定用数组名和下标确定5.1 一维数组的定义和引用一维数组的定义和引用一维数组的定义一维数组的定义v定义方式:定义方式: 数据类型数据类型 数组名数组名 常量常量表达式表达式 ; C语言程序设计 数组例例 int a6;a00145a1a2a3a4a523a例 int i=15; int datai; ( 不能用变量定义数组维数)例 int data5; data5=10; 一维数组元素的引用一维数组元素的引用v数组必须数组必须先定义先定义,后使用后使用v只能逐个引用数组元素,不能一次引用整个数组。只能逐个引用数组元素,不能一次引用整个数组。v数组元素表示形式:数组元素表示形式: 数组名数组名下标下标其中:下标可以是常量或整型表达式其中:下标可以是常量或整型表达式 C语言程序设计 数组例例 int a10; printf(“%d”,a); ( )必须必须 for(j=0;j10;j+) printf(“%dt”,aj); ( )例例5.1#include void main() int i,a10; for(i=0;i=0;i- -) printf(“%d”,ai);运行结果:运行结果: 9 8 7 6 5 4 3 2 1 0一维数组的初始化一维数组的初始化 C语言程序设计 数组实现的方法:实现的方法:v在定义数组时对数组元素赋初值。在定义数组时对数组元素赋初值。v只给一部分元素赋值。只给一部分元素赋值。int a5=1,2,3,4,5;等价于:等价于:a0=1; a1=2; a2=3; a3=4; a4=5;如如 int a5=6,2,3;等价于:等价于: a0=6; a1=2;a2=3; a3=0; a4=0;如如 int a3=6,2,3,5,1; ( )v数组元素值全部为数组元素值全部为0。int a5=0,0,0,0,0; 或或int a5=0; v对整个数组元素赋初值时,可以不指定长度。对整个数组元素赋初值时,可以不指定长度。int a=1,2,3,4,5,6;编译系统根据初值个数确定数组编译系统根据初值个数确定数组大小大小一维数组程序举例一维数组程序举例 C语言程序设计 数组例例 读读10个整数存入数组,找出其中最大值和最小值个整数存入数组,找出其中最大值和最小值步骤步骤:1. 输入输入:for循环输入循环输入10个整数个整数2. 处理处理:(a) 先令先令max=min=x0(b) 依次用依次用xi和和max,min比较比较(循环循环) 若若maxxi,令令min=xi3. 输出输出:max和和min #include #define SIZE 10void main() int xSIZE,i,max,min; printf(Enter 10 integers:n); for(i=0;iSIZE;i+) printf(%d:,i+1);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); C语言程序设计 数组例例5.2 用数组来处理求用数组来处理求Fibonacci数列问题数列问题#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi);) 3()2(12) 1(1121nFFFnFnFnnnf0f1f2f3f4f5f19.11f1901452319235 C语言程序设计 数组例例5.3 用起泡法对用起泡法对10个数排序(由小到大)个数排序(由小到大)9 8 8 8 8 8 8 9 5 5 5 5 5 5 9 4 4 4 4 4 4 9 2 2 2 2 2 2 9 0 0 0 0 0 0 98 5 5 5 5 5 8 4 4 4 4 4 8 2 2 2 2 2 8 0 0 0 0 0 85 4 4 4 4 5 2 2 2 2 5 0 0 0 0 54 2 2 2 02 4 0 0 0 42 00 2第一轮大数沉底第一轮大数沉底 第二轮第二轮 第三轮第三轮 第四轮第四轮 第五轮第五轮 此处:此处:n=6 外层循环外层循环j(1n-1)次次 内层循环内层循环i (1n-j)次次 C语言程序设计 数组输入输入n 个数给个数给a1 到到 anfor j=1 to n-1for i=1 to n-jaiai+1真真假假aiai+1输出输出a1 到到 an#include void main() int a10,i,j,t; printf(Input 10 numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for(j=0;j9;j+) for(i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(The sorted numbers:n); for(i=0;i10;i+) printf(%d ,ai);5.2 二维数组的定义和引用(多维数组)二维数组的定义和引用(多维数组)二维数组的定义二维数组的定义v定义的一般形式定义的一般形式类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式; C语言程序设计 数组例例 int a34; float b25; int c234; int a3,4; ( )v数组元素的存放顺序数组元素的存放顺序l原因原因:内存是一维的内存是一维的l二维数组:按行序优先二维数组:按行序优先l多维数组:最右下标变化最快多维数组:最右下标变化最快int a32a01a10a11a20a21014523a00a00 a01a10 a11a20 a215.2 二维数组的定二维数组的定义和引用(多维数义和引用(多维数组组) C语言程序设计 数组int c23401234567.20212223c000c001c002c003c010c011c012c013c020c021c022c023c100c101c102c103c110c111c112c113c120c121c122c123v二维数组理解二维数组理解 C语言程序设计 数组例例 int a34;20161720181920202120222320089201011201213201415200012002320045200067a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23每个元素ai由包含4个元素的一维数组组成二维数组a是由3个元素组成a0a1a2行名a01a02a03a10a11a00a13a20a21a22a23a1201452367101189a0a1a2二维数组的引用二维数组的引用v形式:形式: 数组名数组名下标下标下标下标l下标是整型或字符型的常量,变量或表达式。下标是整型或字符型的常量,变量或表达式。(定义时不能使用变量)(定义时不能使用变量)如:如: a12 aijl数组元素可出现在表达式中,如:数组元素可出现在表达式中,如: a12=a22/2l使用数组元素时,应注意不要超出其定义的使用数组元素时,应注意不要超出其定义的范围;范围;如:如: int a23; a23=5; C语言程序设计 数组 C语言程序设计 数组二维数组的初始化二维数组的初始化v分行初始化分行初始化v按元素排列顺序初始化按元素排列顺序初始化 例例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456 例例 int a23=1,2,4;a00 a01 a02 a10 a11 a12120400 例例 int a3=1,4,5;a00 a01 a02 a10 a11 a12100450 例例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化全部初始化 例例 int a23=1,2,4;a00 a01 a02 a10 a11 a12124000 例例 int a3=1,2,3,4,5;a00 a01 a02 a10 a11 a12123450第一维第一维长度省略初始化长度省略初始化二维数组程序举例二维数组程序举例 C语言程序设计 数组例例5.4 将二维数组行列元素互将二维数组行列元素互 换,存到另一个数组中换,存到另一个数组中#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); bji=aij; printf(n); printf(array b:n); for(i=0;i=2;i+) for(j=0;j=1;j+) printf(%5d,bij); printf(n); a=1 2 34 5 6b=1 42 53 6 C语言程序设计 数组例例5.5 求二维数组中最大元素值及其行列号求二维数组中最大元素值及其行列号max=a00for i=0 to 2for j=0 to 3aijmax真真假假max=aijrow=icolum=j输出输出:max和和row,colum#include void main() int a34=1,2,3,4, 9,8,7,6,-10,10,-5,2; int i,j,row=0,colum=0,max; max=a00; for(i=0;i=2;i+) for(j=0;jmax) max=aij; row=i; colum=j; printf(max=%d,row=%d, colum=%dn,max,row,colum);5.3 字符数组字符数组字符数组:存放字符数据的数组。字符数组:存放字符数据的数组。一维字符数组:存放一个字符串(每个数组元素存放一个字符)一维字符数组:存放一个字符串(每个数组元素存放一个字符)二维字符数组:存放多个字符串(行数是字符串的个数)二维字符数组:存放多个字符串(行数是字符串的个数)字符数组的定义字符数组的定义v形式:形式:lchar 数组名数组名常量表达式常量表达式lchar 数组名数组名常量表达式常量表达式常量表达式常量表达式l常量表达式:整数、字符、符号常量常量表达式:整数、字符、符号常量 C语言程序设计 数组例例 char c10, ch34;v可以用整型数组存放字符型数据,但浪费存储空间。可以用整型数组存放字符型数据,但浪费存储空间。字符数组的初始化字符数组的初始化v逐个字符赋值逐个字符赋值v用字符串常量用字符串常量 C语言程序设计 数组 例例 char ch5=H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3 ch4 例例 char ch4=H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3 ch4有问题! 例例 char ch5=B,o,y;ch0Boy00逐个字符赋值逐个字符赋值ch1ch2ch3 ch4 例例 char ch =H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3 ch4 例例 char diamond5= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*;二维字符数组初始化二维字符数组初始化*00 * *0* * * *0 *00diamond0diamond1diamond2diamond3diamond4 C语言程序设计 数组例例5.6 输出一个字符串输出一个字符串#include void main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(%c,ci); printf(n);Iamaboy0123456789字符数组的引用字符数组的引用 C语言程序设计 数组例例5.7 输出一个钻石图形输出一个钻石图形#include void main() char diamond 5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for(i=0;i5;i+) for(j=0;j5;j+) printf(%c,diamondij); printf(n); 运行结果:运行结果:* * * *字符串和字符串结束标志字符串和字符串结束标志v字符串:用双引号括起的若干字符,如:字符串:用双引号括起的若干字符,如: “china”可将其存放在一维或两维字符型数组中。可将其存放在一维或两维字符型数组中。无字符串变量,用字符数组处理字符串无字符串变量,用字符数组处理字符串v字符串结束标志:字符串结束标志:0,( (既无动作既无动作, ,又不显示又不显示) ) l字符串的长度:第一个字符串的长度:第一个 0以前字符的个数以前字符的个数l在字符型数组或字符串中遇在字符型数组或字符串中遇 0,即认为该字符串结束。,即认为该字符串结束。l系统对字符串常量自动加一个系统对字符串常量自动加一个0作为结束符。作为结束符。printf(“china”); C语言程序设计 数组china0v用字符串常量初始化字符数组用字符串常量初始化字符数组 C语言程序设计 数组 例例 char ch6=“Hello”; char ch6=“Hello”; char ch=“Hello”;用字符串常量用字符串常量ch0Helloch1ch2ch3ch40ch5 例例 char fruit7=”Apple”,”Orange”, ”Grape”,”Pear”,”Peach”;二维字符数组初始化二维字符数组初始化fruit0fruit1fruit2fruit3fruit4Apple00Orange0Grape00Pear000Peach00字符数组的输入输出字符数组的输入输出v逐个字符逐个字符I/O: %cv整个字符串整个字符串I/O: %s C语言程序设计 数组例例 用用%s void main() char str5; scanf(“%s”, str); printf(“%s”, str);用字符数组名用字符数组名,不要加不要加&输入串长度输入串长度数组维数数组维数遇空格或回车结束遇空格或回车结束自动加自动加0用字符数组名用字符数组名,遇遇0结束结束例例 用用%c void main() char str5; int i; for(i=0;i5;i+) scanf(“%c”, &stri); for(i=0;i5;i+) printf(“%c”, stri);输入:输入:China 输出:输出:China输入:输入:Program 输出:输出: Progr C语言程序设计 数组#include void main() char a =h,e,l,0,l,o,0; printf(%s,a);其它注意事项:其它注意事项:输出:hel h e l 0 l o 0 C语言程序设计 数组 H o w 0 a r e 0 y o u ? 0 #include void main() char a15,b5,c5; scanf(%s%s%s,a,b,c); printf(a=%snb=%snc=%sn,a,b,c); scanf(%s,a); printf(a=%sn,a);运行情况:运行情况:输入:输入:How are you?输出:输出:a=How b=are c=you?输入:输入:How are you?输出:输出:a=How运行情况:运行情况:输入:输入:How are you? C语言程序设计 数组例例 若准备将字符串若准备将字符串“This is a string.”记录下来,记录下来,错误错误的输入语句为:的输入语句为:(A)char s20; scanf(“%20s”,s);(B)for(k=0;k17;k+) sk=getchar();(C)while(c=getchar()!=n) sk+=c;(D)char a5,b5,c5,d10; scanf(“%s%s%s%s”,a,b,c,d);字符串处理函数字符串处理函数包含在头文件包含在头文件 string.h 中中v字符串输出函数字符串输出函数 putsl格式:格式: puts(字符数组)(字符数组)l功能:向显示器输出功能:向显示器输出一个一个字符串(输出完,换行)字符串(输出完,换行)l说明:字符数组必须以说明:字符数组必须以0结束。可以包含转义字符。结束。可以包含转义字符。 输出时输出时0转换成转换成n,即输出字符后换行。,即输出字符后换行。 C语言程序设计 数组例:例:#include void main( ) char a1 =“china nbeijing” ; char a2 =“china 0beijing” ; puts(a1); puts(a2); puts(“WUHAN” ); 运行结果:运行结果: china beijing china WUHANv字符串输入函数字符串输入函数getsl格式:格式:gets (字符数组字符数组)l功能:从键盘输入功能:从键盘输入一个一个以以回车结束回车结束的字符串放入字符的字符串放入字符 数组中,并自动加数组中,并自动加0。l说明:输入串长度应小于字符数组维数说明:输入串长度应小于字符数组维数 C语言程序设计 数组例:例:gets和和scanf输入比较输入比较#include void main( ) char a115, a215 ; gets(a1); scanf(“%s”,a2); printf (“a1=%s n”,a1); printf (“a2=%s n”,a2); 输入:输入:china beijing china beijing 输出:输出:a1=china beijing a2=chinaputs和gets函数只能输入输出一个字符串。 puts(str1,str2) gets(str1,str2)v字符串连接函数字符串连接函数strcatl格式:格式:strcat (字符数组字符数组1,字符数组字符数组2)l功能:把字符数组功能:把字符数组2连到字符数组连到字符数组1后面后面l返值:返回字符数组返值:返回字符数组1的首地址的首地址l说明:说明:字符数组字符数组1必须足够大必须足够大 连接前连接前,两串均以两串均以0结束结束;连接后连接后,串串1的的0取取 消消,新串最后加新串最后加0。 C语言程序设计 数组例:例:#include void main( ) char str130=“Peoples Republic of “; char str2=China”; printf (“%sn”,strcat(str1,str2); str1: Peoples Republic of 0str2: china0str1: Peoples Republic of china0v字符串拷贝函数字符串拷贝函数strcpyl格式:格式:strcpy(字符数组字符数组1,字符串字符串2)l功能:将字符串功能:将字符串2,拷贝到字符数组,拷贝到字符数组1中去中去l返值:返回字符数组返值:返回字符数组1的首地址的首地址l说明:说明:字符数组字符数组1必须足够大必须足够大,字符串字符串2 字符数组字符数组1必须是数组名形式(必须是数组名形式(str1), 字符串字符串 2可以是字符数组名或字符串常量。可以是字符数组名或字符串常量。 拷贝时拷贝时0一同拷贝一同拷贝 不能使用赋值语句为一个字符数组赋值不能使用赋值语句为一个字符数组赋值 C语言程序设计 数组例例 char str120,str220; str1=“Hello!”; ( ) str2=str1; ( ) 可以只复制字符串可以只复制字符串2中的前几个字符,来取中的前几个字符,来取 代字符数组代字符数组1的前几个字符。的前几个字符。 strcpy(str1,str2,2) 复制前复制前2个。个。 C语言程序设计 数组例例7 strcpy与与strcat应用应用举例举例#include void main() char destination25; char blank = , c= C+, turbo = Turbo; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf(%sn, destination);Turbo C+Trbo0u012345678924Trbo0u012345678924Trbo0u012345678924C+v字符串比较函数字符串比较函数strcmp l格式:格式:strcmp(字符串字符串1,字符串字符串2)l功能:比较两个字符串功能:比较两个字符串l比较规则:对两串从左向右逐个字符比较(比较规则:对两串从左向右逐个字符比较(ASCII码),码), 直到遇到不同字符或直到遇到不同字符或0为止为止。l返回值:返回返回值:返回int型整数型整数。 其其值是值是ASCII码的差值码的差值 (不一定,不同编译系统有不同(不一定,不同编译系统有不同标准)标准) a. 若字符串若字符串1 字符串字符串2, 返回返回正整数正整数 c. 若字符串若字符串1= 字符串字符串2, 返回返回零零l说明:说明:字符串比较不能用字符串比较不能用“=”,必须用必须用strcmp, 虽然编译无错,但结果不对虽然编译无错,但结果不对 C语言程序设计 数组if(str1=str2) printf(“yes”);错错if(strcmp(str1,str2)=0) printf(“yes”);对对 C语言程序设计 数组例:字符比较例:字符比较#include void main( ) int i,j,k; char a1 =“wuhan”, a2 =“beijing” ; i=strcmp(a1,a2); j=strcmp(“china”, “korea”); k=strcmp(a2, “beijing” ); printf(“i=%d nj=%d nk=%d n”,i,j,k); 参考资料:http:/ C语言程序设计 数组例例 对于以下字符串,对于以下字符串,strlenstrlen(s)(s)的值为:的值为:(1 1)char s10=char s10=A A, ,00, ,B B, ,C C, ,00, ,D D;(2 2)char s =char s =“tv0willntv0willn”; ;(3 3)char s =char s =“x69082nx69082n”; ; 答案:答案:1 3 1例:测试字符串长度例:测试字符串长度#include void main( ) char a110=“ china” ; printf (“%d n”,strlen(a1); printf (“%d n”, strlen(“beijing 0wuhan”); 运行结果:运行结果:5 7v大写字母转换成小写字母函数大写字母转换成小写字母函数strlwrl格式:格式:strlwr(字符串字符串)v小写字母转换成大写字母函数小写字母转换成大写字母函数struprl格式:格式:strupr(字符串字符串) C语言程序设计 数组例:字符转换例:字符转换#include void main( ) char a16=“CHinA”, a2 =“wuHAn” ; printf (“%s n”,strlwr(a1); printf (“%s n”,strupr(a2); 运行结果:运行结果:china WUHAN C语言程序设计 数组例例5.8 输入一行字符,统计其中的单词个数,单词间空格分开。输入一行字符,统计其中的单词个数,单词间空格分开。分析:根据题目要求,可以用一个字符数组来存储输入的这行字符。要统计其中单词数,就是判断该字符数组中的各个字符,如果出现非空格字符,且其前一个字符为空格如果出现非空格字符,且其前一个字符为空格,则新单词开始,计数num加1。 但这在第一个单词出现时有点特殊,因为第一个单词前面因为第一个单词前面可能没有空格可能没有空格,因此在程序里我们可以人为加上一个标志word,并初始化为0。该标志指示前一个字符是否是空格,如果该标志值为0则表示前一个字符为空格。 C语言程序设计 数组例例 输入:输入:I am a boy. 当前字符当前字符是否空格是否空格word原值原值新单词开始否新单词开始否word新值新值num值值 Iamaboy.否否0是是11是是1未未01否否0是是12否否1未未12是是1未未02否否0是是13是是1未未03否否0是是14否否1未未14否否1未未14否否1未未14当前字符当前字符=空格空格是是否否未出现新单词,使未出现新单词,使word=0,num不累加不累加前一字符为空格前一字符为空格(word=0),新单词出现新单词出现,word=1,num加加1前一字符为非空格前一字符为非空格(word=1),未出现新单词未出现新单词,num不变不变 C语言程序设计 数组输入一字符串给 string i=0 num=0 word=0当(c=stringi)!=0)c=空格真真假假word=0word=1num=num+1i=i+1输出:numword=0#include void main()char string81; 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); C语言程序设计 数组例例5.9 有有3个字符串,要求找出其中最大者。个字符串,要求找出其中最大者。 H i g h 0 str0str1str2 H e l l o 0 H o w 0 #include #include void main() char string20,str320; int i; for(i=0;i0) strcpy(string,str0); else strcpy(string,str1); if(strcmp(str2,string)0)strcpy(string,str2); printf(nThe largest string is:n%sn,string); C语言程序设计 数组例例 比较比较 int a23=5,6,7,8; 与与 int a23=5,6,7,8;5 6 07 8 05 6 78 0 0例例 int a10; float f2=1.2 ,2.2;例例 int a5; a=2,4,6,8,10;例例 int a10; float i=3; ai=10;例例 char name0; float weight10.3; int array-100; h e l l oh e l l o02314 h e l l o 0h e l l o 0023145例例 char str=“Hello”; char str=H,e,l,l,o;本章要求本章要求 数组是程序设计的常用数据结构,字符串(字符数组)数组是程序设计的常用数据结构,字符串(字符数组)在程序中应用普遍,应掌握它们的意义和用法。在程序中应用普遍,应掌握它们的意义和用法。v数组(一维和二维)名、数组元素的概念。数组(一维和二维)名、数组元素的概念。v数组的初始化方法。数组的初始化方法。v数组元素在内存中的存储顺序。数组元素在内存中的存储顺序。v数据排序算法。数据排序算法。v字符串的特点(作为数组处理,最后一字节加字符串的特点(作为数组处理,最后一字节加0)v字符串处理函数的应用。字符串处理函数的应用。 C语言程序设计 数组 C语言程序设计 数组作业:作业:v数组练习数组练习: 5.3 v字符字符数组练习数组练习:5.10 5.12 v提高提高题题:预习预习:第第6章章 函数函数