《c语言程序设计3完整版教学课件全书电子讲义(最新).ppt》由会员分享,可在线阅读,更多相关《c语言程序设计3完整版教学课件全书电子讲义(最新).ppt(492页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第1 1章章 程序设计基础程序设计基础 1.1 计算机内的数据表示 1.2算法及其表示 1.3程序设计语言 1.4 结构化程序设计1.1 计算机内的数据表示q数制及其转换数制及其转换v常用计数方法十进制计数法进制计数法是“逢十进一”的 例如:(1234.56)10110321023101410051016102各位的权值分别为:103、102、101、100、101、102。二进制计数法二进制计数法是“逢二进一”的。例如:(1001101.11)2=126025024123122021120121122 各位的权值分别为:26、25、24、23、22、21、20、21、22、23。1.1 计
2、算机内的数据表示八进制数与十六进制数八进制计数法是“逢八进一”的,数码为:0、1、2、3、4、5、6、7。例如:(621)8=682281680 各位的权值分别为:82、81、80。十六进制计数法是“逢十六进一”的,数码为 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。例如:(8A1F)16=816310162116115160各位的权值分别为:163、162、161、160。1.1 计算机内的数据表示v数制转换任意进制转换为十进制由r制数转换为十进制数可按照如下公式进行多项式展开求和即可:KnKn1K1K0.K1K2KmKnrnKn1rn1K1r1K0 r0K1r1K2r2
3、Kmrm 十进制转换为任意进制o可以采用除基取余法将十进制整数转换为r进制整数:将十进制整数除以r,得到商和余数,余数对应为r进制数低位的值;继续让商再除以r,得到商和余数,重复此操作,直至商为0,如此得到的一系列的余数就是相应r进制数的各位数字,先得到的是低位,后得到的是高位。1.1 计算机内的数据表示例如,将(29)10转换为二进制整数:因此,(29)10(11101)22292141低位27023121101高位1.1 计算机内的数据表示o可采用乘基取整法将十进制小数转换为r进制小数:将十进制小数乘以r,去掉乘积的整数部分,再将余下的纯小数乘以r,重复此操作,直至乘积等于0或达到所需的精
4、度为止,如此得到的一系列整数就是r进制小数的各位数字,先得到的是高位,后得到的是低位。例如,将(0.625)10转换为二进制小数:0.6252=1.25 1 高位 0.252=0.5 0 0.52=1 1 低位 因此,(0.625)10(0.101)2o由于整数和小数的转换方法截然不同,将十进制数转换为r进制数时,整数部分和小数部分要分开来进行转换。r进制小数能精确的转换为十进制小数,但十进制小数通常不能精确的转换为r进制小数。1.1 计算机内的数据表示二进制与八进制、十六进制之间的转换o对于一个二进制数,只要依次(整数部分由低位到高位,小数部分由高位到低位)将其每3位或4位分成一组,就可以直
5、接转换为八进制数或十六进制数。例如,(1 000 101 111 010 011.011 01)2(105423.53)8 (1000 1011 1101 0011.01101)2(8B13.B8)16o将八进制数中的每一位用3位二进制数表示,将十六进制数中的每一位用4位二进制数表示,就能转换为对应的二进制数。1.1 计算机内的数据表示q 原码,反码及补码原码,反码及补码 在计算机中,“位”是数据的最小单位。计算机中的存储量是以字节来计算的,一个字节是8位二进制位。在计算机内,一般规定:用0表示正号“”,用1表示负号“”;符号位放在数值位之前。一个数连同其符号在机器中的二进制表示形式称为机器数
6、,它所代表的数值称为机器数的真值。机器数的一般格式为:符号位 数值位 1.1 计算机内的数据表示v原码原码表示法是符号位用0表示正数,用1表示负数,数值位表示数值本身。例如:27原=0 0 0 1 1 0 1 1 27原=1 0 0 1 1 0 1 1在原码表示法中,0的表示方法不唯一:0原=0 0 0 0 0 0 0 0 0原=1 0 0 0 0 0 0 0。v反码反码表示法中正数与负数的表示方法不同,正数的反码与原码同形,如:27反=0 0 0 1 1 0 1 1负数的反码为:符号位仍为1,数值位是对原码取反,如:27反=1 1 1 0 0 1 0 0在反码表示法中,0的表示也不唯一:0反
7、=0 0 0 0 0 0 0 0 0反=1 1 1 1 1 1 1 1。1.1 计算机内的数据表示v补码正数的补码与原码、反码同形,如:18原18反18补 0 0 0 1 0 0 1 0负数的补码为:符号位为1,数值位等于原码的数值位取反,再加1,或者说:x补x反1;如:18原 1 0 0 1 0 0 1 0 18反 1 1 1 0 1 1 0 1 18补 1 1 1 0 1 1 1 0补码形式的数据进行运算时,符号位和数值位一样的参与运算。例如,计算3658,36补 1 1 0 1 1 1 0 0 58补 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 1 1 0
8、 1 0溢出 1 0 0 0 1 0 1 1 0 在补码表示法中,0的表示是唯一的,假设用一个字节存放数据0补0 0 0 0 0 0 0 01.2算法及其表示 q算法算法v为解决一个问题而采取得方法和步骤,称为算法。v 算法就是被精确定义的一组规则,规定先做什么,再做什么,以及判断某种情况下做哪种操作。例如,下面是用自然语言表示的对三个数进行从小到大排序的算法。输入三个数x、y、z;将x与y比较,若xy,交换x与y的值;将x与z比较,若xz,交换x与z的值;将y与z比较,若yz,交换y与z的值;输出此时的三个数x、y、z1.1 计算机内的数据表示q算法的特性和目标算法的特性和目标 v算法必须具
9、有以下五个特性:确定性 算法中的每一步都必须有确切的含义,不允许存在二义性;对于相同的输入数据,必须有相同的输出结果。可行性 算法中的每一步操作都能通过可以实现的基本运算,执行有限次来完成,并最终得到确定的结果。有穷性 一个算法必须总是在执行有限个操作步骤和可以接受的时间内完成其执行过程。也即是说,对于一个算法,要求其在时间和空间上均是有穷的。1.2算法及其表示输入 一个算法有零个或多个输入数据。有些算法需要提供输入数据,有些算法则不需要。输出 一个算法应该有1个或多个输出数据。v算法应达到的目标正确性可读性健壮性高效率与低存储空间需求 1.2算法及其表示q算法的表示算法的表示 v自然语言 v
10、传统流程图 传统流程图是用规定的一组图形符号、流程线和文字说明来表示各种操作的算法表示方法。1.2算法及其表示1.2算法及其表示流程图只包括三种基本程序结构 顺序结构 选择结构 真处理A处理B假条件选择结构处理A处理B顺序结构1.2算法及其表示循环结构 真处理A假条件直到型循环结构假真处理A条件当型循环结构开始输入x,y,z结束输出x、y、z对三个数进行排序交换x、y假真xy?交换x、z假真xz?交换y、z假真yz?1.2算法及其表示vN-S流程图 顺序结构 选择结构 顺序结构处理A处理B分支结构条件处理A处理B成立不成立1.2算法及其表示循环结构当条件成立时继续处理A当型循环结构处理A直到条
11、件成立时结束直到型循环结构1.2算法及其表示输入x,y,zxy?YN交换x、yxz?YN交换x、zyz?YN交换y、z输出x、y、z三个数进行从小到大排序1.2算法及其表示v伪码伪码是用一种介于自然语言和计算机语言之间的文字和符号来描述算法。例如,用伪码描述上述算法:input x,y,zxmaxif y max then ymaxif z max then zmax output max1.3程序设计语言 q程序与程序设计语言程序与程序设计语言 v程序 计算机程序是指为让计算机完成特定的任务而设计的指令序列。v程序设计语言 机器语言汇编语言高级语言面向对象的语言 qC C语言简介语言简介 v
12、C语言的历史 1.3程序设计语言vC程序的结构 C程序是一种函数结构,一般由一个或若干个函数组成;其中必有一个名为main()的主函数,程序的执行就是从这里开始的。【例1.1】编写程序判断一个整数是否是3的倍数,如果是输出“YES”,否则输出NO”。main()/*main函数的首部*/*main函数体的开始*/int m;/*定义整型变量m*/printf(nPlease input a integer:);/*输出提示信息*/scanf(%d,&m);/*读入变量的值*/if(m%3=0)printf(YES);else printf(NO);/*如果flag值为0,输出“YES”,否则输
13、出“N0”*/1.3程序设计语言运行情况如下:Please input a integer:20 NO【例1.2】编写程序求任意三个整数中的最小值。main()/*main函数的首部*/*main函数体的开始*/int n1,n2,n3;/*定义三个整型变量*/int minnum;/*定义变量minnum,用于存放最小值*/printf(nEnter three integers:);/*输出提示信息*/scanf(%d,%d,%d,&n1,&n2,&n3);/*读入变量的值*/minnum=min(n1,n2,n3);/*调用自定义函数min,将所求的最小值赋给变量minnum*/prin
14、tf(nMaximum is:%d,minnum);/*输出minnum值*/1.3程序设计语言int min(int x,int y,int z)/*num函数的首部*/*num函数体的开始*/int m;m=x;/*默认第一个数最小*/if(ym)m=y;/*如果第二个数更小,则修改m*/if(zm)m=z;/*如果第三个数更小,则修改m*/return m;/*将m的值作为函数值返回*/*max函数体的结束*/运行情况如下:Enter three integers:18,25,12Maximum is:12 1.3程序设计语言C程序的结构特点o C程序是由函数构成的。o函数由函数首部和函
15、数体两部分组成。一般函数的格式如下:类型名类型名 函数名(函数参数表)函数名(函数参数表)声明部分声明部分 执行部分执行部分 函数体中也可以没有任何内容,即构成一个空函数。o一个源程序有一个且只能有一个main函数(又称主函数)。C程序的执行总是从main函数开始的,在调用其它函数后,最后回到main函数中结束整个程序的执行。1.3程序设计语言oC程序书写格式自由。既允许在一行内写多个语句,也允许将一个语句分写在多行上,但每个语句必须以分号结束。o“/*/”表示对函数或语句的功能作注释。在“/”和“*”之间不能有空格,且“/*”和“*/”必须配对使用。注释是供人阅读的,并不参与编译和运行。注释
16、可以出现在程序的任何地方,添加必要的注释可以提高程序的可读性。o源程序中可以使用预处理命令(如include命令、define命令),预处理命令以“#”开头,一般预处理命令应放在源文件或源程序的最前面。1.3程序设计语言C程序的一般形式如下:预编译处理命令预编译处理命令 全局变量定义全局变量定义 main()main()声明部分声明部分 执行部分执行部分 sub 1()/*sub 1()/*自定义函数自定义函数*/sub n()/*sub n()/*自定义函数自定义函数*/1.3 程序设计语言vC程序的特点 简洁、紧凑模块化、结构化功能强大可移植性好vC语言的不足运算符多,难以掌握C程序中常常
17、为了类型转换上的方便不要求类型检查,这就导致有些情况下即使要求类型一致,但实际类型不一致也不出错,而产生莫名其妙的运算结果。C语言中对数组进行处理时对数组元素的下标不做越界检查,若程序中引用数组元素时越界,容易造成数据的混乱,甚至更严重的错误。1.4 结构化程序设计 q结构化程序设计方法结构化程序设计方法v结构化程序设计方法是一种用来编写清晰、可读性好、易修改性强的程序的严格的设计方法。v结构化程序设计方法要求程序仅由三种基本结构:顺序结构、选择结构和循环结构经组合、嵌套而成。而且,要求每个程序模块是单入口单出口的;程序中没有永远执行不到的语句,没有死循环(无终止的循环)。v结构化程序设计方法
18、要求采用“模块化”的设计方法。v程序的设计过程采用“自顶向下,逐步求精”的策略。1.4 结构化程序设计q程序设计的步骤程序设计的步骤v分析问题,确定数据结构。v确定算法。v编写程序。v调试运行程序。v建立文档资料。q程序设计的风格程序设计的风格 第2章 简单的数据类型、运算符及表达式 2.1 常量和变量 2.2基本数据类型 2.3 运算符及表达式 2.4 类型转换2.1 常量和变量 q标识符标识符 v字符集 C语言的字符集是指C程序中允许出现的字符,分为:英文字母(大、小写):A,B,C,Z;a,b,c,z 数字:0,1,2,9 特殊字符:,,*,/,_,(,),!,$,&,.,“,?,|以及
19、空格等 转义字符:n,t,v,b,r,f,a,“,ddd,xhh等 2.1 常量和变量v标识符 C语言中各种对象的名字用标识符表示。所谓标识符就是由字母(a-z,A-Z)、数字(0-9)和下划线(_)组成,并且第一个字符必须为字母或下划线开头的一系列字符。标识符是表示符号常量名、变量名、函数名、类型名、文件名等的字符序列。例如,合法的标识符和变量名:data1,Day,x,program_1,aver,sum非法的标识符和变量名:J.Agate,$50,ayz;b=xy=z;c=x=y;printf(nx=%dy=%dz=%d,x,y,z);printf(na=%db=%dc=%d,a,b,c
20、);程序的输出结果是x=8 y=8 z=7a=0 b=0 c=14.1 关系运算、逻辑运算与条件运算q逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式v逻辑运算符与表达式逻辑表达式是指由逻辑运算符连接若干个表达式所构成的表达式。C语言中提供三种逻辑运算符:&(逻辑与),|(逻辑或),!(逻辑非)。逻辑运算符的运算规则是:o&:当且仅当两个运算量的值均为非0时,其运算结果值为1,其余情况均为0;o|:当且仅当两个运算量的值均为0时,其运算结果值为0,其余情况均为1;o!:当运算量的值为0时,运算结果为1,当运算量的值为1时,运算结果为0。4.1 关系运算、逻辑运算与条件运算 例如:表示“三门课成绩均
21、为及格”的逻辑表达式为:(math60)&(phys60)&(engl60)表示“三门课成绩中至少有一门不及格”的逻辑表达式为:(math60)|(phys60)|(engl=A&c0?x+1:x*x/2 条件运算符具有右结合性例如:x0?1:x=60.0)printf(nPassed);/*如果成绩及格,则输出“Passed”*/运行情况如下:Enterascore:85PassedEnterascore:504.2 if语句q双分支选择结构双分支选择结构vif-else语句的形式为:if(表达式)(表达式)语句语句1 else 语句语句2 vif-else语句的执行过程:先判断或计算表达式
22、的值,若结果为“真”(非0),则执行if子句;否则执行else子句。4.2 if语句【例4.6】将例4.4改为:如果成绩及格,则输出“Passed”;否则输出“Failed”。main()floatscore;printf(nEnterascore:);scanf(%f,&score);if(score=60.0)printf(nPassed);elseprintf(nFailed);运行情况如下:Enterascore:85Passed再运行:Enterascore:50Failed4.2 if语句q嵌套的嵌套的if语句语句vif语句嵌在if子句中 if(表达式表达式1)if(表达式表达式2
23、)语句语句1 else 语句语句2 else 语句语句3vif语句嵌在else子句中 if(表达式表达式1)if(表达式表达式2)语句语句1 else if(表达式表达式3)语句语句2 else 语句语句34.2 if语句v较为规范、容易掌握的嵌套的if语句的结构形式if(表达式(表达式1)语句)语句1else if(表达式(表达式2)语句)语句2else if(表达式(表达式3)语句)语句3 else if(表达式(表达式n)语句)语句nelse 语句语句n+1【例4.8】输入一个学生成绩,当成绩90时,输出“Very good”;当80成绩90时,输出“Good”;当60成绩80时,输出“
24、Passed”;当成绩60时,输出“Failed”。4.2 if语句main()floatscore;printf(nEnterascore:);scanf(%f,&score);if(score=90)printf(nVerygood);elseif(score=80)printf(nGood);elseif(score=60)printf(nPassed);elseprintf(nFailed);4.2 if语句运行情况:Enter a score:95 Very good再运行:Enter a score:55 Failed4.2 if语句vif后面的表达式可以是C语言中任意合法的表达式
25、,常常是关系表达式或逻辑表达式。但无论是哪种类型的表达式,在处理时,系统都会将其理解为逻辑值,即表达式的值只区分为0和非0。vif子句和else子句必须以分号结束,且else子句不能作为单独的语句使用,它必须是if语句的一部分,与if配对使用。为了使程序结构清晰、便于阅读,对于复杂的if语句应使用适当的缩进格式。v在if和else后面可以只含一个语句,若需要有多个操作语句,则必须用花括号将这些语句括起来作为复合语句来使用。v在if语句的嵌套中,要注意if和else的配对关系。从最内层开始,else 总是与它上面最近的尚未曾配对if配对。4.3 switch语句 qC语言中提供了switch语句
26、用于直接实现多分支选择结构。qswitch语句的一般形式为:switch(表达式)(表达式)case 常量表达式常量表达式1:语句:语句1;case 常量表达式常量表达式2:语句:语句2;case 常量表达式常量表达式n:语句:语句n;default:语句组语句组n+1;qswitch语句的执行过程为:先计算switch 后面的表达式的值;然后使其顺次花括号内同各个case后的常量表达式的值相比较,若找到相等的常量表达式i,则执行该常量表达式冒号后的语句i;若找不到匹配的常量表达式,此时要考虑是否有default选项,若有,则执行default后面的语句直到结束;否则什么也不执行。4.3 sw
27、itch语句q在执行过程中,若遇到break语句,则跳出switch 结构,将程序流程转向switch 结构外的下一条语句执行;若没有break语句,则从该语句组为入口,依次执行其后的所有冒号后面的语句。【例4.9】用switch语句实现例4.8。main()intscore,mark;printf(nEnterscore:);scanf(%d,&score);mark=-1;if(score=0&score=100)mark=score/10;4.3 switch语句switch(mark)case10:case9:printf(nVerygood);break;/*成绩90*/case8:
28、printf(nGood);break;/*80成绩90*/case7:case6:printf(nPassed);break;/*60成绩80*/case5:case4:case3:case2:case1:case0:printf(nFailed);break;/*成绩60*/default:printf(nEntererror!);/*处理错误的输入*/4.3 switch语句 switch结构使用要注意以下几点:vswitch后面表达式的类型,一般为整型、字符型或枚举类型(枚举类型将在以后的章节中介绍)。v每个case后面常量表达式的值必须互不相同,即不允许对表达式的同一个值有两种或两种
29、以上的处理方案。v尽管各个case和default出现的次序不影响程序的执行结果,但是把default放在最后是一种良好的程序设计习惯。v多个case可共有一组执行语句。vcase后面的常量表达仅起语句标号的作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行下去,不再进行判断。4.3 switch语句vswitch语句又称为开关语句。当仅需执行一个开关时,则在该case后面的语句中必须包含一个break语句,让其执行后跳出switch语句,否则会一直执行到最后,或遇到下一个case中的break语句为止。v当case后面包含一条以上的执行语句时,可以不用花括号括起来,系统会自动识
30、别并顺序执行所有语句。vdefault是可选项。但良好的程序设计习惯是,在每个switch语句中,写上一条default语句来集中处理例外条件,从而防止一些条件没有被测试到。4.4 选择结构程序设计举例【例4.10】求一元二次方程的根。#includemath.hmain()floata,b,c,disc,x1,x2,rpart,ipart;printf(nnpleaseinputa,b,c:);scanf(%f,%f,%f,&a,&b,&c);/*输入方程的系数*/printf(Theequation);if(fabs(a)=1E-6)/*若a等于0,则不是一元二次方程*/printf(is
31、notquadratic);exit(0);elsedisc=b*b-4*a*c;if(fabs(disc)1E-6)/*0,有两个不等实根*/4.4 选择结构程序设计举例 x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(hastwodistinctrealroots:%8.4f,%8.4f,x1,x2);else/*0,有两个共厄复根*/rpart=-b/(2*a);ipart=sqrt(-disc)/(2*a);printf(hastwocomplexroots:);printf(n%8.4f+%8.4fi,rpart,ipar
32、t);printf(n%8.4f-%8.4fi,rpart,ipart);4.4 选择结构程序设计举例程序的运行情况如下:please input a,b,c:1,2,1 The equation has two equal roots:-1.0000 please input a,b,c:2,8,6 The equation has distinct real roots:-1.0000,-3.000 please input a,b,c:1,2,3 The equation has two complex roots:-1.0000+1.4141i-1.0000-1.4141i4.4 选择
33、结构程序设计举例【例4.12】某商店售货,按购买货物的款数多少分别给予不同的优惠折扣:购货不足250元的,没有折扣;购货满250元,不足500元,折扣5%;购货满500元,不足1000元,折扣7.5%;购货满1000元,不足2000元,折扣10%;购货满2000元,折扣15%。用嵌套的if结构实现。4.4 选择结构程序设计举例4.4 选择结构程序设计举例main()floatm,d,amount;printf(nEnteryourmoneyforbuying:);scanf(%f,&m);if(m250)d=0;elseif(m500)d=5;elseif(m1000)d=7.5;elseif
34、(m2000)d=10;elsed=15;amount=m*(1-d/100);printf(namount=%6.2f,amount);4.4 选择结构程序设计举例运行情况:Enteryourmoneyforbuying:680amount=629.00再运行:Enteryourmoneyforbuying:1350amount=1215.00用switch结构实现。设置mark标记变量:mark=m/250,根据mark的值而确定相应的折扣。程序如下:main()floatm,d,amount;intmark;printf(nEnteryourmoneyforbuying:);scanf(
35、%f,&m);4.4 选择结构程序设计举例mark=m/250;switch(mark)case0:d=0;break;case1:d=5;break;case2:case3:d=7.5;break;case4:case5:case6:d=10;break;default:d=15;if(d0)printf(nEntererror!);elseamount=m*(1-d/100);printf(namount=%6.2f,amount);4.4 选择结构程序设计举例【例4.13】编一程序将以英寸为单位表示的长度转换为以厘米为单位表示的长度;或者反之,从厘米转换为英寸。已知:1英寸=2.54厘米
36、因为要求两种单位可以互相转换,所以,设置一个变量select,用于选择,select=1表示将英寸转换为厘米,select=2表示将厘米转换成英寸。用if语句实现:main()intselect;floatleng,r=2.54;printf(nPleasechoose(1:inchtocm,2:cmtoinch):);scanf(%d,&select);printf(Entertheleng:);scanf(%f,&leng);if(select=1)printf(n%6.2finch=%6.2fcm,leng,leng*r);elseif(select=2)printf(n%6.2fcm=
37、%6.2finch,leng,leng/r);4.4 选择结构程序设计举例运行情况:Please choose(1:inch to cm,2:cm to inch):1Enter the leng:12 12.00 inch=30.48 cm再运行:Please choose(1:inch to cm,2:cm to inch):2Enter the leng:12 12.00 cm=4.72 inch4.4 选择结构程序设计举例用switch结构实现:main()intselect;floatleng,r=2.54;printf(nPleasechoose(1:inchtocm,2:cmto
38、inch):);scanf(%d,&select);printf(Entertheleng:);scanf(%f,&leng);switch(select)case1:printf(n%6.2finch=%6.2fcm,leng,leng*r);break;case2:printf(n%6.2fcm=%6.2finch,leng,leng/r);break;default:printf(Entererror!)n);第第5 5章章 循环结构程序设计循环结构程序设计5.1 while循环5.2 do-while循环5.3 for循环5.4循环结构的嵌套5.5 转向语句5.6 循环结构程序设计举例
39、 5.1 while循环qwhile语句用于构成“当型”循环结构。qwhile语句的一般形式为:while(表达式表达式)循环体语句循环体语句qwhile循环结构的执行过程是:首先计算表达式(循环条件)的值,若结果为“真”(非零),则执行循环体语句;然后再次计算表达式的值,重复上述过程,直到表达式的值为“假”(零)时结束循环,流程控制转到循环结构的下一语句。5.1 while循环【例5.1】从键盘上输入一个整数n,求n!,利用while语句编程实现。main()intn,i,s;printf(nEntern:);scanf(%d,&n);i=1;s=1;/*给变量i、s赋初值*/while(i
40、=n)/*循环继续的条件*/s=s*i;/*进行累乘求积*/i+;/*乘数增值*/printf(nn!=%d,s);/*输出计算的结果*/运行情况如下:Entern:5n!=1205.1 while循环使用while循环结构应注意以下几点:qwhile循环结构的特点是“先判断,后执行”。如果表达式的值一开始就为“假”,则循环体一次也不执行。q 循环体中,如果包含一个以上的语句,则应用花括号括起来,以复合语句的形式出现。q 循环体内一定要有改变循环继续条件的语句,使得循环趋向于结束,否则循环将无休止的进行下去,即形成“死循环”。为使循环能够正确开始运行,还要做好循环前的准备工作,【例5.2】从键
41、盘上输入30个学生的成绩,对其进行处理:如果成绩及格,则输出“Passed”;否则输出“Failed”。5.1 while循环5.1 while循环main()intn=1;/*循环控制变量赋初值*/floatscore;while(n=60.0)printf(Passedn);elseprintf(Failedn);n+;/*循环控制变量增值*/5.2 do-while循环qdo-while语句构成的循环结构类似于“直到型”循环,qdo-while语句的形式为:do 循环体语句循环体语句while(表达式表达式);qdo-while循环结构的执行过程:首先执行一次循环体语句,然后计算表达式(
42、循环条件)的值。若结果为“真”(非零),则再次执行循环体,再计算表达式的值,如此重复下去,直到表达式的值为“假”(零)时,循环结束,流程控制转到循环结构的下一语句。5.2 do-while循环【例5.3】用do-while循环结构实现例5.1。main()intn,i,s;printf(nEntern:);scanf(%d,&n);i=1;s=1;dos=s*i;i+;while(i=n);printf(nn!=%d,s);5.2 do-while循环使用do-while循环结构应注意以下几点:q 当do-while循环体包含一个以上的语句时应该用花括号括起来,以复合语句形式出现;循环体内也一
43、定要有改变循环条件的语句,使循环趋向于结束。q下面的两个程序可以明显的看出while循环和do-while循环的区别。5.2 do-while循环当输入1时,两个程序的运行结果是一样的:The sum is 18,i=4当输入5时,第一个程序的运行结果是:The sum is 6,i=6第二个程序的运行结果是:The sum is 0,i=5qfor语句是功能强大的构成“当型”循环结构的循环语句。它不但可以用于循环次数已知的情况,而且还可以用于循环次数不定的情况。q程序形式:for(表达式(表达式1;表达式;表达式2;表达式;表达式3)循环体语句循环体语句5.3 for循环qfor循环结构的执
44、行过程:首先进行表达式1的运算,然后计算表达式2的值,若结果为真(非零),则执行循环体语句,最后进行表达式3的运算。再次计算表达式2的值,若结果为“真”(非零),再执行循环体语句,最后再进行表达式3的运算。如此循环重复下去,直到计算表达式2的结果为“假”(零)时,循环结束,流程控制转到循环结构的下一语句。【例5.4】用for循环结构实现例5.1。main()int n,i,s;printf(nEnter n:);scanf(%d,&n);for(i=1,s=1;i=n;i+)s=s*i;printf(nn!=%d,s);5.3 for循环使用for循环结构应注意以下几点:q用for循环结构也具
45、有“先判断,后执行”的特点。for循环结构相当如下形式的while结构:表达式1;while(表达式2)循环体表达式3;q从语法上看,for的三个成分都是表达式,它们之间都以分号“;”隔开。q表达式1和表达式3常常是赋值表达式或函数调用,有时也可以是逗号表达式,一般用来实现对循环控制变量初始化和循环控制变量增(减)值。表达式2常常是关系表达式或逻辑表达式,但也可以是其它类型的表达式,它是用来表示循环继续的条件,只要其值为非零,就可执行循环体,否则推出循环。例如:for(i=1,sum=0;i=100;i+,i+)sum+=i;5.3 for循环q关键字for的三个表达式允许部分或全部省略,但其
46、中的两个分号不能省略,否则,系统将报错。需要注意:v当省略表达式1时,在进入for循环之前应该有给循环控制变量赋初始值的语句;v当省略表达式3时,应该在循环体内有修改循环控制变量的值的语句,以保证循环能够正常结束。例如:for(i=1,s=1;i=n;)s=s*i;i+;v当表达式2或三个表达式全部省略时,应该在循环体内设置相应的语句来结束循环,否则程序始终认为判断条件成立,循环将无终止地执行下去,即形成了所谓的死循环。q如果循环体语句为一语句组,则必须用一对花括号“”括起来。5.3 for循环q由于for循环结构书写形式灵活多样,如果在三个表达式中过多的加入与循环控制无关的内容,容易降低可读
47、性。因此,通常使用一种简单明了的for循环结构形式:for(循环控制变量赋初值;循环条件;循环控制变量增(减)值)循环体语句5.3 for循环【例5.5】输入一批非零整数,以为结束符,输出其中的最大值。#includemain()intx,max;printf(inputnumbers,lastoneis0:n);/*输出提示信息*/scanf(%d,&x);max=x;/*先将第一个数赋值给变量max*/for(;x!=0;)scanf(%d,&x);if(maxx)max=x;/*输入值比变量max大,用当前值替换变量max的值*/printf(max=%dn,max);/*输出最大值*/
48、5.3 for循环程序的运行情况如下:inputnumbers,lastoneis0:3652970max=95.4循环结构的嵌套下面是几种合法的循环嵌套形式:(1)while()(2)for(;)while()do while();(3)while()(4)do for(;)for(;)while();5.4循环结构的嵌套【例5.6】编程输出以下形式的乘法九九表。1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=92*1=22*2=42*3=62*4=82*5=102*6=122*7=142*8=162*9=189*1=99*2=189*3=279*4=
49、369*5=459*6=549*7=639*8=729*9=81main()inti,j;for(i=1;i=9;i+)/*i作为外循环控制变量控制被乘数变化*/printf(n);for(j=1;j=9;j+)/*j作为内循环控制变量控制乘数变化*/printf(%1d*%1d=%2d,i,j,i*j);5.4循环结构的嵌套【例5.7】全班有30个学生,每个学生考8门课。要求分别统计出每个学生各门课的平均成绩。5.4循环结构的嵌套main()inti,j,score,sum;floataver;j=1;while(j=30)sum=0;for(i=1;i=8;i+)printf(EnterN
50、O.%dthescore%d:,j,i);scanf(%d,&score);/*输入第j个学生第i门课程的成绩*/sum=sum+score;/*累计第j个学生的总成绩*/aver=sum/8.0;/*计算第j个学生的平均成绩*/printf(NO.%daver=%5.2fn,j,aver);/*输出第j个学生的平均成绩*/j+;5.4循环结构的嵌套使用循环的嵌套结构要注意以几点:q外层循环应“完全包含”内层循环,不能发生交叉。例如下面这种形式是不允许的:do for()while();q嵌套的循环控制变量一般不应同名,以免造成混乱。5.4循环结构的嵌套q嵌套的循环要注意正确使用缩进式书写格式