1、2023-1-22第3章C语言流程控制第第3章章C语言流程控制语言流程控制第3章C语言流程控制本章重点 格式化输入输出函数 C语言中的顺序、分支和循环程序的设计方法第3章C语言流程控制3.1格式化输入输出函数 printf()函数 scanf()函数第3章C语言流程控制3.11 printf()函数 C标准库函数中提供了一些输入输出函数,如前面遇到的printf()函数和scanf()函数,它们非C关键词,而是函数名而已,可以自己编写输入输出函数。printf()函数和scanf()函数在系统文件“stdio.h”中声明,所以在程序的开始部分要使用编译预处理命令“#include”。第3章C语
2、言流程控制在日常生活中,我们要经常将华氏温度转换成摄氏温度,其转换公式如下:式中:c表示摄氏温度,f表示华氏温度。运行结果:运行结果:如:第3章C语言流程控制 printf()函数的作用就是输出。对比:函数语句:printf(fahr=%f,celsius=%fn,fahr,celsius);输出结果:fahr=100.000000,celsius=37.777778得出:双引号里,第一个%f换成了fahr的值,第二个%f换成了celsius的值,并且以单精度数据形式显示。第3章C语言流程控制printf()函数一般的调用格式为:printfprintf(格式控制字符串格式控制字符串,输出参数
3、输出参数1,1,输输出参数出参数2,2,输出参数输出参数n n););“格式控制字符串”是用双引号括起来的字符串,也称作“转换控制字符串”,包括两种意思。第3章C语言流程控制 普通字符普通字符即需要原样输出字符。如:printf(fahr=%f,celsius=%fn,fahr,celsius);fahr=100.000000,celsius=37.777778双引号内,两个%f变化除外,其余均无改变 格式说明格式说明由“%”和格式字符组成,如%d、%f等,它的作用是将输出的数据转换成指定的格式输出。第3章C语言流程控制格式说明格式说明输出输出%c%d%e%E%x%u%s%o%G%g%f%X一
4、个字符一个字符根据数值的不同自动选择根据数值的不同自动选择%f或或%e。用于指数小于。用于指数小于-4或者大于精度或者大于精度根据数值的不同自动选择根据数值的不同自动选择%F或或%E。用于指数小于。用于指数小于-4或者大于精度或者大于精度无符号八进制整数无符号八进制整数字符串字符串无符号十进制整数无符号十进制整数使用十六进制数字使用十六进制数字of的无符号十六进制整数的无符号十六进制整数使用十六进制数字使用十六进制数字oF的无符号十六进制整数的无符号十六进制整数输出一个输出一个%有符号十进制整数有符号十进制整数浮点数、以指数的形式输出浮点数、以指数的形式输出(1.2e+02)浮点数、以指数的形
5、式输出浮点数、以指数的形式输出(1.2E+02)以小数点形式输出浮点数、十进制记数法以小数点形式输出浮点数、十进制记数法第3章C语言流程控制字符字符说明说明l用于长整型整数,可加在格式符用于长整型整数,可加在格式符d、o、x、u前面前面m(正整数正整数)数据最小宽度数据最小宽度n(正整数正整数)对于实数,表示输出对于实数,表示输出n位小数;对于字位小数;对于字符串,表示截取的字符个数符串,表示截取的字符个数输出的数字或者字符在域内向左靠输出的数字或者字符在域内向左靠 1.对于%md和%ms,m为指定输出数据的宽度,如果数据的位数小于m,则左端补空格,若大于m,则按实际位数输出。例如:print
6、f(%4d,%4d,a,b)若a=12,b=12345,则输出结果为:12,12345 注意:注意:2.对于%-ms,如果字符串的长度小于m,则输出m列,不足的位数在右侧补空格。例如:printf(“%-4d,%-4d”,a,b);若a=12,b=12345;结果为:a=12,b=12345。3.对于%m.s,输出占m列,但只是取字符串中左端n个字符,这n个字符输出在m列的右侧,左端补空格。%-m.s则在右侧补空格,如果n m,则m自动取n值,即保证n个字符正常输出。4.对于%m.nf,指定输出的数据共占m列,其中n位小数。如果数值长度小于m,则左端补空格。%-m.nf与%m.nf一样,只是使
7、输出的数值向左端靠,右端补空格。第3章C语言流程控制3.1.2 scanf()函数 依旧探讨华氏温度转换成摄氏温度,上一节中,华氏温度为一定值,如果根据用户来输入相应的数据,求摄氏温度,那该如何进行相应的输入呢?第3章C语言流程控制运行结果:Please input fahr:140fahr=140.000000,celsius=60.000000scanf()函数作用,函数作用,输入数值输入数值例:例:第3章C语言流程控制 scanf函数的作用是输入数据,其基本格式为:scanf(scanf(格式控制格式控制,地址列表,地址列表)“格式控制”的含义和printf函数的格式控制。格式说明也是以
8、%开始,以一个格式字符结束,中间可以插入一些普通字符,普通字符同样按原样输出。第3章C语言流程控制格式说明符格式说明符意义意义%c输入单个字符输入单个字符%d输入有符号的十进制整数输入有符号的十进制整数%f输入浮点数,可以用小数或者整数形式输入输入浮点数,可以用小数或者整数形式输入%o输入无符号的八进制数输入无符号的八进制数%s输入字符串,将字符串存放到一个字符数组中,输入时以非输入字符串,将字符串存放到一个字符数组中,输入时以非空白字符开始,以第一个空白字符结束,字符串以串结束标空白字符开始,以第一个空白字符结束,字符串以串结束标志志0作为其最后一个字符。作为其最后一个字符。%u输入无符号的
9、十进制整数输入无符号的十进制整数%x,%X输入无符号的十六进制整数输入无符号的十六进制整数%e,%E,%g,%G与与%f的作用相同,的作用相同,e,f,g可以互相替换而且大小写的作用相可以互相替换而且大小写的作用相同。同。scanf函数的格式说明符函数的格式说明符字符字符意义意义l用于输入长整型数据,可用于用于输入长整型数据,可用于%ld、%lo、%lx、%lu以及以及double型数型数据据%lf或或%leh用于输入短整型数据,可用于用于输入短整型数据,可用于%hd、%ho、%hx域宽域宽指定输入数据所占的列宽,应为一个正整数指定输入数据所占的列宽,应为一个正整数*表示本输入项在读入后不赋给
10、相应的变量表示本输入项在读入后不赋给相应的变量第3章C语言流程控制如:如:scanf(”%d”,&i);输入输入1234,结果,结果i的值为的值为1234 输入输入1234,结果,结果i的值为的值为123 输入输入 1234,结果,结果i的值为的值为1234为了更清楚地了解scanf()函数的用法,须知以下几点:如:如:scanf(”%d,%d”,&a,&b)加上加上“&”,表示,表示变量变量a和和b的地址的地址这个,输入时,必须加这个,输入时,必须加上逗号,才能保证正确上逗号,才能保证正确如:如:scanf(”%4d”,&i);输入输入12345,结果,结果i的值为的值为1234(因为指定域
11、宽为(因为指定域宽为4)输入输入12345,结果,结果i的值为的值为123(因为遇见空白字符)(因为遇见空白字符)scanf格式控制中的普通字符必须按原样格式控制中的普通字符必须按原样输入,地址列表中必须为地址,在变量输入,地址列表中必须为地址,在变量前加上前加上“取地址运算符取地址运算符”读取数据的时候是以指定域宽或者第一读取数据的时候是以指定域宽或者第一个空白字符处为终止(最先达到者)个空白字符处为终止(最先达到者)若第一个或前几个连续为空白字符、制若第一个或前几个连续为空白字符、制表符和换行符,都将跳过这些字符表符和换行符,都将跳过这些字符注意注意%s格式说明符的用法格式说明符的用法第3
12、章C语言流程控制要点深度解析:要点深度解析:结合要点结合要点1,了解地址的含义,了解地址的含义 结合要点结合要点2、3,分析多数据输入情况,分析多数据输入情况 结合要点结合要点4,掌握,掌握%s的用法的用法第3章C语言流程控制3.2 程序流程图 流程图是用一些图框来表示各种操作。用流程图来表示算法,直观形象,易于理解。美国国家标准化协会ANSI规定了一些常用的流程图符号。第3章C语言流程控制菱形框菱形框,是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。它有一个入口,两个出口连接点连接点,是用于将画在不同地方的流程线连接起来。在流程图中,编号相同的连接点表示这些点是互
13、相连接在一起的注释框注释框,不是流程图中的必要部分,不反应流程和操作,只是为了对流程图中某些框的操作作必要的补充说明,以便于人们更好的理解流程图第3章C语言流程控制例:求一数值的绝对值。数学分析:若此数值本身就不小于0,就是其本身,反之,为其相反数。输出输出X输出输出 -xX满足条件满足条件不满足条不满足条件件流程图表示:流程图表示:第3章C语言流程控制三种基本结构:三种基本结构:1.顺序结构,流程图表示如下:顺序结构,流程图表示如下:执行完执行完A框指定的操作后接着执行框指定的操作后接着执行B框所指定框所指定的操作。顺序结构是最简单的一种基本结构。的操作。顺序结构是最简单的一种基本结构。2.
14、选择结构,流程图表示如下:选择结构,流程图表示如下:此结构中必须包含一个判断框,根据给定的条此结构中必须包含一个判断框,根据给定的条件件p是否成立来选择执行是否成立来选择执行A框还是框还是B框中所指定的操作。框中所指定的操作。无论无论p条件是否成立,只能执行条件是否成立,只能执行A框或者框或者B框之一,两框之一,两者不可能同时执行。者不可能同时执行。A框或者框或者B框有一个可以是空的,框有一个可以是空的,不执行任何操作不执行任何操作3.循环结构,流程图表示如下:循环结构,流程图表示如下:当(当(while)型循环结构。其功能是:当给定的条件)型循环结构。其功能是:当给定的条件p1成立时,执行成
15、立时,执行A框操作,执行完框操作,执行完A后,再判断条件后,再判断条件p1是否成是否成立,如果仍然成立,再执行立,如果仍然成立,再执行A框,如此反复执行框,如此反复执行A框,直到框,直到某一次条件某一次条件p1不成立为止,此时不执行不成立为止,此时不执行A框,从框,从b点脱离循点脱离循环结构环结构 直到(直到(until)型循环结构。其功能是:先执行)型循环结构。其功能是:先执行A框,框,然后判断给定的条件然后判断给定的条件p2是否成立,如果是否成立,如果p2条件不成立,则条件不成立,则再执行再执行A,然后再对,然后再对p2条件作判断,如果条件作判断,如果p2条件仍然不成条件仍然不成立,又执行
16、立,又执行A如此反复执行如此反复执行A,直到给定的条件,直到给定的条件p2成立成立为止,此时不再执行为止,此时不再执行A,从,从b点脱离循环结构点脱离循环结构第3章C语言流程控制3.3顺序结构程序设计 算术运算符 算术表达式 赋值表达式第3章C语言流程控制例:求一元二次方程的两根。例:求一元二次方程的两根。运行结运行结果:果:从主函数入口开始执行,定义变量,输入数从主函数入口开始执行,定义变量,输入数值,求解方程的解,这都是按照代码的一步一步值,求解方程的解,这都是按照代码的一步一步往下实现的。往下实现的。第3章C语言流程控制3.3.1算术运算符5种基本运算符:种基本运算符:1).+(加法或者
17、正直运算符加法或者正直运算符)2).(减法或者负值运算符减法或者负值运算符)3).*(乘法运算符乘法运算符)4)./(除法运算符除法运算符)5).%(求余运算符求余运算符)第3章C语言流程控制注意:注意:加法和减法运算符同于数学上加法和减法运算符同于数学上乘法在乘法在c语言中用语言中用“*”,而不用,而不用“”除法在除法在c语言中是语言中是“/”,而不用,而不用“”使用使用“/”时,若除数和被除数都为整数,则商也时,若除数和被除数都为整数,则商也是整数,若参与运算的有负数,是整数,若参与运算的有负数,第3章C语言流程控制3.3.2算术表达式算术表达式 即用算术运算符和括号将运算对象连接起来,符
18、合C语法规则的式子算术运算时是按照优先级进行的,若优先级相同,则按照结合方向进行计算,并且每一个表达式都会有一个确定的值。第3章C语言流程控制3.3.3赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。其一般形式为:变量变量赋值运算符赋值运算符表达式表达式计算过程是:先计算赋值运算符右侧的“表达式”的值,然后将这个值赋值给左边的变量。多个赋值表达式共存则按结合性“自右而左”进行一步一步分别赋值。第3章C语言流程控制常用的复合赋值运算符常用的复合赋值运算符a+=y等价于a=a+yb=y等价于b=byc*=y等价于c=c*yd/=y等价于d=d/ye%=y等价于e=e%yy
19、可以是常量、变量以及复杂的表达式赋值运算符赋值运算符“=”之前加上其他运算之前加上其他运算符,就构成复合赋值运算符。符,就构成复合赋值运算符。第3章C语言流程控制 编写程序:编写程序:从键盘上输入三角形的三边,根据从键盘上输入三角形的三边,根据下面的公式求出三角形的面积下面的公式求出三角形的面积area。假设输入假设输入a、b和和c三边的边长能够组成一个三角形。三边的边长能够组成一个三角形。程序为:程序为:第3章C语言流程控制3.4 选择结构程序设计 关系运算符和关系表达式 逻辑运算符和逻辑表达式 if语句与switch第3章C语言流程控制例:一元二次方程根的情况。例:一元二次方程根的情况。运
20、行结果:运行结果:此程序就体现了,根据不同的情况,此程序就体现了,根据不同的情况,有不同的结果,就达到了一种选择的目的。有不同的结果,就达到了一种选择的目的。第3章C语言流程控制3.4.1关系运算符和关系表达式关系运算符关系运算符运算符含义小于大于=大于或等于=等于!=不等于算术运算符算术运算符关系运算符关系运算符赋值运算赋值运算符符算术运算符:算术运算符:*/%关系运算符:关系运算符:=算术运算负算术运算负关系运算符关系运算符逻辑运算符逻辑运算符&与与|为双目运算符,需要两个运算量为双目运算符,需要两个运算量!为单目运算符,只需要一个!为单目运算符,只需要一个第3章C语言流程控制 逻辑表达式
21、:由逻辑运算符连接两个数,进行逻辑运算的式子。表达式结果:“真”“假”逻辑量:参与逻辑运算的量逻辑值:逻辑量、逻辑表达式的运算结果任何非“0”的逻辑量的逻辑值都为真第3章C语言流程控制写出下面各逻辑表达式的值。设a=3,b=4,c=5;1.a+bc&b=c2.a|b+c&b-c3.!(ab)&!c|14.!(x=a)&(y=b)&05.!(a+b)+c-1&b+c/21.02.13.14.05.1第3章C语言流程控制3.4.3 if语句与switch语句if,英语中其义有“如果”的意思。那么就来研究C语言中的“如果”。1.if语句格式:if(表达式)语句组;流程图:流程图:如果表达式的值为真,
22、就语句组中的如果表达式的值为真,就语句组中的语句语句;如果不为真,就执行语句组后的语句如果不为真,就执行语句组后的语句表达式语句组真假第3章C语言流程控制2.在在if语句中添加语句中添加else子句子句格式:if(表达式)语句组1;else语句组2;如果表达式的值为真,就执行语句组1;如果不为真,就执行语句组2。流程图:流程图:表达式语句组1语句组2真假第3章C语言流程控制3.多重选择else if格式:if(表达式1)语句组1;else if(表达式2)语句组2;else if(表达式3)语句组3;else语句组n;表达式1语句组1真假表达式2表达式3语句组n语句组3语句组2假假真真流程图:
23、流程图:当表达式当表达式1为真的时候则执行语句组为真的时候则执行语句组1,否则的话,将,否则的话,将判断表达式判断表达式2的真假,表达式的真假,表达式2为真,则执行语句组为真,则执行语句组2依依次这样判断。次这样判断。第3章C语言流程控制4.if语句的嵌套在if语句的语句组中又包含一个或多个if语句称为if语句的嵌套如:if(表达式1)if(表达式2)语句组;if的多重嵌套时,得注意if和else的搭配,写法要得当!第3章C语言流程控制 if语句实现多分支时,需要嵌套的if语句层数较多,程序冗长,可读性低。因此可用switch语句来处理多分支情况。switch(表达式表达式)case 常量表达
24、式常量表达式1:语句组:语句组1;case 常量表达式常量表达式2:语句组:语句组2;case 常量表达式常量表达式n:语句组:语句组n;default:语句组语句组n+1;第3章C语言流程控制switch说明:说明:switch括号内的表达式任意,值和哪个case后的常量表达式匹配,就执行后面的语句,没有匹配的,就执行default后面的,default可省略。每个case后常量表达式的值必须不一样,case和default的顺序不影响结果。执行完一个case后,程序流程转移到下一个case,直到运行完全或遇见break语句,并非直接跳出。多个case可以共用一个执行语句。第3章C语言流程控
25、制例:例:输入两个实数,按照代数值由小到大的顺序输出这两个数。满足满足if条件就条件就交换交换a,b的值的值第3章C语言流程控制例:输入三个实数,编程找出其中最大例:输入三个实数,编程找出其中最大的一个并输出的一个并输出探究唯一的三目运算符探究唯一的三目运算符第3章C语言流程控制三目运算符一般形式:表达式表达式1 1?表达式?表达式2 2:表达式:表达式3 3 其执行顺序为:先求解表达式1,若为真(非0),则求解表达式2,并把表达式2的值作为整个条件表达式的值。若表达式1为假(0),则求解表达式3,并把表达式3的值作为整个条件表达式的值。注意点:注意点:条件运算符的优先级别高于赋值运算符,条件
26、运算符的优先级别高于赋值运算符,但是比关系运算符和算术运算符要低。但是比关系运算符和算术运算符要低。条件运算符的结合方向为条件运算符的结合方向为“自右向左自右向左”条件表达式中的表达式条件表达式中的表达式2和表达式和表达式3可以是可以是任意的表达式。表达式任意的表达式。表达式1与表达式与表达式2和表达和表达式式3的类型也可以不同。的类型也可以不同。第3章C语言流程控制编写程序:编写一程序,从键盘上输入x的值,根据上面的函数,求出y的值。语句组中只有一句,花括号可以省略。语句组中只有一句,花括号可以省略。第3章C语言流程控制3.5循环结构程序设计 while循环与自增自减运算符 dowhile语
27、句 for语句 逗号运算符和逗号表达式第3章C语言流程控制3.5.1 while循环与自增自减while语句用来实现“当型”循环结构。其一般形式:while(表达式)语句组;在语句组中必须包含能改变表达式的值来使表达式的值最终变为假,否则循环永远不会中止第3章C语言流程控制例:使用例:使用while循环来求循环来求“1+2+3+100”的值的值运行结果:运行结果:循环条件循环条件i为循环变为循环变量量循环变量增值循环变量增值循环体循环体第3章C语言流程控制i=1i100sum+=ii+真真假假流程图如下:流程图如下:循环变量初始化循环变量初始化i=1判断表达式判断表达式i 100是否成立是否成
28、立u成立就执行循环体成立就执行循环体u不成立就执行循环体后不成立就执行循环体后面的语句面的语句(循环体未执行循环体未执行)执行循环体后,就再从第一执行循环体后,就再从第一步往下进行判断,直至为假步往下进行判断,直至为假就退出循环就退出循环循环体循环体i+使使i每次增每次增1sum+=i进行累加进行累加第3章C语言流程控制自增运算符“+”,其作用使变量的值增1.与其相对的还有自减运算符“-”,其作用使变量的值减1。自增自减运算符为单目运算符,所以仅需1个变量。注意,自增自减只能用于变量,不能用于常量或表达式第3章C语言流程控制自增、自减运算符的使用有两种方式:前缀模式:前缀模式:+变量,变量,-
29、变量。变量。(在使用变量之前,先使变量的值加(减)1)后缀模式:变量后缀模式:变量+,变量,变量-。(在使用变量之后,使变量的值加(减)1)在用自增、自减运算符时,易使表达式产生不正确的地方,尽量不用第3章C语言流程控制3.5.2 dowhile语句 dowhile循环先执行循环体语句,然后再判断while后面的条件是否成立。当表达式为真,则返回重新执行循环体语句,如此反复,直到while后面的表达式为假才结束循环一般形式为:do循环体语句组;循环体语句组;while(表达式表达式);此处分号此处分号一定不能少一定不能少第3章C语言流程控制用用while和和dowhile分别求分别求1到到10
30、0的累加和的累加和while循环循环dowhile循环循环对比:对比:while循环先判断条件,成立则执行循环体,不循环先判断条件,成立则执行循环体,不成立执行其后语句;而成立执行其后语句;而dowhile循环先执行一次循环循环先执行一次循环体后判断条件,成立则再执行循环体,不成立,退出循体后判断条件,成立则再执行循环体,不成立,退出循环。所以环。所以dowhile至少执行一次循环体至少执行一次循环体第3章C语言流程控制3.5.3 for语句C语言中的for语句是使用最为灵活的语句,其一般形式如下:forfor(表达式表达式1 1;表达式;表达式2 2;表达式;表达式3 3)循环体语句组;循环
31、体语句组;当循环体语句组只有一句时,花括号可以省略。第3章C语言流程控制for循环的执行过程:循环的执行过程:求解表达式求解表达式1;求解表达式求解表达式2,如果为真,则执行循环体,如果为真,则执行循环体语句组,执行结束后转步骤语句组,执行结束后转步骤;如果表达;如果表达式的结果为假,则结束循环,转步骤式的结果为假,则结束循环,转步骤;求解表达式求解表达式3;转步骤转步骤;循环结束,执行循环语句之后的其他语句。循环结束,执行循环语句之后的其他语句。for语句的语句的3个表达式均可省略,但是里面的分号个表达式均可省略,但是里面的分号“;”不能省略。需要注意的是,省略相应的表达式,不能省略。需要注
32、意的是,省略相应的表达式,就需要在其他地方弥补相应表达式的功能,以保证程就需要在其他地方弥补相应表达式的功能,以保证程序的正常运行序的正常运行第3章C语言流程控制例:用例:用for循环求循环求1到到100的累加和。的累加和。相比相比while和和dowhile,使用,使用for循环,循环,很简洁,前提必须弄懂很简洁,前提必须弄懂for循环究竟是如何循环究竟是如何工作的。工作的。第3章C语言流程控制continue和break都有表示结束循环的意思,但continue是结束本次循环,break为结束整个循环。ABA中,结果为中,结果为sum=5050;B中,结果为中,结果为sum=1;因为因为A执行了执行了100次,而次,而B仅执行了仅执行了1次。次。第3章C语言流程控制3循环的比较:while语句、dowhile语句和for语句都可以用来处理同一问题,它们之间可以互换 while和dowhile循环体中,应该包含使循环变量改变的语句,避免死循环。for相比相比之下,显得更灵活、强的。for循环的变量初始化在表达式1中,另外二者都在循环之前。2023-1-22第3章C语言流程控制