收藏 分享(赏)

计算机C语言—第七章.ppt

上传人:gnk289057 文档编号:10249207 上传时间:2019-10-25 格式:PPT 页数:48 大小:168KB
下载 相关 举报
计算机C语言—第七章.ppt_第1页
第1页 / 共48页
计算机C语言—第七章.ppt_第2页
第2页 / 共48页
计算机C语言—第七章.ppt_第3页
第3页 / 共48页
计算机C语言—第七章.ppt_第4页
第4页 / 共48页
计算机C语言—第七章.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、第7章 数 组 数组:是构造类型,元素由基本类型(整、实、字符)组成。 它是有序的、同类型数据的集合。 7.1 一维数组的定义和引用(类似于向量) 7.1.1 一维数组的定义形式:类型说明符 数组名常量表达式如:int a5; float b10; 说明: 1.命名规则:数组名是由合法的标识符组成。,2.数组名后是用 括起来的是常量表达式 包括:整、字符、符号常量表达式。 如: int a2+3, b5, ca , _d8, xyz# (#=35) 而:int a(10) , bx, %5, 83, x-y50, 5x100 是否正确?又如: int i=5; int a5+i 是否正确性?

2、3.数组的长度int a5 a0, a1, a2, a3, a4 5个元素 ,下标从0 4 注意:在Turbo C 中超过定义的数组下标元素是可以引用的,系统不作检查。但a5是个无意义的随机数,4.数组大小的定义只能是常量,不能是变量或动态地定义。 例7-0-2. C main( ) int n=5,an;a1=100;printf (“a1=%dn”,a1); 编译指出:constant expression required in function main (主函数中要求常量表达式),7.1.2 一维数组元素的引用 引用规则:1.先定义,后使用。2.引用形式:数组名下标 下标可以是整、字

3、符型的常量、变量或表达式。3.引用方法:针对元素而不是整个数组。 如:a0=ab - a + a b -96 +a3 - a2*2 例T7-1. C 对数组a 顺序赋值,逆序输出 main( ) int a5,i; for(i=0; i=0;i- -) printf( “a%d=%dn”, i, ai );思考:书上的例题有没有错误?,运行结果: a4=4 a3=3 a2=2 a1=1 a0=0,说明: 1、一个数组是一个数据。 2、为什么要先定义后使用?因为数组名代表内存中存放数组元素的连续存储空间的起始地址,所以,数组名就是地址(门牌号)了解数组中元素在内存中如何存放的? 3、区分:int

4、 a5;和a5有什么区别?所以可以ai,但不可以int ai 4、一个数组元素就相当于一个简单变量,7.1.3 一维数组的初始化 实现的方法有: 1.定义时对数组元素初始化如: int a5=1, 2, 3, 4, 5;2. 只给部分元素赋值如: int a5=1, 3, 5;后面为0,这与只定义不赋值是不同的! 3. 初始化时给全部元素赋0值如: int a5=0,0,0,0,0; int a5=0; 4. 对全部元素赋初值时可以不指出长度如: int a5=2,4,6,8,10; 或 int a =2,4,6,8,10; 效果一样。这种方法很方便,特别适合元素太多的数组,但长度不一致时不能

5、省,例T7-1-1.c 定义时对数组元素初始化 main( ) int i; int a5=2,4,6,8,10; for(i=0;i=4;i+) printf(“%dn”,ai); ,运行结果: 2 468 10,7.1.4 一维数组程序举例(请同学们仔细思考) 例T7-2.c 求Fibonacci 数列问题 关于菲波那契算法:头两个数各为1, 以后的每个数皆为前两个数之和。 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 (“%

6、12d”,fi); ,运行结果:1 1 2 3 58 13 21 34 55144 233 377 610 987 1597 2584 4181 6765,例T7-3.c 用起泡法对6个数排序(由小到大)(特别重点) 思路:将相邻两数两两比较,若当前所指的数比其后面的数据大,则交换位置第一轮大数沉底 第二轮 第三轮 第四轮 第五轮 此处:n=6 外层循环j(1n-1)次:轮数 内层循环i (1n-j)次:每轮内比较的次数,main( ) int a7; int i, j , t; printf (“input 6 numbers: n”); for(i=1;iai+1)t=ai;ai=ai+1

