第7章数组00002.ppt

上传人:本田雅阁 文档编号:2552168 上传时间:2019-04-07 格式:PPT 页数:56 大小:713.51KB
返回 下载 相关 举报
第7章数组00002.ppt_第1页
第1页 / 共56页
第7章数组00002.ppt_第2页
第2页 / 共56页
第7章数组00002.ppt_第3页
第3页 / 共56页
亲,该文档总共56页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第7章数组00002.ppt》由会员分享,可在线阅读,更多相关《第7章数组00002.ppt(56页珍藏版)》请在三一文库上搜索。

1、第七章,数组,掌握一维、二维数组的定义和引用方法、存储结构和初始化方法。 掌握有关一维数组的有关算法。 掌握数组的运算。,本章要点,主要内容:,7.1 一维数组的定义和引用 7.2 二维数组的定义和引用 7.3 字符数组, 7.1. 一维数组的定义和引用,7.1.1、一维数组的定义 1、一维数组的定义方式: 类型说明符 数组名常量表达式;,合法标识符,表示元素个数 下标从0开始, :数组运算符 单目运算符 优先级(1) 左结合 不能用( ),例 int a6;,数组名表示内存首地址,是地址常量,编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型),2、说明: (1)数组名定

2、名规则和变量名相同,遵循标识符定名规则。 (2)数组名后是用方括弧括起来的常量表达式,不能用圆括弧。 (3)在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。 (4)常量表达式中可以包括常量和符号常量,但不能包含变量。,例 int i=15; int datai; (不能用变量定义数组维数),7.1.2一维数组元素的引用,1、数组元素的引用方式:,数组名下标 下标可以是整型常量或整型表达式。例如: a0=a5+a7-a2*3,说明: 1 数组必须先定义,后使用 2 只能逐个引用数组元素,不能 一次引用整个数组,一维数组元素引用的程序实例,#includ

