《顺序及分支程序设计.ppt》由会员分享,可在线阅读,更多相关《顺序及分支程序设计.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3章 顺序及分支程序设计 本章重点:1、复合语句2、if 语句3、ifelse语句4、嵌套的if及ifelse语句5、常见错误31 语句概述语句是一个程序的主要构成部分。在C语言里,一个语句是在结尾处用分号结束的。根据语句功能或构成的不同,C语言语句可分为五类:1表达式语句 2空语句 3函数调用语句 4复合语句5控制语句 1表达式语句 表达式语句由表达式加上分号“;”就构成了一个语句。事实上,C语言中有使用价值的表达式语句主要有3种:(1)赋值语句。例如:sum=x+y;(2)自加自减运算符构成的表达式语句。例如:i+;(3)逗号表达式语句。例如:x=1,y=1;2空语句,光有一个分号“;”
2、,作为语句结束符,它表示什么也不做。3函数调用语句 函数调用语句是由一次函数调用加一个分号“;”构成。例如:printf(Printf is a C function);其实“函数调用语句”也是一种表达式语句,只是为了便于理解和使用,我们把“函数调用语句”单独作为一种语句。4复合语句 把多个语句用括号 括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句,例如:x=y+z;a=b+c;printf(“%d%d”,x,a);是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“”外不能加分号。5控制语句 控制语句用于控制程序的流程,以实现程序的各种结构
3、方式。它们由特定的语句定义符组成。语言有九种控制语句。可分成以下三类:(1)选择控制语句if语句,switch语句 (2)循环执行语句do while语句,while语句,for语句(3)转向语句break语句,goto语句,continue语句,return语句32 问题的引出(顺序程序示例)例3.1有三个电阻并联,其阻值分别为10、25、50,求并联后的电阻。计算并联电阻的公式是:#include stdio.hmain()float r,r1,r2,r3;r1=10;r2=25;r3=50;r=1/(1/r1+1/r2+1/r3);printf(并联电阻r=%8.2fn,r);程序运行结
4、果:并联电阻r=6.2533 if 语句331 if语句的一般形式C语言中有一种特有的条件运算符“?:”,其格式为:c?e1:e2。若条件c成立,即为真,则取e1的值,否则取e2的值。此条件运算符在某种程度上可以起到逻辑判断的作用,我们可以用条件运算符来解决一些问题。例如:例3.2 求分段函数的值。#include math.h#include stdio.hmain()float x,y;/*变量y存放f(x)的值*/printf(请输入x的值:);scanf(%f,&x);y=x=0?sqrt(2*x+1):-1;printf(当x=%f时,f(x)=%f,x,y);程序运行结果:请输入x
5、的值:2当x=2.000000时,f(x)=2.236068例3.3 任意输入两个整数,请按降序输出这两个数。#include stdio.hmain()int a,b;printf(请输入两个整数(a,b):);scanf(%d,%d,&a,&b);if(ab)/*条件成立执行语句1*/printf(降序排列后的两个整数是:%d,%dn,a,b);else printf(降序排列后的两个整数是:%d,%dn,b,a);/*条件不成立则执行语句2*/if 语句的一般格式:if()else 其语义是,若表达式的值不为零,则执行,否则,执行。此处的和可以是任何形式的语句。if-else构作了一个两
6、路分支结构。332 if-else中的复合语句如果两个分支中需要执行的语句不止一条,必须用“”括起来,作为一个复合语句使用,若只有一条语句,“”可以省略。例3.4 已知实数a,b,计算u=(r+s)2,v=(r+s)3的值。这里:当ab时,r=a2-b2,s=a/b当ab时,r=b2-a2,s=a/b+4#include stdio.hmain()float a,b,u,v,s,r;printf(请输入实数a,b:);scanf(%f,%f,&a,&b);if(ab)r=a*a-b*b;s=a/b;/*复合语句A*/else r=b*b-a*a;s=a/b+4;/*复合语句B*/u=(r+s)
7、*(r+s);/*语句C*/v=u*(r+s);printf(u=%f,v=%f,u,v);if 语句的一般格式:if()else 分析语法错误:if(ab)r=a*a-b*b;s=a/b;else r=b*b-a*a;s=a/b+4;if 语句的一般格式:if()else 分析语法错误:if(ab)r=a*a-b*b;s=a/b;;else r=b*b-a*a;s=a/b+4;if 语句的一般格式:if()else 分析逻辑错误:若ab成立,哪几条语句执行?if(ab)r=a*a-b*b;s=a/b;else r=b*b-a*a;s=a/b+4;123注意事项:(1)if后面的一定要有括号,
8、这是语法约定。(2)允许只使用if语句,没有else;但程序中不可以没有if而只有else;(3)只能执行与if有关的语句或者只执行与else有关的语句,而不可能同时执行两者。(4)复合语句内的各条语句都必须以分号“;”结尾,在括号“”外不能加分号;(5)if语句的表达式可以是任意类型的C语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之一。333 if 语句的表达式C语言没有逻辑型数据,用非0的数表示“真”,而用0表示“假”,只有表达式的值为“真”时,才执行相对应的分支语句。构成表达式的运算符可以是算术运算符,关系运算符和逻辑运算符。关系运算符包括大于()、小于(=)、小于等于(=b
9、&a=c)max=a;else if(b=a&b=c)max=b;else max=c;printf(max=%dn,max);在一个if语句的分支语句中又包含另一个if语句,从而构成了if语句的嵌套使用。从后往前,(1)else与前面最接近的if配对。(2)复合语句外的else不能与复合语句内的if配对342 流程图(自学)表3-2 流程图图形符号 343 if与else的配对规则C语言规定:else与前面最接近它而还没有和其他else语句配对的if语句配对。同时从书写格式上也要注意,要有层次感,好的程序员应该养成这一习惯,以便他人理解你的程序和自己将来的修改。例挑选三个数中最大的一个数/*
10、错误写法*/*正确写法*/(2)复合语句外的else不能与复合语句内的if配对从后往前,(1)else与前面最接近的if配对例3.10 求解一元二次解方程:运用结构化程序设计思想:先整体后局部输入a,b,c;计算delta;根据delta的不同情况计算并输出根;123if(delta0)else3_1if(delta0)else if(delta0)else伪代码#include#include main()float a,b,c,delta;printf(请输入方程系数a,b,c:);scanf(%f,%f,%f,&a,&b,&c);delta=b*b-4*a*c;if(delta0)els
11、e if(delta0)else r1=(-b+sqrt(delta)/2/a;r2=(-b-sqrt(delta)/2/a;r=b/2/a;Im=sqrt(-delta);r=-b/2/a;123123#include#include main()float a,b,c,delta,x1,x2,realpart,imagpart;printf(请输入方程系数a,b,c:);scanf(%f,%f,%f,&a,&b,&c);if(fabs(a)=1e-6)printf(“一元二次方程变成一元一次方程,有一解:%8.4fn,-c/b);else delta=b*b-4*a*c;if(fabs(d
12、elta)1e-6)x1=(-b+sqrt(delta)/(2*a);x2=(-b-sqrt(delta)/(2*a);printf(“有两个不相等的实根:%8.4f和%8.4fn,x1,x2);else realpart=-b/(2*a);imagpart=sqrt(-delta)/(2*a);printf(有两个不相等的虚根:n);printf(%8.4f+%8.4fin,realpart,imagpart);printf(%8.4f-%8.4fin,realpart,imagpart);35 switch 语句 if语句只能实现两路分支,在两者中选择其一。虽然嵌套的if语句可以实现多路检
13、验,但有时不够简洁。为此C语言提供了实现多路选择的另一个语句switch,称为开关语句。下面,我们来看一个用switch语句编写的具有多路分支的程序。例3.11 模拟计算器的功能。编写一个程序,能够根据用户输入的运算符,对两个数进行运算。流程图如3-5所示。源程序如下:#include stdio.hmain()float x,y;/*存放两个运算符分量*/char operator;/*存放运算符*/printf(请输入x,运算符,y:);scanf(%f%c%f,&x,&operator,&y);switch(operator)case+:printf(%.2f%c%.2f=%.2fn,x,operator,y,x+y);break;case-:printf(%.2f%c%.2f=%.2fn,x,operator,y,x-y);break;case*:printf(%.2f%c%.2f=%.2fn,x,operator,y,x*y);break;case/:if(y=0)printf(分母为零,算式出错!n);break;else printf(%.2f%c%.2f=%.2fn,x,operator,y,x/y);break;default:printf(“%.2f%c%.2f不是一个正确的算式!n,x,operator,y);
限制150内