《c语言》教案

《c语言》教案

ID:20476916

大小:352.50 KB

页数:89页

时间:2018-10-09

上传者:U-4626
《c语言》教案_第1页
《c语言》教案_第2页
《c语言》教案_第3页
《c语言》教案_第4页
《c语言》教案_第5页
资源描述:

《《c语言》教案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

《C语言程序设计》教案总课时数:64+32适用专业:计算机科学与技术学院名称:计科系年级:2014级4班修订时间:徐乾2014年10月88 授课日期:周一3、4周三7、8周五5、6授课类型:演示、讲解、练习、辅导课时:64教材:《高级语言程序设计(C语言描述第二版)》《C程序设计.第四版》教学过程:内容讲授学生实践作业布置新课内容预告教学手段:整体授课+多媒体教学软件+个别辅导+作业88 第1章C语言概述C语言是国际上广泛流行的一门高级程序设计语言,具有语言简洁、使用方便灵活、移植性好、能直接对系统硬件和外围接口进行控制等特点。本章将简要地介绍它的产生过程和特点、C程序结构及C程序的上机步骤,以便对C语言有一个概括的认识。1.1C语言的历史和特色一、历史1.1960年出现了ALGOL60。2.1963年和1967年,在ALGOL60的基础上推出了CPL和BCPL语言更接近于硬件。3.1970年美国贝尔实验室对BCPL语言做了进一步简化,设计了B语言,并用B语言编写了第一个UNIX操作系统。4.在1972年至1973年间,贝尔实验室的D.M.Ritchie在B语言的基础上设计出C语言。二、特色1.简洁紧凑,使用方便灵活C语言一共只有32个关键字、9种控制语句,程序书写自由,压缩了一切不必要的成分,语言简练。2.运算符丰富C语言有34种运算符和15个等级的运算优先顺序,使表达式类型多样化,可以实现在其它语言中难以实现的运算。3.数据类型丰富C语言的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、联合体类型及枚举类型等,能用来实现各种复杂的数据结构的运算。4.模块化结构C语言用函数作为程序的模块单位,便于实现程序的模块化,而且便于模块间相互调用及传递数据。5.语法限制少和程序设计自由度大C语言允许程序编写者有较大的自由度,放宽了以往高级语言严格的语法检查,较好地处理了“限制”与“灵活”这一对矛盾。88 6.比较接近硬件C语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。7.生成目标代码质量高、程序执行效率高一般只比汇编程序生成的目标代码效率低10%―20%。8.可移植性好基本上不做修改就能用于各种型号的计算机和各种操作系统。1.2C程序结构下面列出几个简单的C程序来说明C程序的结构特征。例1.1输出一行信息。main(){printf("ThisisfirstCprogramme! ");}该程序的作用是输出一行信息:ThisisfirstCprogramme!main表示“主函数”;函数体用大括号{}括起来。本例题中主函数仅包含一个语句,该语句由printf()输出函数构成。括号内双引号中的字符串按原样输出;´ ´是换行符,即在输出"ThisisfirstCprogramme!"后回车换行;语句后面有一个分号,表示该语句结束,这个分号必不可少。例1.2计算两个数之和。main()/*求两个数之和*/{inta,b,sum;/*定义3个整型变量*/a=123;/*以下3行为C语句*/b=321;sum=a+b;printf("sumis%d ",sum);}该程序的作用是求两个整数a和b之和sum,并在屏幕上输出sum。程序中,/*……88 */表示注释部分,对编译和运行不起作用。第3行是变量说明,使用的a、b和sum为整型(int)变量。第4行是两个赋值语句,使a的值为123,b为321。第5行使sum的值为a+b,第6行的%d是输入输出的“格式说明”,表示“十进制整数类型”,printf函数中括号内最右端的sum是要输出的变量,当然它的值为444。例1.3比较两个数的大小。main()/*主函数,功能输入两个整数,判断后输出较大的数*/{inta,b,c;/*定义3个整型变量*/scanf("%d,%d",&a,&b);/*输入变量a和b的值*/c=max(a,b);printf("max=%d ",c);/*输出c的值*/}intmax(intx,inty)/*定义max()函数,函数值为整型,x,y为形式参数、整形变量*/{intz;/*定义main()函数内部用到的变量z为整数*/if(x>y)z=x;/*将x,y中较大的值赋给z*/elsez=y;return(z);/*将z值返回。通过max()函数带回调用处*/}该程序的作用是从键盘输入两个整数,然后在屏幕上输出它们中较大值的数。程序的第5行是调用max()函数,在调用过程中将实际参数a和b的值,分别传递给max()函数中的形式参数x和y,然后得到一个返回值(z的值),并把这个值赋给变量c。运行情况如下:2,8↙max=8从以上几个例题,可以看到C程序的结构特征。88 1.C程序是由函数构成的。一个C程序至少有一个main()函数,也可以包含一个main()函数和若干个其它函数。2.一个函数有两部分构成。函数说明部分,即函数的第一行,包括函数类型、函数名、形参类型、形参名。函数体,由一对大括号{}括起来的语句集合。函数体一般包括有声明部分和执行部分,声明部分用于定义所用到的变量,执行部分由若干语句组成。3.一个C程序总是从main()函数开始执行,而不管main()在源程序中的位置,执行完主函数中的所有语句后,程序就结束。4.每个语句和变量定义的最后必须要有一个分号,分号是C语句的必要组成部分。5.C语言本身没有提供输入和输出语句,输入输出操作是通过库函数scanf()、printf()等函数来实现的。6.C语言用/*……*/对程序进行注释,/和*之间不允许留有空格,/*和*/应当一一对应匹配,注释部分允许出现在程序中的任何位置上。程序中加一些注释,可以增加程序的可读性。1.3C程序的开发过程用C语句编写的程序称为“源程序”。1.C程序开发的4个基本步骤一般C程序开发要经历4个基本步骤:编辑——编译——连接——运行(1)编辑使用字处理软件或编辑工具将源程序以文本文件形式保存到磁盘,源程序文件名由用户自己选定,但扩展名必须为".c"。(2)编译编译的功能就是调用“编译程序”,将已编辑好的源程序翻译成二进制的目标代码。如果源程序没有语法错误将产生一个与源程序同名,以".obj"为扩展名的目标程序。(3)连接编译后产生的目标程序往往形成多个模块,还要和库函数进行连接才能运行,连接过程是使用系统提供的“连接程序”运行的。连接后,产生以".exe"为扩展名的可执行程序。(4)运行88 可执行程序生成后,就可以在操作系统的支持下运行,若执行结果达到预期的目的,则开发工作到此完成,否则,要进一步地经过以上过程以取得最终的正确结果。2.使用TurboC开发程序的方法现在,多数的C程序开发使用一个集成TurboC开发工具来完成。下面简单介绍使用TurboC开发程序的方法。(1)TurboC的目录及文件TurboC应装入磁盘的某一目录下,例如,放在c盘的根目录下一级TC子目录下,TurboC安装完成后,磁盘上将增加以下目录及文件:TC子目录(c:tc):其中包括tc.exe、tcc.exe、make.exe等执行文件。INCLUDE子目录(c:tcinclude):其中包括stdio.h、string.h、math.h等头文件。Lib子目录(c:tclib):其中包括graphlics.lib、math.lib、math1.lib等库函数文件。BGI子目录(c:tc|bgi):其中包括tc运行时所需的信息。通过执行tc.exe命令就可以进入TurboC环境,如果用户的当前目录是TurboC所在的子目录tc,则只需从键盘输入“tc”命令即可。C:tc>tc↙(2)TurboC集成环境作简单介绍,它包括以下几个方面的内容:主菜单窗口编辑窗口信息窗口功能键提示行3.用TurboC运行第一个C程序下面介绍使用TurboC编辑和运行一个简单的C程序的操作步骤:(1)编辑或修改源程序。在编辑窗口键入一下源程序:main(){printf("ThisismyfirstCprogram");}然后执行“File/save”命令;或按“F2”键存盘。88 (2)编译与连接源程序。执行“compile/makeexefile”命令或直接按下F9键,即可一次完成编译与连接。(3)运行程序。按“F10”键返回主菜单,用光标移动键将亮条移到“Run”菜单选项回车或按下“Ctrl+F9”键,即可运行刚生成的可执行文件。此时TurboC工作窗口消失,屏幕上显示程序运行结果:ThisismyfirstCprogram若发现运行结果不对,可再按“F10”键回工作窗口,重复上述步骤。(4)运行程序后查看程序的运行结果。(5)退出TurboC,按“Alt+X”键,系统即退出Turbo环境。本章小结本章对C语言进行了总体介绍,对学生的要求是掌握基本概念,学习的过程要紧密结合本章的知识要点:1.程序的构成,main()函数和其他函数。2.头文件、数据说明、函数的开始和结束标志。3.源程序的书写格式。4.C语言的风格。88 第2章顺序结构程序设计顺序结构是一组按书写顺序执行的语句。本章将主要介绍程序中用到的一些基本要素(常量、变量、运算符、表达式和输入输出语句等),以及基本的数据类型(整型、实型和字符型)。2.1常量和变量一、常量1.常量:在程序运行的过程中,其值不能被改变的量。如2、4、-1.6等。2.分类:普通常量和符号常量。3.符号常量:用一个标识符代表一个常量,这样的标识符称为符号常量。如用PI代表3.1415926。4.注意:符号常量的值在其作用域内不能改变,也不能再被赋值。如在程序中,对PI重新赋值:PI=2;这样是不允许的。二、变量1.变量C语言规定在程序运行的过程中,其值可以改变的量,称为变量。2.标识符:用来标识变量名、符号常量名、函数名、数组名、类型名和文件名的有效字符序列。3.C语言规定:标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。一般变量名的长度不能超过8个字符。如下面是合法的标识符,也是合法的变量名:sum,average,day,month,student,_above,k_1_2_3,basic;下面是不合法的标识符和变量名:M.D.John,$123,#33,3D64,a>,-ab。在C语言中,要求对所有用到的变量作强制定义,也就是″先定义,后使用″。2.2整型数据一、整型常量C语言整型常数可用以下三种形式表示:1.十进制整数:数码直接开头的十进制数。2.八进制整数:以0开头的常量是八进制数。88 3.十六进制整数:以0x开头的数是16进制数。二、整型变量1.整型变量的分类整型变量可分为:基本型、短整型、长整型和无符号型四种,其定义的关键字如下:(1)基本型,以int表示。范围为-32768~32767,即-215~(215-1)。(2)短整型,以shortint或short表示。范围与基本型相同。(3)长整型,以longint或long表示。若一个整型常量后面加上一个字母l或L,则认为是longint型常量。范围为-2147483648~214783647即-231~(231-1)(4)无符号型,在实际应用中变量的值常常是正的,如年龄、工资、成绩等,因此可以将变量定义为″无符号″类型。无符号型又分为:①无符号整型,以unsignedint或unsigned表示。范围:0~65535,即0~(216-1)。②无符号短整型,以unsignedshort表示。范围:0~65535即0~(216-1)。③无符号长整型,以unsignedlong表示。范围:0~4294967295即0~(232-1)。2.整型变量的定义变量的定义格式为:数据类型变量表列;其中若定义多个同类型的变量,则用逗号分开。例:inta,b;(指定变量a,b为整型)unsignedshortc,d;(指定变量c,d为无符号短整型)longe,f;(指定变量e,f为长整型)3.整型数据的输入整型变量键盘输入,是通过scanf函数实现的,scanf函数是数据输入函数,格式为:scanf(格式控制,地址表列);例如:scanf(″%d%d″,&a,&b);(1)格式控制是用双引号括起来的字符串,由″%″和格式字符组成,作用是将输入数据转换为指定的格式输入。(2)格式字符,对于不同的数据用不同的格式字符。d格式符是用来输入十进制整数的。因为本节问题中变量a,b是整型变量,所以输入时,用了d格式符。(3)&a,&b中的″&″是″地址运算符″88 ,&a是指a在内存中的地址。上面scanf函数的作用是:将a、b的值放到a,b在内存的地址单元中去。所以,在该问题中,若输入:35↙则输出结果为a+b=84.整型数据的输出整型数据的输出用printf函数来实现。如printf(″a+b=%d″,c);printf函数的格式为:printf(格式控制,输出表列);(1)格式控制和输入函数scanf的格式控制基本一致。(2)输出表列是需要输出的数据或表达式。(3)在输出整型数据时,格式字符如下:①%d,按整型数据的实际长度输出。②%md,m为输出字段的宽度,如果输出数据的位数小于m则左端补以空格,若大于m,则按实际位数输出。例如:printf(″%4d,%4d″,a,b);若a=123,d=12345,则输出结果为:V123,12345(注:V表示空格字符,下同)③%ld,输出长整型数据。如:longa=135790;printf(″%8ld″,a);输出结果为:VV135790一个int型数据可以用%d或%ld格式输出。④%u,输出unsigned型数据,即无符号类型,如unsignedu;那么u在输出的时候,应该用u格式控制符,那么输出时应使用语句:printf(″%u″,u);例2.1从键盘输入任意一个整数,输出这个数的平方的值。main(){inta;longs;scanf(″%d″,&a);s=a*a;printf(″s=%ld ″,s);}88 2.3实型数据一、实型常量实数在C语言中,又称浮点数。实数有两种表示形式:1.十进制数形式。由数字和小数点组成(注意必须有小数点)。2.指数形式。但注意字母e(或E)之前必须有数字,且e后面指数必须为整数,如e3、2.1e3.5、.e3、e都不是合法的指数形式。二、实型变量在本节问题中,已知两个数是实数,那么两数之和与积也必定为实数,所以需要设四个实型变量,分别为a,b,sum,mul。定义语句为:floata,b,sum,mul;C实型变量分为:1.单精度型(float型)一个float型数据在内存中占4个字节(32位),在TURBOC中,单精度实数的范围约为-1038~1038之间并提供7位有效位;小于10-38的数被处理成零值。2.双精度型(double型)一个double型数据在内存中占8个字节,双精度实数的数值范围约为-10308~10308。并提供15~16位有效位,具体精确多少位与机器有关;小于10-308的数被处理成零值。三、实型数据的输入和输出1.实型数据的输入实型数据的输入也用scanf函数实现的,格式符使用的是f字符,以小数的形式输入数据,也可以使用e字符,以指数的形式输入数据。如本节问题中的scanf(″%f%f″,&a,&b);2.实型数据的输出实型数据的输出用printf函数实现,格式符使用f字符,以小数的形式输出数据。输出时应注意:(1)%f:不指定字段宽度,整数部分会全部输出,并输出6位小数。(2)%m.n:指定输出数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格。88 (3)%-m.n:指定输出数据共占m列,其中有n位小数。如果数值长度小于m,则右端补空格。(4)若是双精度型变量输出时应用%lf格式控制,如doublef;输出时应使用语句:printf(″%lf″,f);2.4字符型数据一、字符常量1.字符常量C语言的字符常量是用一对单引号括起来的单个字符。如:´a´、´b´、´x´、´D´、´?´、´$´等都是字符常量。2.转义字符除了这样的字符常量外,C语言还允许用一种特殊形式的字符常量,就是以一个´´开头的字符序列.例如,前面已经用到,在printf函数中的´ ´,它表示一个″换行″符。例2.2字符常量的输出。main(){printf(″abc tde″);}运行结果:abcde二、字符变量  在本节问题中,设了两个字符型变量c1和c2。定义形式如下:charc1,c2;  它表示c1和c2为字符型变量,各可以放一个字符。可以用下面语句对c1,c2赋值:c1=´a´;;c2=´b´;因此在内存中一个字符变量只占一个字节。三、字符数据的存储形式字符在内存中存储的不是字符本身,而是它的ASCII码,例如字符´a´的ASCII码为97,´b´的ASCII码为98。那么字符的存储形式与整数的存储形式是类似的。C语言使字符型数据和整型数据是通用的。例2.3main(){88 chara1,a2;a1=97;a2=98;printf(″%c%c ″,a1,a2);printf(″%d%d ″,a1,a2);}程序运行时输出如下:ab9798字符型数据和整型数据是通用的,但应该注意字符数据只占一个字节,它只能存放0~255范围内的整数。例2.4大小写字母的转换main(){chara1,a2;a1=´a´;a2=´b´;a1=a1-32;a2=a2-32;printf(″%c%c ″,a1,a2);}运行结果为:AB程序的作用是将两个小写字母a和b转换成大写字母A和B。´a´的ASCII码为97,而´A´为65,´b´为98,´B´为66。从ASCII码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。四、字符型数据的输入和输出1.getchar函数和putchar函数例2.5#include″stdio.h″main(){charc;c=getchar();putchar(c);88 }在运行时,如果从键盘输入字符´a´a↙(输入´a´后,按回车键)a(输出变量c的值´a´)注意:getchar()只能接收一个字符。putchar()也只能向终端输出一个字符。在使用getchar函数和putchar函数时,程序的首部需使用预编译命令″#include″stdio.h″。2.scanf函数和printf函数例2.6main(){charc1,c2;scanf(″%c%c″,&c1,&c2);printf(″%c%c″,c1,c2);}若输入为ab↙则输出为ab在使用scanf函数和printf函数输入输出字符型数据时,使用″%c″格式控制,用来输入输出单个字符。注意,在用″%c″格式输入字符时,空格将以有效字符输入:scanf(″%c%c%c″,&c1,&c2,&c3);若输入aVbVc↙则将字符´a´送给c1,字符空格´V´送给c2,因为空格也是一个有效字符,字符´b´送给c3。%c只需要读入一个字符,用了空格做间隔,所以会出现这样的问题。五、字符串常量字符串常量是用双引号括住的字符序列。如:″Howdoyoudo″,″CHINA″,″a″等都是字符串常量。可以输出一个字符串,如printf(″Howdoyoudo.″);注意:不要将字符常量与字符串常量混淆。´a´是字符常量,″a″是字符串常量,二者不同。C规定:在每个字符串的结尾加一个“字符串结束标志”以便系统据此判断字符串是否结束。以´´作为字符串结束标志。´´88 是ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是“空操作字符”不引起任何操作。2.5变量的初始化变量的初始化,就是在定义变量的同时给变量赋予初值。可以采用说明变量的类型,然后再赋值的方法,也可以对变量类型说明的同时,给变量赋初值。1.先定义后赋值inta,b,c;a=2;b=5;c=10;2.定义和赋值同时进行inta=5;shortb=10;charc=´a´;floatd=7.8;3.对几个变量同时赋一个初值inta1=10,a2=10,a3=10;不可以写成:inta1=a2=a3=10;但是也可以写成:inta1,a2,a3;a1=a2=a3=10;初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋以初值的。相当于一个赋值语句。例如:inta=10;相当于:inta;a=10;又如:inta,b,c=20;相当于:inta,b,c;c=20;2.6运算符和表达式一、算术运算符和表达式例2.7已知正方形的长和宽,求正方形的周长。[分析]正方形的周长公式为:l=2*(a+b),已知正方形的长和宽可以计算周长。main()88 {inta,b,l;a=3;b=4;l=2*(a+b);printf(″l=%d ″,l);}1.基本的算术运算符+(加法运算符,或正值运算符)-(减法运算符,或负值运算符)*(乘法运算符)/(除法运算符)%(模运算符,或求余运算符)注意:(1)两个整数相除结果为整数。但是如果相除的两个数中,至少有一个为实数,则结果为带小数的商。(2)%模运算符,要求操作数均为整型数据,如7%4的值为3。2.算术表达式用算术运算符和括号将操作数连接起来的,符合C语法规则的式子,称C算术表达式。在表达式求值时,按运算符的优先级别高低次序执行。例如:10+´a´+1.5-8765.12*´b´在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。3.强制类型转换可以用强制类型转换运算符将一个表达式转换成所需类型。例如:(double)a(将a转换成double类型)(int)(x+y)(将x+y的值转换成整型)(float)(5%3)(将5%3的值转换成float型)一般形式为:(类型名)(表达式)注意:(1)类型名应用括号括起来。如(int)(x+y)(2)已知floatx;88 对于(int)x,x仍然是float类型,而整个表达式(int)x为整型。二、赋值运算符和赋值表达式1.赋值符号赋值符号″=″就是赋值运算符,将一个数据赋给一个变量。如″a=3″。2.类型转换如果赋值运算符两侧的类型不一致,要进行类型转换。(1)将实型数据赋给整型变量时,舍弃实数的小数部分。如i为整型变量,执行″i=3.56″的结果是使i的值为3。(2)将整型数据赋给实型变量时,数值不变,但以浮点数形式存储到变量中。3.复合的赋值运算符常用的赋值运算符有以下几种:+=,-=,*=,/=,%=例如:a+=3等价于a=a+3x*=y+8等价于x=x*(y+8)x%=3等价于x=x%34.赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为″赋值表达式″。例如:a=b=c=5(赋值表达式值为5,a、b、c值均为5)a=5+(c=6)(表达式值为11,a值为11,c的值为6)a=(b=4)+(c=6)(表达式值为10,a值为10,b等于4,c等于6)三、逗号运算符和逗号表达式逗号运算符将两个表达式连接起来。如:3+5,6+8称为逗号表达式。逗号表达式的格式为:表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2,整个逗号表达式的值是表达式2的值。例如逗号表达式a=3*5,a*4,先求解a=3*5,得a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。课堂练习综合实例例1输入三角形的三条边长,求三角形面积。(为了简单起见,设输入的三边长a,b,c能构成三角形)88 #include″math.h″main(){floata,b,c,s,area;scanf(″%f,%f,%f″,&a,&b,&c);s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(″a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f ″,a,b,c,s);printf(″area=%7.2f ″,area);}运行情况如下:3,4,6a=3.00,b=4.00,c=6.00,s=6.50area=5.33例2从键盘输入一个大写字母,要求改用小写字母输出。#include″stdio.h″main(){charc1,c2;c1=getchar();printf(″%c,%d ″,c1,c1);c2=c1+32;printf(″%c,%d ″,c2,c2);}运行情况如下:A↙A,65a,97本章小结本章在讲解顺序结构程序设计方法的同时,介绍了三种数据类型。88 1.整型数据。主要了解整型数据的定义方法,根据使用整数的范围选用定义整数变量的类型。掌握整型数据的输入输出方法,主要使用d格式控制符。2.实型数据。主要掌握实型变量的不同定义方法,单精度数和双精度数的表示范围,实型数据的输入输出方法,主要使用f格式控制符。3.字符型数据。是由一对单引号括起来的单个字符,要注意,字符与字符串的区别。还讲解了各种运算符和表达式,主要掌握算术运算符,在混合运算中,要按照运算符的优先级,结合方向运算。作业:1.编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf函数输出这两个字符。上机运行此程序,比较putchar和printf函数输出字符的特点。2.试编写程序,从键盘输入一个大写字母,要求改用小写字母输出。88 第3章选择结构程序设计选择结构,或称分支结构,是指对所给定的条件进行判断,然后决定选择执行不同的操作。本章主要介绍如何用C语言实现选择结构。C语言的选择语句有两类,一类是if语句,另一类是switch语句,本章将分别进行介绍。在介绍选择结构程序设计的同时,还要介绍关系运算符和关系表达式,逻辑运算符和逻辑表达式等内容。3.1关系运算符和关系表达式一、关系运算符及其优先次序1.关系运算符C语言提供6种关系运算符:①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)⑤==(等于)⑥!=(不等于)优先级相同(高)优先级相同(低)2.关于优先次序:(1)前4种关系运算符(´<´,´<=´,´>´,´>=´)的优先级别相同,后两种也相同。前4种高于后2种。例如,´>´优先于´==´。而´>´与´<´优先级相同。(2)关系运算符与算术运算符、赋值运算符的优先级关系如下:算术运算符(高)→关系运算符(中)→赋值运算符(低)例如:a>b+c等效于a>(b+c)a==b=c等效于a=(b>=c)(3)关系运算符的结合方向是“自左向右”。注意:“等于”关系的运算符“==”和“不等于”关系的运算符“!=”与数学中的表示方法不同。例如,欲判断x是否等于0,若写成:x=0则表示把0赋值给变量x,正确的写法为:x==0。88 二、关系表达式1.关系表达式用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式等)连接起来的式子,称关系表达式。例:x>y,a+b<18,´a´<´b´都为合法的关系表达式。2.关系表达式的值关系表达式的值是一个逻辑值,即“真”或“假”。在C语言中:常用1表示“真”,用0表示“假”。例如,a=5,b=2,则:关系表达式a>b的值为“真”,表达式的值为1。关系表达式a==b的值为“假”,表达式的值为0。可以将关系表达式的运算结果(0或1)赋给一个整型变量或字符型变量,如a=4,b=1,下面的赋值语句是将1赋给变量c:c=a>bc的值为1例3.1试求x=5>3>1的值。[分析]x=5>3>1相当于x=(5>3)>1=1>1=0[说明]根据关系运算符的优先级别高于赋值运算符。3.2逻辑运算符和逻辑表达式一、逻辑运算符及其优先次序1.逻辑运算符C语言提供了3种逻辑运算符:①!逻辑非②&&逻辑与③║逻辑或其中“&&”和“║”为“双目(元)运算符”,要求有两个操作数(即运算量),如(a=b)&&(x>y)可写成:a>=b&&x>y(a==b)║(x==y)可写成:a==b║x==y(3)逻辑运算的结合方向是“自左向右”。二、逻辑表达式1.逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。例如:a&&b*c,(a+b)║(c<0)均为逻辑表达式。2.逻辑表达式的值C语言编译系统在给出逻辑运算时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以非0代表“真”,即将一个非0的数值认为是“真”,以0代表“假”。注意:(1)参与逻辑运算的量不但可以是0和1,或者是0和非0的整数,也可以是任何类型的数据,如字符型、实型或指针型。(2)如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。(3)在逻辑表达式的求解中,并不是所有逻辑运算符都需要执行,有时只需执行一部分运算符就可以得到逻辑表达式的最后结果。例如:①x&&y&&z只有x为真时,才需要判断y的值。只要x为假,就立即得出整个表达式为假。②x║y║z只要x为真(非0),就不必判断y和x;当x为假,才判断y;x和y都为假才判断z。3.3if语句if语句是选择结构的一种形式,又称为条件分支语句。它是通过对给定条件的判断,来决定所要执行的操作。C语言中提供了3种形式的if语句:if语句、if-else语句和if-else-if语句。一、问题的提出[问题]比较两个数的大小,将两个数中较大者赋给m。88 [分析]要比较两个数的大小就要用到关系表达式,定义两个变量a,b,如果a>b则将a的值赋给m,若ab)m=a;elsem=b;printf("m=%d ",m);}程序运行结果:m=10[说明]在该问题中我们借用了if语句,通过条件来判断应该执行哪条语句,充分体现出选择结构程序设计的思想。二、if语句的三种形式1.if语句if语句是条件分支语句最基本的形式。格式:if(表达式)语句功能:首先计算表达式的值,若表达式的值为“真”(非0),则执行语句,若表达式的值为“假”(0),不执行语句。其流程图3.1(a)所示。例如:if(x>y)printf("%d",x);2.if-else语句if-else语句是条件分支语句的标准使用形式。格式:if(表达式)语句1else语句2功能:首先计算表达式的值,若表达式的值为“真”(非0),则执行语句1,若表达式的值为“假”(0),则执行语句2。例如:if(x>y)printf("%d",x);elseprintf("%d",y);88 3.if-else-if语句前面两种if语句一般都用于两个分支的选择结构。对于多个分支选择时,可采用if-else-if语句。格式:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3┇elseif(表达式n-1)语句n-1else语句n功能:首先计算表达式1的值,若为“真”(非0),执行语句1,否则进行下一步判断;若表达式2为真,执行语句2,否则进行下一步判断……最后所有表达式都为假时,执行语句n。例如:if(score>89)grade=´A´;elseif(score>79)grade=´B´;elseif(score>69)grade=´C´;elseif(score>59)grade=´D´;elsegrade=´E´;关于if语句的说明:(1)if后面圆括号中的表达式一般是关系表达式或逻辑表达式,用于描述选择结构的条件,但也可以是任意的数值类型表达式(包括整型、实型、字符型、指针型数据表达式)。例如:if(2)printf("OK!");是合法的,因为表达式的值为2,非0,按“真”处理,执行结果输出“OK!”(2)第二种、第三种格式的if语句中,在每个else前面有一个分号,整个语句结束处也有一个分号。这是由于分号是C语句中不可缺少的部分,这个分号是if语句中的内嵌语句所需要的。(3)在if和else后面可以只含有一个内嵌的操作语句,也可以含有多个操作语句,此时应用大括号“{}”将几个语句括起来,构成一个复合语句,注意:复合语句的“{”和“}”之后不能加分号。88 例3.2输入两个实数,按代数值由小到大输出这两个数。main(){floata,b,c;scanf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}程序运行结果:2.2,-5.7↙-5.70,2.20二、if语句的嵌套在if语句中有包含一个或多个if语句称为if语句的嵌套。要处理多重分支选择结构问题,除了用if-else-if语句外,还可以利用if语句的嵌套来实现。说明:(1)if和else的配对规则为:else总是与它上面的最近的未配对的if配对。(2)if与else的个数最好相同,从内层到外层一一对应,以避免出错。(3)在嵌套内的if语句既可以是if语句形式,也可以是if-else语句形式,但最好使内嵌if语句也包含else部分。如果if与else的个数不同,可以用花括号来确定配对关系。例如:if(){if()语句1}else语句2这时“{}”限定了内嵌if语句的使用范围,因此else与第一个if配对。例3.3有一函数:-1(x<0)y=0(x=0)1(x>0)88 编一程序,输入一个x值,输出y值。main(){intx,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d ",x,y);}三、条件运算符条件运算符由两个符号“?”和“:”组成,要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的三目运算符。条件表达式的格式为:表达式1?表达式2:表达式3min=(ab)?printf("%d",a):printf("%d",b)等均为合法的条件表达式。(2)条件表达式的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。min=(ab?a:b+1等效于a>b?a:(b+1),而不等效于(a>b?a:b)+188 (4)条件运算符的结合方向为“自右至左”。例如:x>0?1:x<0?-1:0等效于x>0?1:(x<0?-1:0)(5)表达式1、表达式2和表达式3的类型可以不同,此时条件表达式的值的类型为它们中较高的类型。例3.4输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。main(){charch;printf("Pleaseenteracharcter: ");scanf("%c",&ch);ch=(ch>=´A´&&ch<=´Z´)?(ch+32):ch;printf("%c",ch);}程序运行结果:Pleaseenteracharcter:A↙a[说明]条件表达式中的(ch+32),其中32是小写字母和大写字母ASCⅡ码的差值。3.4switch语句一、问题的提出要求按照考试成绩的等级(grade)输出百分制分数段:键入´A´,输出85~100;键入´B´,输出70~84;键入´C´,输出60~69;键入´D´,输出<60;键入其他任意字符,输出error。main(){chargrade;scanf("%c",&grade);switch(grade){88 case´A´:printf("85~100 ");case´B´:printf("70~84 ");case´C´:printf("60~69 ");case´D´:printf("<60 ");default:printf("error ");}}二、switch语句格式为:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2┇case常量表达式n:语句ndefault:语句n+1}其中default和语句n+1可以同时省略。说明:(1)switch的表达式通常是一个整型或字符型变量,也允许是枚举型变量,其结果为相应的整数、字符或枚举常量。case后的常量表达式必须是与表达式对应一致的整数、字符或枚举常量。(2)switch语句中所有case后面的常量表达式的值都必须互不相同。(3)switch语句中的case和default的出现次序是任意的。(4)由于switch语句中的“case常量表达式”只是起语句标号的作用,而不起条件判断作用,即“只是开始执行处的入口标号”。可以用一个break语句来终止switch。将上面的switch结构改写如下:switch(grade){case´A´:printf("85~100 ");break;case´B´:printf("70~84 ");break;case´C´:printf("60~69 ");break;case´D´:printf("<60 ");break;88 default:printf("error ");}最后一个分支(default)可以不加break语句。如果grade的值为´B´,则只输出"70~84"。(5)每个case的后面既可以是一个语句,也可以是多个语句,当是多个语句的时候,也不需要用花括号括起来。(6)多个case的后面可以共用一组执行语句,如:switch(n){case1:case2:x=10;break;┇}它表示当n=1或n=2时,都执行下面两个语句:x=10;break;本章小结本章介绍了结构化程序设计的基本结构之一选择结构,另外还介绍了逻辑运算等内容,现将本章中的知识要点作一概括性小结。1.关系运算。包括关系运算符及其优先性、关系表达式及其求值方法。2.逻辑运算。包括逻辑运算符及其优先性、逻辑表达式及其求值方法。3.用if语句实现选择结构。包括if的三种形式及其执行流程、if语句的嵌套。4.用switch语句实现多分支选择结构。5.条件运算符的使用。作业:给学生写评语,若学生成绩在60~69分,则打印“及格”,70~89分打印“良好”,90~100分打印“优秀”,60分以下打印“不及格”,请分别用if-else语句和switch语句编程。88 第4章循环结构程序设计循环结构是结构化程序设计的基本结构之一,它与顺序结构、选择结构共同作为各种复杂程序的基本构造单元。C语言提供了3种循环语句:while语句、do-while语句和for语句,本章将分别进行介绍。除此之外,还将介绍break语句、continue语句的使用。4.1三种循环语句一、while语句while语句用来实现“当型”循环结构。格式为:while(表达式){语句}功能:当表达式的值为非0时,执行while语句中的循环语句。说明:(1)循环体如果包含一个以上的语句,应该用大括号括起来,以复合语句的形式出现,否则while语句范围只到while后面第一个分号处。(2)在循环中应有使循环趋向于结束的语句,即设置修改条件的语句。例如:i=i+1;如果无此语句,则i的值一直不变,循环永不结束,这就称为“死循环”。(3)while语句的特点是先判断表达式的值,然后执行循环体中的语句,如果表达式的值一开始为假(即值为0),则退出循环,并转入下一个语句执行。例4.1求2+4+8+……+50的值。main(){inti=2,sum=0;while(i<=50){sum=sum+i;i=i+2;}printf("%d",sum);}程序运行结果:2+4+8+…+50=65088 二、do-while语句do-while循环语句,用来实现“直到型”循环结构。格式:do{语句}while(表达式);功能:先执行一次指定的循环体语句,然后判断表达式的值,当表达式的值为非0时,返回重新执行该语句,如此反复,直到表达式的值等于0为止,此时循环结束。说明:(1)do-while语句的特点是:先执行语句,后判断表达式的值。(2)如果do-while语句的循环体部分是多个语句组成,则必须用左右大括号括起来,使其形成复合语句。(3)while圆括号后面有一个分号“;”,书写时不要忘记。例4.2用do-while循环结构来计算1+3+5+…+99的值。main(){inti=1,sum=0;do{sum=sun+i;i=i+2;}while(i<=100);printf("1+3+5+…+99=%d ",sum);}程序运行结果:2+3+5+…+99=2500例4.3求i+(i+1)+(i+2)+…+10(i<=10)的值,其中i由键盘输入。(2)用do-while语句编程main(){intsum=0,i;scanf("%d",&i);88 do{sum=sum+i;i=i+1;}while(i<=10);printf("%d",sum);}[程序](1)用while语句编程main(){intsum=0,i;scanf("%d",&i);while(i<=10){sum=sun+i;i=i+1;}printf("%d",sum);}程序运行情况如下:1↙sum=55再运行一次结果为:11↙sum=11程序运行情况如下:1↙sum=55再运行一次结果为:11↙sum=088 显然,当输入i的值小于或等于10,两个程序运行结果相同;当i大于10时,程序(1)一次也不执行循环语句,程序(2)仍然执行一次循环语句。while语句和do-while语句的区别:当while后面的表达式第一次的值为“真”时,两种循环得到的结果相同。否则,二者不相同(指二者具有相同的循环体的情况)。三、for语句1.for语句格式:for(表达式1;表达式2;表达式3){语句}执行过程:①先计算表达式1的值。②再计算表达式2的值,若其值为真,则执行循环体一次;否则跳转第⑤步。③然后计算表达式3的值。④回转上面第②步。⑤结束循环,执行for语句下面一个语句。说明:(1)表达式1一般为赋值表达式,用于进入循环之前给循环变量赋初值。(2)表达式2一般为关系表达式或逻辑表达式,用于执行循环的条件判定,它与while、do-while循环中的表达式作用完全相同。(3)表达式3一般为赋值表达式或自增(i=i+1可表示成i++)、自减(i=i-1可表示成i--)表达式,用于修改循环变量的值。(4)如果循环体部分是多个语句组成的,则必须用大括号括起来,使其成为一个复合语句。例4.4用for循环结构来计算1+2+3+…+10的值。[程序]main(){inti,sum=0;for(i=1;i<=10;i++)sum=sum+1;printf("1+2+3+…+10=%d ",sum);}88 程序运行结果:1+2+3+…+10=55可以看出,此例的结果与用while语句完全相同的。显然,用for语句简单、方便。对于以上for语句的一般形式也可以改写为while循环语句的形式:表达式1;while(表达式2){循环语句;表达式3;}例如,以下for语句程序段:for(i=1;i<=5;i++){a=a*i;printf("%d%d ",a,i);}完全等价于下面的while语句程序段:i=1;while(i<=5){a=a*i;printf("%d%d ",a,i);i++;}2.for语句表达式的进一步说明(1)for语句的一般形式中的“表达式1”可以省略。但要注意省略表达式1时,其后的分号不能省略。此时,应在for语句之前给循环变量赋初值。例如:i=1;for(;i<=100;i++)sum=sum+i;相当于:for(i=1;i<=100;i++)88 sum=sum+i;;(2)如果省略表达式2,即表示表达式2的值始终为真,循环将无终止地进行下去。例如:for(i=1;;i++)printf("%d",i);相当于:i=1;while(1){printf("%d",i);i++;}该循环无终止条件,将无限循环输出1、2、3、4、5……。(3)如果省略表达式3,也将产生一个无穷循环。因此,程序设计者应另外设法保证循环能正常结束,可以将循环变量的修改部分(即表达式3)放在循环语句中控制。例如:for(i=1;i<=100;){sum=sum+i;i++;}上述for语句中没有表达式3,而是将表达式3(即i++)放在循环语句中,作用相同,都能使循环正常结束。(4)可以同时省略表达式1和表达式3,即省略了循环的初值和循环变量的修改部分,此时完全等价于while语句。例如:while(i<=10){printf("%d",i);i++;}相当于:88 for(;i<=10;){printf("%d",i);i++;}(5)3个表达式都可省略,如:for(;;)相当于:while(1)即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。(6)在for语句中,表达式1和表达式3也可以使用逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。在逗号表达式内按从左至右求解,整个表达式的值为其中最右边的表达式的值。例如:for(i=1;i<=100;i++,sum=sum+i;)相当于:for(i=1;i<=100;i++)sum=sum+i;(7)在for语句中,表达式一般为关系表达式(如i<=10)或逻辑表达式(如x>0‖y<-4),但也可以是其他表达式(如字符表达式、数值表达式)。(8)for语句的循环语句可以是空语句。空语句用来实现延时,即在程序执行中等待一定的时间。需要注意的是,延时程序会因为计算机速度的不同而使执行的时间不同。如下面语句为延时程序的例子:for(i=1;i<=1000;i++);注意以上语句最后的逗号不能省略,它代表一个空语句。4.2循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环:while循环、do-while循环和for循环可以互相嵌套。例如下面几种形式都是合法的。for(;;){……88 for(;;){……}}do{……do{……}while();}while();while(){……while(){……}}while(){……do{……}while();}for(;;){……while(){……}}do{……for(;;){}……}while();例4.5利用双重for循环结构打印出9*9乘法表。main()88 {inti,j;for(i=1;i<10;i++){for(j=1;j<10;j++)printf("%d",i*j);printf(" ");}}4.3break语句和continue语句一、break语句格式:break;功能:该语句可以使程序运行时中途跳出循环体,即强制结束循环,接着执行循环下面的语句。例4.6求圆的面积。[分析]计算r=1到r=10的圆面积,直到s>100为止,当s>100时,执行break语句,提前终止循环,即不再继续执行其余的几次循环。#definePI3.1415926main(){intr;floats;for(r=1;r<=10;r++){s=PI*r*r;if(s>100)break;}printf("s=%f",s);}[说明](1)break语句不能用于循环语句和switch语句之外的任何语句。(2)在多重循环的情况下,break语句只能跳出一层循环,即从当前循环中跳出。88 二、continue语句格式:continue;功能:结束本次循环,即跳出循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:continue语句只是结束本次循环,而不终止整个循环的执行;而break语句则是强制终止整个循环过程。例4.7打印出数字0~10,但跳过(即不输出)数字7。main(){inti;for(i=0;i<=10;i++){if(i==7)continue;printf("%5d",i);}}程序运行结果为:01234568910[说明](1)当i等于7时执行continue语句,它的作用是终止本次循环,即跳过printf语句,故不输出7。(2)如果程序中不用continue语句,循环体也可以改用一个语句处理:if(i!=7)printf("%5d",i);(3)如果在本例中将第7行“continue;”语句,改为“break;”语句,则输出结果为:0123456可以清楚地看出break语句是终止整个循环过程,它与continue语句作用是截然不同的。4.4几种循环的比较1.三种循环都可以用来出来处理同一问题,一般情况下它们可以互相代替。88 2.while和do-while循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成,用for循环都能实现。3.对于循环变量赋初值,while语句和do-while语句一般是在进入循环结构之前完成,而for语句一般是在循环语句表达式1中现实变量的赋值。4.while语句和for语句都是先测试循环控制表达式,后执行循环语句,do-while语句则是先执行循环语句,后测试循环控制表达式。5.while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。本章小结本章重点介绍了结构化程序设计的基本结构之一——循环结构,主要介绍了以下几个方面:1.while循环结构的构成形式、运行流程与使用过程中的注意事项。2.do-while循环结构的构成形式、运行流程与使用过程中的注意事项。3.for循环结构的构成形式、运行流程与使用过程中的注意事项。4.3种循环结构的比较,以及在结构化程序设计中的灵活运用和循环结构的嵌套。5.其他流程控制语句的使用,包括break语句、continue语句。作业:1.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。2.有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?3.找出1~1000之间的所有水仙花数。所谓水仙花数是指一个3位数的立方和恰好等于该数本身。例如:153就是一个水仙花数,因为153=1*1*1+3*3*3+5*5*5。4.按下面的近似公式计算:e=1+1/1!+1/2!+1/3!+……+1/n!+……,使误差小于一个给定的值。88 第5章数组本书前几章介绍了C语言中几种简单数据类型。在本章中将介绍一种新的构造类型:数组。数组是一种最简单的构造类型,它包含着一组具有同一类型的变量,这些变量在内存中的存储位置是连续的。在解决实际问题时数组有着广泛的应用。本章介绍了C语言中一维数组、二维数组及字符数组的定义、初始化及使用方法等。5.1一维数组的定义和引用一、一维数组的定义C语言规定:数组必须先定义,后使用。一维数组的格式为:类型说明符数组名[常量表达式];例如:floatscore[10];它表示定义了一个名为score的数组,该数组有10个元素,其存放的数据类型应为实型。说明:(1)类型说明符用来说明数组元素的类型:int,char,float或double。(2)数组名的命名应遵守标识符的命名规则。(3)数组名后是用方括号括起来的常量表达式。常量表达式表示的是组元素的个数,即数组的长度。在上例中定义了数组score[10],该数组有10个元素,其下标从0开始。注意:不要使用score[10],因为它不是该数组的元素。(4)常量表达式中可以包括常量和符号常量,不能包含变量,因为C语言规定数组不能动态定义。二、一维数组的初始化数组的初始化是指在定义数组时给数组元素赋初值。一维数组初始化的格式为:类型说明符数组名[常量表达式]={常量列表};例如inta[5]={2,4,6,8,10};其作用是在定义数组的同时将常量2、4、6、8、10分别置于数组元素a[0]、a[1]、a[2]、a[3]、a[4]中。说明:(1)常量列表可以是数值型、字符常量或字符串。(2)数组元素的初值必须依次放在一对大括号内,各值之间用逗号隔开。(3)可以只给部分数组元素赋初值。例如:inta[10]={1,2,3,4,5};(4)在进行数组的初始化时,{}中值的个数不能超过数组元素的个数。例如:int88 a[5]={1,2,3,4,5,6,7,8};是一种错误的数组初始化方式。(5)在给数组所有元素赋初值时,可以不指定数组长度。例如:inta[]={1,2,3,4,5};则系统会自动定义数组a的长度为5。(6)定义数组时不进行初始化,则该数组元素的值是不确定的。如果欲将数组所有元素的初值置为0,可以采用如下方式:staticinta[10];三、一维数组元素的引用C语言规定数组不能以整体形式参与数据处理,只能逐个引用数组元素。一维数组的引用方式为:数组名[下标];其中下标可以是整型常量、整型变量或整型表达式。例如有定义:inta[10],i=2;则以下是正确的表达式:a[0]=a[1]+a[i]+a[i+3];例5.1找出10个整数中的最大值及其序号。[分析]将10个整数放于一维数组中,找出其中的最大值及其下标即可。main(){inti,max,k,a[11];for(i=1;i<=10;i++)scanf("%d",&a[i]);max=a[1];k=1;for(i=2;i<=10;i++){if(max0)for(i=1;i<=17;i++)if(a[i]!=0){temp++;if(temp==3){printf("%4d",a[i]);a[i]=0;temp=0;d--;}}88 }程序的运行结果是:3691215151014281671713411例5.4用冒泡法对10个整数由小到大进行排序main(){inti,j,t,a[11];printf("input10numbers: ");for(i=1;i<=10;i++)scanf("%d",&a[i]);printf(" ");for(j=1;j<=9;j++)/*控制比较的趟数*/for(i=1;i<=10-j;i++)/*控制每趟比较的次数*/if(a[i]>a[i+1])/*相邻元素相比较*/{t=a[i];a[i]=a[i+1];a[i+1]=t;}/*交换数组元素的值*/printf("thesortednumbers: ");for(i=1;i<=10;i++)printf("%d",a[i]);}程序运行情况如下:input10numbers:583210-4143-126742↙thesortednumbers:-12-40358214267143此程序用a[0]至a[10]存储10个数据,排序时采用双层循环,外层循环控制比较的“趟”数(共9趟),内层循环控制每趟比较的“次”数。第一趟比较9次,将最大数置于a[10]中;第二趟比较8次,将次大数置于a[9]中;……;第九趟比较1次,将次小数置于a[2]中;余下的最小数置于a[1]中。5.2二维数组的定义和引用一、二维数组的定义88 与一维数组相同,二维数组也必须先定义,后使用。二维数组的格式为:类型说明符数组名[常量表达式1][常量表达式2];例如:inta[3][4];定义a为3×4(3行4列)的整型数组。该数组有12个元素,分别为:a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]说明:(1)类型说明符、数组名、常量表达式的意义与一维数组相同。(2)二维数组中元素的排列顺序是按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。(3)可以把二维数组看成是特殊的一维数组,它的每个元素又是一个一维数组。二、二维数组的初始化二维数组也可以在定义时对指定元素赋初值,可以用以下方法对二维数组进行初始化:(1)按行分段赋值。例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};(2)将所有的初值写在一个大括号内,按数组元素的排列顺序对各个元素赋初值。例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};(3)可以对数组部分元素赋初值。例如:inta[3][4]={{1},{5,6},{9}};又如:inta[3][4]={{1,2},{},{0,10}};其作用是使a[0][0]=1,a[0][1]=2,a[2][1]=10,数组的其它元素都为0。(4)如果对数组的全部元素都赋初值,则定义数组时可以不指定数组的第一维长度,但第二维长度不能省略。例如:若有定义:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};此定义也可以写成:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};三、二维数组元素的引用二维数组的引用方式为:数组名[下标1][下标2]88 其中下标可以是整型常量、整型变量或整型表达式。例5.5将数组a(2×3矩阵)行列转置后保存到另一数组b中。12314a=b=2545636main(){inta[2][3]={{1,2,3},{4,5,6}};inti,j,b[3][2];printf("arraya: ");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);/*输出a数组*/b[j][i]=a[i][j];/*数组转置*/}printf(" ");}printf("arrayb: ");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf(" ");}}运行结果如下:arraya:123456arrayb:88 142536例5.6有一个3×4的矩阵,求出其中最大值以及它所在位置。main(){inti,j,max,row=0,col=0;inta[3][4]={{2,14,-6,8},{3,7,9,21},{-9,16,0,5}};max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;col=j;}printf("max=%d,row=%d,col=%d ",max,row,col);}程序的输出结果为:max=21,row=1,col=3例5.7某班有20名学生,每名学生有5门课的成绩,分别求出每门课的平均成绩和每个学生的平均成绩。main(){inti,j;floatscore[21][6]={0};for(i=1;i<=20;i++)for(j=1;j<=5;j++){scanf("%f",&a[i][j]);88 score[i][0]+=score[i][j];score[0][j]+=score[i][j];}printf("averageofstudentis: ");for(i=1;i<=20;i++)printf("%d:%6.2f ",i,sccore[i][0]/5);printf("averageofcourseis: ");for(i=1;i<=5;i++)printf("%d:%6.2f ",i,score[0][i]/20);}5.3字符数组的定义和引用一、字符数组的定义1.一维字符数组的格式为:类型说明符数组名[常量表达式];例如:charstr[10];定义str为一维字符数组,该数组包含10个元素,最多可以存放10个字符型数据。2.二维字符数组的格式为:类型说明符数组名[常量表达式1][常量表达式2];例如:chara[3][20];定义a为二维字符数组,该数组有3行,每行20列,该数组最多可以存放60个字符型数据。在C语言中,很多情况下字符型与整型是通用的,因此字符型数组也可以这样定义:intstr[10];inta[3][20];注意:字符型数据在内存中是以ASCII码方式存储的,在字符数组中也是如此。二、字符数组的初始化字符数组的初始化方式与其它类型数组的初始化方式类似。1.逐个元素赋初值chars[5]={´C´,´h´,´i´,´n´,´a´};2.如果初值的个数多于数组元素的个数,则按语法错误处理。88 3.如果初值的个数少于数组元素的个数,则C编译系统自动将未赋初值的元素定为空字符(即ASCII码为0的字符:´´)。4.如果省略数组的长度,则系统会自动根据初值的个数来确定数组的长度。例如:charc[]={´H´,´o´,´w´,´´,´a´,´r´,´e´,´´,´y´,´o´,´u´,´?´};数组c的长度自动设定为12。5.二维数组也可以进行初始化。三、字符数组的引用例5.8输出一个字符串。main(){charc[10]={´I´,´´,´a´,´m´,´´,´h´,´a´,´p´,´p´,´y´};inti;for(i=0;i<10;i++)printf("%c",c[i]);printf(" ");}程序运行结果:Iamhappy例5.9输出钻石图形main(){charc[5][5]={{´´,´´,´*´},{´´,´*´,´´,´*´},{´*´,´´,´´,´´,´*´},{´´,´*´,´´,´*´},{´´,´´,´*´}};inti,j;for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%c",c[i][j]);printf(" ");}}程序的运行结果为:88 ********四、字符串1.字符串和字符串结束标志字符串常量是用双引号括起来的一串字符。C语言系统在处理字符串时,一般会在其末尾自动添加一个´´作为结束符。2.用字符串常量给数组赋初值可以用字符串常量来使字符数组初始化。例如:charc[]={"student"};也可以省略大括号而直接写成charc[]="student";五、字符数组的输入与输出1.将数组元素逐个输入与输出,即用格式符"%c"输入或输出一个字符。例5.10从键盘读入一串字符,将其中的大写字母转换成小写字母后输出该字符串。main(){chars[80];inti=0;for(i=0;i<80;i++){scanf("%c",&s[i]);if(s[i]==´ ´)break;elseif(s[i]>=´A´&&s[i]<=´Z´)s[i]+=32;}s[i]=´´;for(i=0;s[i]!=´´;i++)printf("%c",s[i]);printf(" ");}运行该程序两次。88 第一次输入:ProGram↙程序运行结果为:program第二次输入:HOWDOYOUDO?↙程序运行结果为:howdoyoudo?2.将字符数组整体输入或输出,即用格式符"%s"控制字符串的输入与输出。例5.11将上例改写成整体输入输出形式。main(){chars[80];inti;scanf("%s",s);for(i=0;s[i]!=´´;i++)if(s[i]>=´A´&&s[i]<=´Z´)s[i]+=32;printf("%s",s);}注意:(1)用"%s"格式符读入字符串时,scanf函数中的地址项是数组名,不要在数组名前加取地址符号´&´,因为数组名本身就是地址(在后面的内容中将介绍到)。(2)用"%s"格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素。如果写成下面的形式是错误的:printf("%s",s[0]);(3)以scanf("%s",数组名);形式读入字符串时,遇空格或回车都表示字符串结束,系统只是将第一个空格或回车前的字符置于数组中,例如有如下语句:chars[13];scanf("%s",a);若输入为:Howareyou?↙六、字符串处理函数88 在C的库函数中提供了一些字符串处理函数,使用它们可以很方便地处理字符串,如输入、输出、拷贝、连接、比较、测试长度等。1.字符串输出函数:puts格式:puts(字符数组名)功能:将一个字符串输出到终端,字符串中可以包含转义字符。例如:chars[]="China Beijing";puts(s);输出结果是:ChinaBeijing注意:puts函数会将字符串结束标志’’转换成’ ’,即在输出完字符串后换行。2.字符串读入函数:gets格式:gets(字符数组名)功能:从终端读入一个字符串到字符数组。该函数可以读入空格,遇回车结束输入。例如有下面程序段:chars[20];gets(s);puts(s);运行时输入:Howdoyoudo?↙输出结果为:Howdoyoudo?3.字符串连接函数:strcat格式:strcat(字符数组1,字符数组2)功能:将字符数组2中的字符串连接到字符数组1中的字符串的后面,结果放在字符数组1中。例如有如下程序段:chars1[14]="China",s2[]="Beijing";strcat(s1,s2);printf("%s",s1);88 输出结果为:ChinaBeijing说明:使用strcat函数时,字符数组1应作够大,以便能容纳连接后的新字符串。4.字符串拷贝(复制)函数:strcpy格式:strcpy(字符数组1,字符数组2)功能:将字符数组2中的字符串拷贝到字符数组1中。例如有下面程序段:chars1[8],s2[]="China";strcpy(s1,s2);puts(s1);程序段的输出结果是:China说明:(1)字符数组1的长度应大于或等于字符数组2的长度,以便容纳被复制的字符串。(2)字符数组1必须写成数组名的形式(如上例中的s1),字符数组2也可以是一个字符串常量。例如:chars1[8];strcpy(s1,"China");其结果与上例相同。(3)执行strcpy函数后,字符数组1中原来的内容将被字符数组2的内容(或字符串)所代替。(4)不能用赋值语句将一个字符串常量或字符数组直接赋给另一个字符数组。下面的用法是错误的:chars1[8],s2[]="China";s1=s2;在进行字符串的整体赋值时,必须使用strcpy函数。5.字符串比较函数:strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串的大小,例如:strcmp(s1,s2);strcmp("Beijing","Shanghai");88 strcmp(s1,"China");比较的结果由函数值带回。(1)如果字符串1等于字符串2,函数值为0。(2)如果字符串1大于字符串2,函数值为一个正整数(第一个不相同字符的ASCII码值之差)。(3)如果字符串1小于字符串2,函数值为一个负整数。请注意:比较两个字符串是否相等时,不能采用以下形式:if(s1==s2)printf("yes");而只能用if(strcmp(s1,s2)==0)printf("yes");6.测试字符串长度函数:strlen格式:strlen(字符数组名)功能:测试字符数组的长度,函数值为字符数组中第一个´´前的字符的个数(不包括´´)。例如:chars[10]="China";printf("%d",strlen(s));输出结果为:57.字符串小写函数:strlwr格式:strlwr(字符串)功能:将字符串中的大写字母转换成小写字母。8.字符串大写函数:strupr格式:strupr(字符串)功能:将字符串中的小写字母转换成大写字母。七、字符数组应用举例例5.12编程实现两个字符串的连接(不用strcat函数)main(){chars1[80],s2[80];inti,j;gets(s1);gets(s2);/*读入两个字符串*/for(i=0;s1[i]!=´´;i++);/*找到第一个字符串’’的位置*/88 for(j=0;s2[j]!=´´;i++,j++)s1[i]=s2[j];/*连接s2到s1的后面*/s1[i]=´´;/*在连接后的s1中添加字符串结束标志’’*/puts(s1);}程序运行时输入:Iama↙Student.↙运行结果是:Iamastudent.例5.13找出3个字符串中的最大者。main(){charstring[20];charstr[3][20];inti;for(i=0;i<3;i++)gets(str[i]);if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);elsestrcpy(string,str[1]);if(strcmp(str[2],string)>0)strcpy(string,str[2]);printf(" thelargeststringis: %s ",string);}运行时输入:CHINA↙AMERICA↙JAPAN↙运行结果是:thelargeststringis:JAPAN本章小结88 本章主要介绍了数组这一特殊的数据结构。数组由数组元素构成,在计算机内存中占据一片连续的存储单元。在同一个数组中存储的数据应具有相同的类型。可以用不同的下标来访问数组元素。数组分为一维数组和多维数组,在处理实际问题时,数组是一种非常有用的数据结构。在使用数组时应遵循先定义、后使用的原则。数组一般不能整体引用,也不能越界使用数组元素,可以用循环结构很方便地访问数组元素。字符串在计算机内存中一般是以字符数组的方式存在,´´称为字符串结束标志,可以用字符串处理函数来处理字符串的连接、复制、比较等操作。作业:1.将一个数组中的值按逆序重新存放,例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。2.用数组来处理求Fibonacci数列问题。3.有一个3×4的矩阵,输入数据后,求其主对角线之和。4.编一程序,将两个字符串连接起来,不要用strcat函数。88 第6章函数一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能,所有的高级语言中都有子程序这个概念,用子程序来实现模块的功能。在C语言中,子程序的作用是由函数来完成的。一个C程序可由一个主函数和若干个函数构成。由主函数来调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。6.1概述一、问题的提出[问题]一个简单的例子。main(){printstar();/*调用printstar函数*/print_message();/*调用print_message函数*/printstar();/*调用printstar函数*/}printstar()/*pirntstar函数*/{printf(″****************** ″);}print_message()/*print_message函数*/{printf(″Howdoyoudo! ″);}运行情况如下:******************Howdoyoudo!******************[说明]:本节问题中,printstar和print_message都是用户定义的函数名,分别用来输出一排星号和一行信息。88 现对函数在程序中的使用作几点说明:1.一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源文件为单位进行编译,而不是以函数为单位进行编译。2.一个C程序由一个或多个源程序文件组成。3.C程序的执行从main函数开始,调用其它函数后流程回到main函数,再在main函数中结束整个程序的运行。main函数是系统定义的。4.所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。5.从用户的角度看,函数有两种:(1)标准函数,即库函数。(2)用户自己定义的函数,以解决用户的专门需要。6.从函数的形式看,函数分两类:(1)无参函数。如本节问题中的printstar和print_message就是无参函数。(2)有参函数。在调用函数时,在主调函数和被调用函数之间有参数传递。6.2函数定义的一般形式一、问题的提出例6.1求两数之和。main(){floata,b,c;floatadd(float,float);/*对被调函数的说明*/scanf(″%f,%f″,&a,&b);c=add(a,b);printf(″sum=%f ″,c);}floatadd(x,y)floatx,y;{floatz;z=x+y;88 return(z);}运行结果:8.2,6.5↙sumis14.700000二、无参函数的定义形式类型标识符函数名(){说明部分语句}用“类型标识符”指定函数值的类型,即函数带回来的值的类型。无参函数一般不需要带回函数值,因此可以不写类型标识符,printstar和print_message就如此。三、有参函数定义的一般形式类型标识符函数名(形式参数表列)形式参数说明{说明部分语句}例如:floatadd(x,y)floatx,y;/*形式参数说明*/{floatz;/*函数体中的说明部分*/z=x+y;return(z);}注意:1.第二行“floatx,y;”是对形式参数作类型说明,指定x和y为单精度型。花括弧内是函数体,它包括说明部分和语句部分。2.“floatz;”必须写在花括弧内,而不能写在花括弧外。3.不能将第二、三行合并写成“floatx,y,z;”。形式参数的说明应在函数体外。4.在函数体的语句中求出z的值(为x与y的和),return语句的作用是将z的值作为函数值带回到主调函数中。88 return后面的括弧中的值作为函数带回的值(或称函数返回值)。在函数定义时已指定add函数为实型,在函数体中定义z为实型,二者是一致的,将z作为函数add的值带回调用函数。四、空函数也可以有“空函数”,它的形式为:类型说明符函数名(){}例如:dummy(){}调用此函数时,什么工作也不做,没有任何实际作用。6.3函数参数和函数的值一、形式参数和实际参数“形式参数”:在定义函数时函数名后面括弧中的变量名。“实际参数”:用函数时,函数名后面括弧中的表达式。例6.2main(){inta,b,c;scanf(″%d%d″,&a,&b);c=max(a,b);printf(″Maxis%d″,c);}max(x,y)intx,y;{intz;z=x>y?x:y;return(z);}运行情况如下:88 7,8↙Maxis8关于形参与实参的说明:1.定义函数时指定的形参变量,在未出现函数调用时,它们并不占用内存中的存储单元。只有在发生函数调用时函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。2.实参可以是常量、变量和表达式,如:max=(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参变量。3.定义的函数中,必须指定形参的类型。4.实参与形参的类型应相同或赋值兼容。5.C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。6.ANSI新标准允许使用另一种方法对形参类型作说明,即在列出“形参表列”时,同时说明形参类型。如intmax(intx,inty){……}相当于:intmax(x,y)intx,y;{……}又如:floatfun(array,n)intarray[10],n;可以写成floatfun(intarray[10],intn)这两种用法等价,都可以使用。二、函数的返回值通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。1.函数的返回值是通过函数中的return语句获得的。88 return语句后面的括弧也可以不要,如returnz;它与“return(z);”等价。2.函数值的类型。在定义函数时指定函数值的类型,例如:intmax(inyx,inty)函数值为整型charletter(charc1,charc2)函数值为字符型doublemin(floatx,floaty)函数值为双精度型在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。3.如果函数值的类型和return语句中表达式的值的类型不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。例6.3将例6.2稍做改动(注意是变量的类型改动)。main(){floata,b;intc;scanf(″%f,%f″,&a,&b);c=max(a,b);printf(″Maxis%d ″,c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}运行情况如下:1.5,2.5↙Maxis24.如果被调用函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。88 5.为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。为使程序减少出错,保证正确调用,凡不要求带回函数值的函数,一般应定义为“void”类型。6.4函数的调用一、问题的提出输出n的阶乘值。n由键盘输入。main(){intn;floatf;floatfac(int);scanf(″%d″,&n);f=fac(n);printf(″%d!=%f ″,n,f);}floatfac(ints){floatfa=1;for(i=1;i1)可以用一个函数来描述上述递归过程:age(intn)/*求年龄的递归函数*/{intc;/*c用作存放函数的返回值的变量*/if(n==1)c=10;elsec=age(n-1)+2;return(c);88 }main(){printf(″%d″,age(5));}运行结果如下:186.7数组作为函数参数一、数组元素做实参例6.8有两个数组a、b。各有10个元素,将它们对应地逐个相比(即a[0]与b[0]比,a[1]与b[1]比,……)。如果a数组中的元素大于b数组中相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次为不同的值,)则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。main(){inta[10],b[10],i,n=0,m=0,k=0;printf(″enterarraya: ″);for(i=0;i<10;i++)scanf(″%d″,&a[i]);printf(″ ″);printf(″enterarrayb: ″);for(i=0;i<10;i++)scanf(″%d″,&b[i]);printf(″ ″);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}88 printf(″a[i]>b[i]%dtimes a[i]=b[i]%dtimes a[i]k)printf(″arrayaislargethanarrayb ″);elseif(ny)flag=1;elseif(xb[i]4timesa[i]=b[i]1timesa[i]max)max=array[i][j];return(max);}main(){staticinta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(″maxvalueis%d ″,max_value(a));}程序运行结果如下:maxvalueis346.8局部变量和全局变量一、局部变量88 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这样得变量称为“局部变量”。说明:1.主函数main中定义的变量也只在主函数中有效,不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其它函数中定义的变量。2.不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。3.形式参数也是局部变量。例如f1函数中的形参a,也只在f1函数中有效。其它函数不能调用。4.在一个函数的内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也可称为“分程序”或“程序块”。二、全局变量在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量。全局变量可以为本文件中其它函数所共用。它的有效范围为:从定义变量的位置开始到本源文件的结束。说明:1.设全局变量的作用:增加了函数间数据联系的渠道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。例6.13有一个一维数组,内放10个学生成绩,写一个函数,求出平均分,最高分和最低分。floatmax=0,min=0;/*全局变量*/floataverage(floatarray[],intn)/*定义函数,形参为数组*/{inti;floataver,sum=array[0];max=min=array[0];for(i=1;imax)max=array[i];elseif(array[i]x[k])k=j;if(k!=i){t=x[i];x[i]=x[k];x[k]=t;}88 }}main(){int*p,i,a[10];p=a;for(i=0;i<10;i++)scanf(″%d″,p++)/*将10个整数读入a数组中*/p=a;sort(p,10);/*调用sort函数对数组进行排序*/for(p=a,i=0;i<10;i++){printf(″%d″,*p);p++;}/*输出排序后的数组*/}7.4字符串与指针一、用一个一维字符数组来存放字符串1.C语言对字符串的约定:以字符′′作为字符串结束标志。2.C语言中表示字符串常量的约定虽然C语言中没有字符串数据类型,但却可以使用“字符串常量”。3.C语言中字符串常量给出的是地址值。在C语言中,字符串常量被隐含处理成一个以′′结尾的无名的字符型一维数组。因此,若有以下定义:char*sp,s[10];以下赋值是不合法的:s=″Hello!″;不合法的原因是:内容为Hello!的字符串常量在赋值过程中给出的是这个字符串在内存中的首地址,而s是一个字符数组的数组名。因此,该赋值是非法的。而以下的赋值:sp=″Hello!″;4.字符数组与字符串的区别在C语言中,有关字符串的大量操作都与字符串标志′′有关,因此,在字符数组中的有效字符后面加上′′这一特定情况下,可以把这种一维字符数组看作“88 字符串变量”。二、指向字符串的指针使指针指向一个字符串的方法主要有以下几种方法:1.通过赋初值使指针指向一个字符串char*ps=″Hello!″;2.通过赋值运算使字符指针指向字符串char*ps;ps=″Hello!″;也可以通过将指针变量之间的赋值使指针指向字符串。例如:char*ps1,*ps2=″Hello!″;ps1=ps2;使ps1也指向了ps2所指向的字符串。还可以将字符数组名赋给字符指针变量而使其指向字符串。例如:char*ps1,s[]=″Hello!″;ps1=s;例7.7用指针法将字符串a复制为字符串b。#include″stdio.h″main(){chara[20],b[20],*p1,*p2;inti;gets(a);for(p1=a,p2=b;*p1!=′′;p1++,p2++)*p2=*p1;*p2=′′;puts(b);}三、指向字符串的指针作函数参数将一个字符串从一个函数传递到另一个函数,可以采用地址传递的方法。例8.9用函数调用实现字符串的连接。voidstr_cat(char*p1,char*p2){while(*p1!=′′)88 p1++;/*找目标字符串的结束标志′′*/while(*p2!=′′){*p1=*p2;/*将字符串2连接到字符数组中*/p1++;p2++;}*p1=′′;/*在连接后的字符串后面添补′′*/}main(){chara[80],b[80];gets(a);gets(b);str_cat(a,b);puts(a);}程序中的str_cat函数还可写成如下形式:voidstr(chat*p1,char*p2){while(*p1)p1++;while(*p2)*p1++=*p2++;*p1=′′;}本章小结本章主要介绍了指针的概念、指向变量的指针、指向数组的指针、指向字符串的指针、指针数组以及多级指针等。所谓指针其实就是地址,由于可以通过地址找到存储于内存中的变量,所以形象地把地址称为指针。指针变量是存储地址的变量,通过指针变量可以很方便地对存储于内存单元中的变量进行操作。在用指针处理数组时,可以通过指针的移动来访问数组的每一个元素。在用指针处理字符串时,可以充分利用字符串结束标志′′。指针数组一般用来处理多个字符串的情况。多级指针一般使用到二级指针为止,主要用来处理二维数组等情况。88 作业:1.从键盘输入三个整数,然后降序输出,要求用指针实现。2.编一个函数sort,使10个整数按升序排列,在main函数中输入这10个数,并输出排好序的数。3.编程将字符串computer赋给一个字符数组,然后从第一个字母开始间隔输出该串,请用指针完成。输入一行文字指出其中有多少大写字母,要求用指针实现。88

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