




已阅读5页,还剩300页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第一章计算机语言及C语言概述第二章基本数据类型、运算符和表达式第三章数据的输入和输出第四章语句第五章指针初步和数组第六章函数与程序结构第七章编译预处理第八章指针第九章结构体第十章文件,C语言程序设计,2,第一章计算机语言及C语言概述,1.1计算机语言1.2C语言概述1.3C程序的上机步骤,3,1.1计算机语言1.1.1计算机语言的发展过程计算机语言是指计算机能够接受和处理的、具有一定格式的语言。用计算机语言编写的,使计算机能够完成特定任务的代码串称为计算机程序。计算机语言经历了三个阶段:1.机器语言:由、代码组成的、能被机器直接理解执行的指令集合。如:10000011就是一条单字节指令。2.汇编语言:采用一定的助记符来代替机器语言中的指令和数据,又称为符号语言。如:ADDA33.高级语言:接近自然语言和数学语言的程序设计语言。1.汇编程序:将用汇编语言编制的程序(源程序)翻译加工成机器语言程序(目标程序)的工具。,1.12语言处理程序,4,.编译程序:将用高级语言编写的程序(源程序)翻译成机器语言或汇编语言程序(目标程序)的工具。特点:一次编译,目标程序可多次使用从高级语言程序到获得运行结果的一般过程程序库数据源程序目标程序可执行程序结果3.解释程序:直接对源代码中的语句进行解释执行,产生运行结果,它不产生目标代码。,编译,连接,执行,5,1.2C语言概述C语言是适用于描写结构的程序设计语言,常用来设计操作系统或其它系统程序。1.2.1C语言的发展历史C语言的发展依次为:ALGOL60CPLBCPLBC,略。(见教材),1.2.2C语言的特点,6,例1.1:#includestdio.hmain()printf(ThisisaCprogram.n);例1.2:main()inta,b,sum;a=123;b=456;sum=a+b;printf(sumis%dn,sum);,1.2.3C程序举例,7,例1.3:输入任意三个整数num1、num2、num3,求三个数中的最大值。main()intnum1,num2,num3,max;printf(Pleaseinputthreenumbers:);scanf(%d,%d,%d,8,例1.3:求a、b和c中的大者.main()/*主函数*/inta,b,c,max1;/*定义变量*/scanf(“%d,%d,%d”,/*将z值返回调用处*/,9,通过对上面三个程序的讨论,可以归纳如下:(1)C程序是由函数构成的.且至少要包含一个主函数main,也可以包含若干个其它函数.(2)被调用的函数可以是系统提供的库函数(如printf和scanf函数),也可以是用户自定义的函数(如例1.3中的max函数)。(3)一个函数由两部分组成:a.函数头:包括函数名、函数类型、函数形参名、形参类型一个函数名后面必须跟一对圆括号,但函数参数可以没有。b.函数体函数体是用一对花括号作为开始和结尾的标志.包括说明和执行两部分:说明部分用来说明函数、变量和定义变量、指针、数组等,执行部分则通过语句描述函数的功能。变量定义和语句都要以分号结尾。(4)程序的任何地方都可以加入以“/*”和“*/”包围起来的解释部分,该部分的作用是为了增加程序的可读性,它不是程序的可执行部分,不产生程序代码。,10,(5)C语言书写形式自由一行内可以写多条语句,一条语句也可以分写在不同行上,当一条语句分写在几行上时,行尾需加续行符“”。C语言中大小写字母是有区别的,这一点在使用时要特别注意。1.C语言的基本符号:(1)大小写英文字母各26个:az,AZ。(2)09共十个数字。(3)下划线_。(4)特殊符号:包括运算符在内的其他字符。如、*、等。2.标识符:用来标识变量名、符号常量名、函数名、类型名、文件名等。标识符只能由字母、数字和下划线三种字符组成,且必须以字母或下划线开头;其次,虽然C语言没有对标识符的长度进行统一的规定,但是具体的系统都有长度限制。TurboC能识别长达31个字符。,1.2.4C语言的基本语法单位,11,C语言中,标识符有三种类型:a.关键字:系统已定义过的、有特定含义、不能挪作它用的标识符。C语言共有32个关键字。例如,int、char、break、for等。b.预定义标识符:系统定义过的,用于编译预处理命令中的标识符。例如,include、define等。建议这些标识符也不要作为用户自定义标识符。c.自定义标识符:依据标识符的命名原则,由用户自己定义的标识符。若能使用“见名知义”的名字,会使程序的可读性增强。例如,下面的标识符都是合法的。A2studentarea_of_circlenum_dd而下面的标识符则是不合法的。2AA-Bareaofcircle(一个标识符)M.D,12,1.进入TurboC集成环境运行TurboC的执行程序TC.EXE,就进入了TurboC集成环境,TC主屏由四部分组成:主菜单、编辑窗口、信息窗口和功能键提示行。在进行编辑程序之前应设置好包含文件、库文件、输出文件和TurboC系统所在的目录。2.编辑在编辑窗口中将编写好的程序输入计算机或对已经存在的源程序文件进行修改的过程,就是源程序的编辑过程。FileLoad命令:输入一个要编辑的源程序名字,则编辑窗口中的NONAME.C被新输入的名字取代。若被编辑的是一个新文件,则可以输入编写好的程序到编辑窗口;若被编辑的是一个旧文件,则可以对其进行修改。FileSave命令:保存文件。FileNew命令:在清屏后的编辑窗口,输入程序FileWriteto命令输入源程序名字保存文件,1.3C程序的上机步骤,13,选择CompileCompiletoOBJ命令,对编辑窗口中的文件进行编译,如果编译成功,按F2键,将文件保存一下后就可进入下一个过程;否则,若编译失败,则在信息窗口中将发现的错误和警告信息一一列出。编译后生成的目标文件和库文件连接在一起才能生成可执行文件。当编译成功后,选择CompileLinkEXEfile命令,进入连接,如果出现错误,则一般要检查库文件和头文件的路径设置是否正确,修改后重新连接。,3.编译,4.连接,14,选择RunRun或Ctrl+F9(两个键同时按下)命令,就可以执行程序。若要察看运行结果,则按ALT+F5。如果程序在运行过程中需要输入数据,则选择了RunRun命令后,屏幕处于用户屏状态,等待用户输入所需的数据,数据输入结束,运行后重新回到集成环境的主屏。TurboC中,编译和连接这两个步骤也可以通过功能键ctrl+F9(建立.EXE可执行文件)附带一并一次完成。简言之,编辑后,可通过ctrl+F9一起完成若有错,则要反复多次选择FileOSshell命令,可以暂时退出TurboC,转到DOS提示符下,此时,若再键入EXIT,则又可以返回TurboC集成环境的主屏。选择FileQuit命令,彻底退出TurboC,返回到DOS提示符下。作业:习题3,5,6上机知识:编辑、编译、连接、执行全过程,5.运行,6.退出Turbo环境,15,第二章基本数据类型、运算符和表达式,2.1基本数据类型2.2运算符和表达式2.3小结,16,C语言可以处理数值型及非数值数据。大致可分为:,2.1基本数据类型,17,每一种数据类型又有常量和变量之分,下面分别予以介绍。1.值常量和符号常量常量是指那些在程序运行过程中其值不能改变的量。(1)值常量:如:-25、3.0、2e-3、A。(2)符号常量:是用define命令定义的常量,例如:#definePI3.14define是宏定义,定义符号常量的方法为:#define标识符常量值习惯上符号常量名用大写表示,而变量名则用小写表示。注意:符号常量虽然用标识符来标识,但它本质上是常量,具有常量值不能改变的性质。,2.1.1常量,18,【例2.1】#definePI3.14main()floatr=3.0,s,l;l=2*PI*r;s=PI*r*r;printf(l=%f,s=%f;l,s);2.整型常量计算机中的整型数是有范围的,一般而言,用一个机器字来存放一个基本整型数据.(若干个字节组成一个存储单元,称为“字”).在表示方法上,通常在整数后面加上字母“l”或“L”,表示它为一个长整型数据;若在某个整数后面加上字母“u”或“U”,则表示它是一个无符号整数。例如:125、26、40000L、37U、0L等等,都是合法的整型常量。而50000、-23u非法.,19,整型常量还有十进制、八进制和十六进制三种表示方法。1)十进制形式如125、-21、0。2)八进制形式以数字0开头的,由07之间的数字组成的数据。如:056。3)十六进制数以0 x或0X开头的,由数字09和字母A、B、C、D、E、F组成的数据.其中6个字母也可以小写.如:0X5A、0 x39。0X5A5*16110*16090整型常量的类别和进制表示可以结合在一起使用。如:0X41L为十六进制长整型数。,20,3.实型常量实型常量有两种表示方式:1)十进制小数形式由正负号、数字和小数点组成,其中小数点不能缺少,正数符号可省略。如1.25、34.0、+1.25、17.和.1。2)指数形式由尾数开头,加上指数部分共同构成,其中指数部分由指数符号e(或E),正负号及整数组成。如1.25e-5、+1e10、-1.25e5、1e-6、3e2。注意:e前面不能没有数字,e后面的数字必须为整数,也不能加园括号。如1E(-3)、E-5、1e2.1都是错误的。4.字符型常量C语言提供了两类字符型常量。1)普通的字符常量:用单引号括起来的一个字符.如A、b、0、?。2)转义字符常量:是以“”(反斜杠)开头的用单引号括起来的字符序列。常用的转义字符见p13.,21,注意:x61表示ASCII码为97的字符,即字符a。0表示ASCII码为0的字符,它是一个空字符(不是空格字符),常作为字符串的结束标志。整型数据和字符型数据可以在一定范围内通用,通过指定不同的格式,一个字符型数据既可以以字符形式输出,又可以以整数形式输出其ASCII码值。字符型char的值机内以ASCII码值表示。如:数字字符09的ASCII码值是连续排列的,为4857;大写字母AZ的ASCII码值是连续排列的,为6590;小写字母az的ASCII码值是连续排列的,为97122。A与A不同,前者是字符串,实际上由两个字符组成,即字符A和字符串结束标志0,而后者是一个字符,仅由一个字符A组成,在存储器中存放的是A的ASCII码值65。,22,1.变量的定义变量:在程序运行过程中其值可变的量.变量的定义方式如下:存储类别数据类型变量名表;其中“存储类别”是可以省略的,缺省时,在函数内默认为auto型,即自动类型。例如:inta,b;(定义变量a和b为整型)unsignedc,d;(定义变量c,d为无符号整型变量)longe,f;(定义变量e和f为长整型)floatx,y;(定义变量x和y为单精度实型)doublez;(定义变量z为双精度实型)charc1,c2;(定义变量c1,c2为字符型变量)C规定:程序中所有用到的变量都必须在程序中指定其类型,即“定义”.,2.1.2变量,23,2.变量的赋值和初始化变量必须先有确定的值后才能参与各种相应的操作。(1)赋值语句例如:inta;a=3;使整型变量a的值为3。(2)初始化在定义变量的同时对变量赋初值。如inta=3;它等价于上面的赋值语句。(3)赋值与初始化的区别赋值语句是在程序运行阶段将值赋给变量的初始化是在编译或运行时,系统为变量分配内存单元的同时,将值存放进去的。赋值语句允许在一条语句中为多个变量同时赋值,初始化则不允许.,24,如inta,b,c;a=b=c=0;是正确的。而inta=b=c=0;则是错误的,应该修改为如下的形式:inta=0,b=0,c=0;3.变量的使用原则变量的使用遵循这样的原则:先定义,后使用。例如,在程序中有定义intdate;而程序体中有语句data=10;则编译时会检查出data是未经定义.例如,有定义floata,b;若程序中出现表达式“a%b”,则编译系统会检查出变量a和b参与了非法的运算。因为运算符“%”要求的操作数必须是整型。,25,4.注意事项(1)不能把字符串赋给字符型变量。例如:charch=Youarewrong.;因为ch是char类型,一个字符型变量只能存放一个字符。(2)一般不要将一个负数赋给一个unsigned型变量。例如:unsignedinta=-26;因为-26不是无符号数。(3)给整型变量赋值时,注意要避免超界。例如:inta=50000;超界,因为int类型允许的最大整数是32767。,26,语言提供了十五大类共四十四种运算符。有三个属性:优先级、结合性和目数优先级由高到低的次序进行,C语言的优先级别分为15级结合性则规定了在相同优先级运算符连续出现时的计算顺序,包括自左向右和自右向左两种。不同的运算符的优先级和结合性见p15表2.4。表达式:由常量,变量,函数调用和运算符按一定规律组合在一起构成的式子。其求值的顺序为:根据运算符的优先级与结合方向对表达式加园括号,然后从左到右计算表达式,一面计算一面转换操作数的类型,直到能最终确定表达式的值时终止。,2.2运算符和表达式,27,1.算术运算符+(加法或取正)-(减法或取负)*(乘法)/(除法)%(求余数)+(自增)-(自减)其中+、-、*、/、%的结合性是自左向右。而+和-的结合性则是自右向左。C语言的算术运算符优先级从高到低为(+、-、+、-)、(*、/、%)、(+、-)。2.说明(1)在除法运算中,当两个操作数都是整数时,商也为整数,小数部分一律舍去。例如,7/3的结果为2,-1/2的结果为0,-5/3的结果为-1。,2.2.1算术运算,28,当两个运算数的符号不同时,结果的符号与被除数的符号相同。例如,5%3的值为2,-5%3的值为-2,5%-3的值为2。【例2.2】main()intx=10,y=3;printf(%d,%dn,x/y,y%x);(3)自增、自减运算符+i,-i(在使用i之前,先使i的值加减1)i+,i-(在使用i之后,使i的值加减1)若i的值为3,则j=+i;j的值为4j=i+;j的值为3,然后变为4.,(2)%(求余运算)要求两个操作数都是整型,结果为整除后余下的整余数。,printf(%d,+i);输出4printf(%d,i+);输出3,29,再如,若a的值仍为3则执行a+*2后,表达式的值为6,a的值为4,而执行+a*2后,表达式的值为8,a的值为4。注意:自增、自减运算符只能用于整型变量,而不能用于表达式.如5+(a+b)+-d(d为实数)非法,【例2.3】,main()inta,b,c;a=b=c=0;a=+b+c;printf(”n%d%d%d”,a,b,c);a=b+c+;printf(”n%d%d%d”,a,b,c);a=+b+c+;printf(”n%d%d%d”,a,b,c);a=b-+-c;printf(”n%d%d%d”,a,b,c);,30,其形式为:变量赋值运算符表达式其中赋值运算符可以是“=”,也可以是复合赋值运算符,如“+=”、“-=”、“*=”、“/=”和“%=”等等赋值运算其作用:将一个数据赋给一个变量,并以变量的值作为赋值运算后整个式子的值。复合赋值运算符“+=”一般形式:变量+=表达式等价于变量=变量表达式其余的复合赋值运算符可类似的理解。例如:a+=3等价于a=a+3b*=a+2等价于b=b*(a+2),而不是b=b*a+2。,2.2.2赋值运算,31,使用赋值运算符,要注意以下几点:1.该运算符的结合性为自右向左。例如:a=3+(b=2)等价于a=(3+(b=2)运算结束后,a的值为5,b的值为2。思考题:假设a的初值为,有表达式a+=(b=4)+2则运算结束后,a、b及表达式的值各为多少?2.当赋值运算符两端数据类型不一致时,在赋值之前,系统自动对右端的类型进行转换,使其与左端类型一致。例如,假定a为整型变量,则a=3.78的结果是将3赋给a。系统自动把赋值号右边的实数3.87转换成整型3,小数部分全部舍去,不遵循四舍五入的原则。,32,3.赋值运算符的左端只能是变量(或数组元素),不能为表达式或常量。如:a+b=3和4+=m等都是错误的。4.赋值表达式中的“表达式”,可以是一个赋值表达式,也可以包含复合的赋值运算符.如:a=b=c=5a=5+(c=6)a=(b=10)/(c=2)a+=a-=a*a,33,种类:(大于)、=(大于等于)、=(等于)、!=(不等于)结合方向从左到右。关系运算符优先级从高到低为(、=)(=、!=)a=b的结果为,a0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?,2.2.3关系运算,n/k+(n%k0),34,C语言提供三个逻辑运算符:i=100作用:向终端输出若干个任意类型的数据“控制字符串”要用双引号括起来,它包含两种信息:a.普通字符:即需要原样输出的字符.这类字符中包括转义字符,如遇到n则输出一换行符,即光标移至下一行行首。b.格式说明:由%和格式字符组成,如%d,%f.作用:将输出的数据转换为指定的格式输出.输出表列是指需要输出的常量,变量或表达式.其个数必须与格式说明串所说明的个数相等,且顺序上一一对应。如:printf(a=%d,b=%d,a+b=%dn,a,b,a+b);,3.1格式输入输出函数3.1.1printf函数(格式输出函数),48,2.格式字符对不同的数据类型,要用不同的格式字符来说明.见p26表3.1和表3.2)。常用的格式字符:(1)d格式%d按整型数据的实际长度输出。%mdm为一整数,代表指定的输出字段的宽度如果数据的位数大于m,则按实际宽度输出,若小于,则左端补以空格。如printf(%4d,%4d,a,b);/*a=123,d=12345*/输出:_123,12345%-md基本同%md,区别在于当数据实际宽度小于时,负号“”使得数据输出时向左靠。右端补以若干个空格。%ld输出长整型数据,当然%mld,%-mld也是允许的格式,含义同上。如longa=135790;printf(%ld,a);/*此处不能用%d*/,49,(2)c格式符用来输出一个字符,当一个整数的值介于0255之间时,也可以用%c形式输出,这时输出的是该整数(ASCII码)对应的字符。同样,一个字符也可以以%d的形式输出,输出字符相应的码值.main()charc=a;inti=97;printf(%c,%dn,c,c);printf(%3c,%dn,i,i);输出:a,97_a,97,50,(3)格式符格式符用以输出一个字符串%s按实际长度输出字符串。%m.ns,皆为整数,该形式输出的数据占列,且仅输出字符串中的前个字符,输出时左端补空,字符串向右靠。也可以用%ms、%-ms、%-m.ns,其中m和“”的意义同前。【例3.5】main()printf(%2s,%6s,%-6.3s,%3.2s,abcd,abcd,abcd,abcd);运行结果:abcd,_abcd,abc_,_ab,51,(4)f格式符f格式符以小数形式输出实数。%f整数部分原样输出,小数部分输出位(不全是有效数字).%m.nfm,n皆为整数,输出数据占列,小数位数为位,数据向右靠,左端补空,若省略,则整数部分原样输出,小数部分输出列。%-.nf意义同%m.nf,数据向左靠,右端补空格。【例3.6】main()floatf=123.456;printf(%f,%10.5f,%-10.2f,%.2f,f,f,f,f);运行结果:123.456001,_123.45600,123.46_,123.46,52,1形式scanf(控制字符串,地址表列);其中控制字符串的组成同printf函数中的相应部分。地址表列,即在变量名前加入一个取地址符”输入:m=12,n=15,3.1.2scanf(格式输入函数),53,(3)用%c格式输入字符时,空格字符和转义字符都作为有效字符输入.如:scanf(%c,%c,%c,54,3.格式说明同printf函数一样,scanf函数的格式说明也是以“%”开头,以格式字符结束,中间可辅以附加字符.见p31表3.3和表3.4。现将格式说明中有别于printf函数的地方说明如下:(1)输入实型数据时不能指定小数位数,如scanf(%7.2f,若输入:12_345_67,则将12赋给a,67赋给b。而%*3d对应的345则被跳过,不作存储。,55,3.2字符输入输出函数3.2.1putchar(字符输出函数),作用:向终端输出一个字符,相当于printf(%c,参量)。形式为:putchar(参量);其中参量可以是一个字符型或整型变量,字符常量,或一个转义字符,要注意的是,在调用该函数时,在程序开头要加入一条文件包含命令:#includestdio.h【例3.10】#includestdio.hmain()intm=65;chara,b;a=O;b=K;putchar(m);putchar(n);putchar(101);putchar(a);putchar(b);,56,作用:从终端输入一个字符。1.形式:getchar()该函数无参数,函数的值是从输入设备得到的字符。如:ch=getchar();2.说明:getchar函数得到的字符可以赋给一字符变量或整型变量,也可以只作为表达式的一部分,而不再赋给任何变量。如:putchar(getchar();该语句的作用是将从输入设备输入的字符在终端输出设备上显示出来。同putchar函数一样,在调用getchar函数时,程序前面也要包含一条预编译处理命令:#includestdio.h【例3.12】程序:#includestdio.hmain()charch;ch=getchar();ch=A,3.2.2getchar函数(字符输入函数),scanf(%c,57,3.3小结一格式输入输出函数printf和scanf注意事项:格式输出函数printf双引号内除“%格式符”以外,皆原样输出。输出表列中的各个表达式的值若要正确输出,则要求双引号内必须有一个类型一致的格式符与之对应;若类型不对,则输出无定值;若格式符少,则列在后面的输出项不被输出。多数系统在该输出函数中采用自右向左的顺序求输出表列中各个表达式的值。使用该函数的输出形式灵活多样。如,可以通过附加控制符“+”、“-”和指定列宽共同控制对齐方式。如:“%-5d”代表数据占5列宽,且左端对齐。函数的返回值为正常输出的输出项的个数。,58,格式输入函数scanf:地址表列中的地址可以是变量的地址、数组名、指针变量。输入项要与“控制字符串”中的格式符的个数相等、类型一致。对整数可以指定系统按要求的位数截取所读入的数据,但对实数则不能规定小数位数。双引号内除“%格式符”以外的部分也要原样输入,因此一般除分隔符外,建议不要增加其他内容,以简化输入形式。若无分隔符,对数值型数据而言,遇空白符(包括空格符、制表符、回车符)、遇指定的宽度、遇非法输入的数据(如:非数值型数据)等结束该数据的输入;对字符型数据而言,所有输入的数据都为有效的字符。建议双引号内不要象输出函数一样经常使用n,由于系统方面的原因,经常需要多输入一个数据方能结束。“%*”表示跳过对应的输入数据项,即该数据项不被读入。返回值为正常读入数据的个数。,59,字符输入函数getchar():该函数的作用是从标准输入设备(通常指键盘)输入一个字符。该函数无参数,函数的值是从输入设备得到的字符,可将其赋给一字符变量或整型变量,也可以只作为表达式的一部分,而不赋给任何变量。如:ch=getchar();是将从输入设备输入的字符赋给字符型变量ch,等价于scanf(%c,sum=a+b;又称为赋值语句scanf(%d,4.1基本语句4.1.1表达式语句,4.1.2空语句,62,形式为:语句组作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成动作时,需要使用复合语句。例如:当变量的值比的值大时,交换两变量的值,可用如下语句:if(xy)t=x;x=y;y=t;通常,把定义或说明语句组这种分程序形式也归为复合语句。,4.1.3复合语句,63,如:main()intm=2;intm=3;printf(%d,m);printf(%d,m);其中:花括号括起来的部分是一个分程序结构,也归为复合语句。在分程序结构中也可以定义变量,这些变量只在分程序结构内部有效.语言提供两类选择控制语句:种为if语句,实现n分支,要求n-1个表达式;一种为switch语句,实现多分支;只用1个表达式.,4.2选择控制语句,64,4.2.1if语句if语句的三种形式:1.if(表达式)语句当表达式为真(非0)时,执行表达式后面的语句,否则绕过该语句,而执行其后面的语句。如:if(xy)t=x;x=y;y=t;printf(min=%d,max=%d,x,y);2.if(表达式)语句1else语句2当表达式为真(非0)时,执行语句1,否则执行语句2。错例:if(xy)max=x;min=y;else,.,if(x0)printf(%f,x)elseprintf(%f,-x),65,3.if(表达式1)语句1elseif(表达式2)语句2elseif(表达式n)语句nelse语句n+1,当表达式1的值为真(非0)时,执行语句1,否则当表达式2的值为真时执行语句2,依此类推,若表达式的值都为假,则执行语句n+1。,【例4.1】将a,b,c三个实数按由小到大的顺序排列。main()floata,b,c,t;scanf(%f%f%f,后两个if语句的次序交换,行否?,66,3.if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式:if(表达式1)if(表达式11)语句11else语句12else语句2在if语句的嵌套形式中,为了增强程序的可读性,建议采用锯齿型的书写形式。C语言规定:else始终与它上面的最近的if语句配对。假如有:if()if()语句1elseif()语句2else语句3,if()if()语句1elseif()语句2else语句3,67,【例4.2】用if语句实现下面分段函数程序段:if(x=0)if(x0)y=1;elsey=0;elsey=-1;思考题:试对上述分段函数用一个表达式语句实现。,或者:y=-1;if(x=0)if(x0)y=1;elsey=0;,错例:y=0;if(x=0)if(x0)y=1;elsey=-1;,68,C语言还提供了另外一种专门用于描述多分支选择结构的语句switch语句。1.形式:switch(表达式)case常量表达式1:语句组1break;case常量表达式2:语句组2break;case常量表达式n:语句组nbreak;default:语句组n+1,4.2.2switch语句,当表达式的值与某个常量表达式的值相等时,则执行该常量表达式后面相应的语句,若使用了break,则执行完该语句后便退出switch语句;否则,还要依次执行其后面的各条语句。若找不到相匹配的常量表达式,则执行default后面的语句。,69,如:switch(grade)caseA:printf(85100n);caseB:printf(7084n);caseC:printf(6069n);caseD:printf(60n);default:printf(errorn);2.说明:(1)switch语句中的常量表达式与表达式的类型要一致,要求为整型或字符型。(2)常量表达式的值要互不相同,但不同的常量表达式可以共用同一个语句组。(3)该语句通常与break语句联用,以保证多路分支的正确实现,break的作用是强制退出switch语句。(4)多个case可以共用一组执行语句,如:caseA:caseB:caseC:printf(6069n);,“case常量表达式”只是起语句标号作用,不是进行条件判断。,70,a=1;switch(a%5)case0:printf(“%dt”,a+);case1:printf(“%dt”,a+);case2:printf(“%dt”,+a);break;case3:printf(“%dt”,+a);break;又如:switch(int)s/1000)case0:case1:case2:,错误:switch(s)cases=1000,for(表达式1;表达式2;表达式3)语句,前两种用于描述循环次数未知的循环,而后者则用于描述循环次数已知的循环。,72,【例4.4】用上述三种循环语句,求s=main()intn,s;n=1;s=0;while(n=100)s=s+n;n=n+1;printf(s=%dn,s);,main()intn,s;n=1;s=0;dos=s+n;n=n+1;while(n=100);printf(s=%dn,s);,/*花括号不能省*/,main()intn,s;for(n=1,s=0;n=100;n+)s=s+n;printf(s=%dn,s);,while语句:,do-while语句:,for语句:,73,#includestdio.hmain()inti,c;for(i=0;(c=getchar()!=n;i+=c);printf(%dn,i);,74,循环的嵌套:循环体内包含另一个完整的循环结构.三种循环语句皆可以互为内嵌语句。以下形式的循环被称为二重循环。例如:while()while(),for(;)while(),例:main()/*ex4_1_2*/inti,j;for(i=1;i10;i+)for(j=1;j10;j+)printf(%dt,i*j);printf(n);,外循环控制变量每变化一次,内循环就要被执行若干次。,75,还可以用无条件转移语句goto及if语句来实现循环。形式:goto标号;标号的命名规则同标识符。goto语句的作用是将程序控制转到标号对应的语句处。例:,注意:goto语句只能从循环体内跳到循环体外,但不能从循环体外转到循环体内。,main()intn,s=0;n=1;loop:if(n=100)s=s+n;n+;gotoloop;printf(%dn,s);,76,break语句有两个作用:其一是用于switch语句中,保证多分支情况的正确执行;其二是用于循环语句中,强制终止本层循环(跳出本层循环)。Continue语句只能用于循环语句中,不同于break语句的是它并不终止本层循环,而只是绕过本次循环,强行进入下一次循环,即它只能跳过循环体中continue后面的语句。分析下面两个例子:,break语句和continue语句,例4.5:,main()intm;for(m=0;m10;m+)if(m=5)continue;printf(%dn,m);,main()intm;for(m=0;mk),k=sqrt(m),break,81,#includemath.h/*一行打印五个*/main()inti,j,k,n=0;for(i=2;i=k+1)n+;printf(%3d,i);if(n%5=0)printf(n);,82,请阅读以下程序的功能:main()inta=100,b=2;while(aEPS);,错在哪儿?,86,【例4.11】输入一行字符,要求输出其相应的密码.规律:将字母A变成字母E,a变成e,即变成其后的第四个字母,W变成A,X变成B,Y变成C,Z变成D.非字母字符不变.#includestdio.hmain()charc;while(!=n)if(c=a,(c=getchar(),c=c+4,cZ,x=0;while(x=9)y=0;while(y=12)if(4*x+3*y+(36-x-y)/2=36),88,第五章指针初步和数组,5.1指针初步5.2一维数组5.3指针和一维数组的关系5.4二维数组5.5字符串5.6程序举例,89,对变量的操作直接访问:按标识符来存取这些变量的值。间接访问:若要访问某个变量的值,先要找到这个变量的地址,然后再到这个地址对应的单元中存取内容。,5.1.1指针概念的引入,例如,假定有定义charch=A;inta=2;floatf=1.5;有定义int*ap=是指向整型数据的指针变量,即p中应存放某一整型数据的地址;是指向单精度实型数据的指针变量,即q中应存放某一单精度实型数据的地址。2.初始化在定义的同时赋初值,称为指针变量的初始化。例如:floatd=1.5,*p=p=,91,p和d的关系如图5.2所示。pd,NULL代表0地址(在stdio.h中有NULL的宏定义),表示不指向任何对象。(2)p=错!,5.1.4指针变量的赋值,93,【例5.1】:main()inta,b;int*p1,*p2,*p;scanf(%d%d,p1,p2所指对象变了,而对象本身没变,94,【例5.2】:main()inta,b,t;int*p1,*p2;scanf(%d%d,95,5.1.5指针的算术运算,1.自增(+)和自减(-)运算。p+pp-p,p+的意义是p先参加运算,接着指向下一元素的内存位置。p-的意义是先参加运算,接着指向上一元素的内存位置。+p,-p是先改指向,后参加运算。*p+和(*p)+的含义是什么?*p+*(p+)*pp+(*p)+*p(*p)+,见Ex5_3_1.c,96,p+n(或p-n)(为一整数)意义是指向其所指基本类型的后面(或前面)第个元素的位置。即p+n的值为:p的值n*sizeof(p指向的类型)例:若有定义floatf,*p=如:ints50;定义了一个包含50个整型元素的数组,这些数组元素分别用s0、s1、s49来表示。也可用符号常量及常量表达式说明数组长度。如:#defineN10floataN,bN*2;如下面的定义是错误的:intn,an;,5.2一维数组,5.2.1一维数组的定义,98,2.实质数组一经定义,系统便为该数组分配一段连续的内存单元来存放这些数组元素,数组名代表了这段内存区域的首地址(是一个地址常量),数组名是用来描述整个数组的,而数组元素则是数组中的某个特定变量。5.2.2数组的初始化1.给所有元素赋初值。如:inta5=0,2,4,6,8;或inta=0,2,4,6,8;将全部数组元素的初值在一对花括号内依次列出。2.给部分元素赋初值。如:inta10=1,3,5,7,9;花括号内列出的值赋给了前面的若干个元素。错例:1)inta10;a=1,3,5,7,9;数组名是个地址常量,不能被赋值。2)inta10;a10=1,3,5,7,9;,a10不是数组中的元素,且不能用花括号为一个元素赋多个值。,99,5.2.3数组元素的引用,数组除了做函数参数或对字符数组进行某些操作时可整体引用外(即以数组名的形式出现),其它情况下必须以元素的方式引用。数组元素的形式:数组名下标其中:下标为整型或整型表达式。假设有定义:intaN;其中,N是已定义过的符号常量。1)数组元素的输入for(j=0;jave)printf(%ft,*(s+i);,102,【例5.5】:利用一维数组求fibonacci数列的前20项。main()inti;intx20=0,1;for(i=2;i20;i+)for(i=0;i20;i+)if(i%5=0)printf(n);printf(%5d,xi);,i=2,3,19,xi=xi-1+xi-2;,103,a.选择法基本思想:将A0与AJ(J=1,3,9)逐个元素进行比较,若AJA0,则A0与AJ中的数互换.最后,A0存放的是数组中最小的元素;一般,AI与剩下的AJ(J=I+1,9)逐个元素进行比较,方法同上,得到AI中的数是数组中第I大的;(I=1,3,8)如此重复,直到A8与A9比较完成.,8,3,4,9,7,I=1,3,4,9,7,8,I=2,3,4,8,9,7,I=3,3,4,7,8,9,I=4,5.2.4一维数组的应用举例,【例5.6】:对数组中的数据(假设n=10)按从小到大的顺序进行排序。,104,main()inti,j,temp,a10;printf(input10numbers:n);for(i=0;iaj,Ex5_6_1.c,105,b.冒泡法main()inti,j,temp,a10;printf(input10numbers:n);for(i=0;i10;i+)scanf(%d,基本思想:把相邻的两个元素进行比较,如符合排序要求,则保持原样如不符合,则交换之.,8,3,4,9,7,K=5,3,4,8,7,9,K=4,3,4,7,8,9,K=3,3,4,7,8,9,K=2,for(i=0;iaj,10-i,Ex5_6_2.c,106,5.3指针和一维数组的关系5.3.1指向数组元素的指针指针可以指向变量也可以指向数组元素。如:inta10,*p=其中,指针是指向数组第一个元素的,即中存放的是第一个元素的地址。指针是指向数组第二个元素的。赋值语句p=则如下的等价关系成立:(1)pd则是错误的。,108,【例5.7】分析下列程序。main()/*ex5_7.c*/inta10,i,*p;p=a;for(i=0;i10;i+)scanf(%d,p+);for(i=0;i10;i+,p+)printf(%d,*p);数组元素能否正确输出?,【例5.8】#includestdio.hinta=0,1,2,3,4;main()inti,*p;for(p=,Ex5_8_1.c,109,5.4二维数组5.4.1二维数组的定义存储类型数据类型数组名常量表达式1常量表达式2;其中:常量表达式1代表二维数组的行数,常量表达式2代表二维数组的列数.行列下标都从零开始,其最大下标均比常量表达式的值小1。如:floata23;定义一个包含2行3列的单精度实型数组a。二维数组在内存中是按行连续存放的,即列下标先于行下标变化.,二维数组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年口腔修复学手术操作规范考卷答案及解析
- 高性能石墨块生产线项目初步设计
- 2025年传染病学疾病溯源调查应急处理判断题答案及解析
- 飞天凌空课件
- 2025年眼科药物治疗知识检测试卷答案及解析
- 2025年神经外科神经外科手术技能评估模拟测试卷答案及解析
- 2025年心理卫生心理疏导技巧测评答案及解析
- 外包运输安全培训记录课件
- 外包施工单位安全培训课件
- 2025年急诊除颤电击器操作技能检测及临床应用试卷答案及解析
- GB/T 1770-2008涂膜、腻子膜打磨性测定法
- 粮库监理工作流程
- 输血申请单规范PDCA
- 污水处理技术及工艺介绍课件
- 第17课-我是浙江人课件
- 税务尽职调查报告(参考)
- 初中七年级上《综合实践》活动课程课件
- 《太阳出来了》课 件课件
- 全屋定制家居整装安装师傅专业安装服务技巧培训指导手册
- 公路桥梁和隧道工程施工安全风险评估讲解(刘兴旺)
- 部编版语文七年级上册古诗文默写填空及答案
评论
0/150
提交评论