7、;ai+1=t; printf (“the sorted numbers: n”); for(i=1;i7;i+) printf(“%d _ _”,ai); ,运行:input 6 numbers: 输入:9 8 5 4 2 0 输出:0 2 4 5 8 9,7.2 二维数组的定义和引用 7.2.1 二维数组的定义(类似于矩阵) 1.一般形式: 类型说明符 数组名常量表达式常量表达式如:float a34 定义数组a具有三行四列类似于矩阵 float a3,4错误 在C中,可将二维数组看着是特殊形式的一维数组。 如上述定义可看着是具有三个元素的一维数组,而每个元素又可看作是包含四个元素的一维数

8、组。 因此,上述定义相当于:float a0 4, a1 4, a2 4 其中a0、 a1、 a2是三个数组名,代表了3个一维数组 2.二维数组各个元素在内存中的存放顺序是: 按先行后列的顺序依次存放,例T7-3-1.c main( ) int i, j, a23;for(i=0; i2; i+)for(j=0; j3; j+)scanf(“%d”, ,输入:1 3 5 7 9 11 输出:&a00=ffce a00=1 &a01=ffd0 a01=3&a02=ffd2 a02=5&a10=ffd4 a10=7&a11=ffc6 a11=9&a12=ffd8 a12=11,7.2.2 二维数组

9、的引用 形式:数组名下标下标 其中:下标是整型或字符型的常量,变量或表达式。(定义时不能使用变量)如: a12 aij 1.数组元素可出现在表达式中,如: a12=a22/2 也可以被赋值,因为就相当于是一个普通变量 2.使用数组元素时,应注意不要超出其定义的范围;如: int a23; a23=5; 再次强调:请严格区分定义时的a23及引用时的a23,7.2.3 二维数组的初始化 1.按行给二维数组赋初值如: int a23=1,2,3,4,5,6;2.按数组元素排列的顺序赋初值 如:int a23=1,2,3,4,5,6; 3.对部分元素赋初值,按行赋值较直观 如:int a23=2,5,

10、3; 请写出int a34=1,5,6; 请写出int a34=1, ,9; 适用于0元素较多的数组,4.全部元素赋值时,第一维下标可省略,但第二维不可以省 如: int a 3=1,2,3,4,5,6 ; 提问:为什么2维不可以省? int a 2 3=1,2,3,4,5,6 ,7 ;编译会报错 也可对部分元素赋初值而省略第一维的长度,但必须分行赋,否则系统不知道有多少行了 又如:int a 4=0,0,3,0,0,10;,若此处加7 ?则作为3行3列处理,7.2.4 二维数组程序举例(同学们自己思考) 例T7-4 将一个二维数组的行和列元素互换,存到另一个二维数组中,T7-4.c两数组行列

11、互换 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(“%4d”, aij); bji=aij;printf( n”); printf(“array b: n”); for(i=0;i=2; i+) for(j=0;j=1;j+) printf(“%4d”,bij); printf(“ n”); ,例T7-5.c 有3 4矩阵,求出其中最大元素及所在的行号和列号 main( ) int i, j, r=0,c=0, max; int a34=1,

12、2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for(i=0;imax) max=aij; r=i;c=j printf(“max=%d,row=%d, colum=%dn”,max,r,c); ,运行结果: max=10,row=2,colum=1 问题:在比较前 为什么要把a00赋给max?,7.3 字符数组(先看p53) 字符型数组:用于存放字符型数据。 一维字符数组:存放一个字符串(每个数组元素存放一个字符) 二维字符数组:存放多个字符串(行数是字符串的个数) 7.3.1 字符数组的定义 形式:char 数组名常量表达式 char 数组名常量表达式常量表达式

13、常量表达式:整、字符、符号常量。 例: char a5; int a5也可以a0=C; a1=H;a2=I; a3=N; a4=A;,7.3.2 字符数组的初始化 如:char a5=C, H, I, N, A;char b5=C, H, I, N, W, U; 编译时将指出:初始化值太多char c5=C, H, I;char d =C, H, I, N, A 系统自动确认其长度为5,7.3.3 字符数组的引用 例T7-6.c 输出一个字符串 main( ) char c10=I, _, a, m, _, h, a, p, p, y;int i;for(i=0;i10;i+) printf(

14、“%c”, ci); printf(“ n”); ,运行结果: I_am_happy,T7-7.C输出一个钻石图 main() char diamond5= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; int i; int j; for (i=0;i5;i+)控制行for(j=0;j5;j+)控制列printf(“%c“,diamondij);printf(“n“); ,7.3.4 字符串和字符串结束标志 几点说明: (1)字符串:用双引号括起的若干字符,可将其存放在一维或两维字符型数组中。C中,是将字符串作为数组来处理的 (2)字符串结束标志为: 0 (既无

15、动作,又不显示)如printf(“I am a boyn”); (3)长度的计算:第一个 0以前字符的个数 (4)在字符型数组或字符串中遇 0,即认为该字符结束; (5)可用字符串常量对字符型数组初始化 如:char c =“ I_am_happy” ; 系统自动在数组的最后加了 0 ,长度为11 或 char c =“ I_am_happy”; 系统自动在数组的最后加了 0 ,长度为11,相当于 c = I,_,a,m,_,h,a,p,p,y, 0; 而 char c10=“CHINA ” 注意:输出时遇到第一个 0 结束; 例T7-7-1.c main( ) char a = a, b,

16、0, 1, 2;char b =“ab 0cd” ; (以上两种存储上有区别吗) printf (“%s n%s n”, a,b); ,运行结果: a b a b,7.3.5 字符数组的输入输出 1.字符数组的输出:,例T7-7-2.c main( ) int i;char a10= “CHINA” ;char b18=“CHINA0CHINA0CHINA” ; for(i=0;i10;i+) printf(“%c”,ai); printf (“ n”); printf (“%s n”,a); /* ai错误!*/ for(i=0;i18;i+) printf (“%c”, bi); prin

17、tf(“ n”); printf (“%sn”,b); ,运行结果: CHINACHINACHINA_CHINA_CHINACHINA,注意: (1)%s格式输出时,遇第一个 0时结束; (2)%c格式输出时,按指定的长度输出,当遇 0 时输出_ ; (3)%s格式输出字符型数组元素时,如printf (“%s” , a2);编译时虽然无错,但输出的是不可确定的字符,因此,这里必须是数组名; 2.字符数组的输入 形式:scanf (“ %s” , a); 思考:若改成 从键盘输入china回车(注意长度) 内存中则为c h i n a 0,例T7-7-3.c 输入函数中为多个字符型数组输入字符

18、串 main( ) char a15, a25, a35; scanf (“%s%s%s”,a1, a2, a3); printf(“a1=%s na2=%s na3=%s n”,a1, a2, a3); printf (“ ,说明: (1)用scanf函数输入 多个字符串时,可用_, , Tab分隔。 (2)在printf里,我们用%s输出字符型数组的内容;而用%x,或%o可输出字符型数组的首地址。(与13页有何区别?),输入: how_are_you? 输出:a1=how a2=are a3=you? &a1=ffcc &a2=ffd2 &a3=ffd8,说明,1、见书上图7.12,说法与

19、本幻灯不符,有待考证 2、char str13;scanf(“%s”,str)输入 How are you?回车,内存中为 How0,而非想象的How are you?0.,7.3.6 字符串处理函数(不需要#include) 1.字符串输出函数 形式: puts(字符数组名或字符串) 功能:输出一个字符串, 且将 0换成 n 。 例T7-7-4.c main( ) char a1 =“china nbeijing” ;char a2 =“china 0beijing” ;/*可包含转义字符*/puts(a1); puts(a2); puts(“WUHAN” ); ,运行结果: china b

20、eijing china WUHAN,这里是将 0 n 因此光标移 到下行,2. 字符串输入函数 形式: gets(字符数组名) 功能: 从键盘输入一个字符串到字符数组。并得到一个函数值,该值是数组的首地址(不关心)。 如gets(str);输入china回车 则内存中china0 在输入过程中,遇“” 结束,并将其转换为 0 存入字符串尾部,对输入的_, Tab 作为字符存入字符型数组中(这个和sanf有很大区别,scanf是将_作为字符串结束标志。,例T7-7-5.c 用gets 和scanf 函数分别输入字符串,在scanf 中遇_ 字符串便结束了, 而gets 中,却将_ 作为字符存入

21、字符型 数组中。 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_beijinga2=china,特别提示,gets和puts只能输入输出一个字符串,不允许输入输出多个 如:puts(str1,str2);错误,3.字符串连接函数 形式:strcat(字符数组1,字符数组2) 功能:连接两个数组中的字符串。 操作:把字符数组2 (串2)中的内容连接到字符数组1的后

22、面,结果是两串相加存放到字符数组1中,使用时要考虑字符数组1的容量要足够大。并得到一个函数值,组1的首地址(不关心),例T7-7-6.c main( ) char str130=“Peoples_Republic_of_” ;思考:30能取消吗char str2 =“china” ;printf(“%s n”, strcat(str1, str2); 注意:1、连接时会自动取消组1后的0,4.字符串拷贝函数 形式:strcpy(字符数组1,字符串或字符数组2) 功能:将字符串2(也可以是字符数组)拷贝到字符数组1中,字符数组1中原来的内容被覆盖。 例T7-7-7.c main( ) char

23、a18, a2 =“ china”, a3 =“wuhan” ; strcpy(a1, a2); strcpy(a2, a3); strcpy(a3, “ beijing” ); printf(“a1=%s na2=%s na3=%s n”, a1,a2,a3); ,运行结果: a1=chinaa2=wuhana3=beijing?,注意: 1、组1的空间要足够大 2、组1必须用数组名形式,组2可以是字符串常量 3、复制时连同后面的0一起复制过去了 4、字符串拷贝不能用赋值运算符 “=”;如:char a110,a210=“china”;a1=a2或a1=“china”只能用strcpy(a1

24、,a2); 5、字符数组的元素可用赋值运算符, 如:a11=a21; 6、字符数组只有在初始化时可用“=” ,其它地方对字符数组赋值时不能用“=”; 7、strcpy(a1,a2,2);将a2的前2个字符复制过去再加一个0,5.字符串比较函数 形式:strcmp(字符串1,字符串2) 功能:两串按Ascii码值从左向右逐个比较,直到出现不同字符或 0 为止; 若全部相等,才认为相等,否则以第一个不相等的字符比较结果为准,“a” ”A”( a A? ) “ compare” “ compAre” 英文之间技巧:小写比大写“大”,后面的比前面的“大” 比较结果: (1) 串1 = = 串2 返回值

25、为0(2) 串1 串2 返回值为正数 其值是Ascii码的差值(3) 串1 串2 返回值为负数其值也是Ascii码的差值,例T7-7-8.c 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); ,运行结果: i=21 i=w-b=119-98=21 j=-8 j=c-k=99-107=-8 k=0 k=b-b

26、=98-98=0,说明,1、注意:两字符串比较不能用“=” 运算符, 虽然编译无错,但结果不对 if(a1=a2)printf(“yes”)错误!怎么改? 2、填空 “1+2” ? “!#¥”,6.求字符串长度函数 形式:strlen(字符数组) 功能:检测字符串长度,返回字符串长度值,不包括 0 ; 例T7-7-9.c main( ) char a110=“ china” ; printf (“%d n”,strlen(a1); printf (“%d n”, strlen(“beijing 0wuhan”); ,运行结果:57,7.大小写字母转换函数:strlwr(字符串) 8.小大写字母

27、转换函数:strupr(字符串) 例T7-7-10.c main( ) char a16=“CHinA”, a2 =“wuHAn” ; printf (“%s n”,strlwr(a1); printf (“%s n”,strupr(a2); ,运行结果:chinaWUHAN,备注,使用以上字符串函数时最好加个头文件string.h,但也可以不加,看是什么系统。,7.3.7 字符数组应用举例(请同学自己思考) 例T7-8.c 输入一行字符,统计单词数,单词间用_ 分隔。 main( ) char s81; int i, n=0, w=0; char c; gets(s); for(i=0;(c=si)!= 0 ; i+) if(c=_ ) w=0; else if(w=0) w=1; n+; printf(“There_are_%d words_in_the_line n”, n); ,输入:I_am_a_boy. 输出:There_are_4_word_in_the_line,其中: n: 统计单词数 w: 单词标志,在单词中为1,出了单词为 0 i: 11,看个考点题,main() char a80=“AB”,b80=“LMNP”; Int i=0; Strcat(a,b); While (ai+!=0) bi=ai; Puts(b);答案:ABLMNP错误LBLMNP正确,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报