3、e void main() int i,a10 for (i=0; i=0; i-) printf(“%d ,ai); printf(“n); ,运行结果如下: 9 8 7 6 5 4 3 2 1 0 程序使a0到 a9的值为09,然后按逆序输出。 数组元素的下标常用循环变量来控制。,1、对数组元素初始化的实现方法: (1)在定义数组时对数组元素赋以初值。 如:int a5=1,2,3,4,5; 等价于:a0=1; a1=2; a2=3; a3=4; a4=5; (2)可以只给一部分元素赋值。 如: int a5=6,2,3; 等价于a0=6; a1=2;a2=3; a3=0; a4=0; (

4、3 )如果想使一个数组中全部元素值为0. int a10=0,0,0,0,0,0,0,0, 0,0;或inta10=0;不能写成:int a10=0*10;不能给数组整体赋初值。,7.1.3一维数组的初始化,在定义数组时,为数组元素赋初值(在编译阶段使之得到初值),(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。 例如:int a5=1,2,3,4,5; 也可以写成 int a=1,2,3,4,5;,说明: 1 数组不初始化,其元素值为随机数 2 对static数组元素不赋初值,系统会自动赋 以0值 3 只给部分的元素赋初值 4 当全部元素赋初值时,可不指定数组

5、长度,static int a5; 等价于:a0=0; a1=0; a2=0; a3=0; a4=0;,7.1.4一维数组程序举例,例:用数组来处理,求解Fibonacci数列前20个数。,#include 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); ,例 读10个整数存入数组,找出其中最大值和最小值.,步骤: 1. 输入:for循环输入10个整数 2. 处理: (a) 先令max=min=x0 (b) 依次用

6、xi和max,min比较(循环) 若maxxi,令min=xi 3. 输出:max和min,#include #define SIZE 10 main() int xSIZE,i,max,min; printf(“Enter 10 integers:n“); for(i=0;ixi) min=xi; printf(“Maximum value is %dn“,max); printf(“Minimum value is %dn“,min); ,例 用冒泡法对10个数排序,排序思路过程: (1)比较第一个数与第二个数,若为逆序a0a1,则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个

7、数和第n个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束,冒泡法的思路是:将相邻两个数比较,将小的调到前头。,如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。,#include void main() int a11,i,j,t; printf(“Input 10 numbers:n“); for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf

8、(“The sorted numbers:n“); for(i=1;i11;i+) printf(“%d “,ai); ,例 用简单选择法对10个数排序,排序过程: (1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束,#include void main() int a11,i,j,k,t; printf(“Input 10 numbers:n“); for(i=1;i1

9、1;i+) scanf(“%d“, ,7-2 二维数组的定义和引用,7.2.1二维数组的定义,二维数组的定义 定义方式: 数据类型 数组名常量表达式常量表达式;,行数,列数,元素个数=行数*列数,例 int a34; float b25; int c234; int a3,4; (),数组元素的存放顺序 原因:内存是一维的 二维数组:按行序优先 多维数组:最右下标变化最快,二维数组理解,二维数组a是由3个元素组成,每个元素ai由包含4个元素的一维数组组成,注意: 我们可以把二维数组看作是一种特殊的一维数,它的元素又是一个一维数组。 例如,可以把a看作是一个一维数组,它有3个元素:a0、a1、a

10、2,每个元素又是一个包含4个元素的一维数组。,二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素,下图表示对a34数组存放的顺序,概念上可理解二维数组a34是一个行列的矩阵,例如:整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;,地址 值 数组元素,3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H,1 2 3,4 5 6,789,b00 b01 b02 b10 b11 b12 b20 b21 b22,定义三维数组: float a234; 多维数组元素在内存中的排列顺序:第一维的下

11、标变化最慢,最右边的下标变化最快。,7.2.2二维数组的引用,二维数组元素的表示形式为:数组名下标下标 例如: a23 下标可以是整型表达式,如 a2-12*2-1,注意: (1)不要写成a2,3,a2-1,2*2-1形式 (2)在使用数组元素时,应该注意下标值应在已定 义的数组大小的范围内。,例:int a34;/* 定义a为34的数组 */ 常出现的错误有: a34=3; 注意下标最大值的取值,7.2.3二维数组的引用,数据类型 数组名 常量表达式1常量表达式2 初始化数据 ;,二维数组初始化 (1)分行给二维数组赋初值。 如:int a34=1,2,3,4,5,6,7,8,9,10,11

12、,12; (2)可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。 如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,(3)部分元素赋初值 (a)可以对部分元素赋初值。如 int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,(b)也可以对各行中的某一元素赋初值,如 int a34=1,0,6,0,0,0,11;,1 0 0 0 0 6 0 0 0 0 0 11,(c)也可以只对某几行元素赋初值。如: int a34=1,5,6;,1 0 0 0 5 6 0 0 0 0 0 0,(4)如果对全部元素都赋初值,则定义数组时对第一维的

13、长度可以不指定,但第二维的长度不能省。,在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0, 7.2.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(

14、“array b:n“); for(i=0;i=2;i+) for(j=0;j=1;j+) printf(“%5d“,bij); printf(“n“); ,例: 有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。,先用N-S流程图表示算法 ,如下:,#include 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;imax) max=aij; row=i; colum=j; printf(“max=%d,row=%d, colum=

15、%dn“,max,row,colum); ,例 读入下表中值到数组,分别求各行、各列及表中所有数之和,#include main() int x54,i,j; for(i=0;i4;i+) for(j=0;j3;j+) scanf(“%d“,j+), xi3+=xij; x4j+=xij; x43+=xij; for(i=0;i5;i+) for(j=0;j4;j+) printf(“%5dt“,xij); printf(“n“); ,7.3 字符数组,7.3.1字符数组的定义 用来存放字符数据的数组是字符数组。 字符数组中的一个元素存放一个字符。,定义方法与前面介绍的类似。例如: char

16、c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h;c6=a; c7=p;c8=p;c9=y; c为字符数组,有个元素,赋值后数组状态如下:,字符数组的初始化 逐个字符赋值 用字符串常量,7.3.2字符数组的初始化,7.3.2字符数组的初始化,对字符数组初始化,最容易理解的方式是逐个字符 赋给数组中各元素。如: char c10=I, , a, m, , h,a,p,p,y; 注意:如果花括弧中提供的初值个数(即字符个 数)大于数组长度,则按语法错误处理。 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即0)。,注意:如果提供的初

17、值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。,char c10=I, , a, m, , h,a,p,p,y; 数组c的长度自动定为10。,7.3.3字符数组的引用,例 输出一个字符串,程序如下: #include void main() char c10=I, ,a,m, ,a, , b,o,y; int i; for(i=0;i10;i+) printf(%c,ci); printf(n); ,运行结果:I am a boy,例 输出一个钻石图形,#include void main() char diamond5= , ,*,*, ,*,*,

18、 , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); ,运行结果 * * * * * * * *,7.3.4字符串和字符串结束标志,字符串及其结束标志 无字符串变量,用字符数组处理字符串 字符串结束标志:0,7.3.5字符数组的输入输出,字符数组的输入输出可以有两种方法:,逐个字符输入输出。用格式符“%c”输入或输出一个字符。 将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。,例 用%c main() char str5; int

