《工学chapter7数组》由会员分享,可在线阅读,更多相关《工学chapter7数组(65页珍藏版)》请在金锄头文库上搜索。
1、 工学工学chapter7-chapter7-数数组 计算机教研室 田晓梅程序设计语言程序设计语言? 这些数据如何存放才便于排序82945637617188888888881111111111111118 8 88888888问题问题1 1:给一组数排序,这组数该如何存放?给一组数排序,这组数该如何存放? 计算机教研室 田晓梅程序设计语言程序设计语言问题问题2 2:输入:输入100名学生某门课程的成绩,要求将名学生某门课程的成绩,要求将高于平均分高于平均分的那些成绩打印出来。的那些成绩打印出来。1.用读入一个数就累加一个的办法来求出学生的总分;用读入一个数就累加一个的办法来求出学生的总分;2但
2、只有读入全部学生的分数后才能求得平均分;但只有读入全部学生的分数后才能求得平均分;3所所以以必必须须将将100个个学学生生的的成成绩绩全全部部都都保保留留下下来来,然然后后逐逐个个和和平均分比较,把高于平均分的成绩打印出来。平均分比较,把高于平均分的成绩打印出来。所所以以保保留留学学生生的的成成绩绩必必须须用用100个个变变量量s1,s2,s100,average用用来来存存放放平平均均分分,需需要要100条条语语句句来来判判断断学学生生的的成成绩是否高于平均分。绩是否高于平均分。如何解决这类问题?如何解决这类问题? 一个班学生的成绩一个班学生的成绩一行文字一行文字一个矩阵一个矩阵这些数据的特
3、点是这些数据的特点是:1.1.具有相同的数据类型具有相同的数据类型 2.2.使用过程中需要保留原始数据使用过程中需要保留原始数据 计算机教研室 田晓梅程序设计语言程序设计语言C中的数据类型中的数据类型数据类型数据类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型(void)整型整型字符型字符型实型(浮点型)实型(浮点型)枚举类型枚举类型(enum*)数组类型数组类型结构体类型结构体类型(struct*)共用体类型共用体类型(union*) 计算机教研室 田晓梅程序设计语言程序设计语言数数 组组 在在程程序序设设计计中中,把把具具有有相相同同类类型型的的若若干干变变量量按按有有序序
4、的的形形式式组组织织起起来来,以以满满足足某某些些复复杂杂问问题题的的需需要要,这这些些按按序序排排列列的的同同类类型数据型数据元素的集合称为元素的集合称为数组数组。C语言数组类型有三个特点语言数组类型有三个特点:一一、数数组组元元素素的的个个数数必必须须是是确确定定的的,不不允允许许变变动动,但但元元素素的的值值可变,数组元素可由可变,数组元素可由数组名与下标数组名与下标来直接访问;来直接访问;二二、数数组组元元素素类类型型必必须须相相同同,它它们们在在内内存存中中占占据据的的地地址址空空间间是是连续的连续的;三、三、各元素可作为基本变量使用各元素可作为基本变量使用。数组元素可以是任何一种数
5、据类型,按类型分为:数值数数组元素可以是任何一种数据类型,按类型分为:数值数组、字符数组、指针数组、结构数组等。组、字符数组、指针数组、结构数组等。 计算机教研室 田晓梅程序设计语言程序设计语言数数 组组上例中若采用数组来解决,程序将十分简单:上例中若采用数组来解决,程序将十分简单:floats100,sum,average;inti;for(i=0;i100;i+)scanf(”%f”,&si);/对于数组中的元素逐个输入值对于数组中的元素逐个输入值sum+=si;/求和求和average=sum/100;for(i=0;i=average)printf(”s%d=%f”,i,si); 计算
6、机教研室 田晓梅程序设计语言程序设计语言主要内容主要内容7.1一维数组的定义和引用一维数组的定义和引用7.2二维数组的定义和引用二维数组的定义和引用7.3字符数组字符数组小结小结练习练习提示:预习第八章提示:预习第八章 计算机教研室 田晓梅程序设计语言程序设计语言一、一维数组的定义一、一维数组的定义1定义方式为:定义方式为:存储类型存储类型类型说明符类型说明符数组名数组名常量表达式常量表达式=初始值初始值;如:如:inta10;floatscore30;7.1一维数组的定义和引用一维数组的定义和引用2定义规则:定义规则:(1)数组名遵循标识符命名规则数组名遵循标识符命名规则,但不与其它变量同名
7、;但不与其它变量同名;如如inta,a10;(2)数组的下标应用方括号括起来,而非();)数组的下标应用方括号括起来,而非();(3)常量表达式表示元素的个数,即数组的长度;)常量表达式表示元素的个数,即数组的长度;(4)常量表达中可包含)常量表达中可包含常量常量和和符号常量符号常量,但不能包含,但不能包含变变量量,即数组的大小不能动态定义;,即数组的大小不能动态定义;(5)数组定义前不允许有执行语句;)数组定义前不允许有执行语句; 计算机教研室 田晓梅程序设计语言程序设计语言#defineN5intaN,d;floatn=5,bn;intc2*2;inti;scanf(”%d”,&i);in
8、tdi;数组说明中其他常见的错误:数组说明中其他常见的错误:floata0; /*数组大小为数组大小为0没有意义没有意义*/intb(2);/*不能使用圆括号不能使用圆括号*/例例7-2判断下列数组中的正误,并改正。判断下列数组中的正误,并改正。数组定义时不能用变量说明数组大小数组定义时不能用变量说明数组大小不能与变量同名;不能与变量同名;不允许数组定义前有执行语句不允许数组定义前有执行语句 计算机教研室 田晓梅程序设计语言程序设计语言数数组组元元素素占占用用连连续续的的存存贮空间贮空间,如,如一维数组:一维数组:floatmark100; 数数组组名名代代表表存存储储空空间间的的首首地地址址
9、,mark代代表表该该数组的首地址。数组的首地址。每个数组元素占用每个数组元素占用的字节数,就是的字节数,就是基基类型类型的字节数的字节数,float型一个元素型一个元素占占4个个字节字节mark0mark1mark2mark3.mark9986.592.077.552.0.94.0低地址低地址高地址高地址3.一维数组在内存中的存放一维数组在内存中的存放 计算机教研室 田晓梅程序设计语言程序设计语言数数组组中中的的每每个个元元素素只只能能逐逐个个被被引引用用,而而不不能能一一次次引引用用全部数组元素全部数组元素1.1.数组元素的引用方式数组元素的引用方式引用形式:引用形式:数组名数组名下标下标
10、如如:inta8;a0=a3+a4-a2*3;其中下标可为其中下标可为整型常量或整型表达式,表达式中可整型常量或整型表达式,表达式中可包含变量包含变量。数组元素的下标固定从数组元素的下标固定从0开始,数组开始,数组下标下下标下限为限为0,下标上限为下标上限为数组长度减数组长度减1。C语言编译系统语言编译系统不进行数组边界检查不进行数组边界检查,保证数组元素引,保证数组元素引用时不超界是编程人员的职责。用时不超界是编程人员的职责。二、一维数组的引用二、一维数组的引用 计算机教研室 田晓梅程序设计语言程序设计语言例例7-3输出输出5个学生的成绩中大于个学生的成绩中大于80分的成绩分的成绩#incl
11、udevoidmain()inti;floatscore5;for(i=0;i5;i+)scanf(”%f”,&scorei);/*逐个输入各元素的值逐个输入各元素的值*/for(i=0;i=80)printf(”%8.2f”,scorei); 运行结果如下:运行结果如下:63.2 56.3 78.9 95 6363.2 56.3 78.9 95 63 95.00 95.00 计算机教研室 田晓梅程序设计语言程序设计语言初始化初始化指在指在定义时指定初始值定义时指定初始值,编译时将初始值赋给数组元素编译时将初始值赋给数组元素。赋值赋值是指使用赋值语句,在运行时将值赋给数组元素。是指使用赋值语句
12、,在运行时将值赋给数组元素。1定定义义数数组组的的同同时时可可以以进进行行初初始始化化,但但必必须须针针对对数数组组元元素素逐逐个个进行,而不能给数组整体赋初值。进行,而不能给数组整体赋初值。如:如:inta10=1,2,3,4,5,6,7,8,9,10;数组元素的初值依次放在一对大括号内。数组元素的初值依次放在一对大括号内。2 可可 以以 只只 给给 部部 分分 元元 素素 初初 始始 化化 ; 如如 : inta10=1,2,3,4,5;后后5个元素值为?个元素值为?3若整个数组的初值相同,也只能一一初始化;若整个数组的初值相同,也只能一一初始化;如:如:inta10=1,1,1,1,1,
13、1,1,1,1,1;1*10三、一维数组的初始化三、一维数组的初始化 计算机教研室 田晓梅程序设计语言程序设计语言4对全部数组元素初始化时,可以不指定数组长度,对全部数组元素初始化时,可以不指定数组长度,但但不能省略。不能省略。如:如:inta=1,2,3,4,5,6,7,8,9,10;系统自动定义长度为系统自动定义长度为105数数组组定定义义后后,若若全全部部数数组组元元素素在在使使用用前前未未赋赋值值,则则该该数数组组元元素素的的值值不不确确定定。若若数数组组元元素素部部分分初初始始化化,则则未未初始化部分元素值为初始化部分元素值为0。如如inta10,b10=1,2,3,4;一维数组的初
14、始化一维数组的初始化 计算机教研室 田晓梅程序设计语言程序设计语言例例7-4输入十个整数,按由小到大的顺序输出。输入十个整数,按由小到大的顺序输出。 1起泡法(或称为冒泡法)排序起泡法(或称为冒泡法)排序第第一一趟趟比比较较经过第一趟经过第一趟(共共5次比较与交换次比较与交换)后,最大的数后,最大的数9已已”沉底沉底”,然后进行对余下的前面然后进行对余下的前面5个数第二趟比较。个数第二趟比较。四、一维数组应用举例四、一维数组应用举例 计算机教研室 田晓梅程序设计语言程序设计语言如果有如果有n个数,则要进行个数,则要进行n-1趟比较。在第趟比较。在第1趟比较趟比较中要进行中要进行n-1次两两比较
15、,在第次两两比较,在第j趟比较中要进行趟比较中要进行n-1-j次两两比较。次两两比较。起泡法排序第第二二趟趟比比较较 计算机教研室 田晓梅程序设计语言程序设计语言程序流程图如下:程序流程图如下: 计算机教研室 田晓梅程序设计语言程序设计语言#includevoidmain()inti,j,t,a10;printf(Inputintegernumbers:n);for(i=0;i10;i+)scanf(%d,&ai);for(j=0;j9;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;printf(Thesortednumbersis:n);for(i=0;i10;i
16、+)printf(%d,ai);printf(n);问题:问题:从从10个排序扩展到个排序扩展到n个数排序(个数排序(n已知),如已知),如何修改程序?何修改程序?#defineN20NNN-1N-1N程序运行结果如下:程序运行结果如下:Inputintegernumbers:23412357656-58874-45686 Thesortednumbersis:-456-584122335567686874 计算机教研室 田晓梅程序设计语言程序设计语言2选择法排序选择法排序 指指导导思思想想:不不急急于于调调换换位位置置,而而是是记记下下当当前前所所扫扫视视过过的的最最小数所在的位置,小数所在
17、的位置,ap就是就是10个数中最小的那个数。个数中最小的那个数。然然后后重重复复此此算算法法,每每重重复复一一次次,进进行行比比较较的的数数列列向向后后移移动动一一个个位位置置,即即第第2遍遍从从第第2到到第第n个个数数进进行行比比较较,将将ap与与a2对对调调,此此过过程程重重复复n-1次次,即即可可将将数数组组中中的的n个个数按从小到大的顺序排序。数按从小到大的顺序排序。这种排序方法称为这种排序方法称为选择法选择法。98540126781566pppp09p 计算机教研室 田晓梅程序设计语言程序设计语言选择法排序输入输入n个数给个数给a0aN-1forj=0toN-1p=jfori=j+1
18、toN-1aiapYNp=iap与与aj交换交换输出输出a0aN-1#include#defineN10voidmain()intaN,i,j,p,t;printf(Input10integernumbers:n);for(i=0;iN;i+)scanf(%d,&ai);for(j=0;jN-1;j+)p=j;for(i=j+1;iN;i+)if(aiap)p=i;if(p!=j)t=aj;aj=ap;ap=t;printf(Thesortednumbers:n);for(i=0;iN;i+)printf(%d,ai);printf(n); 计算机教研室 田晓梅程序设计语言程序设计语言7.2
19、二维数组的定义和使用二维数组的定义和使用 一、二维数组的定义一、二维数组的定义 1一般形式:一般形式:存存储储类类型型类类型型说说明明符符数数组组名名常常量量式式1常常量量式式2=初初始值始值;如:如:inta43,f45;定义定义a、f为二维数组为二维数组不能写成不能写成floata4,3,b4,5; 计算机教研室 田晓梅程序设计语言程序设计语言(1)同同一一维维数数组组一一样样,表表达达式式中中可可包包含含常常量量和和字字符符常常量量,但不能包含变量。但不能包含变量。(2)二维数组也可以理解为定义了多个一维数组,)二维数组也可以理解为定义了多个一维数组,如:如:inta43;2 2定义时注
20、意:定义时注意:a0:a00a01a02a0a1a2a3所以可将所以可将a看作特殊的一维数组,其中每个元素又为看作特殊的一维数组,其中每个元素又为一维数组。一维数组。 计算机教研室 田晓梅程序设计语言程序设计语言(3)二维数组的存放顺序)二维数组的存放顺序二维数组中的元素在存储时实行二维数组中的元素在存储时实行按行存放按行存放,即在内存中先,即在内存中先顺序存放第一行的元素,再存放第二行的元素。顺序存放第一行的元素,再存放第二行的元素。地址地址地址地址 值值值值 数组元素数组元素数组元素数组元素b00b01b02b10b11b12b20b21b223003000 0H H3003002 2H
21、H3003004 4H H3003006 6H H3003008 8H H300300A AH H300300C CH H300300E EH H30301010H H123456789例如:例如:shortb33=1,2,3,4,5,6,7,8,9; 计算机教研室 田晓梅程序设计语言程序设计语言1表示形式为:表示形式为:数组名数组名下标下标下标下标同样,数组的下标同样,数组的下标下限为下限为0,上限为,上限为常量表达式的值减常量表达式的值减1。2下下标标也也可可用用整整型型表表达达式式来来表表示示,但但下下标标值值应应在在已已定定义义的的数数组大小的范围内。保证下标不超界是编程者的责任。组大
22、小的范围内。保证下标不超界是编程者的责任。如:下列引用是否正确:如:下列引用是否正确:inta43;a1+26-3=4;a42=10;a4-22=a32-a12;3数组元素可用于表达式中,也可用于赋值。如上例中。数组元素可用于表达式中,也可用于赋值。如上例中。4注意定义时的注意定义时的a43与引用时的与引用时的a43的区别:的区别:?定义的定义的a43数组中有无数组中有无a43元素?元素?二、二维数组的引用二、二维数组的引用 计算机教研室 田晓梅程序设计语言程序设计语言可以用下面可以用下面4种方法对二维数组初始化:种方法对二维数组初始化:数据类型数据类型数组名数组名常量表达式常量表达式1常量表
23、达式常量表达式2=初始化数据初始化数据;1按行初始化:每一行的数据用括号括起来按行初始化:每一行的数据用括号括起来inta43=1,2,3,4,5,6,7,8,9,10,11,12;2按顺序初始化按顺序初始化inta43=1,2,3,4,5,6,7,8,9,10,11,12;所有数据在一个花括号内,按数组元素排列的顺序对各元所有数据在一个花括号内,按数组元素排列的顺序对各元素赋初值,但容易遗漏。素赋初值,但容易遗漏。三、二维数组的初始化三、二维数组的初始化 计算机教研室 田晓梅程序设计语言程序设计语言1 0 0 01 0 0 05 0 0 0 5 0 0 0 9000也可以对各行中的某一元素赋
24、初值,如也可以对各行中的某一元素赋初值,如inta34=1,0,6,0,0,0,11;1 0 0 01 0 0 00 6 0 00 6 0 00 00 0 110 0 11 1 0 0 01 0 0 05 6 0 0 5 6 0 0 0000也可以只也可以只对对某几行元素某几行元素赋赋初初值值。如。如:inta34=1,5,6;.可以对部分元素赋初值:可以对部分元素赋初值:按行用括号括起来按行用括号括起来例如:例如:inta34=1,5,9; 计算机教研室 田晓梅程序设计语言程序设计语言.如果对全部元素都赋初值,则定义数组时对第一维如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,
25、但第二维的长度不能省。即的长度可以不指定,但第二维的长度不能省。即可以可以省略行下标,但列下标不能省省略行下标,但列下标不能省。例如:例如:inta34=1,2,3,4,5,6,7,8,9,10,11,12;它它等价等价于于:inta4=1,2,3,4,5,6,7,8,9,10,11,12;在定义时也可以只对部分元素赋初值而省略第一维的在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。长度,但应分行赋初值。例如:例如:inta3=1,5,6,9,11;1005609110 计算机教研室 田晓梅程序设计语言程序设计语言例:判断正误:例:判断正误:inta34=1,2,3,4,5
26、,6,7,8,9,10,11,12;intb3=1,2,3,4,5,6,7,8,9,10,11,12;intc3=1,2,3,4,5,6,7,8,9,10,11,12;intd=1,2,3,4,5,6,7,8,9,10,11,12;inte23=1,2,8;intf2=1,2,3,8; 计算机教研室 田晓梅程序设计语言程序设计语言四、二维数组应用举例四、二维数组应用举例 例例7-5分分析析下下列列程程序序,当当运运行行时时输输入入:123456 后,运行结果为:后,运行结果为:。#includevoidmain()inti,j,a23;for(i=0;i2;i+)for(j=0;j3;j+)s
27、canf(%d,&aij);printf(na%d%d=%d,i,j,aij);运行结果:运行结果:123456a00=1a01=2a02=3a10=4a11=5a12=6 计算机教研室 田晓梅程序设计语言程序设计语言例例7-6改错:下列程序求改错:下列程序求2个个3*3矩阵对角矩阵对角线之和,不增加语句,改正程序中的错误。线之和,不增加语句,改正程序中的错误。#includevoidmain()inta3=1,2,4,0,5,7;intj,k,b3,3;intsum1=sum2=0;for(j=1;j=3;j+)for(k=1;k=3;k+)scanf(”%d”,bjk);for(k=1;k
28、=3;k+)sum1+=akk;sum2+=bkk;printf(”%d,%f”,sum1,sum2);a3=1,2,4,0,5,7;b33sum1=0,sum2=0;j=0;j3k=0;k3&bjkk=0;k3%d 计算机教研室 田晓梅程序设计语言程序设计语言N-S流程图表示算法流程图表示算法如下:如下:例例7.7:有一个有一个34的矩阵,要求编程序求出其中值的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。最大的那个元素的值,以及其所在的行号和列号。 计算机教研室 田晓梅程序设计语言程序设计语言#includevoidmain()inti,j,row=0,col=0,
29、max;inta34=3,5,7,9,65,346,24,-12,45,-8,33,100;max=a00;for(i=0;i3;i+)for(j=0;j4;j+)if(maxaij)max=aij;row=i;col=j;printf(max=%d,row=%d,col=%dn,max,row,col);例例7.7程序程序 计算机教研室 田晓梅程序设计语言程序设计语言7.3字符数组字符数组一、字符数组的定义一、字符数组的定义二、字符数组的初始化二、字符数组的初始化三、字符数组的引用三、字符数组的引用四、字符串和字符串结束标志四、字符串和字符串结束标志五、字符数组的输入输出五、字符数组的输入输
30、出六字符串处理函数六字符串处理函数七、字符数组应用举例七、字符数组应用举例 计算机教研室 田晓梅程序设计语言程序设计语言一、字符数组的定义一、字符数组的定义用用来来存存放放字字符符数数据据的的数数组组称称为为字字符符数数组组,一一个个元元素素存存放放一一个个字字符符。常常作作为为一一个个独独特特的的数数据据结结构构,专专门门用用来来存存放放字字符符串串,因此它与数值数组在许多方面有所不同。,因此它与数值数组在许多方面有所不同。字符数组的定义,如:字符数组的定义,如:charc110;或或intc210;charc3103;注意注意:字符数组和整型数组可以互相通用,但有时会出现字符数组和整型数组
31、可以互相通用,但有时会出现错误;另外,若用错误;另外,若用int数组存放字符常量,会造成很大的数组存放字符常量,会造成很大的内存空间浪费。内存空间浪费。 计算机教研室 田晓梅程序设计语言程序设计语言1定定义义时时进进行行初初始始化化:同同一一般般数数组组一一样样逐逐个个进进行行赋赋值值(赋赋字字符序列符序列)一维数组一维数组:charc10=I,a,m,h,a,p,p,y;或者或者省略下标省略下标二维数组二维数组:chardiamond55=,*,*,*,*,*,*,*,*;二、字符数组的初始化二、字符数组的初始化 计算机教研室 田晓梅程序设计语言程序设计语言2用字符串赋初值:用字符串赋初值:
32、(不同于数值型数组)(不同于数值型数组)charc4=”cat”;或者或者charc4=”cat”;charch6=”China”,”Japan”,”Korea”;当当将将一一个个字字符符串串存存入入一一个个数数组组时时,系系统统在在有有效效字字符符末末尾尾多多加加0作作为为结结束束标标志志,因因而而用用字字符符串串赋赋值值比比用用字字符符逐逐个赋值要个赋值要多占一个字节多占一个字节。v字字符符数数组组定定义义时时已已确确定定元元素素个个数数而而未未初初始始化化,则则该该字字符符数数组组中中的的元元素素值值不不确确定定(随随机机);若若已已初初始始化化,其其余余为为空空字字符(符(0)。)。
33、计算机教研室 田晓梅程序设计语言程序设计语言三、字符数组的引用三、字符数组的引用可引用字符数组中的一个元素,得到一个字符,引用方法可引用字符数组中的一个元素,得到一个字符,引用方法与一般数值型数组相同。与一般数值型数组相同。例例7-8打印以下图案:(打印以下图案:(P153练习练习7.11)*#includevoidmain()chara=*;inti,j,k;for(i=0;i5;i+)printf(n);printf();for(j=1;j=i;j+)printf();for(k=0;k5;k+)printf(%c,ak); 计算机教研室 田晓梅程序设计语言程序设计语言#includevo
34、idmain()inti,j;chara6=China,Japan,Korea;for(i=0;i=2;i+)for(j=0;j5;j+)printf(%c,aij);printf(n); 运行结果:运行结果:ChinaJapanKorea 例例7-9写出下列程序的运行结果:写出下列程序的运行结果: 计算机教研室 田晓梅程序设计语言程序设计语言1在在C语言中,字符串作为字符数组来处理。语言中,字符串作为字符数组来处理。如定义一个数组来存放字符串,如如定义一个数组来存放字符串,如charc7=s,t,u,d,e,n,t;(长度为(长度为7)但但在在实实际际应应用用中中所所关关心心的的是是字字符符
35、串串的的有有效效长长度度,而而不不是字符数组的长度。如定义:是字符数组的长度。如定义:charc10=s,t,u,d,e,n,t;(数组长度为(数组长度为10,实际长度为,实际长度为7)。)。四、字符串和字符串结束标志四、字符串和字符串结束标志 计算机教研室 田晓梅程序设计语言程序设计语言2为为了了测测定定字字符符串串的的实实际际长长度度,C语语言言规规定定一一个个“字字符符串串结结束束标志标志”,以,以0代表代表。v有有字字符符串串结结束束标标志志后后,程程序序中中对对字字符符串串进进行行操操作作时时,就就不不以以字字符符数数组组长长度度为为依依据据,而而是是依依据据检检测测0的的位位置置来
36、来判判定定字字符符串串是否结束。是否结束。v0代代表表ASCII为为0的的字字符符,它它是是一一个个空空操操作作符符,只只是是一一个个供辨别的标志供辨别的标志。如。如”studyClanguage.”(共(共17个字符)个字符)v在在定定义义字字符符串串时时及及初初始始化化时时,既既可可以以逐逐个个赋赋值值,也也可可以以采采用用字字符符串串常常量量来来使使字字符符数数组组初初始始化化,但但用用字字符符串串比比逐逐个个赋赋值值长长度度长长1。 计算机教研室 田晓梅程序设计语言程序设计语言如:如:charc=”student”;或者或者charc=”student”;数数组组c的的长长度度为为8,
37、而而非非7,因因为为字字符符串串常常量量后后由由系系统统加加上上一一个个0,它等价于,它等价于charc=s,t,u,d,e,n,t,0;字符数组并不要求其最后一个字符为字符数组并不要求其最后一个字符为0,但由于系统对字,但由于系统对字符串常量自动加一个符串常量自动加一个0,为了处理方法一致,因而在字符,为了处理方法一致,因而在字符数组中常常人为地加上一个数组中常常人为地加上一个0。如:如:改错:改错:charc13=b,o,y;charc23=”boy”;charc33=”boy”;charc43=boy 计算机教研室 田晓梅程序设计语言程序设计语言例例7-10字符串的输出字符串的输出#in
38、cludevoidmain()charstr=Beijing;inti;for(i=0;stri!=0;i+)printf(”%c”,stri);/逐个字符输出逐个字符输出printf(n);printf(%s,str);1输出输出:有两种方法:有两种方法:(1)逐个字符输出:用格式符)逐个字符输出:用格式符”%c”,按字符序列输出,按字符序列输出(2)整个字符串一次输出:用)整个字符串一次输出:用”%s”格式符格式符/不同于数值数组不同于数值数组五、字符数组的输入输出五、字符数组的输入输出对对 应应 为为 字字符数组名符数组名对对应应为为字字符符数组元素数组元素 计算机教研室 田晓梅程序设计
39、语言程序设计语言(A)输出字符串不包括输出字符串不包括0;(B)用用%c输出输出:printf中的输出项是数组元素名;中的输出项是数组元素名;用用%s输输出出:在在printf的的输输出出表表列列中中,只只需需给给出出字字符符串串首首地地址址,用用字字符符数数组组名名表表示示,一一维维数数组组直直接接用数组名,二维数组可作为多个一维数组。用数组名,二维数组可作为多个一维数组。(C)若若数数组组长长度度大大于于字字符符串串实实际际长长度度,则则以以0为为结束标志结束标志,只输出实际的字符串。,只输出实际的字符串。(D)若)若字符数组中包括多个字符数组中包括多个0,以第一个为结束,以第一个为结束标
40、志标志。(3)注意:)注意: 计算机教研室 田晓梅程序设计语言程序设计语言(1)逐个字符输入:)逐个字符输入:用用%c按字符序列输入按字符序列输入(2)整个字符串输入:)整个字符串输入: 用用%s输入字符串输入字符串/不同于数值型数组不同于数值型数组2输入:有两种方法输入:有两种方法如:如:#includevoidmain()charc110,c210;for(i=0;i10;i+)scanf(”%c”,&c1i);/逐个输入字符逐个输入字符scanf(”%s”,c2);/输入字符串输入字符串对对 应应 为为 字字符数组名符数组名对对应应为为字字符符数数组元素的地址组元素的地址 计算机教研室
41、田晓梅程序设计语言程序设计语言3.说明说明(1)输输入入的的字字符符串串应应短短于于定定义义的的字字符符数数组组长长度度,系系统统自自动动加加0;(2)用一个用一个scanf输入多个字符串,则以输入多个字符串,则以空格、回车空格、回车分隔分隔(3)用用%s输入时,输入项中是字符数组名,输入时,输入项中是字符数组名,不加地址符不加地址符&。改错改错:charch10;scanf(”%c”,&ch);scanf(”%s”,&ch);scanf(”%s”,ch);(4)对于一维字符数组,用对于一维字符数组,用printf(”%o”,ch);可输出数组;可输出数组ch的起始地址的起始地址。u实际上实际
42、上printf(”%s”,ch);在执行时,按字符数组名;在执行时,按字符数组名ch找找到数组起始地址,然后逐个输出其中的字符,直到遇到到数组起始地址,然后逐个输出其中的字符,直到遇到0u注意注意:scanf函数以函数以回车回车、空格空格作为字符串结束标志。作为字符串结束标志。 计算机教研室 田晓梅程序设计语言程序设计语言分析下列程序的结果分析下列程序的结果例:例:charst15;printf(”Inputastring:”);scanf(”%s”,st);printf(”%s”,st);运行时输入:运行时输入:TurboC结果为?结果为?输出:输出:TurboWhy?如何解决?如何解决?解
43、决办法:(解决办法:(1)多设几个字符数组;)多设几个字符数组;(2)用)用gets函数。函数。 计算机教研室 田晓梅程序设计语言程序设计语言六字符串处理函数六字符串处理函数1.puts函数函数2.gets函数函数3.strcat函数函数4.strcpy函数函数5.strcmp函数函数6.strlen函数函数7.strlwr函数函数8.strupr函数函数 计算机教研室 田晓梅程序设计语言程序设计语言一般形式一般形式:puts(字符数组字符数组)作作用用:将将一一个个字字符符串串输输出出到到终终端端,包包括括转转义义字字符符(使用不多)(使用不多)charstr=”BeijingnOlympi
44、c”;puts(str);或者:或者:printf(”%s”,str);1.puts函数函数字符串输出函数字符串输出函数 计算机教研室 田晓梅程序设计语言程序设计语言u一般形式为:一般形式为:gets(字符数组字符数组)u作作用用:从从终终端端输输入入一一个个字字符符串串到到字字符符数数组组,并并且且得得到到一一个个函函数数值值(即即字字符符数数组组的的起起始始地地址址)。该该函函数数一一般般只只用用来来向向字字符数组输入字符串。如:符数组输入字符串。如:gets(str);输入:输入:Beijing(送给(送给str共共8个字符,包括个字符,包括0)u注注意意:puts、gets只只对对一一
45、个个字字符符串串操操作作,而而不不对对多多个个字字符符串串。gets函函数数在在回回车车为为结结束束标标志志。puts、gets函函数数使使用时要包含用时要包含stdio.h头文件头文件。2.gets函数函数字符串输入函数字符串输入函数 计算机教研室 田晓梅程序设计语言程序设计语言函数值为字符数组函数值为字符数组str的起始地址。一般利用的起始地址。一般利用gets函数函数的目的是向字符数组输入一个字符串,而不大关心其函数值。的目的是向字符数组输入一个字符串,而不大关心其函数值。注意:注意:用用puts和和gets函数只能输入或输出一个字符串,函数只能输入或输出一个字符串,不能写成不能写成pu
46、ts(str1,str2)或或gets(str1,str2)例:例:charst15;printf(”Inputastring:”);gets(st);printf(”%s”,st);运行时输入:运行时输入:TurboC结果为?结果为?输出:输出:TurboC说明说明: 计算机教研室 田晓梅程序设计语言程序设计语言一般形式一般形式:strcat(字符数组字符数组1,字符串字符串/字符数组字符数组2)头文件:头文件:string.h作用:连接两字符数组中的字符串,把字符串作用:连接两字符数组中的字符串,把字符串2连接到字符串连接到字符串1的后面,并删除串的后面,并删除串1后面的后面的0,结果放在
47、字符数组,结果放在字符数组1中,函中,函数调用后得到一个函数值数调用后得到一个函数值字符数组字符数组1的首地址的首地址。如:如:charstr130=”2008Olympic,”;charstr2=”BeijingChina”;printf(”%s”,strcat(str1,str2);结果:结果:2008Olympic,BeijingChina3.strcat函数函数字符串连接函数字符串连接函数说明:(说明:(1)不能直接用不能直接用“+”来进行连接来进行连接; (2)字符数组字符数组1必须足够大,以容纳新字符串必须足够大,以容纳新字符串; (3)连接前每个串后有连接前每个串后有0,连接后只
48、有一个,连接后只有一个0; 计算机教研室 田晓梅程序设计语言程序设计语言一般形式:一般形式:strcpy(字符数组字符数组1,字符数组字符数组2/字符串字符串2)作用是将字符串作用是将字符串2复制到字符数复制到字符数组组1中去。中去。例:例:charstr110,str2=”Beijing”;strcpy(str1,str2);4strcpy函数函数字符串复制函数字符串复制函数说明说明:(1)字符数组)字符数组1的长度应不小于字符串的长度应不小于字符串2的长度;的长度;(2)字符数组字符数组1必须写成必须写成数组名数组名形式,字符串形式,字符串2用字符数用字符数组名或字符串常量;组名或字符串常
49、量;(3)0一起复制;一起复制;(4)不能用赋值语句给字符数组赋字符串常量或字符数组)不能用赋值语句给字符数组赋字符串常量或字符数组。如:。如:str1=”Beijing”;str1=str2;()用赋值语句只能将一个字符赋给一个字符变量或字符数组元用赋值语句只能将一个字符赋给一个字符变量或字符数组元素。素。(5)扩展:将字符串)扩展:将字符串2中前中前n个字符复制到字符数组个字符复制到字符数组1中。中。strncpy(str1,str2,n); 计算机教研室 田晓梅程序设计语言程序设计语言改错改错:charstr110=”Beijing”,str210;str2=”Olympic”;str1
50、=str2;strcpy(str1,str2);strcpy(”2008”,str2);strcpy(str2,str1,4);strcpy(str2,”Olympic”);Strcpy(str1,str2);strcpy(str2,”2008”);strncpy(str2,str1,4); 计算机教研室 田晓梅程序设计语言程序设计语言v一般形式:一般形式:strcmp(字符串字符串1,字符串,字符串2)v作用:作用:比较字符串比较字符串1、字符串、字符串2的大小的大小v比比较较规规则则:对对两两个个字字符符串串自自左左至至右右逐逐个个字字符符相相比比较较(按按ASCII),直直到到出出现现不
51、不同同的的字字符符或或遇遇到到0为为止止。全全部部字字符符相相同,则认为相等;不同,则以第一个不相同的字符为准。同,则认为相等;不同,则以第一个不相同的字符为准。 ”Program”大于大于”People”,”English”小于小于”Language”v比较的结果由函数值带回:比较的结果由函数值带回:(1)相等,则函数值为)相等,则函数值为0;(2)串)串1大于大于串串2,则函数值为一正数;,则函数值为一正数;(3)串)串1小于小于串串2,则函数值为一负数;,则函数值为一负数; 当当两两字字符符串串进进行行比比较较运运算算时时,不不能能用用普普通通的的比比较较运运算算符符来来进进行行,而要用
52、函数来完成。而要用函数来完成。5.strcmp函数函数字符串比较函数字符串比较函数 计算机教研室 田晓梅程序设计语言程序设计语言一般形式一般形式:strlen(字符数组字符数组)作作用用:测测试试字字符符串串长长度度的的函函数数。函函数数的的值值为为字字符符串串中中的的实实际际长长度度(不包括不包括0在内在内)。如:如:charstr=”Olympic”;printf(”%d”,strlen(str);printf(”%d”,strlen(”Olympic”);所以该函数既可以测试字符串常量,也可以测试字符数所以该函数既可以测试字符串常量,也可以测试字符数组的长度。组的长度。6strlen函数
53、函数字符串长度函数字符串长度函数 计算机教研室 田晓梅程序设计语言程序设计语言一般形式:一般形式:strlwr(字符串字符串)作用:将字符串中大写字母换成小写字母。作用:将字符串中大写字母换成小写字母。8.strupr函数函数一般形式:一般形式:strupr(字符串字符串)作用:将字符串中小写字母换成大写字母。作用:将字符串中小写字母换成大写字母。7.strlwr函数函数 计算机教研室 田晓梅程序设计语言程序设计语言例例7-11字符串大小写转换函数的使用字符串大小写转换函数的使用#include#includevoidmain()chara=”Olympic”;strupr(a);printf
54、(”%sn”,a);strlwr(a);printf(”%sn”,a);运行结果:运行结果:OLYMPIColympic 计算机教研室 田晓梅程序设计语言程序设计语言七、字符数组应用举例七、字符数组应用举例例例7-12以下程序属于字符串及其函数的应用,改正其中的错误以下程序属于字符串及其函数的应用,改正其中的错误#includevoidmain() charstr1=Sheisastudent.;charstr26=Yes,sheis.,str320;scanf(%c,&str3);strcat(No,sheisnot.,str3);if(str2=str3)printf(%sn,str1);
55、else printf(%sn,str3);printf(%sn,str25);#includecharstr1=Sheisastudent.;str212=Yes,sheis.scanf(%s,str3);/gets(str3);strcat(str3,No,sheisnot.);(strcmp(str2,str3)=0)str1str3str2 计算机教研室 田晓梅程序设计语言程序设计语言例例7-13写出下列程序的运行结果写出下列程序的运行结果#include#includevoidmain() inti;chars10,st10;gets(st);for(i=0;i4;i+)gets(s
56、);if(strcmp(st,s)0)strcpy(st,s);printf(%sn,st); 输入:输入:C+BASICQUICKAdaPascal结果:结果:QUICK 计算机教研室 田晓梅程序设计语言程序设计语言注意流程注意流程图图中的中的问题问题(P151例例7.8)设设:字符串用:字符串用str81存放存放,单词计单词计数器数器为为num思路:思路:(1)输输入字符串入字符串(2)找第一个非空字符找第一个非空字符(3)计计数数(4)跳跳过过本本单词单词,即,即寻寻找空格或找空格或0(5)未未结结束束则转则转(2)例例7-14 7-14 输入一行字符,统计其中有多少单词,单输入一行字符
57、,统计其中有多少单词,单词之间用空格分隔。词之间用空格分隔。 计算机教研室 田晓梅程序设计语言程序设计语言#includevoidmain()inti=0,num=0;charstr81,c;printf(pleaseinputastring:n);gets(str);dowhile(c=stri)=)i+;if(c!=0)num+;while(c=stri)!=&c!=0)i+;while(c!=0);printf(numberofword:%dn,num);程序如下:程序如下:运行结果:运行结果:pleaseinputastring:helloworldnumberofword:21.能否
58、用能否用scanf(”%s”,str);输输入?入?2.if中的条件有何用?中的条件有何用? 计算机教研室 田晓梅程序设计语言程序设计语言一一维维数数组组、二二维维数数组组、字字符符串串的的正正确确定定义义、初初始始化化及及它它们们下下标的使用,这是应用数组的基础。标的使用,这是应用数组的基础。掌握常用算法。掌握常用算法。掌掌握握字字符符串串在在C语语言言中中作作为为字字符符数数组组处处理理,但但与与其其它它的的数数组组区区别别在在于于:在在字字符符串串中中,C语语言言规规定定了了一一个个“字字符符串串结结束束标标志志”,以,以0代表(代表(ASCII值为值为0)。)。掌握字符数组处理的相关函
59、数。掌握字符数组处理的相关函数。注意:注意:1字符和字符串外部表示不同。例如:字符和字符串外部表示不同。例如:charch=r;charch=”r”;必须使用字符数组存放字符串。必须使用字符数组存放字符串。小小结结 计算机教研室 田晓梅程序设计语言程序设计语言2用用字字符符数数组组存存放放字字符符串串时时,字字符符数数组组长长度度应应包包含含结结束束标标志符志符0。3所所有有数数组组在在编编程程时时自自己己注注意意下下标标超超界界问问题题,一一旦旦下下标标超超界界,这这时时编编译译和和连连接接并并不不出出错错,但但运运行行时时对对下下标标出出界界的的数数组元素引用,将给出不正确的值。组元素引用
60、,将给出不正确的值。4不能直接用不能直接用”+”连接两个字符串。连接两个字符串。5不能直接用关系运算符比较两个字符串的大小。不能直接用关系运算符比较两个字符串的大小。6不能直接用赋值语句将字符串赋给字符数组不能直接用赋值语句将字符串赋给字符数组小结小结 计算机教研室 田晓梅程序设计语言程序设计语言P1527.47.77.97.137.15练习练习2516123149275388532871252补充题:补充题:1.编程:用数组实现输入右表中的编程:用数组实现输入右表中的数字,然后将各行之和、各列之和数字,然后将各行之和、各列之和与所有数字之和填入表中并输出整与所有数字之和填入表中并输出整个表格的数据。(注意通用性)个表格的数据。(注意通用性)2.编程实现:将输入的十进制正整编程实现:将输入的十进制正整数数n转换为二进制数,并将转换结转换为二进制数,并将转换结果输出,转换方法为果输出,转换方法为”除二取余除二取余”。结束结束