书签 分享 收藏 举报 版权申诉 / 197
上传文档赚钱

类型《C语言与程序设计教程》课件第4章.ppt

  • 上传人(卖家):momomo
  • 文档编号:8095485
  • 上传时间:2024-11-26
  • 格式:PPT
  • 页数:197
  • 大小:531KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《C语言与程序设计教程》课件第4章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C语言与程序设计教程 语言 程序设计 教程 课件
    资源描述:

    1、第第4章章 数组数组 4.1 一维数组4.2 二维数组 4.3 字符数组和字符串 4.4 典型例题精讲4.1 一维数组一维数组4.1.1 一维数组的定义一维数组的定义数组元素可以有多个下标,下标的个数表示数组的维数,只有一个下标时表示该数组为一维数组。数组的使用也必须遵循“先定义,后使用”这一原则。一维数组定义的一般形式如下:类型标识符 数组名常量表达式;数组定义包含以下几个要点:(1)类型标识符用来指明数组元素的类型,同一数组的元素其类型相同;类型标识符可以是任意一种基本数据类型或者构造数据类型。(2)数组名的命名规则与普通变量相同,但不得与其他变量或数组同名;数组名表示该数组在内存中存放的

    2、首地址,是一个地址常量。(3)方括号“”是数组的标志,方括号中的常量表达式表示数组的元素个数,即数组的长度(大小)。(4)常量表达式是整型常量、符号常量及由它们组成的表达式,但不允许出现变量。例如:int a5;在此,数组a共有5个元素:a0、a1、a2、a3和a4,且每个元素都是整型的。特别要注意的是,数组元素的下标从0开始,直至数组元素的个数减1,数组a的内存分配示意见图4-1,从图中可以看到:数组名a实际上就是数组元素a0的地址。C语言的编译器不对数组的越界问题进行检查,直到运行时才给出出错信息,这一点要特别注意。图4-1 int a5的内存分配示意例4.1 指出下面的数组定义中哪些是正

    3、确的,哪些是错误的。int x40,y20,z(10);float b7.5,s8;int m;char m15,chm;解 对本题的数组定义说明如下:(1)对“int x40,y20,z(10);”,其中数组x、y的定义是正确的,而数组z的定义有错,因为数组的标志是方括号“”,而不是圆括号“()”。(2)对“float b7.5,s8;”,其中数组s定义是正确的,而数组b因其表示数组元素个数的常量表达式是一浮点型常量,而不是整型常量,因此出错。(3)对“char m15,chm;”,数组m因为与整型变量m同名而出错,数组ch的常量表达式是一变量m,而不是常量,因此出错。4.1.2 一维数组的

    4、引用和初始化数组必须先定义、后使用,并且只能逐个引用数组元素而不能一次引用整个数组。数组元素的引用格式为:数组名下标其中,方括号“”中的下标只能是整型常量或整型表达式。例如:a5bi+2*j /*i和j均为整型变量*/ci+1 /*i为整型变量*/都是合法的数组元素。程序在引用数组元素的值之前,必须先给数组元素置初始值。数组元素的初始值可以由键盘输入,也可以通过赋值语句来设置。在程序每次运行时数组元素的初值都固定不变的情况下,可以在数组定义时就给定其元素的初值;这种方式称为数组的初始化。数组初始化可以有以下几种方法:(1)在数组定义时给数组所有元素赋初值。例如:int a5=0,1,2,3,4

    5、,;将数组元素的初值用“,”分隔依次写在一对花括号“”内。经过上面的定义和初始化之后,就有:a0=0,a1=1,a2=2,a3=3,a4=4如果想使一个数组中全部元素的初值均为0,则可写成:int a10=0,0,0,0,0,0,0,0,0,0;或者:int a10=0;此时,a0被赋初值0,而其余未赋初值的数组元素均由系统给其赋0。注意,如果写成:int a10=2;则a0被赋初值2,而其余数组元素均由系统给其赋初值0。(2)数组定义时只给前面一部分元素赋初值。例如:int b10=0,1,2,3;定义b数组有10个元素,其中前4个元素赋予了初值,而后6个元素值自动被赋以“0”值(仅对数值型

    6、数组)。(3)如果数组的全部元素都设置了初值,则定义中可不指定数组的长度。例如:int a5=1,2,3,4,5;可以写成:int a=1,2,3,4,5;此时,系统会根据花括号“”中的初值个数来确定数组的长度,但是数组的标志“”不能省略。此外,如果提供的初值个数小于希望的数组长度,则方括号中的常量表达式不能省略。例如,需要定义数组a长度为10,但初值前5个为1、2、3、4、5,则不能写成:int a=1,2,3,4,5;而必须写成:int a10=1,2,3,4,5;除了数组初始化之外,通常是通过for语句循环为数组的每一个元素读入数据或者输出数据。例如:int a10,i;for(i=0;

    7、i10;i+)scanf(%d,&ai);为数组a的每一个元素输入数据,或者通过下面的for语句输出每一个数组元素的值:for(i=0;i10;i+)printf(%4d,ai);例4.2 已定义数组a如下:int a6=1,2,3,4,5,6;现通过下面两种输出语句来输出数组a中每一个元素的值:(1)printf(%4d,a6);(2)printf(%4d,a);请指出它们的错误并给出正确的输出语句。解 语句(1)只是输出了下标序号为6这个数组元素的值,而没有输出所有数组元素的值,并且数组a只有a0a5这6个数组元素而并不存在a6,所以该语句是错误的。语句(2)输出的变量是数组名a,而a是一

    8、个地址常量,它代表数组a的首地址,所以该语句也无法输出所有数组元素值而仅输出了数组a的首地址。正确的输出语句如下:for(i=0;i=5;i+)printf(%d,ai);例4.3 给数组a输入任意一组数据,然后实现数组元素的逆置,最后输出逆置后的数组元素。解 实现数组元素的逆置示意见图4-2。图4-2 实现数组元素的逆置示意因此,对n个数据元素进行逆置的for语句只能循环n/2次。实现逆置的程序如下:#includevoid main()int a20,i,n,x;printf(Input number of elements:);scanf(%d,&n);printf(Input elem

    9、ent:n);for(i=0;in;i+)/*输入数据*/scanf(%d,&ai);printf(Before:n);/*输出输入的数据*/for(i=0;in;i+)printf(%4d,ai);printf(n);for(i=0;in/2;i+)/*实现逆置*/x=ai;ai=an-i-1;an-i-1=x;printf(After:n);for(i=0;in;i+)printf(%4d,ai);printf(n);运行结果:Input number of elements:10Input element:1 2 3 4 5 6 7 8 9 10Before:1 2 3 4 5 6 7

    10、8 9 10After:10 9 8 7 6 5 4 3 2 1例4.4 用数组实现Fibonacci数列前20项数据的输出。解 在第3章中求Fibonacci数列的方法是每求出两个值时就进行输出,然后继续求后继的两个值。这里,我们每求出一个值就保存于数组f中;当求出所需长度的Fibonacci数列后(已保存于数组f中),再通过for循环输出数组f中保存的Fibonacci数列值。程序编写如下:#includevoid 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)/*每输出5项换一行*/

    11、printf(n);printf(%12d,fi);printf(n);运行结果:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765例4.5 任意输入一个十进制数,将其转换成二进制数并按位保存于数组中,最后输出数组中所保存的二进制数。解 由十进制数转换为二进制数的方法可知:将十进制数每次除2,其余数按先后顺序逆序排列即为该十进制数对应的二进制数。因此,我们采用的方法如下:当十进制数n不等于0时,先对2取余(即“%”),将余数存于数组a中,然后对n除以2,再重复刚才的这两步操作,直到n等于0;这样最终a0、a1、a

    12、i-1保存着该十进制数对应二进制数的最低位、次低位、最高位的值。程序编制如下:#includevoid main()int i=0,j,n,a20;printf(Input data:);scanf(%d,&n);while(n!=0)ai=n%2;n=n/2;i+;printf(Output:n);for(j=i-1;j=0;j-)/*二进制数由高位到低位输出*/printf(%4d,aj);printf(n);运行结果:Input data:11Output:1 0 1 1 4.2 二维数组二维数组 4.2.1 二维数组的定义二维数组的定义如果一维数组看做是同一类型变量的一个线性排列,那么

    13、二维数组则可认为是同一类型变量的一个平面排列,即行和列。实际上也是这样,二维数组元素有两个下标,一个是行下标,一个是列下标。由于二维数组是多维数组中比较容易理解的一种,并且它可以代表多维数组处理的一般方法,所以,在此主要介绍二维数组。二维数组定义的一般形式如下:类型标识符 数组名常量表达式1常量表达式2;其中,常量表达式1表示第一维的长度(即行数),常量表达式2表示第二维的长度(即列数)。二维数组元素的总数为常量表达式1与常量表达式2的乘积。例如:int a34;定义了一个3行4列的数组,数组名为a,其数组元素的类型为整型,该数组共有34个元素,这些元素排列如下:a00,a01,a02,a03

    14、a10,a11,a12,a13a20,a21,a22,a23注意,二维数组的定义不能写成:int a3,4;与一维数组的定义相同,二维数组定义中的两个常量表达式必须是常量,不能是变量。二维数组在内存中是以一维线性方式排列的,并且采用行优先原则:先存储第一行元素,然后在第一行元素之后顺序存储第二行元素,依此类推,直至存储完二维数组中的全部元素。对于定义了3行4列的“int a34;”来说,其内存分配示意如图4-3所示。图4-3 对应“int a34;”的内存分配示意由图4-3可知,数组名a是二维数组a的起始地址,也就是数组元素a00的地址;而a0、a1、a2则分别是二维数组a各行的起始地址;即a

    15、0对应数组元素a00的地址、a1对应数组元素a10的地址,而a2则对应数组元素a20的地址。我们可以这样理解,即把二维数组看做是一种特殊的一维数组,这个数组中的每个元素又是一个一维数组。也就是说,我们把二维数组a看做是一个一维数组,它有3个元素a0、a1和a2,而每一个元素又是一个包含了4个元素的一维数组,而a0、a1和a2就是其对应的数组名。因此,a0、a1和a2在二维数组中是数组名(即为一个地址),而决不能当作元素使用,并且a0和a都是指向a00这个数组元素的地址。4.2.2 二维数组的引用和初始化二维数组元素的引用方式为:数组名行下标1列下标2其中,方括号“”中的行、列下标既可以是整型常

    16、量也可以是整型表达式。二维数组也必须先定义后使用,并且也只能逐个引用数组元素。二维数组存在着行和列,因此二维数组的行下标是在0到数组行数减1之间变化,而列下标是在0到数组列数减1之间变化。同样,C语言也不对二维数组做越界检查,所以要特别注意。例如,对二维数组的定义:int a22;则a10=5;a01=a11+8;都是正确的,而a12=10;/*列越界*/a0,0=7;/*行下标和列下标都必须放在方括号“”中*/是错误的。二维数组的初始化可以有以下几种方法:(1)按行分段给每个元素赋初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;这种赋初值方法比较直观,行和列

    17、都很清楚。(2)按数组元素在内存中的排列顺序给每个元素赋值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3)给部分元素赋初值。当“”中值的个数少于二维数组的元素个数时,只给前面的部分元素赋值,而后面的元素自动取“0”值。例如:int a33=1,2,3,4;它等价于:int a33=1,0,0,2,3,0,4,0,0;(4)给全部元素赋初值。此时定义二维数组的第一维(行)大小可以省略,但第二维(列)大小不能省略。否则无法知道行和列各自的大小。例如:int a4=1,2,3,4,5,6,7,8,9;则系统根据每行放4个元素,放下这9个值必须大于等于9个元素,故需

    18、要3行;即二维数组a为3行4列。又如:int a4=1,2,3,1,2,4;对于这种按行分段赋值方式,系统会根据最外面的花括号内有几个花括号“”来确定行数;因此系统认为二维数组a有3行。例4.6 一程序如下:#includevoid main()int x32=0,i;for(i=0;i3;i+)scanf(%d,xi);printf(%d%d%dn,x00,x01,x10);若运行时输入:2 4 6则输出的结果为 。A)200 B)204 C)240 D)246 解 我们知道,x0、x1和x2分别对应二维数组x各行的首地址,即数组元素x00、x10和x20的地址(xi即为&xi0)。所以,语

    19、句“scanf(%d,xi);”写法正确(因xi为一地址);这样当输入为“2 4 6”时,相应的数组元素x00的值为2、x10的值为4、x20的值为6,而其余数组元素的值不变仍为“0”。最后,我们得到输出结果应为:204,因此选B。例4.7 定义一个3行4列的二维数组,并逐行输入二维数组元素值,再逐行输出二维数组的元素值。解 我们知道,一维数组元素值的输入输出都是通过一个for语句实现的;而二维数组的输入和输出则需要用两个for语句组成的两层循环来实现,即外层for语句控制行的变化,而内层for语句控制列的变化。实现的程序如下:#includevoid main()int a34,i,j;pr

    20、intf(Input data:n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,&aij);printf(Output data:n);for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,aij);printf(n);运行结果:Input data:1 2 3 45 6 7 89 10 11 12Output data:1 2 3 4 5 6 7 8 9 10 11 12例4.8 输入年、月、日,求这一天是该年的第几天。解 为确定一年中的第几天,需要一张每月的天数表,该表给出每个月的天数。由于二月份的天数因闰年和平年相差一天。所以把月份

    21、天数表设计成2行12列的二维数组;数组的第0行给出平年各月份的天数,数组的第1行给出闰年各月份的天数。为了计算某月某日是这年的第几天,则首先确定这一年是平年还是闰年,然后根据各月份的天数表将前几个月的天数与当月的日期累加,就得到了某年某月某日是该年的第几天。程序编制如下:#includevoid main()int days12=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;int year,month,day,leap=0,i;printf(Input year、month、day:n);sca

    22、nf(%d%d%d,&year,&month,&day);if(year%4=0&year%100!=0)|year%400=0)leap=1;for(i=0;imonth-1;i+)day=day+daysleapi;printf(date=%dn,day);运行结果:Input year、month、day:2010 3 10date=694.3 字符数组和字符串字符数组和字符串 用来存放字符数据的数组被称为字符数组。在C语言中没有专门的字符串类型,而是采用字符数组来存放一串连续的字符。通常使用的字符数组是一维数组(当然也可是多维数组),其数组元素的类型为字符类型;也即,字符数组中的每一个

    23、元素存放一个字符。4.3.1 字符数组的定义、引用及初始化字符数组的定义、引用及初始化1.字符数组的定义字符数组本质上与前面介绍的数组相同,只不过它的类型标识符是char类型。字符数组的定义方式如下:char 数组名常量表达式;/*定义一维字符数组*/或者char 数组名常量表达式1常量表达式2;/*定义二维字符数组*/例如:char c5;表示定义了一个一维字符数组,数组名为c,最多可以存放5个字符。如果给字符数组c赋值如下:c0=C;c1=h;c2=i;c3=n;c4=a;则字符数组c的存储如图4-4所示。图4-4 字符数组存放字符后的情况由图4-4可知,字符数组的存储也是占用内存一段连续

    24、的空间,其存储及表示方法与前面介绍的数值型数组相同。2.字符数组的引用字符数组的引用不同于数值型数组仅能逐个元素的引用,字符数组既可以逐个元素的引用,又可以通过字符串形式来整体引用。(1)对字符数组元素的引用。对字符数组元素的引用与对数值型数组元素的引用完全相同。字符数组元素的引用方式为:数组名下标其中方括号中“”的下标只能是整型常量或整型表达式。例如:char a10;a0=a;(2)对字符数组的整体引用。例如:char c5=a,b,c;printf(%s,c);在printf语句中,字符数组c是以数组名整体引用的。3.字符数组的初始化如果在定义字符数组时不进行初始化,那么字符数组中各元素

    25、的值是不确定的。可以通过下列方法对字符数组进行初始化:(1)逐个为字符数组中的元素赋初值。例如:char s10=P,r,o,g,r,a,m;或者:char c6;c0=C;c1=h;c2=i;c3=n;c4=a;或者:char x10;int i;for(i=0;i10;i+)scanf(%c,&xi);(2)将一个字符串整体赋给一个字符数组。例如:char a=Program;也可以去掉花括号写成:char a=Program;注意,字符串是以空字符0(ASCII码值为0)作为结束标志的。因此,这个空字符也放入了字符数组a,即字符数组a的元素个数是8而不是7。当然,我们也可如下定义字符数组

    26、a:char a8=Program;另外一种整体赋值方法如下:char x10;scanf(%s,x);即通过scanf语句给字符数组读入一个字符串。对字符数组的初始化一定要注意以下几点:(1)如果给字符数组赋初值的字符个数大于字符数组长度,则按语法错误处理。例如:char c5=China;char x5=P,r,o,g,r,a,m;前者以字符串形式赋给字符数组c,虽然在计算字符串长度时,0不计入字符串的长度,但0却占用一个字符位置;因此,字符串“China”虽然长度为5,但占用6个字符元素位置,而字符数组c只能放下5个字符,故此出错。后者花括号中“”提供的初值个数已大于字符数组x的长度,因

    27、此也是错误的。(2)如果给字符数组赋初值的字符个数小于字符数组长度,则将这些字符赋给字符数组前面的那些元素,而后面未赋值的元素则由系统自动赋以空字符0。例如:char c10=China;则字符数组c的存储情况见图4-5。图4-5 数组c的存储情况例4.9 下面哪些字符数组的定义是错误的,指出出错的原因。(1)char a5=a,b,c,d,e;(2)char b5=abcde;(3)char c5=a0;(4)char d5;d=abc;解 第(1)项定义正确,即逐个为字符数组中的元素赋初值,且赋初值的字符个数已等于字符数组的长度,故无空余的数组元素来存放待添加的0字符(这一点与给字符数组赋

    28、一个字符串不同)。第(2)项定义出错。字符串abcde加上0字符应占6个元素的位置,而字符数组b的定义是元素个数为5(长度为5),故此出错。第(3)项定义正确,即将字符串a0,也就是将字符a和转义字符0赋给字符数组c,然后再在其后添加一个字符串结束符0,因此是正确的。第(4)项定义错。给字符数组赋值,只能在定义时将双引号括起来的字符串赋给字符数组,而不能在定义之后再通过赋值语句将字符串赋给字符数组名。例4.10 下面是几种将字符序列“ABC”赋给字符数组的方法,请指出它们在存储上的异同。(1)char x6=A,B,C;(2)char x6=ABC;(3)char x6;int i;for(i

    29、=0;i3;i+)scanf(%c,&xi);输入:ABC(4)char x6;scanf(%s,x);输入:ABC(5)char x6;x0=A;x1=B;x2=C;解(1)、(2)两种输入方式的存储状态如图4-6(a)所示,即存储的是字符串“ABC”,(3)、(5)的存储状态如图4-6(b)所示,未存储字符的那些数组元素其值不确定,(4)和后面将要介绍的gets(x)(输入:ABC)函数存储如图4-6(c)所示。图4-6 不同输入方式下字符数组x的存储4.3.2 字符串字符串在C语言中,字符串常量是一个用双引号“”括起来的有效字符序列。并且,对字符串的处理只能通过字符数组进行。也即,一个字

    30、符串可以用一个一维字符数组来存放;若干个字符串则可以用一个二维字符数组来存放,且用每一行来存放一个字符串。C语言规定了字符串必须以字符0结束。也即,当遇到字符0时表示字符串到此结束,而它之前出现的字符序列则组成一个字符串。注意,0是一个转义字符,它的ASCII值为“0”,由于它不对应任何显示和操作,所以又称为空字符。系统在每一个字符串常量的后面自动加上了一个表示字符串结束的字符0。因此,要将一个字符串存入一个字符数组时,这个字符数组的长度不能小于该字符串的实际字符数(即长度)加1。例如:printf(How are you?n);该语句的功能是输出一个字符串。那么,系统是如何实现这种输出呢?实

    31、际上,在内存存放该字符串时,系统已经自动地在该字符串的最后一个字符n之后加上了一个0作为字符串结束的标志;并且在执行printf输出语句时,每输出一个字符时都需检查该字符是否是0,如果是0,则停止输出。有了字符串结束标志0后,字符数组的长度就无关紧要,在程序中通常是靠检测0的位置来判断字符串是否结束,而字符数组的长度通常是无法判断字符串的结束(字符串通常放不满字符数组)。在采用字符串方式后,字符数组的输入输出就变得更加简单了。除了前面讲述的用字符串赋初值外,还可以使用printf函数和scanf函数一次性输出或输入一个字符数组中的字符串,而不必再通过循环语句逐个字符地输出或输入。例4.11 字

    32、符串的输入输出。#includevoid main()char st110,st210;printf(Input string:n);scanf(%s%s,st1,st2);printf(Output string:n);printf(%s%sn,st1,st2);运行结果:Input string:China XianOutput string:China Xian在使用scanf和printf语句中采用格式字符“%s”输入输出字符串时,应注意以下几点:(1)输入输出字符串时都使用数组名,这一点与scanf或printf输入输出其他单个字符或数值型的值不同(scanf要求的是变量的地址,而p

    33、rintf要求的是变量)。(2)在输入两个字符串时,中间必须使用空格隔开。(3)输入字符串时,必须注意字符串的最大长度不得大于或等于字符数组的长度(最多到字符数组长度减1)。此外,要注意不是每个字符数组保存的字符序列都是一个字符串,例如下面的程序在输出时就会出错:includevoid main()char st15;st10=C;st11=h;st12=i;st13=n;st14=a;printf(%s,st1);由于字符数组stl存放的字符序列并不是字符串(在“China”之后并没有存储0字符),故在采用格式字符“%s”输出时,输出了“China”之后仍将继续输出内存中存放在“China”

    34、之后的其他数据,直至遇到0时才结束输出。因此,一定要避免这样的错误出现。4.3.3 常用字符串处理函数常用字符串处理函数C语言提供了丰富的字符串处理函数,这些字符串处理函数可以分为字符串的输入、输出、修改、比较、复制(拷贝)、转换、搜索等几类。在编写程序中使用用于输入、输出的字符串函数时,程序应包含“stdio.h”头文件,而使用其他字符串函数时,则程序还应包含“string.h”头文件。下面介绍几种常用的字符串函数。1.字符串输出函数puts调用格式:puts(字符数组名);其功能是将一个保存在字符数组中的以0结束的字符串进行输出显示,输出时将字符串结束标志0转换成n,因此输出完字符串后自动

    35、换行。例如:char s=student;puts(s);输出结果为:student因此语句:“puts(s);”相当于执行以下的程序段:i=0;while(si!=0)printf(%c,si);i+;printf(n);也即,函数puts完全可以由函数printf取代;当需要按指定格式进行输出时则采用函数printf。此外,用puts输出的字符串中也可以包含转义字符,如:char s=ComputernProgram;puts(s);则输出结果为:ComputerProgram2.字符串输入函数gets调用格式:gets(字符数组名);其功能是从键盘上输入一个字符串直到n为止,并将这个字符

    36、串存入函数gets指定的字符数组中,存放时系统自动将n置换成0。例如:char c20;gets(c);从键盘上输入:Computer of China则将字符串“Computer of China”存入到字符数组c中。因此,语句“gets(c);”相当于执行以下的程序段(当输入的字符不是“”时):i=0;scanf(%c,&ci);while(ci!=n)i+;scanf(%c,&ci);ci=0;注意:“gets(c);”与“scanf(%s,c);”是有区别的;对于输入的字符串“Computer of China”,scanf语句只能读入了字符串“computer”,即函数scanf是以

    37、空格或回车符n作为输入字符串的结束标志,而函数gets只以回车符n作为输入字符串的结束标志。3.字符串连接函数strcat调用格式:strcat(字符数组1名,字符数组2名);其功能是将字符数组2中的字符串连接到字符数组1中字符串的后面,形成一个包含这两个字符串的新字符串(也即,连接后原第一个字符串后面无0,而替代顺序放入第二个字符串的字符,但连接后形成的新字符串后面由系统加入一个0)。函数调用后得到一个函数值,就是字符数组1的首地址。需要注意以下两点:(1)函数strcat的第一个参数必须是字符数组名,而第二个参数可以是字符数组名也可以是用双引号“”括起来的字符串。(2)由于连接的结果放在字

    38、符数组1中,因此,字符数组1的长度必须足够大。例4.12 当输入为:123 时,给出下面程序的输出结果。#include#includevoid main()char st110=abcde;scanf(%s,st1);strcat(st1,fgh);printf(%sn,st1);解 该程序执行过程中其字符数组的存储变化见图4-7。其中,图4-7(a)为定义字符数组st1时的存储情况,图4-7(b)为执行scanf语句后的存储情况,而图4-7(c)则是调用strcat函数后的存储情况。由图4-7可知,最后输出的结果是:123fgh。图4-7 字符数组st1存储变化情况例4.13 用程序实现函

    39、数strcat功能。#includevoid main()char a40=I am a teacher!;char b20=You are a student!;int i=0,j=0;while(ai!=0)/*找到字符数组a中的字符串尾*/i+;while(bj!=0)/*实现连接功能*/ai+=bj+;ai=0;/*赋字符串结束标志*/puts(a);/*输出连接后的字符串*/运行结果:I am a teacher!You are a student!4.字符串拷贝函数strcpy调用格式:strcpy(字符数组1名,字符数组2名);其功能是将字符数组2中的字符串以及其后的那个0一起拷

    40、贝到字符数组1中。需要注意的是,第二个参数“字符数组2名”可以是字符数组名也可以是双引号括起来的字符串,此外,字符数组1要能放得下将要拷贝的字符串。例4.14 字符串拷贝函数的应用。#include#includevoid main()char s120=“Thank you!,s2=OK!;strcpy(s1,s2);puts(s1);运行结果:OK!5.字符串比较函数strcmp调用格式:strcmp(字符数组1名,字符数组2名);其功能是对字符数组1中的字符串1和字符数组2中的字符串2,从左至右逐个字符的进行ASCII码值比较,直到字符不同或遇到0为止。函数strcmp的返回值如下:字符

    41、串1=字符串2,则返回0值;字符串1字符串2,则返回正值;字符串1字符串2,则返回负值。需要注意的是,strcmp参数中的“字符数组1名”和“字符数组2名”都可以是字符数组名或双引号括起来的字符串。例4.15 比较两个字符串的大小。#include#includevoid main()char s1=abc,s2=acbe;int x;x=strcmp(s1,s2);if(x=0)printf(s1=s2n);elseif(x0)printf(s1s2n);elseprintf(s1s2n);运行结果:s1s2注意:strcmp是带返回值的函数,不像strcat、strcpy、gets和put

    42、s作为语句使用那样,它只能出现在表达式中。6.字符串长度测试函数strlen调用格式:strlen(字符数组名);其功能是测出字符串的实际长度(不包含字符串结束标志0字符),并作为该函数的返回值。注意,函数strlen参数“字符数组名”可以是字符数组名,也可以是双引号括起来的字符串。例4.16 测字符串长度。#include#includevoid main()char s=I am a student.;int n;n=strlen(s);printf(The length of the string is:%dn,n);运行结果:The length of the string is:15

    43、例4.17 给一维数组输入数据,然后将数组元素循环右移k位,并且只用一个变量辅助实现这种移动。解 由于只允许使用一个变量辅助实现数组元素的移动,所以将该题转化为每次将数组元素循环右移一位并且进行k次来实现。因此,需用两层for循环:外层的for循环控制k次移位,内层的for循环控制整个数组元素循环右移一位。数组元素循环右移一位的示意如图4-8所示。图4-8 数组元素循环右移一位示意实现程序如下:#includevoid main()int a20,i,j,k,n,x;printf(Please input number of elements:);scanf(%d,&n);printf(Ple

    44、ase input elements:n);for(i=0;in;i+)scanf(%d,&ai);for(i=0;in;i+)printf(%4d,ai);printf(n);printf(Please input number of moves:);scanf(%d,&k);for(i=1;i=0;j-)aj+1=aj;a0=x;printf(Output after moves:n);for(i=0;in;i+)printf(%4d,ai);printf(n);运行结果:Please input number of elements:8Please input elements:1 2

    45、3 4 5 6 7 8 1 2 3 4 5 6 7 8Please input number of moves:3Output after moves:6 7 8 1 2 3 4 5 例4.18 利用数组求2到1000之间的完数,完数即其因子之和等于该数自身的数。例如:6=123=1+2+3。解 在第3章中我们已经求解过完数,但是由于当时没有用数组保存一个数所找到的每个因子,而是将找到的因子求和保存;故当判断出这个数的所有因子和等于该数时(即为完数),还需再一次求出每一个因子用于输出。这里,我们采用数组来保存判断某数是否为完数过程中所找出的每一个因子,一旦确定这个数为完数就可直接输出已保存在数

    46、组中的因子。程序中,我们用变量k来指示数组f中下一个存放因子的位置。实现程序如下:#includevoid main()int f10,i,j,k,s;for(i=2;i=1000;i+)s=0;/*用于保存因子之和*/k=0;for(j=1;ji;j+)if(i%j=0)fk=j;/*保存找到的一个因子*/s=s+j;/*求因子的累加和*/k+;if(i=s)printf(%4d its factors are,i);for(j=0;jk;j+)printf(%4d,fj);printf(n);运行结果:6 its factors are 1 2 3 28 its factors are 1

    47、 2 4 7 14 496 its factors are 1 2 4 8 16 31 62 124 248例4.19 用数组存储的方式实现求解素数问题。解 在此我们采用筛法求素数的方法。用数组实现筛法求素数的思想是:先设一整型数组,并认为每一个数组元素的下标值即代表一个整数;这样,这个数组的下标即可表示某一范围的全部整数。初始时假定该数组下标对应的全部整数都是素数,并置该数组的每一个元素值为“1”。筛法求素数的过程是,先从该数组中取出第一个元素,根据其下标值(它代表一个整数)将这个下标所有倍数的下标所指数组元素置“0”值(即筛去一个整数对应的全部倍数整数);然后,继续顺序取出数组中的第二个元

    48、素,同样根据其下标值找出其所有倍数下标的数组元素,将其置“0”;这样反复进行,就好像过“筛子”一样,每一遍都筛去一些不是素数的数组元素(即将其置“0”),也即筛去的是与这些数组元素下标相同的整数。当筛到数组中的最后一个元素时,该数组中元素值为“1”的那些元素就是我们所求的素数,而那些非素数已经在反复过“筛”中被筛掉(即置为“0”了)。程序设计如下:#includevoid main()int b1000,i,j;for(i=2;i1000;i+)bi=1;for(i=2;i1000;i+)if(bi)for(j=2;i*j1000;j+)/*bi非0时则i为素数*/bi*j=0;/*筛去i的所

    49、有倍数*/printf(Output prime:n);j=1;for(i=2;iaj)则交换这两个数的位置;这种操作反复进行,直到所有数都比较、交换过。经过这样一趟排序,最小的数就被安置在第一个位置上。然后,对剩余的n-1个数重复上述排序过程,则第二趟排序的结果是将次小数放置在第二个位置上。这样,在经过n-1趟排序之后,就得到了已经由小到大排好序的n个数。由于每趟排序总是使参与比较的数据中其值最小者放在前面,这就好像水中的气泡一样,较轻的气泡总是先冒出水面,故此形象地称这种排序方法为“冒泡排序法”。为了便于观察每趟排序的过程,在程序中,我们安排了每趟排序后输出当时n个数的排列情况,并且,内循

    50、环for语句“for(j=n-1;j=i;j-)”保证了每趟排序都将参与此趟排序的最小数移到本趟比较中的最前面位置。程序设计如下:#includevoid main()int a20,i,j,n,temp;printf(Please input number of elements:);scanf(%d,&n);printf(Input elements:n);for(i=0;in;i+)scanf(%d,&ai);for(i=0;in;i+)printf(%4d,ai);printf(n);for(i=1;i=i;j-)if(aj-1aj)temp=aj-1;aj-1=aj;aj=temp;

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《C语言与程序设计教程》课件第4章.ppt
    链接地址:https://www.163wenku.com/p-8095485.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库