(6)--ch6 C语言程序设计数组.ppt

上传人:奉*** 文档编号:96320752 上传时间:2023-11-02 格式:PPT 页数:93 大小:466.50KB
返回 下载 相关 举报
(6)--ch6 C语言程序设计数组.ppt_第1页
第1页 / 共93页
(6)--ch6 C语言程序设计数组.ppt_第2页
第2页 / 共93页
点击查看更多>>
资源描述

《(6)--ch6 C语言程序设计数组.ppt》由会员分享,可在线阅读,更多相关《(6)--ch6 C语言程序设计数组.ppt(93页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第6章 数组 核心术语核心术语n批量相同数据类型的数据管理n数据之间的关系n线性关系n树型关系n网状关系n存储n数组n动态变量n文件n处理n复合型数据类型n数组学习目标学习目标n掌握一维数组的定义、初始化及引用n掌握二维数组的定义、初始化及引用n理解数组元素在内存中的存放形式n掌握字符串的输入、输出和处理n熟练使用数组设计程序章节内容章节内容n6.1 班级英语成绩排名n6.1.1一维数组的定义n6.1.2一维数组元素的引用n6.1.3一维数组的初始化n6.1.4一维数组程序举例n6.2班级总成绩排名n6.2.1 二维数组的定义和引用n6.2.2 二维数组的初始化n6.2.3 二维数组程序举例n

2、6.3 搜索好友n6.3.1 字符数组的定义和引用n6.3.2 字符串和字符串结束标志n6.3.3 字符数组的输入输出n6.3.4 字符串处理函数n6.4 程序举例n6.5 旅客的航空逾重行李费用计算及查询6.1 班级英语成绩排序班级英语成绩排序n例6.1 输入一个班级30名学生英语成绩并对其排序(分析)。n对两名或三名学生的英语成绩进行排名,可以通过定义两个或三个变量进行比较来完成。对于30名学生的英语成绩,不可能定义30个变量进行排名,可以通过C语言提供的数组统一管理这30个成绩。假设数组名为a,成绩顺序存放到数组a中,每个成绩则由数组元素存储,如图所示,其下面一行数为成绩存储在数组中的序

3、号,也称为下标来区分不同元素,C语言通过数组名和下标访问每个成绩,例如,通过a0访问第一个学生的成绩a93060177285382467589686776891923 2475256626 27 289329786291666.1班级英语成绩排序班级英语成绩排序n排序:从下标为0的数组元素a0开始,在这30个成绩中,选择一个最高成绩存放在该元素中。然后,从剩下的29个元素中,挑选第二高成绩存放在a1中,这样一直到下标为28的元素,剩余的两个成绩,高成绩存放在下标为28元素中,低成绩存放在下标为29元素中,这样便完成了排序。n排序具体过程:n30个成绩的排序需要进行29次挑选,需要循环语句来处理

4、n每次挑选都是在剩余的数组中首元素依次与后面的元素对比,如果后面元素值大,则互换,该过程也需要一个循环语句来处理6.1班级英语成绩排名班级英语成绩排名#include#define N 30void main()int i,j,temp,aN;/*定义保存30个成绩的数组a*/printf(Please input class scores:n);for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN-1;i+)/*对a中30个成绩排降序*/for(j=i+1;jN;j+)if(aiaj)temp=ai;ai=aj;aj=temp;6.1班级英语成绩排序班级英语成绩排序p

5、rintf(class scores order:);for(i=0;iN;i+)/*按照6个成绩一行输出*/if(i%6=0)printf(n);printf(%3d,ai);6.1班级英语成绩排序班级英语成绩排序n程序运行结果如下:nPlease input class scores:n 93 60 77 85 82 67 89 86 76 91 54 78 88 72 76 n 82 72 49 58 66 71 74 89 78 91 75 66 62 66 93nclass scores order:n 93 93 91 91 89 89n 88 86 85 82 82 78n 78

6、 77 76 76 75 74n 72 72 71 67 66 66n 66 62 60 58 54 49n仅用一个下标即可确定数组元素的数组称为一维数组,如aN,需要由两个下标才可以确定数组元素的数组称为二维数组,需要由三个下标才可以确定数组元素的数组称为三维数组,C语言还可以定义四维、五维、六维等多维数组。6.1.1一维数组的定义一维数组的定义 n要使用数组,必须先在程序中定义数组,即通知计算机,该数组可以存放多少个元素,元素的数据类型是什么。一维数组定义的一般形式为:n数据类型符 数组名 整型常量表达式;n数组定义说明:n(1)数据类型符是指数组中所有元素的数据类型,可以是整型、实型、字

7、符型,也可以是以后要学习的数据类型。n(2)数组名是用户定义的标识符,代表整个数组,程序员通过它来使用数组(本质上它是分配给数组的连续内存空间的首地址,也是数组第一个元素的内存地址)n(3)“”是数组的标志,“”中间必须是整型常量或整型常量表达式,它决定了数组中数组元素的个数,也称为数组的长度。n(4)最后用分号结束。这个分号是绝对不能省略的。6.1.1一维数组的定义一维数组的定义 n例如:n int a10;/说明整型数组a,有10个元素。n float b10,c20;/说明实型数组b,有10个元素,n /实型数组c,有20个元素。n char ch20;/说明字符数组ch,有20个元素。

8、n对于数组类型说明应注意以下几点:n(1)数组类型实际上是指数组元素的类型。一个数组中,所有元素的数据类型是相同的,不能在一个数组中存放不同类型的数据。n(2)数组名的书写规则应符合用户标识符的命名规则。n(3)数组名不能与其它变量名相同。6.1.1一维数组的定义一维数组的定义 n(4)方括号中常量表达式表示数组元素的个数,如a5表示数组a有 5个元素,不能在方括号中用变量来表示元素的个数。n例如:n void main()n n int a3+2;n n n是合法的。但是下述说明方式是错误的。nvoid main()n int n=5;n int an;n n6.1.2 一维数组元素的引用一

9、维数组元素的引用 nC语言规定,数组是一组有序数据的集合,不能直接存取整个数组,只能使用数组的元素。数组元素是组成数组的基本单元,数组元素是变量,引用数组元素的方式为:数组名后跟一个下标,下标表示了元素在数组中的顺序号:n 数组元素的一般形式为:数组名下标n其中,下标必须是整型,可以是整型常量、变量或表达式。C语言规定,下标的下限为0,上限为数组长度减1。例6.1中定义的数组int a30,数组a每个元素的引用如下图所示。数组a93a060a177a285a382a467a589a686a776a891a9a2893a29666.1.2 一维数组元素的引用一维数组元素的引用 n数组元素通常也称

10、为下标变量,即由下标确定的变量。定义数组后,数组中每一个元素其实就相当于一个变量。对变量的一切操作同样适用于下标变量。在语言中只能逐个地使用下标变量,而不能一次引用整个数组。n例如,输出长度为10的整型数组a,通常使用循环语句逐个输出各下标变量:nfor(i=0;i10;i+)n printf(%d ,ai);n而不能用一个语句输出整个数组。下面的写法是错误的:nprintf(“%d”,a);/*其实输出的将是数组a在内存中的首地址*/6.1.2 一维数组元素的引用一维数组元素的引用 n例例6.2 对10个元素的整型数组,依次存放0、1、4、9、16、25、36、49、64、81,按照逆序输出

11、整个数组元素。n#include nvoid main()nn int i,a10;n for(i=0;i=0;i-)n printf(%3d,ai);nn程序执行结果如下:n81 64 49 36 25 16 9 4 1 06.1.2 一维数组元素的引用一维数组元素的引用 n本例中,用一个循环语句给a数组各元素赋值,然后用第二个循环语句输出a数组各元素的值。实际上,定义数组后,系统将给数组分配一定大小的内存单元,数组所占内存的字节数等于数组长度与元素的数据类型所占字节大小的积。例6.2中,数组a所占存储空间大小为10*4字节,第一个元素是a0,第二个元素为a1,.。假如a所占内存的首地址为5

12、000,则数组a在内存中存放形式如图6-3所示,其实数组名a就是地址5000。01491625364964815000500450085012501650205024502850325036aa0a1a2a3a4a5a6a 7a8a96.1.2 一维数组元素的引用一维数组元素的引用 n引用数组的“”是下标运算符,优先级最高,结合性为右结合。引用数组元素,实际上就是使用下标运算符计算数组元素的地址:nai的地址=数组的起始地址+isizeof(数组类型)n例6-2中,第5个数组元素a4的地址为5000+4*4=5016。如果数组的下标为12,则可以计算出地址为5000+12*4=5048,但是,

13、该地址不是C语言分配给该数组的,访问是非法的,对其读写有可能产生错误。对C语言来说,编译器不会检查数组的下标是否越界,需要读者自己检查。6.1.3一维数组的初始化一维数组的初始化 n数组定义后,它所占的存储单元中的值是不确定的,引用数组元素之前,必须保证数组的元素已经被赋予确定的值。在C语言中对一维数组的赋值有两种方法:第一种,通过赋值语句逐一给数组的每个元素赋值,如例6-2中第一个for循环语句;另一种方法,数组初始化,是指在数组定义时给数组元素赋初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。n一维数组初始化的一般形式为:n类型说明符 数组名常量表达式=值0,值1,值n-

14、1;6.1.3一维数组的初始化一维数组的初始化 n说明:n(1)“=”之前是数组的定义,“=”之后是用花括号括起来的初值列表,各值之间用逗号间隔。对数组元素的初始化是从下标为0的元素开始逐一对数组元素初始化。n例如:n int a10=0,1,2,3,4,5,6,7,8,9;n相当于nint a10;na0=0;a1=1;a2=2;a3=3;a4=4;na5=5;a6=6;a7=7;a8=8;a9=9;6.1.3一维数组的初始化一维数组的初始化 n(2)初值列表的长度必须小于等于数组的长度。如果初值列表的长度大于数组的长度,则语法错误;如果初值列表的长度小于等于数组的长度,则只给数组前面部分元

15、素赋初值,后面未指定初值的元素赋值为0。n例如:nint a10=0,1,2,3,4;n表示只给a0、a1、a2、a3、a4这5个元素赋值为0、1、2、3、4,而后面的5个元素缺省赋值0。n如果要给int a10的所有元素都赋初值0,可以采用:nint a10=0;6.1.3一维数组的初始化一维数组的初始化 n(3)初始值列表只能在数据定义时赋值,不能使用在赋值语句中给数组赋值。n例如:给数组int a10的10个元素初始化1,下面是错误的:n int a10;n a=1,1,1,1,1,1,1,1,1,1;n(4)如果初值列表的长度等于数组的长度,可以省略数组长度,此时数组的长度就是初值列表

16、中实际数值的个数。n例如:nint a5=1,2,3,4,5;n可写为:nint a=1,2,3,4,5;n特别是在字符数组中,使用得比较多,例如nchar str=A,B,C,E,E,F,G;n(5)初值列表的常量数据类型一定要与数组元素的数据类型一致,如果不一致,将进行数据类型的自动转化。6.1.4 一维数组程序举例一维数组程序举例 n可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。n例例6.3从键盘接收10个数据,求其最大值。nvoid main()n int i,max,a10;n printf(input 10 numbers:n);n

17、for(i=0;i10;i+)n scanf(%d,&ai);n max=a0;n for(i=1;imax)n max=ai;n printf(maxmum=%dn,max);n6.1.4 一维数组程序举例一维数组程序举例 n上面程序中,第一个for语句要求从键盘输入10个整数存储到数组a中。接着把a0赋给max,并用第二个for语句把a1到a9的值逐个与max的值比较,若比max的值大,则把该下标变量的值赋给max,因此,max的值总是已比较过的元素的最大值。比较结束,输出max的值。6.1.4 一维数组程序举例一维数组程序举例 n例6.4从键盘接收10个数据,采用冒泡法法排序并输出。n冒

18、泡法的基本思想是将相邻的两个数进行比较,如果前面的数比后面的大,则交换其值。冒泡排序的过程如下:n(1)比较第一个元素和第二个元素,如果a0a1,则交换;比较第二个元素和第三个元素,如果a1a2,则交换;依次类推,直到比较第n-1个元素和第n个元素,如果an-2an-1,则交换;这是第一趟冒泡排序,在n个元素中,值最大的元素放到了an-1位置,即数组的最后一个位置。n(2)对前n-1个元素进行第二趟冒泡排序,值次大元素放到an-2的位置。n(3)重复上述过程,经过n-1趟冒泡排序后,整个数组的元素按照升序排列。6.1.4 一维数组程序举例一维数组程序举例#include#define N 10

19、void main()int i,j,temp,aN;printf(input 10 numbers:n);for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN-1;i+)/*冒泡排序*/for(j=0;jaj+1)temp=aj;aj=aj+1;aj+1=temp;printf(The sorted array:n);for(i=0;iaj,则i=j。比较到最后一个元素后,如果i的值不为0,则a0与ai互换,这样a0存放了n个元素中最小的值。这是第一趟选择排序。(2)第一个元素已经选定,应该从第二个元素开始新的一轮选择。设i=1,代表第二个元素下标,ai依次与后面的n

20、-2个元素比较,如果aiaj,则i=j。最后,如果i的值不为1,则a1与ai互换,这样a1存放了n-1个元素中最小的值。这是第二趟选择排序。(3)重复上述过程,经过n-1趟选择排序后,整个数组的元素按照升序排序。6.1.4 一维数组程序举例一维数组程序举例#include#define N 10void main()int i,j,k,temp,aN;printf(input 10 numbers:n);for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN-1;i+)/*选择排序*/k=i;for(j=i+1;jaj)k=j;if(k!=i)temp=ai;ai=ak;

21、ak=temp;printf(The sorted array:n);for(i=0;iN;i+)printf(%3d,ai);printf(n);6.1.4 一维数组程序举例一维数组程序举例 n程序执行结果如下:ninput 10 numbers:n 62 41 36 6 43 2 35 81 85 18nThe sorted array:n 2 6 18 35 36 41 43 62 81 856.2 班级总成绩排序班级总成绩排序 n利用一维数组可以处理“一组”相关数据,比如班级的英语成绩。而要处理“多组”相关数据,比如矩阵是一个二维表格,就不方便用一个一维数组表示;班级多名学生、多门课程

22、的成绩表,它也是一个二维表格,如下表示,不方便用一个一维数组来表示。学号学号语文语文数学数学英语英语总成绩总成绩189817824829279652413879689270488789626256998832506799586260.306799782446.2 班级总成绩排名班级总成绩排名n在C语言中,数组元素可以是任何类型,当数组元素是数组时,这种数组就是多维数组。凡是具有相同数据类型的二维数据表格,都可以使用一个数组元素为一维数组的一维数组来表示,这种数据结构称为二维数组。n班级成绩表的每一行视为一个数组元素,该数组元素由5列组成;所有的行组成数组,数组的长度是30,其数据类型是长度为5

23、的整型一维数组,这就是二维数组。二维结构的数据又常常称为矩阵,上表为305的矩阵。6.2 班级总成绩排名班级总成绩排名例例6.6 班级总成绩排名#include#define M 30#define N 5void main()int i,j,k,temp;int aMN;/*定义了一个二维数组,用于存储30行5列的矩阵*/for(i=0;iM;i+)ai0=i+1;printf(请输入%d号同学的成绩:,i+1);scanf(%d%d%d,&ai1,&ai2,&ai3);ai4=ai1+ai2+ai3;6.2 班级总成绩排名班级总成绩排名for(i=0;iM-1;i+)/*按照总分选择排序*

24、/k=i;for(j=i+1;jM;j+)if(ak4aj4)k=j;if(k!=i)/*交换的是两行数据*/temp=ak0;ak0=ai0;ai0=temp;temp=ak1;ak1=ai1;ai1=temp;temp=ak2;ak2=ai2;ai2=temp;temp=ak3;ak3=ai3;ai3=temp;temp=ak4;ak4=ai4;ai4=temp;6.2 班级总成绩排名班级总成绩排名printf(按照总分从高到低的成绩排名:n);printf(名次 学号 语文 数学 外语 总成绩n);for(i=0;iM;i+)printf(%4d%4d%4d,i+1,ai0,ai1);p

25、rintf(%4d%4d%4d n,ai2,ai3,ai4);6.2 班级总成绩排名班级总成绩排名为了测试的方便,把M更改为6,仅仅输入前6名同学的成绩,结果如下:请输入1号同学的成绩:89 81 78请输入2号同学的成绩:92 84 65请输入3号同学的成绩:87 94 89请输入4号同学的成绩:88 78 96请输入5号同学的成绩:69 98 83请输入6号同学的成绩:79 95 86按照总分从高到低的成绩排名:名次 学号 语文 数学 外语 总成绩 1 3 87 94 89 270 2 4 88 78 96 262 3 6 79 95 86 260 4 5 69 98 83 250 5 1

26、 89 81 78 248 6 2 92 84 65 241n本程序中使用了二维数组,下面将介绍二维数组的定义、初始化、引用和使用。6.2.1二维数组的定义和引用二维数组的定义和引用 n一维数组只有一个下标,其数组元素称为单下标变量。多维数组元素有多个下标,以标识它在数组中的位置,所以称为多下标变量。二维数组定义的一般形式:n类型说明符 数组名常量表达式1常量表达式2;n其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。对于二维数组的理解,可以想象其为一个矩阵,常量表达式1的值为行数,常量表达式2的值为列数,元素的总个数为两维长度之积。例如二维数组int a23,可以存

27、储一个23矩阵B的6个数据,如下所示:7 5 92 8 6B=6.2.1二维数组的定义和引用二维数组的定义和引用 n二维数组元素也称为双下标变量,其表示形式为:n 数组名下标1下标2n其中下标1是第一维的下标,取值范围是从0开始至第一维长度减1;下标2是第二维的下标,取值范围是从0开始至第二维长度减1。nC语言把二维数组看成是一个特殊的一维数组,每个数组元素又是一个一维数组,如int a23,可以看成有两个元素a0、a1的一维数组,而a0、a1又是拥有3个整型数组元素构成的一维数组,a0可以看成由a00、a01和a02构成的一维数组名。6.2.1二维数组的定义和引用二维数组的定义和引用 nC语

28、言中,二维数组是一个特殊的一维数组,该数组按照线性存放,其每个元素所对应的一个数组也是按照线性存放的,二维数组名也是分配给整个二维数组连续存储空间的首地址,这就是C语言中二维数组在物理上采用的按行存储的顺序存储方式,也称为以行序为主序的顺序存储结构。n在二维数组中,欲计算某个元素aij的地址,必须知道第二维的大小,这也是C语言双下标变量的有效地址计算公式:n有效地址=数组的起始地址+(i*第二维大小+j)sizeof(数组元素数据类型)6.2.1二维数组的定义和引用二维数组的定义和引用 n假如二维数组int a23的首地址为5000,保存矩阵B的数据,则数组a的存储结构如下图。78928650

29、0050045008501250165020aa00a01a02a10a11a12a0a16.2.2 二维数组的初始化二维数组的初始化 n二维数组定义的同时也可以初始化,具体方法有多种。n(1)分行初始化n二维数组是一个特殊数组,通过构成一个初始值列表。因为每个元素又是一个一维数组,所以每个初始值又是一个构成的初始列表,表示一行,双层的所构成的初始值列表的初始化称为分行初始化。nint a23=7,5,9,2,6,8;n其中第一行7,5,9,顺序初始化a0,第二行2,6,8,顺序初始化a1,与一维数组初始化一样,都是从下标0开始一一对应进行赋初值。该方法一行对一行,界限清楚,容易理解,也不容易

30、出错。6.2.2 二维数组的初始化二维数组的初始化 n分行初始化中允许对行部分初始化,即对行的前半部分初始化,没有初始化部分赋予缺省值0。nint a23=7,2,6;相当于int a23=7,0,0,2,6,0;nint a23=7,5;相当于 int a23=7,5,0,0,0,0;n分行初始化时,不允许出现内部为空的情况(最少有一个初值),它不代表不给该行初始化,而是语法错误,n例如int a23=,2,6,8;n分行初始化时,如果所有的行都有对应的初始化,此时定义二维 数组的第一维的大小可以省略,编译器会根据初值表的个数来确定。但是第二维的大小必须给定,即使每行的元素全部列出也不 能省

31、略。nint a 3=7,2,6;相当于int a23=7,0,0,2,6,0;6.2.2 二维数组的初始化二维数组的初始化 n(2)按顺序赋初值n将所有的数据包括在一个花括号内,初值列表不分行,所有的初值通过逗号分开。赋值的规则是按照元素在内存中的排列顺序进行赋值,先初始化第一行,然后初始化第二行,依次类推。nint a23=7,5,9,2,6,8;相当于 nint a23=7,5,9,2,6,8;n该方法相对简单,效果与分行赋值一样。但是,当数组元素较多时,容易出现混乱、遗漏和出错,程序的可读性相对差一些。n采用此方法可以部分赋初值,但只能是最前面的行列赋初值,后面的没有对应初值的元素赋缺

32、省值0。nint a23=7,5;相当于 nint a23=7,5,0,0,0,0;6.2.2 二维数组的初始化二维数组的初始化 n如果全部赋值时,数组第一维长度可以省略,编译系统可以通过第二维的长度,结合初值列表的长度计算出第一维的长度nint a 3=7,5,9,2,6,8;相当于 nint a23=7,5,9,2,6,8;n对于Visual C+系统,即使没有全部赋值,也可以根据第二维的长度,结合初始列表长度计算出第一维的长度,此时没有赋值的元素赋缺省值0。nint a 3=7,5,9,2;相当于 int a23=7,5,9,2,0,0;nint a 3=7,5;相当于 int a13=

33、7,5,0;6.2.2 二维数组的初始化二维数组的初始化 n例例6.7求出66矩阵A主对角线元素的平均值。9 2 36 14 5 67 34 1 10 11 3213 4 15 26 17 1819 30 21 22 23 2425 16 27 28 29 2031 12 33 8 35 3A=6.2.2 二维数组的初始化二维数组的初始化#include#define N 6void main()int i;float sum=0;int aNN=9,2,36,14,5,6,7,34,1,10,11,32,13,4,15,26,17,18,19,30,21,22,23,24,25,16,27,

34、28,29,20,31,12,33,8,35,3;for(i=0;iN;i+)sum+=aii;printf(The average is%.2fn,sum/N);程序运行结果如下:The average is 18.676.2.3二维数组程序举例二维数组程序举例 n例例6.8 打印如下所示的杨辉三角的图形,(打印六行),要求用二维数组实现。n1n1 1n1 2 1n1 3 31n1 4 64 1n1 5 10 10 5 1nN行的杨辉三角可以看做是N*N方阵的下三角,各行的数值分布有如下关系:n(1)数据的第0列和对角线元素都为1;n(2)数组其余各元素是上一行同列和上一行前一列的两个元素之

35、和。6.2.3二维数组程序举例二维数组程序举例#include#define N 6void main(void)int aNN;int i,j;for(i=0;iN;i+)ai0=1;aii=1;for(i=2;iN;i+)for(j=1;ji;j+)aij=ai-1j+ai-1j-1;printf(杨辉三角为:n);for(i=0;iN;i+)for(j=0;ji+1;j+)printf(%5d,aij);printf(n);6.2.3二维数组程序举例二维数组程序举例 例例6.9求出55螺旋矩阵A。1 2 3 4 5 16 17 18 19 615 24 25 20 7 14 23 22

36、21 813 12 11 10 9A=螺旋矩阵的第一行是从左到右顺序递增,最后一列从上到下递增,最后一行从右到左递增,第一列从下到上递增到第二行,第二行从左到右顺序递增到倒数第二列,这样螺旋进行递增,直到矩阵数据布满。本程序首先要对矩阵赋值,再打印出该矩阵。6.2.3二维数组程序举例二维数组程序举例#include#define N 5void main(void)int aNN;int i,j,k=0,m;if(N/2=0)m=N/2;elsem=N/2+1;for(i=0;im;i+)for(j=i;jN-i;j+)/*最上面一行从左到右顺序赋值*/aij=+k;for(j=i+1;j=i

37、;j-)/*最下面一行从右到左顺序赋值*/aN-i-1j=+k;for(j=N-i-2;j=i+1;j-)/*最左面一列从下到上顺序赋值*/aji=+k;6.2.3二维数组程序举例二维数组程序举例 for(i=0;iN;i+)/*输出螺旋矩阵*/for(j=0;jN;j+)printf(%4d,aij);printf(n);n更改N为8,则程序运行结果如下:n 1 2 3 4 5 6 7 8n 28 29 30 31 32 33 34 9n 27 48 49 50 51 52 35 10n 26 47 60 61 62 53 36 11n 25 46 59 64 63 54 37 12n 24

