《C语言程序设计教程》.ppt
C语言程序设计教程Huanghuai University Department of Computer Science主讲:傅主讲:傅丰丰黄淮学院黄淮学院计算机计算机科学科学系系高等教育出版社谭浩强 张基温等编著第三章 C程序的流程设计1 算法2 C语句概述3 选择结构程序设计3.1 双分支结构(if-else)3.13.2多分支结构(else if、switch)4 循环结构程序设计2学时2学时本节本节4学时1 算法算法程程 序序算算 法法数据结构数据结构=+菜菜 谱谱加工方法加工方法加工原料加工原料=+数据的类型数据的类型和组织形式和组织形式解决问题的解决问题的方法和步骤方法和步骤每件事都需要事先设计出方法步骤。每件事都需要事先设计出方法步骤。如:春节回家(收拾行李、买车票、按时乘车、到站下车、乘公交车回家)程程 序序算算 法法数据结构数据结构=+菜菜 谱谱加工方法加工方法加工原料加工原料=+数据的类型数据的类型和组织形式和组织形式解决问题的解决问题的方法和步骤方法和步骤一、一、算法的性质与组成要素有穷性:有穷性:算法是一个有穷动作序列,不能是无限的。确定性:确定性:每一步的含义应唯一、明确,不能有歧义性。有序性:有序性:算法只能有一个起始动作,每个动作仅有一个后继动作。有有0个或多个输入,有个或多个输入,有1个或多个输出:个或多个输出:没有输出的算法没有意义。操作:操作:算术运算、关系运算、逻辑运算、函数运算、位运算、I/O操作等。控制结构:控制结构:控制算法各操作的执行顺序(不同顺序会得到不同结果)。结构化程序设计方法要求:结构化程序设计方法要求:一个程序只能由一个程序只能由三种基本控制结构组成:三种基本控制结构组成:v顺序结构:顺序结构:算按书写顺序执行。v选择结构:选择结构:根据判断选择执行路径。v循环结构:循环结构:将一条或多条语句重复执行多次。性性质质组组成成要要素素二、算法的描述二、算法的描述不不够够直直观观1、自然语言、自然语言例如:求例如:求n!(1)输入n的值;(2)若n=0,则f=1,结束;否则:f=1,i=1 f*if,即f=f*i i+1i即i=i+1 若i=n则返回,否则结束。(3)f为所求。三三种种基基本本程程序序结结构构ABPABYNPAYNPAYNPAYN顺序顺序结构结构分支结构分支结构(选择结构选择结构)循环循环结构结构当当(while)型型循环结构循环结构直到直到(untile)型型循环结构循环结构P57图图3.1 常用的流程图符号常用的流程图符号起始框输出输出判断框处理框流程线连接点注释框2、传统流程图、传统流程图流程线的无限制使用,会导致程序无序跳转,造成难以理解。因此,规定使流程线的无限制使用,会导致程序无序跳转,造成难以理解。因此,规定使用三种基本程序结构组成算法。其共同特点是:用三种基本程序结构组成算法。其共同特点是:只有一个入口和一个出口只有一个入口和一个出口 结构内每部分都有机会被执行结构内每部分都有机会被执行,不存在死循环。不存在死循环。(1)输入n的值;(2)若n=0,则f=1,结束;否则:f=1,i=1 f*if,即f=f*i i+1i即i=i+1 若i=n则返回,否则结束。(3)f为所求。自自然然语语言言开始开始i=nf=1,i=1结束结束i=i+1输出输出ff=f*iYNn=0YN输入输入nP59图图3.4:求:求n!3、结构化流程图、结构化流程图(N-S图图)P成立成立 不成立不成立 A BAB当当P成立时成立时A直到直到P成立为止成立为止A顺序顺序结构结构分支结构分支结构(选择结构选择结构)当当(while)型型循环结构循环结构直到直到(untile)型型循环结构循环结构输入输入nY n=0 Nf=1f=1i=1f=f*ii=i+1i=n输出输出fi=nf=1,i=1i=i+1输出ff=f*iYNn=0YN输入nP59图图3.6 N-S图的三种基本结构图的三种基本结构P60图图3.7:求:求n!4、问题分析图、问题分析图(PAD图图)顺序结构顺序结构分支结构分支结构循环结构循环结构P60图图3.8 PAD图的三种基本结构图的三种基本结构从上向下表示执行顺序从上向下表示执行顺序从左到右表示层次关系从左到右表示层次关系ABPAB当当PAn=0返回返回1f=1i=1当当i=nf=f*ii=i+1返回返回f值值P60图图3.9:求:求n!5、伪代码表示、伪代码表示用介于自然语言和计算机语言之间的文字和符号描述算法。begin if n=0 f=1 else f=1 i=1 f=f*i i=i+1 while(i=n)print fend例:求例:求n!的伪代码表示的伪代码表示main()int n,f,i;scanf(“%d”,&n);if(n=0)f=1;else f=1;i=1;do f=f*i;i=i+1;while(i0)t=a;(a=b是赋值表达式)是赋值表达式)不能写为:不能写为:if(a=b;)0)t=a;(a=b;是赋值语句)是赋值语句)一、表达式语句一、表达式语句表达式语表达式语句句简单简单表达式语句表达式语句赋值语句赋值语句:赋值表达式;赋值表达式;函数调用语句函数调用语句:函数名函数名(实参实参);空语句空语句:;复合复合表达式语句表达式语句逗号表达式;逗号表达式;表达式;表达式;表达式加上分号可以构成一条语句是表达式加上分号可以构成一条语句是C语言的特色。语言的特色。二、流程控制语句二、流程控制语句流程控流程控制语句制语句流程流程控制控制语句语句选择结构选择结构(条件语句条件语句)双分支结构双分支结构多分支结构多分支结构if()else语句语句else if语句语句switch语句语句循环结构循环结构while()语句语句dowhile()语句语句for()语句语句流程流程转向转向语句语句条件转条件转向语句向语句无条件无条件转向语句转向语句goto语句语句中止循环或中止循环或switch语句语句:break跳过其后语句返回循环开始跳过其后语句返回循环开始:continue函数返回语句函数返回语句:return()while()break;break;while()continue;continue;goto er;er goto 标号;标号;三、复合语句三、复合语句1、复合语句是用、复合语句是用 括起来的一组括起来的一组 语句,相当于一个语句。语句,相当于一个语句。2、复合语句中可包含复合语句。、复合语句中可包含复合语句。3、复合语句又称为分程序。、复合语句又称为分程序。在复合语句中可以定义变量,在复合语句中可以定义变量,这些变量只在分程序中有效。这些变量只在分程序中有效。四、停止函数四、停止函数exit1、功能:立即停止当前程序运行,退回到操作系统状态。、功能:立即停止当前程序运行,退回到操作系统状态。2、参数:为、参数:为int型。参数为型。参数为0:属正常停止;:属正常停止;为其它值:参数即为造成停止的错误类型。为其它值:参数即为造成停止的错误类型。3、使用、使用exit()函数,应在程序前使用:函数,应在程序前使用:#include “stdio.h”main()int a;int b;b=3;printf(“%dn”,a+b);3 选择结构程序选择结构程序一、一、if 语句的三种结构语句的三种结构选择结构选择结构(条件语句条件语句)双分支结构双分支结构多分支结构多分支结构if()else语句语句else if语句语句switch语句语句if(条件)(条件)语句语句1;(1)不平衡结构不平衡结构if(条件)(条件)语句语句1;else 语句语句2;(2)平衡结构平衡结构if(条件条件1)语句语句1;else if(条件条件2)语句语句2;else if(条件条件3)语句语句3 else 语句语句n;(3)else if 结构结构1、条件可以是关系表达式、条件可以是关系表达式、逻辑表达式、算术表达式逻辑表达式、算术表达式 (非(非0即真)即真)2、else前面的语句带分号,前面的语句带分号,但整个但整个if语句并未结束。语句并未结束。勿认为勿认为else是一条语句,是一条语句,else子句不能单独使用,子句不能单独使用,它必须与它必须与if配对使用。配对使用。3、if和和else后的语句如果是后的语句如果是 多条语句时,应用多条语句时,应用 括括 起来构成一个复合语句。起来构成一个复合语句。说说 明明 x0是是 否否|x|=-x|x|=xP69例例3:求一个数的绝对值。:求一个数的绝对值。main()double a,abstr(double x);printf(“Enter real number a:”);scanf(“%lf”,&a);printf(“abs(%lf)=%lfn”,a,absr(a);double abstr(double x)if(x0.0)x=-x;else x=x;return(x);double abstr(double x)if(x0)x=a+b;printf(“x=%dn”,x);if(b0)x=a+b;else x=a-b;printf(“x=%dn”,x);P70例例4:求三数中的最大数。:求三数中的最大数。main()float a,b,c,m;float f(float x,float y,float z);printf(“Enter 3 real number a,b,c:”);scanf(“%f%f%f”,&a,&b,&c);m=f(a,b,c);printf(“The max is%fn”,m);float f(float x,float y,float z)float max=x;if(zy)if(zx)max=z;else if(yz)max=y;return(max);zx是是 否否max=z max=x zy 是是 否否 yz是是 否否max=y return(max)在在if语句中又包含一个或多个语句中又包含一个或多个if语句,称为语句,称为if语句的语句的嵌套嵌套。else总是与它前面距它最近的总是与它前面距它最近的if匹匹配。可用配。可用号改变匹配关系。号改变匹配关系。思考:思考:上面程序是否有误?上面程序是否有误?if(zy)if(zx)ma=z;else if(yz)ma=y;P72例例5:求一元二次方程:求一元二次方程ax2+bx+c=0的根。的根。b=0 是是 否否 无根无根 单根单根 -c/b d=b*b-4*a*c a=0 是是 否否 d=0 是是 否否 实根实根 虚根虚根a=0:b=0:无根:无根 b0:只有一个实根:只有一个实根-c/ba0:判别式判别式=0:实根:实根 x=判别式判别式=0)printf(“%f,%fn”,t1+t2,t1-t2);else printf(“%f+%fi,%f-%fin”,t1,t2);else if结构(结构(ifelse多重嵌套的变形)多重嵌套的变形)if(条件条件1)语句语句1;else if(条件条件2)语句语句2;else if(条件条件3)语句语句3 else 语句语句n;补充:求税率补充:求税率 0.15 n500 0.10 n300 x=0.075 n100 0.05 n50 0 其它其它main()float n,x;scanf(“%f”,&n);if(n500)x=0.15;else if(n300)x=0.10;else if(n100)x=0.075;else if(n50)x=0.05 else x=0;printf(“%fn”,x);P74例例6:用用else if结构求二元一次方程的根。结构求二元一次方程的根。b=0 是是 否否 无根无根 单根单根 -c/b d=b*b-4*a*c a=0 是是 否否 d=0 是是 否否 实根实根 虚根虚根#include“math.h”void f(float a,float b,float c)if(a=0.0&b=0.0)printf(“no answern”);else if(a=0.0&b!=0.0)printf(“%fn”,-c/b);else if(a!=0.0)float d,t1;d=b*b-4*a*c;t1=-b/(2*a);t2=sqrt(fabs(d)/(2*a);if(d=0)printf(“%f,%fn”,t1+t2,t1-t2);else printf(“%f+%fi,%f-%fin”,t1,t2);a!=0 是是 否否d=b*b-4*a*c a=0且且b=0 是是 否否 a=0且且b!=0 是是 否否单根单根-c/b无根无根 d=0 是是 否否 实根实根 虚根虚根 1 x0y=0 x=0 -1 x=0)if(x0)y=1;else y=0;else y=-1;y=-1;if(x!=0)if(x0)y=1;else y=0;y=0;if(x=0)if(x0)y=1;else y=-1;正确正确 y=-1;if(x!=0)if(x0)y=1;else y=0;y=0;if(x=0)if(x0)y=1;else y=-1;有函数有函数 ,编程给出编程给出x值,可输出值,可输出y值。值。main()int x,y;scanf(“%d”,&x);if(xb)t=a;a=b;b=t;if(ac)t=b;b=c;c=t;if(bc)t=b;b=c;c=t;printf(“%d,%d,%dn”,a,b,c);课后作业及上机任务v 教材P97习题1、2(1)(4)、38v 上机调试P97习题4v 编写并调试P97习题39v 编程:输入4个整数,按从小到大顺序输出。switch(表达式表达式)case 常量常量表达式表达式1:语句:语句1case 常量常量表达式表达式2:语句:语句2case 常量常量表达式表达式n:语句:语句ndefault:语句语句n+1如:如:按考试等级输出百分制分数段switch (x)case A:printf(“85100n”);case B:printf(“7085n”);case C:printf(“6069n”);case D:printf(“60n”);default:printf(“errorn”);格式格式:1、执行过程:从上到下寻找表达式是否与某个执行过程:从上到下寻找表达式是否与某个case后的常量表达式的值后的常量表达式的值相等,若找到就执行该相等,若找到就执行该case子句后所有的语句(包括其它子句后所有的语句(包括其它case和和default子子句后的语句),对其后的句后的语句),对其后的case子句不再进行判断;若找不到,则执行子句不再进行判断;若找不到,则执行default后的语句。后的语句。2、常在常在case子句中用子句中用break语句终止语句终止switch语句的执行。语句的执行。3、case子句和子句和default子句不能单独使用。子句不能单独使用。说明:说明:二、二、switch语句语句如:如:按考试等级输出百分制分数段switch (x)case A:printf(“85100n”);case B:printf(“7085n”);case C:printf(“6069n”);case D:printf(“60n”);default:printf(“errorn”);补充举例:补充举例:当当x=A时,程序执行结果为:时,程序执行结果为:85100 7085 6069 60 error修改为:修改为:switch (x)case A:printf(“85100n”);break;case B:printf(“7085n”);break;case C:printf(“6069n”);break;case D:printf(“2时,输出:时,输出:*scanf(“%d”,&n);switch (n)case 1:printf(“_ _*n”);case 2:printf(“_*”n”);default:printf(“*n”);switch (n)default:printf(“*n”);case 2:printf(“_*”n”);case 1:printf(“_ _*n”);switch (n)case 1:printf(“_ _*n”);break;case 2:printf(“_*”n”);break;default:printf(“*n”);4、case子句后有多个语句时,可以不必用子句后有多个语句时,可以不必用 括起来。括起来。5、case和和default子句的位置可根据需要调整,子句的位置可根据需要调整,default子句不一定要放到子句不一定要放到case子句的最后。子句的最后。6、switchswitch后的表达式一般是后的表达式一般是整型整型或或字符型字符型表达式表达式,与之相应的,与之相应的casecase后也后也应是一个应是一个整数整数或或字符字符常量常量或不含变量和函数的常量表达式。或不含变量和函数的常量表达式。7 7、不能出现两个、不能出现两个case子句具有相同的常量表达式值的情况。子句具有相同的常量表达式值的情况。8 8、switchswitch语句允许嵌套。语句允许嵌套。说明(续):说明(续):switch (x)case A:case B:case C:case D:printf(“60n”);break;default:printf(“errorn”);补补充充举举例例当当x为为A、B、C时执行结果均为:时执行结果均为:60正确:正确:case 3+4:错误:错误:int x=3,y=4;case x+y:错误:错误:case 3+2:case 8-3:举举例例P75例例7:测试是数字、空白还是其它字符的函数。测试是数字、空白还是其它字符的函数。void test(char c)switch (c)case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:printf(“digitn”);break;case :case n:case t:printf(“whiten”);break;default:printf(“charn”);break;P77例例8:猜字游戏:猜字游戏 (略)(略)上机实习时:上机实习时:自己写出主函数自己写出主函数补充举例:补充举例:路程路程s越远,每公里运费越低。越远,每公里运费越低。折扣的标准如下:折扣的标准如下:s250km 没有折扣没有折扣250s500 2折扣折扣500s1000 5折扣折扣 1000s2000 8折扣折扣 2000s3000 10折扣折扣 3000s 15折扣折扣 设每公里每吨货物的基本运设每公里每吨货物的基本运费为费为p,货物重为,货物重为w,距离为,距离为s,折扣为,折扣为d,则总运费,则总运费f 的计算的计算公式为:公式为:fp*w*s*(1-d)折扣的折扣的“变化点变化点”都是都是250倍数倍数 分析折扣变化的规律:分析折扣变化的规律:若若s为整型,则为整型,则c与折扣与折扣d的关系为:的关系为:c=0 d=0 c=1 d=2%c=2、3 d=5%c=4、5、6、7 d=8%c=8、9、10、11 d=10%c=12、13、14、d=15%若若c=s/250,则折扣,则折扣d如下:如下:c=3000)c=12;else c=s/250;switch (c)case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(“%15.4fn”,f);若若s为整型,则为整型,则c与折扣与折扣d的关系为:的关系为:c=0 d=0 c=1 d=2%c=2、3 d=5%c=4、5、6、7 d=8%c=8、9、10、11 d=10%c=12、13、14、d=15%结论:结论:c=s/250;switch(c)case 0:d=0;break;case 1:d=2;break;case 8:case 9:case 10:case 11:d=10;break;default:d=15;蓝色部分程序段能否改为:蓝色部分程序段能否改为:程序:程序:?能能课后作业及上机任务v 教材P97习题9v 上机调试P75例7(自己写出主函数)v 编写并调试补充例题:运输公司运费的计算v 编程:给一个不多于5位的正整数,要求:输出它是几位数;分别输出每一位数字;按逆序输出各位数,如:原数为321,则输出123。