19、i; for(i=0;i5;i+) scanf(“%c”, ,例 用%s main() char str5; scanf(“%s”, str); printf(“%s”, str); ,用字符数组名,不要加& 输入串长度数组维数 遇空格或回车结束 自动加0,用字符数组名, 遇0结束,说明: 1、用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。 2、如果数组长度大于字符串实际长度,也只输出到遇0结束。 3、输出字符不包括结束符0。 4、如果一个字符数组中包含一个以上0,则遇第一个0时输出就结束。 5、可以用scanf函数输入一个字符串。,例如: void

20、main() int i; char a5; scanf(“%s“,a); for(i=0;i5;i+) printf(“%d,“,ai); ,运行情况: (1)若输入 hel , 正常 (2)若输入 hell , 正常 (3)若输入 hello , 用%s 输出时,会出现问题,输入字符串长度数组维数,例 #include void main() char a=h,e,l,0,l,o,0; printf(“%s“,a); ,输出:hel,数组中有多个0时, 遇第一个结束,例 #include void main() char a15,b5,c5; scanf(“%s%s%s“,a,b,c);

21、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,scanf中%s输入时,遇空格或回车结束,7.3.6字符串处理函数,1、字符串输出函数puts 格式:puts(字符数组) 功能:向显示器输出字符串(输出结束,换行) 说明:字符数组必须以0结束,用puts函数输出的字符串中可以包含转义字符。例如:char str=ChinanBeijing; puts(str); 输出结果

22、: China Beijing,在输出时,将字符串 结束标志0 转换成n, 即输出完字符串后换行。,2、字符串输入函数gets 格式:gets(字符数组) 功能:从键盘输入一以回车结束的字符串放入字符 数组中,并自动加0 说明:输入串长度应小于字符数组维数,例 #include main( ) char string80; printf(“Input a string:”); gets(string); puts(string); 输入: How are you? 输出: How are you ?,注意:用puts和gets函数只能输入或输出一个字串,不能写成puts(str1,str2)或

23、 gets(str1,str2),3、字符串连接函数strcat 格式:strcat(字符数组1,字符数组2) 功能:把字符数组2连到字符数组1后面 返值:返回字符数组1的首地址 说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消,新串最后加0。,4、字符串拷贝函数strcpy 格式:strcpy(字符数组1,字符串2) 功能:将字符串2,拷贝到字符数组1中去 返值:返回字符数组1的首地址 说明:字符数组1必须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值,例 char str120,str220; str1=“Hello!”; () str2=str1;

24、(),例 strcpy与strcat举例,#include #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+,5、字符串比较函数strcmp 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(

25、ASCII码),直到遇到不同字符或0为止 返值:返回int型整数, a. 若字符串1小于 字符串2, 返回负整数 b. 若字符串1大于 字符串2, 返回正整数 c. 若字符串1等于 字符串2, 返回零 说明:字符串比较不能用“”和“=”,必须用strcmp 例如:对两个字符串比较,不能用以下形式: if(str1str2) printf(yes); 而只能用 if(strcmp(str1,str2)0) printf(yes);,注意:字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到0为止。如全部字符相同,则认为相

26、等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。,“A“A“, “computer“compare“, “CHINA“CANADA“, “DOG“cat“,6、字符串长度函数strlen 格式:strlen(字符数组) 功能:计算字符串长度 返值:返回字符串实际长度,不包括0在内,例 对于以下字符串,strlen(s)的值为: (1)char s10=A,0,B,C,0,D; (2)char s =“tv0willn”; (3)char s =“x69082n”;,答案:1 3 1,char str10=China; printf(%d,strlen(str); 输出结果不是10

27、,也不是6,而是5。,7、 strlwr函数 其一般形式为:strlwr (字符串) strlwr函数的作用是将字符串中大写字母换成小写字母。,8、 strupr函数 其一般形式为:strupr (字符串) strupr函数的作用是将字符串中小写字母换成大写字母。,注意:常用的字符串处理函数 包含在头文件 string.h,7.3.7字符数组应用举例,例7 .8 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。,#include #include void main() char string81; int i,num=0,word=0; char c; gets(string);

28、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); ,运行情况如下: I am a boy. There are 4 words in the line.,例 有3个字符串,要求找出其中最大者,程序实现:,#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); ,运行结果如下: CHINA HOLLAND AMERICA the largest string is HOLLAND,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1