38、 45 58 57 56 55 38 13n 23 44 43 42 41 40 39 14n 22 21 20 19 18 17 16 156.3搜索好友搜索好友 n例例6.10 按照姓名搜索好友。n姓名是一个字符串,搜索好友是从一列姓名查找是否有相同的字符串,如果有则找到了,如果没有则没有找到。n存储一列姓名,只能采用字符类型的二维数组,每一行是一个姓名字符串。n从键盘通过scanf函数输入一个姓名,使用strcmp函数与存储的姓名一个一个比对寻找,如果找到了则输出所在的行号,没有找到给出提示信息。strcmp函数原型在string.h头文件中,源程序需要包含该头文件。6.3搜索好友搜索好

39、友#include#include#define N 10void main()/*定义了一个字符串数组并初始化*/char namelistN12=Tom,Jack,Rose,Abel,Barry,Calvin,Edward,Annabelle,Catherine,Gemma;char name12;/*名字最长为11个字母,连续且中间没有空白符分隔*/int i,flag=0;printf(请输入你要查找的朋友名:);scanf(%s,name);6.3搜索好友搜索好友 for(i=0;iN;i+)/*strcmp()是字符串比较函数,相等函数值为0*/if(strcmp(namelist

40、i,name)=0)flag=1;/*设置标志变量,定义值为1的时候找到朋友*/printf(在第%d行找到了你的朋友。n,i+1);break;if(flag=0)printf(抱歉,没有找到你的朋友。n);6.3搜索好友搜索好友 n运行程序,输入JackSbone,结果如下:n请输入你要查找的朋友名:JackSbonen抱歉,没有找到你的朋友。n当输入Abel时,结果如下:n请输入你要查找的朋友名:Abeln在第4行找到了你的朋友。n上面的代码,定义并使用了一种特殊的数组字符串。其实,在C语言中没有字符串数据类型,字符串是存储在字符数组中,并以0结束的字符序列。也就是说,字符串是存储在以0

