资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,-,*,-,第,7,章,数组,数 组,第7章,本 章 内 容,一维数组的定义和引用,二维数组的定义和引用,字符数组,本 章 要 点,掌握一维、二维数组的定义和引用方法、存储结构和初始化方法,掌握有关一维数组的有关算法,掌握数组的运算,什么是数组,数据类型,基本数据类型:整型、实型、字符型,构造数据类型:数组类型、结构体类型、共用体类型,数组,数组,是有序数据的集合。数组中的每一个数据叫做一个元素。,数组中的元素具有相同的数据类型。,用一个数组名和下标来唯一的确定数组中的元素。,7.1,一维数组的定义和引用,一维数组的定义,类型说明符 数组名,常量表达式,;,例如:,int,a6;,char ch20;,float b10;,说明,数组名的命名。,常量表达式表示元素个数,即数组长度。,常量表达式中可包括常量和符号常量,不能包含变量。即,C,不允许对数组的大小作动态定义,如:,int,n;,scanf(%d,int,an,;,/error,a0,3,a1,6,a2,2,a3,8,a4,4,a5,5,7.1,一维数组的定义和引用,一维数组在内存中占一串连续的存储单元。,例如:,float mark100;,每个数据元素占用的字节数,就是基类型的字节数。,一个元素占,4,个字节,低地址,86.5,mark0,92.0,mark,1,77.5,mark,2,52.0,mark,3,高地址,94.0,mark,99,7.1,一维数组的定义和引用,一维数组的引用,数组必须先定义,后使用。,C,语言规定只能逐个引用数组元素。,数组元素的表示形式:,数组名,下标,下标:整型常量、整型表达式。,设数组长度为,N,,下标为,i,,则:下标下限,i,下标上限。,例如:,i,nt,a10,b10;,b0=a9,;,/,对数组元素赋值,b1=a1*2+3;,例,7.1,:数组元素的引用,main(),int,i,a10;,for(i,=0;i=0;i-),printf(%d,ai,);,7.1,一维数组的定义和引用,一维数组的初始化,在定义数组时对数组元素赋初值。,例如:,int,a5=2,4,6,8,10;,可以只给一部分元素赋值。,例如:,int,a6=3,5,7;,使一个数组中全部元素值为,0,,可以写成:,int,a6=0,0,0,0,0,0;,或,int,a6=0;,给全部元素赋初值时,可以不指定数组长度。,例如:,int,a=1,2,3,4,5;,系统自动定义,a,数组的长度为,5,。,注意区别与,int,a10=1,2,3,4,5;,的不同。,7.1,一维数组的定义和引用,一维数组程序举例,例,7.2,:用数组来处理输出,Fibonacci,数列。,Fibonacci,数列:,1,1,2,3,5,8,13,21,34,,,递推关系式:,F,n,=F,n-1,+F,n-2,(n2),初始条件:,F,1,=1,(n=1),F,2,=1(n=2),main(),int,i,f20=1,1;,for(i,=2;i20;i+),fi,=fi-2+fi-1;,for(i,=0;iaa+1,ai,ai+1,真 假,7.1,一维数组的定义和引用,main(),int,a11;,int,i,j,t;,printf(input,10 numbers:n);,for(i,=1;i11;i+),scanf(%d,&,ai,);,printf(n,);,for(j,=1;j=9;j+),for(i,=1;i ai+1),t=,ai,;,ai,=ai+1;ai+1=t;,printf(the,sorted numbers:n);,for(i,=1;i11;i+),printf(%d,ai,);,7.1,一维数组的定义和引用,知识点回顾,数组的概念,数组名、元素、下标,一维数组的定义、引用,一维数组的存储结构,一维数组的初始化,排序算法:起泡法,7.2,二维数组的定义和引用,二维数组的定义,类型说明符 数组名,常量表达式,常量表达式,;,例如:,int,a34;,二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。例如:,数组,a,是有,3,个元素(,a0,、,a1,、,a2,)的一维数组,每个元素又是一个包含,4,个元素的一维数组。,把,a0,、,a1,、,a2,看作,3,个一维数组的名字,则相当于定义:,int,a0,4,a1,4,a2,4;,7.2,二维数组的定义和引用,二维数组可看作由一系列数构成的一个矩阵或表格。,数组元素的第一个下标值表示该元素在表格中的行号。,数组元素的第二个下标值表示该元素在表格中的列号。,二维数组在内存中的存放,在内存中按行的顺序占一串连续的存储单元,即先存放行号小的元素,再存放行号大的元素。这种存储方式为按行存放。,7.2,二维数组的定义和引用,例如:,int,b33=1,2,3,4,5,6,7,8,9;,3000H,1,b00,3002H,2,b0,1,3004H,3,b0,2,3006H,4,b,1,0,3008H,5,b,1,1,300AH,6,b,1,2,300CH,7,b,2,0,300EH,8,b,2,1,3010H,9,b,2,2,7.2,二维数组的定义和引用,三维数组的定义,类型说明符,数组名,常量表达式,常量表达式,常量表达式,例如:,int,a234,;,可看作由若干页表格所组成:,a(0,2,3),a(0,1,3),a(0,0,3),a(0,2,2),a(0,1,2),a(0,0,2),a(0,2,1),a(0,1,1),a(0,0,1),a(0,2,0),a(0,1,0),a(0,0,0),a(1,2,3),a(1,1,3),a(1,0,3),a(1,2,2),a(1,1,2),a(1,0,2),a(1,2,1),a(1,1,1),a(1,0,1),a(1,2,0),a(1,1,0),a(1,0,0),第,1,页,第,2,页,7.2,二维数组的定义和引用,三维数组元素在内存中的排列顺序,a000a001a002a003,a010a011a012a013,a020a021a022a023,a100a101a102a103,a110a111a112a113,a120a121a122a123,7.2,二维数组的定义和引用,二维数组的引用,二维数组元素的表示形式:,数组名,下标,下标,设数组,Amn,,数组元素下标为,i,j,,则:,0i,m,0j,n,例如:,int,a23;,a00,a02,a12,数组元素可以现出在表达式,也可以被赋值。,7.2,二维数组的定义和引用,二维数组的初始化,分行给二维数组赋初值。如:,int,a34=1,2,3,4,5,6,7,8,9,10,11,12;,将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如:,int,a34=1,2,3,4,5,6,7,8,9,10,11,12;,可以对部分元素赋初值。,例如:,int,a34=1,0,5,0,0,9;,数组元素为:,1 0 0 0,0 5 0 0,0 0 9 0,当数组中非,0,元素较少时比较方便。,7.2,二维数组的定义和引用,可以只对某几行元素赋初值。如:,int,a34=1,0,5;,数组元素为:,1 0 0 0,0 5 0 0,0 0 0 0,int,a34=1,0,5;,数组元素为:,1 0 0 0,0 0 0 0,0 5 0 0,可以对全部元素赋初值,不指定第一维的长度,但第二维的长度不能省。如:,int,a4=1,2,3,4,5,6,7,8,9,10,11,12;,7.2,二维数组的定义和引用,可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:,int,a4=1,0,5;,数组元素为:,1 0 0 0,0 0 0 0,0 5 0 0,7.2,二维数组的定义和引用,二维数组程序举例,例,7.4,:将一个二维数组行和列元素互换,存到另一个二维数组中。,1 2 3 1 4,a=b=2 5,4 5 6 3 6,main(),int,a23=1,2,3,4,5,6,b32,i,j;,for(i,=0;i2;i+),for(j,=0;j3;j+),printf(%5d,aij,);,bji,=,aij,;,printf(n,);,for(i,=0;i3;i+),for(j,=0;j2;j+)printf(%5d,bij,);,printf(n,);,7.2,二维数组的定义和引用,课后思考:,如果要求将一个方阵行和列互换,并且将结果仍保存到原数组中,算法如何设计?,例,7.5,:有一个,3X4,的矩阵,要求编程求出其中值最大的那个元素的值,以及其所在的行号和列号。,7.2,二维数组的定义和引用,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;i3;i+),for(j,=0;jmax),max=,aij,;,row=i;,colum,=j;,printf(max,=%d,row=%d,colum,=%,d,max,row,colum,);,7.3,字符数组,字符数组的定义,一维字符数组:,char,数组名,n;,如:,char c5;,每个字符元素占,1B,存储单元。数组,c,在内存中连接占用,5B,存储单元。,也可用整型定义:,int,c5;,c0=a;/*,合法,但浪费存储空间*,/,二维字符数组:,char,数组名,mn,;,7.3,字符数组,字符数组的初始化,逐个字符赋给数组中各元素。如:,char ch4=g,o,o,d;,如果字符个数小于数组长度,赋值时左对齐,其余元素自动为空字符(,0,)。,如果字符个数大于数组长度,则按语法错误处理。,char c,10,=c,,,,,p,,,r,,,o,,,g,,,r,,,a,,,m;,7.3,字符数组,如果字符个数等于数组长度,则可以省略数组长度。系统自动按字符个数确定数组长度。,如:,char,ch,=h,e,l,l,o;,定义和初始化一个二维字符数组,char diamond55=,*,*,*,*,*,*,*,*,7.3,字符数组,字符数组的引用,例,7.6:,输出一个字符串。,main(),char c10=I,a,m,a,b,o,y;,int,i;,for(i,=0;i,字符串,2,负整数:字符串,1,字符串,2,注意:,对两个字符串比较,不能用以下形式:,if(str1=str2),printf(yes,);,而只能用:,If(strcmp(str1,str2)=0),printf(yes,);,7.3,字符数组,strlen,(,字符数组,),功能,函数值:字符串的实际长度,不包括,0,在内。,例如:,char str12=China;,printf(%d,strlen(str,);,strlwr,(,字符串,),功能:将字符串中的大写字母换成小写字母。,strupr,(,字符串,),功能:将字符串中的小写字母换成大写字母。,7.3,字符数组,字符数组应用举例,例,7.8:,输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。,算法分析,未出现新单词,,word=0,num,不累加,当前字符,=,空格 前一字符为空格,,word=1,num+,前一字符为非空格,未出现新单词,Y,N,N,7.3,字符数组,7.3,字符数组,#include,void main(),char string,81,c;,int,i,,,num=0,,,word=0;,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 line.,n,
展开阅读全文