《顺序与分支结构程序设计.ppt》由会员分享,可在线阅读,更多相关《顺序与分支结构程序设计.ppt(76页珍藏版)》请在三一办公上搜索。
1、第3章顺序结构与分支结构程序设计,学习目标,熟悉C语言程序的格式;熟悉赋值语句的使用方法;理解数据输入输出的概念;掌握字符数据的输入输出方法;掌握格式化输入输出数据的方法;能够用C语言编写简单的顺序结构程序。,*,1/75,一、C语言程序的格式,一个C语言程序的格式如下:预处理部分;宏定义部分常量定义部分函数说明部分;类型 main(参数)语句;函数定义;,*,2/75,二、C语句分类,1.控制语句,*,3/75,C语句分类,2.函数调用语句,由函数调用表达式后跟一个分号组成,格式:,函数名(参数列表);,分类:,标准库函数,用户定义函数,标准库函数调用原则:,(1)要在程序中包含相应的头文件
2、,(2)调用的一般形式:函数名(参数列表);,*,4/75,标准函数调用的目的,(1)如数学函数,为了得到函数的返回值。,这类函数的调用一般出现在表达式中,作为表达式语句的一部分。,一般不作为函数调用语句。,(2)为了完成某项任务,而不是为了得到返回值。,在表达式中调用函数,实际上是转去执行一段预先设计好的程序,求出结果后返回调用点。所以函数的值又叫函数的返回值。,调用这类函数时,就直接用函数调用语句。,例:,scanf(%f,,printf(%f,x);,*,5/75,C语句分类,3.赋值语句例如sum=0;在赋值表达式后面加分号构成表达式语句。由于在赋值符“=”右边的表达式也可以又是一个赋
3、 值表达式 例如:a=b=c=d=e=5;按照赋值运算符的右接合性,因此实际上等效于:e=5;d=e;c=d;b=c;a=b;,*,6/75,C语句分类,4.空语句,空语句就是一个分号。,格式:,;,功能:,执行该语句不做任何操作,;,*,7/75,int x=123,g,s,b;g=x%10;s=x/10%10;b=x/100;,C语句分类,5.复合语句,包含三条语句的复合语句完成了提取一个数的个位、十位和百位,由花括弧 括起来的语句序列,表示控制的范围。例,*,8/75,注意:,(1)在复合语句中的“内部数据描述语句”中定义的变量,是局部变量,仅在复合语句中有效。,(2)复合语句结束的“”
4、之后,不需要分号。,(3)复合语句可以出现在任何数据操作语句可以出现的地方。,*,9/75,复合语句示例:,#include stdio.hvoid main()int a=11,b=21,c=31;printf(a=%dtb=%dtc=%dn,a,b,c);int b=22;float c=3.3;printf(a=%dtb=%dtc=%fn,a,b,c);a=b;printf(a=%dtb=%dtc=%dn,a,b,c);,程序运行结果 a=11 b=21 c=31a=11 b=22 c=3.300000a=22 b=21 c=31,*,10/75,三、基本输入输出操作的实现,C语言本身不
5、提供输入/输出语句。,C语言的输入/输出功能由C语言的标准I/O库函数提供。,C语言的输入/输出库函数名称不是保留字(或称关键字)。如putchar,printf,getchar,scanf。,*,11/75,(1)函数其调用格式为,putchar(int);,函数的名称,函数的参数,(2)函数功能,向标准输出设备(一般为显示器)输出一个字符,并返回输出字符的ASCII码值。,1.字符输出函数,*,12/75,【例3-1】字符输出函数举例,#include,程序运行结果为:AAAAA,void main()char ch;ch=A;putchar(A);putchar(ch);putchar(
6、x41);putchar(65);putchar(101);,包含函数putchar的头文件,*,13/75,(1)函数原型,getchar(void);,函数的名称,无参数,(2)函数功能,从标准输入设备(一般为键盘)读入一个字符,返回该字符的ASCII码值,并且将敲入的字符“回显”到屏幕上。,2.字符输入函数,*,14/75,【例3-2】字符输入输出函数举例:,#include/*说明函数getchar的原型包含在哪个文件中*/,void main()putchar(getchar();,从键盘输入字符后马上输出,程序运行结果:cc,*,15/75,注意:,调用函数getchar时,程序执
7、行被中断,等待用户从键盘输入数据。当用户键入字符并敲回车键以后,程序继续运行。若用户输入字符后未按回车键,则键入的内容一直保留在键盘缓冲区中,只有用户键入回车键后,字符输入函数getchar才进行处理。,函数getchar将回车键作为一个字符读入。如果程序中有两个以上函数getchar时,应该一次性输入所需字符,最后再按回车键,如课本31页思考题所示。,无论输入的是英文字母或标点符号还是数字,都是作为字符输入。,*,16/75,3.格式化输出函数,(1)函数原型,printf(char*format,argument,.);,(2)函数功能,函数printf将一组参数,由format给定的格式
8、规定输出格式,把数据格式化并且输出到标准输出设备。,若出错,则返回负数。,可以有多个参数,*,17/75,函数调用的一般形式:,printf(格式控制字符串,输出项列表);,*,18/75,(3)格式控制字符:,(i)组成:,普通字符、转义字符、格式说明。,普通字符:,按原样输出,主要用于输出提示信息。,转义字符:,指明特定的操作。,格式说明:,由%和格式字符串组成:%格式字符串。它表示按规定的格式输出数据。,*,19/75,例:,#include stdio.h void main()int a=97,b=98;printf(1:%d%dn,a,b);/*普通字符,原样输出*/printf(
9、2:%d,%dn,a,b);/*a,b以十进制整数形式输出*/printf(3:%c,%cn,a,b);/*a,b以字符形式输出*/printf(4:a=%d,b=%d,a,b);,程序运行结果为:1:97 982:87,983:a,b4:a=97,b=98,*,20/75,(ii)格式说明的形式:,%flagswidth.precF|N|h|Ltype,方括号表示该项可有可无,可选的标志字符-:左对齐输出,缺省为右对齐输出+:正数输出加号(+),负数输出减号(-)空格:正数输出空格代替加号(+),负数输 出减号(-)如:+d,-d,d。,十进制整数,指定输出宽度。指定宽度实际宽度,补空格。指
10、定宽度实际宽度,按实际输出。不指定宽度,按实际输出。如:10d,输出精度指示符。对整数,表示至少要输出的数字个数,不足补数字,多出则原样输出。对实数,表示小数点后至多输出的数字个数,不足补数字,多出则舍入处理。对字符串,表示最多输出的字符个数,不足补空格,多出则丢弃。,输出长度修饰符:F:输出远指针存放的地址。N:输出近指针存放的地址。H或h:输出短整型数据的值。L或l:输出长整型或双精度值。,格式字符,用来进行格式转换。(重点掌握),*,21/75,(iii)格式字符(type)一览表,*,22/75,注意:使用函数printf时要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一
11、定相同,可以从左到右,也可从右到左。Dev C+中为从右到左,*,23/75,#include stdio.hint main()int a=3,b=4;printf(%dn,(a=b,b,a+3);/*输出序列是一个逗号表达式*/printf(%dn,a=b,b,a+3);/*输出第一个参数变量a的值*/,例:,输出结果为:7 4,*,24/75,注意:,实数运算中的误差不可避免。double比float精度高。float实数(单精度)的有效位数是7位,double实数(双精度)的有效位数是16位,超过有效位数的输出和输入均无意义。e格式符:以指数形式输出实数。%e输出13位,其中:1位整数
12、,1位小数点,6位小数,5位指数(含字符e和指数的符号)。%m.ne%-m.ne 与f格式符中的类似。g格式符:根据数值的值和精度自动选择f或e格式输出。,*,25/75,4.格式化输入函数,(1)函数原型,scanf(char*format,argument,.);,(2)函数功能,按规定格式从键盘输入若干任何类型的数据给argument所指的单元;返回读入并赋给argument的数据个数;遇文件结束返回EOF;出错返回0。,可以有多个参数,*,26/75,(3)函数调用的一般形式:,scanf(格式控制字符串,地址列表);,*,27/75,(4)格式控制字符:,(i)组成:,普通字符、格式
13、说明。,普通字符:,格式说明:,键盘输入时,要按原样输入,一般起分隔或提示作用。,但分隔或提示作用若由用户输入,就失去了本来的意义,一般采用printf来实现。,%*width F|N h|l type,*,28/75,(ii)格式说明的形式:,%*width F|N h|l type,输入赋值抑制字符:表示该格式说明要求输入数据,但不赋值,即在地址列表中没有对应有地址项。,宽度指示符:表示该输入项最多可输入的字符个数。如遇空格或不可转换的字符,读入的字符将减少。,地址大小修饰符:F:表示地址列表项中对应的地址为远指针;N:表示地址列表项中对应的地址为近指针。,数据输入类型:h:短整型l:长整
14、型或双精度类型,必需的格式字符,表示输入数据转换后的数据类型。,*,29/75,(iii)格式字符(type)一览表:,*,30/75,scanf(“i=%d,&i);printf(“i=%d,i);,scanf(%d%d%d,&a,&b,&c);,&:取地址运算符。表示将所输入后的数据放入对应地址的存储单元中。,*,31/75,例:,#include stdio.hvoid main()int a,b;printf(input a,b:);scanf(%d%d,input a,b:78a=7,b=8,*,32/75,(iv)注意事项:,scanf()的格式控制字符串中没有转义字符。如scan
15、f(“%dn”,&a);是错误的。,scanf()的格式控制字符串中的普通字符不是用来显示的,而是输入时要求照普通字符输入的。,scanf()中参数的第二部分一定是地址列表,不能是表达式。,*,33/75,小结,了解C语句的分类掌握C中最基本的四个输入输出操作函数的实现putchar()和getchar()是C标准I/O函数库中简单的,也是最容易理解的字符输入输出函数printf函数()和 scanf()函数提供了灵活多样的格式化输出和输入,细节规定非常繁琐,在刚开始学习时重点掌握一些常用规则即可。,*,34/75,学习目标,掌握关系运算符和逻辑运算符的使用方法。理解选择结构的概念。掌握如何用
16、if语句构成选择结构。掌握如何用switch语句和break语句构成多分支选择结构。,*,35/75,引言,计算分段函数:,y=,3-x x0,2/x x0,C语言用来设计条件选择结构程序的选择语句有两种:if语句、switch语句。,*,36/75,一、关系运算符和关系表达式,关系运算:比较运算,比较两个操作数,看是否满足给定的关系。,1、关系运算符,:小于,53,35,=:小于等于,1=3,3=1,与数学上()不同,:大于,13,31,=:大于等于,1=3,3=1,与数学上()不同,=:等于,1=3,与数学上(=)不同,!=:不等于,1!=3,与数学上()不同,*,37/75,2、关系表达
17、式,用关系运算符将表达式连接起来的式子,优先级,=,高 低,=!=,结合方向,自左向右,表达式的值,关系成立,即为真,结果为1;,关系不成立,即为假,结果为0;,算术运算符,高 低,C语言中,真:非0值,假:0值,高 低,=,*,38/75,二、逻辑运算符与逻辑表达式,1、逻辑运算符,!:逻辑非,一元运算符,运算规则:取反,真,假,假,真,&:逻辑与。又称逻辑乘,运算规则:两个操作数均为真,结果为真。,|:逻辑或。又称逻辑加,运算规则:只要两个操作数有一个为真,结果为真。,*,39/75,2、逻辑量或逻辑表达式的值,非0 值:真,0值:假,整型实型字符型指针类型,00.00NULL,*,40/
18、75,3、逻辑表达式,用逻辑运算符将表达式连接起来的式子。,优先级,关系运算符,高 低,&逻辑与,算术运算符,高 低,!逻辑非,高 低,高 低,|逻辑或,结合性,!:自右向左,&、|:自左向右,高 低,=,*,41/75,例:,int a=5;float b=3.5;,!a,0,!b,0,a&b,1,a|b,1,!a&!b,0,*,42/75,4、注意,编译器在求解逻辑表达式的值时,采用“非完全求解”的方法,并不是所有的逻辑运算符都被执行,只有在需要执行下一个逻辑运算才能求出表达式的解时,才继续运算。,*,43/75,非完全求解举例,如果已有定义:int x=1,y=1,z=1;对如下的逻辑表
19、达式:(x=0)&(y=2)&(z=3),表达式的结果是0,x的值被赋值为0,y,z的值保持不变。(x=5)&(y=0)&(z=3),表达式的结果是0,x、y的值赋值为5和0,z的值保持不变。(x=5)|(y=2)|(z=3),表达式的结果是1,x的值被赋值为5,y,z的值保持不变。(!x)|(y=0)|(z=3),表达式的结果是1,x,y,z的值为1,0,3。,*,44/75,三、条件语句,1、单分支选择if语句,if语句有三种形式:单分支选择if语句、双分支面具选择if语句、多分支选择if语句。,语句形式:,if(表达式)语句;,语句执行流程:,1、if语句的三种形式,*,45/75,【例
20、4-1】利用单分支选择if语句,实现输入两个整数,输出其中的大数。,#include void main()int a,b,max;printf(n input two numbers:);scanf(%d%d,输入a,b,maxb,max=a,max=b,输出max,真,假,*,46/75,注意:,1)if语句中表达式形式很灵活,可以是常量、变量、任何类型表达式、函数、指针等。只要表达式的值为非零值,条件就为真,反之条件为假。,2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。,3)在if语句的三种形式中,if语句自动结合一个语句,如果想在满足条件时执行一组(多个)语句
21、,则必须把这一组语句用 括起来组成一个复合语句。,*,47/75,2、双分支选择if语句,语句形式:,if(表达式)语句1;else 语句2;,语句执行流程:,表达式,语句1,真(非0),假(0),语句2,*,48/75,【例4-2】利用双分支选择if语句,实现输入两个整数,输出其中的大数。,输入a,b,ab,输出a,结束,真,假,输出b,#includevoid main()int a,b;printf(input two numbers:);scanf(%d%d,*,49/75,注意:,if和else语句之间只能有一个语句,当ifelse之间的语句不只一句时,应用一对将语句括起。,if(a
22、b)a+;b+;else a=0;b=10;,*,50/75,3、多分支选择if语句,语句形式:,if(表达式1)语句1;else if(表达式2)语句2;else if(表达式n)语句n;else 语句n+1;,*,51/75,语句执行流程图:,*,52/75,例:计算分段函数。,*,53/75,#include,void main()float x,y;printf(enter x:);scanf(%f,else if(x=1)y=x+5;else if(x10)y=2*x;else y=3/(x-10);,printf(x=%.2f,y=%.2fn,x,y);,if(x=10)print
23、f(not define x.n);,计算分段函数程序:,*,54/75,注意:,(1)当if语句中出现多个“if”与“else”的时候,要特别注意它们之间的匹配关系,否则就可能导致程序逻辑错误;“else”与“if”的匹配原则是“就近一致原则”:即else与同一层最接近它,而又没有其它else语句与之相匹配的if语句配对。,(2)if语句中条件的写法应尽量简单。,*,55/75,【例4-3】从键盘输入一个字符,判别它的类别,由ASCII码表可知:ASCII值小于32的为控制字符ASCII值在“0”和“9”之间的为数字ASCII值在“A”和“Z”之间为大写字母 ASCII值在“a”和“z”之间
24、为小写字母其余则为其它字符,*,56/75,程序:,#include void main()char c;printf(Input a character:);c=getchar();if(c=0,*,57/75,语句含义:,语句形式:,当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。,4、if语句的嵌套,if(表达式)if 语句;,if(表达式)if 语句;else if 语句;,*,58/75,语句执行流程:,else与if的配对原则:,就近一致原则:,*,59/75,四、多分支选择语句,1、语句一般形式:,switch(表达式)case 常量1:语句1;case 常量
25、2:语句2;case 常量3:语句3;.case 常量n:语句n;default:语句n+1;,根据表达式的不同值,选择不同的程序分支,又称开关语句。,数值型或字符型,常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。,*,60/75,其执行流程为:,计算表达式的值然后逐个与其后的常量表达式值相比较当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如果表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。,*,61/75,【例4-6】输入一个数字,输出对应的星期几的英文单词
26、。,#includevoid main()int a;printf(input integer number:);scanf(%d,程序运行结果:input integer number:5Friday SaturdaySunday error,思考:为什么出现这种运行结果?,*,62/75,在“switch”语句中,“case 常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,因此会继续执行所有后面语句的情况。,为此,语言提供了一种break语句,其功能是可以跳出它所在的switch语句。,运行结果分析:,*
27、,63/75,2、break语句在多分支选择结构中的应用,switch语句通常和break语句联合使用。在case的语句后加上break语句,这样,每当执行到break语句时,立即跳出switch语句体,使switch语句真正起到分支的作用。,*,64/75,将上面的例4-6修改如下:,#include stdio.hvoid main()int a;printf(input integer number:);scanf(%d,程序运行结果:5Friday,*,65/75,【例4-7】学生分数成绩转换为相应的等级成绩,程序流程图:,*,66/75,程序源代码及运行结果,#includevoid
28、 main()int s;printf(Input a score:);scanf(%d,程序运行结果:Input a score:65Your score:65 D,*,67/75,注意:,多个case语句可以共用一组执行语句。,switch(grade)case A:case B:case C:printf(grade=60n);break;default:printf(grade60);,各case和default子句的先后顺序可以变动,而不会影响程序执行结果。,*,68/75,default语句可以省略不用。,case和default与其后面的常量表达式间至少有一个空格。,switch
29、语句可以嵌套,break语句只跳出它所在的switch语句。,例如case 10,不能写成case10,这时编译系统会把case10当成一个标识符来对待。,*,69/75,五、应用举例,【例4-8】输入三个整数,输出最大数和最小数。算法分析:首先比较a,b的大小,把大数装入max,小数装入min中接下来max和min再与c比较,若max小于c,则把c赋予max;如果c小于min,则把c赋予min,因此max内总是最大数,而min内总是最小数。最后输出max和min的值即可。,*,70/75,程序源代码及运行结果,#includevoid main()int a,b,c,max,min;prin
30、tf(input three numbers:);scanf(%d%d%d,程序运行结果:input three numbers:3 4 5max=5min=3,*,71/75,例:企业发放的奖金根据利润提成。从键盘输入当月利润,求应发放奖金总数?,*,72/75,利润xx=1010 x2020 x4040 x6060 x100100 x,(int)x/10,常量0,11,22,3,44,5,66,7,8,9,1010以上,用这种方法转换后,n出现了在不同区域有重复数字的情况。解决的方法有很多,其中一种是可以采用当x为10的整数倍时,将计算出的n值减1。,使用switch解题的关键,通过分析找
31、到表达式,将问题分成几种情况。,*,73/75,#include stdio.hvoid main()float x,y;int n;scanf(%f,n=(int)x/10;if(int)x/10=x/10)n-;switch(n)case 0:y=x*0.1;break;case 1:y=x*0.12;break;case 2:case 3:y=x*0.14;break;case 4:case 5:y=x*0.16;break;case 6:case 7:case 8:case 9:y=x*0.18;break;default:y=x*0.2;printf(y=%.2fn,y);,源程序:,*,74/75,小结,本章首先介绍了关系运算符、逻辑运算符以及这两种运算符对应的表达式。这些表达式常作为C语言中条件选择语句的判断条件。C语言的条件选择语句有两种:if语句和switch语句if语句有三种形式:单分支选择if语句 双分支选择if语句 多分支选择if语句switch语句联合break语句构成了一种多分支选择结构,并且形式上比用if 语句的嵌套清晰易读。,*,75/75,