41、结尾的一维字符数组中。0字符的作用标识字符串的结束。因为字符串使用频率比较高,有标准处理函数,都是以0结尾表示字符串结束6.3.1 字符数组的定义和引用字符数组的定义和引用n1字符数组的定义n字符数组就是数组的数据类型为字符型的数组,字符数组中的每个元素存放一个字符。其定义方法与前面介绍的数组的定义方法类似。例如:nchar c10;nc0=I;c1=;c2=a;c3=m;c4=;nc5=h;c6=a;c7=p;c8=p;c9=y;n以上定义了c为字符数组,包含10个元素。赋值以后数组的状态如下所示。nc0 c1 c2 c3 c4 c5 c6 c7 c8 c9n由于字符型数据是以整数形式(AS

42、CII代码)存放的,因此也可以用整形数组存放字符数据,n例如:int c10;c0=a;Iamhappy6.3.1 字符数组的定义和引用字符数组的定义和引用n2字符数组的初始化n对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符一次赋给数组中各元素。例如:nchar a10=I,a,m,h,a,p,p,y;n把10个字符依次分别赋给c0c9这10个元素。如果在定义字符数组时不进行初始化,则数组中元素的值是不可预料的。如果花括号中提供的初始值个数(即字符个数)大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空格字符(即

43、0)。6.3.1 字符数组的定义和引用字符数组的定义和引用n如果提供的初值个数与预定的数组长度相同,在定义时,可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:nchar a=I,a,m,h,a,p,p,y;n数组c的长度自动定义为10,尤其在赋初值的字符个数较多时,比较方便。n也可以定义和初始化一个二维字符数组,例如:nchar a5=H,e,l,l,o,w,o,r,l,d6.3.1 字符数组的定义和引用字符数组的定义和引用n3字符数组元素的引用n字符数组元素的引用方法也是通过下标的方法进行引用的,引用字符数组中的一个元素,得到一个字符。#include void main()ch

44、ar c15=I,a,m,a,s,t,u,d,e,n,t,.;int i;for(int i=0;i15;i+)printf(%c,ci);printf(n);n运行结果如下:I am a student.6.3.1 字符数组的定义和引用字符数组的定义和引用n例例6.12 存储两个字符序列 Hello和world,并分成两行输出。n#include nvoid main()n int i,j;n char a25=H,e,l,l,o,w,o,r,l,d;n for(i=0;i2;i+)n for(j=0;j5;j+)n printf(%c,aij);n printf(n);n nn程序运行结果

45、如下:nHellonworldn对char a25二维字符数组分行初始化全部的元素,然后按行输出每个元素。6.3.2 字符串和字符串结束标志字符串和字符串结束标志 n在语言中用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以0作为串的结束符。因此当把一个字符串存储到一个字符数组时,结束符0也存入数组,并以此作为该字符串是否结束的标志。有了0标志后,就不必再用字符数组的长度来判断字符串的长度了。n语言允许用字符串的方式对数组作初始化。n例如:char c=C,p,r,o,g,r,a,m;n可写为:char c=C program;n或去掉写为:char c=C progra

46、m;6.3.2 字符串和字符串结束标志字符串和字符串结束标志 n用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志0。上面的数组c在内存中的实际存放情况为:n0是由C编译系统自动加上的。由于采用了0标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。Cprogram 06.3.3 字符数组的输入输出字符数组的输入输出n字符数组存储字符串后,可用printf函数和scanf函数输入输出一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。n例例6.13 使用printf输出字符串。nvoid main()char str=Hello,Jenny.

47、nHello,Tom.;nprintf(%sn,str);n n程序运行结果如下:nHello,Jenny.nHello,Tom.n注意本例的printf函数中,使用的格式字符串为%s,表示输出的是一个字符串。而在输出表列中给出数组名即可。但不能写为:printf(%s,str);6.3.3 字符数组的输入输出字符数组的输入输出n例6.14 使用scanf输入字符串。nvoid main()n char str15;n printf(input string:n);n scanf(%s,str);n printf(%sn,str);nnscanf函数接受字符串时,任何时候都会忽略掉前导的空格,

48、读取输入字符并保存到字符数组,直到遇到空格、tab或回车符为止,scanf函数会自动在字符串后面加上0。程序中数组长度为15,因此用户输入的字符串长度必须小于15,以留出字符串结束标志0。对字符数组,如果不作初始化,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格、tab或回车,否则字符数组的输入将结束,空白符用字符串结束标志0替代,标识字符串的输入结束。6.3.3 字符数组的输入输出字符数组的输入输出n如果要保存一行包括空格和tab字符的字符串,可以采用gets函数实现。n用scanf函数输入字符串时,用于接收字符串的字符数组要足够长,以便保存字符

49、串和其结束符,否则,与字符串常量初始化字符数组一样,函数将把超过字符数组定义的长度之外的字符也顺序保存在数组范围之外。为了避免出错,可以使用域宽来实施控制。nchar str15;nscanf(%14s,str);n输入函数最多读入14个非空格或tab字符到str数组,如果输入超过14个非空格或tab字符,则scanf函数停止接受字符,并把str最后一个字节用于存放字符串结束标志0,如果没有超过14个,则结束标志0仍放在字符串的后面。6.3.4 字符串处理函数字符串处理函数n语言提供了丰富的字符串处理标准库函数,包括字符串的输入、输出、合并、修改、比较、转换、复制、搜索等,使用这些函数可大大减

50、轻程序员编程的负担。用于基本输入输出的字符串函数(包括puts和gets两个函数),在使用前应在程序中包含头文件stdio.h,使用其它字符串函数则应包含头文件string.h。下面介绍几个最常用的字符串函数。n1.字符串输出函数字符串输出函数 putsn格式:puts(字符数组名)n功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。6.3.4 字符串处理函数字符串处理函数n例6.15 使用puts函数输出字符串。n#include nvoid main()nchar str=BASICndBASE;nputs(str);nn 从程序中可以看出puts函数中可以使用转义字符,因此

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com