《第4章选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章选择结构程序设计.ppt(50页珍藏版)》请在三一办公上搜索。
1、第四章 选择结构程序设计,本章要点,内容要点提示:什么是算法?算法是如何描述的?程序的三种基本控制结构是什么?执行流程怎样?如何用关系表达式和逻辑表达式表示简单条件、复杂条件?if语句有几种形式?条件如何判断?switch语句一般形式如何?执行过程怎样?,本章内容,4.1 算法及其描述方法 4.2 关系运算与逻辑运算4.3 if语句4.4 条件运算符与条件表达式4.5 switch语句4.6 选择结构程序举例*4.7 if语句嵌套,4.1 算法及其描述方法,算法:把为解决一个问题而采取的方法和步骤称为“算法”。有三种控制结构:顺序结构、选择结构和循环结构。顺序结构:计算机自动按照语句编写的顺序
2、一句一句执行语句。选择结构:也称分支结构。根据输入的数据或中间结果的情况,选择一组语句执行。循环结构:又称重复结构,即当给定条件满足时,反复执行某一部分语句。,4.1 算法及其描述方法,算法的表示方法1.自然语言与伪代码表示方法(1)自然语言表示法将解决问题的步骤用自然语言表示。【例4.1】计算火车行李托运费。输入行李重量,计算并输出托运费。收费标准:(1)不超过50公斤,每公斤0.35元;(2)超过50公斤,其中50公斤同(1),超过部分每公斤0.50元。,4.1 算法及其描述方法,算法:步骤1:输入行李的重量步骤2:根据行李的重量计算费用若重量=50 则 费用=weight*0.35 否则
3、 费用=50*0.35+(weight-50)*0.5步骤3:输出费用的值,4.1 算法及其描述方法,(2)伪代码表示法 伪代码:是不能由计算机执行的,但可以很容易地转化为高级语言的程序。例4.1的伪代码算法:begin input weight if weight is less than or equal to 50 set pay to weight*0.35 else set pay to 50*0.35+(weight-50)*0.5 output payend,4.1 算法及其描述方法,2 传统的流程图表示方法流程图是用称为“流线”的箭头将具有专门含义的表示各种操作的符号连接而成的
4、。流程图常用的符号:,4.1 算法及其描述方法,用流程图表示的程序的三种基本控制结构(1)顺序结构。(2)选择结构。,4.1 算法及其描述方法,(3)循环结构。包括两类循环结构。当(while)型循环:直到(until)型循环:,4.1 算法及其描述方法,用流程图表示例4.1的算法,4.1 算法及其描述方法,3 N-S流程图表示方法(1)顺序结构(2)选择结构(3)循环结构 当型循环 直到型循环,4.1 算法及其描述方法,用N-S流程图表示例4.1的算法,4.2 关系运算与逻辑运算,关系运算1.关系运算符(大于)=(大于或等于)=(等于)!=(不等于)优先级:高 低,4.2 关系运算与逻辑运算
5、,2.关系表达式一般形式为:表达式关系运算符表达式合法的关系表达式:ab a+b=b(ab)=(bc)关系表达式的值:逻辑值“真”“1”表示“假”“0”表示,4.2 关系运算与逻辑运算,例如:假设num1=3,num2=4,num3=5,则:(1)num1num2的值=0。(2)(num1num2)!=num3的值=1。思考:改变num1或num2的值,会影响整个表达式的值吗?注意:关系表达式的值,还可以参与其它种类的运算(为什么?)(4)(num1num2)+num3的值=6。,4.2 关系运算与逻辑运算,逻辑运算1.逻辑运算符&逻辑与(相当于“并且”)|逻辑或(相当于“或者”)!逻辑非(相
6、当于“不是”)运算规则:1)a&b:当且仅当a和 b的值都为真时,结果为真,否则为假。2)a|b:当且仅当a和 b的值都为假时,结果为假,否则为真。3)!a:当a的值为真时,结果为假;当a的值为假时,结果为真。优先级:1)!&|2)!算术运算符 关系运算符&|赋值运算符,4.2 关系运算与逻辑运算,2.逻辑表达式用逻辑运算符将运算对象连接起来的式子。合法的逻辑表达式:(x=0)&(x5)!(x=0)(year%4=0&year%100!=0)|(year%400=0)逻辑表达式的值:例如:num=12,则:!num的值为 0;num=1 num31的值为 1。,注意:55 else y=y+1
7、,4.关系表达式和逻辑表达式的运算结果得到一个逻辑值:真或者假。C语言中没有专门的逻辑值,也没有专门的逻辑变量用零表示假,用非零值表示真-非零即为真!,4.3 if语句,例4.1的程序清单void main()float weight,pay;printf(weight=);scanf(%f,if语句,4.3 if语句,简单if语句1.if语句 语句的一般形式为:if(表达式)语句,思考:若score的值是95,输出时什么?若score的值是85,输出怎样?,例如:if(score=90)printf(“Good!”);printf(“Your score is%d.n”,score);,if
8、语句的执行过程是:,4.3 if语句,2.if-else语句语句的一般形式为:if(表达式)语句1else 语句2,假设x的值是5,y的值是7,这段程序执行后会输出:?,例如:if(xy)min=x;else min=y;printf(“min=%dn”,min);,语句执行的过程:,4.3 if语句,说明:(1)if语句中,括号内的表达式用来表示条件,一般为关系表达式或逻辑表达式。(2)当if语句以某表达式的值不等于0作为条件时,可直接简写成表达式作为条件。例如,语句:if(x!=0)printf(“x!=0”);可以简写成:if(x)printf(“x!=0”);以某表达式的值等于0作为条
9、件时可写成对该表达式取反的形式。例如,语句:if(x=0)printf(“x=0”);可以简写成:if(!x)printf(“x=0”);,4.3 if语句,说明:(3)无论是if语句中的语句还是if-else语句中的语句1、语句2,都可以是任何语句。当它们中的某一个是有多条语句组成时,必须写成复合语句的形式。例如,语句:if(i!=j)i+=1;j+=2;else i-=j;,4.3 if语句,【例4.2】求三个数中的最大者。(1)问题分析及变量设置:从键盘读入三个数分别存入变量n1,n2,n3中,求出最大数存入变量max中,float型。,(2)算法设计:,4.3 if语句,(3)程序清单
10、void main()float n1,n2,n3,max;printf(n1,n2,n3=);scanf(%f%f%f,改为:max=n1;if(n2max)max=n2;if(n3max)max=n3;,这种方法即擂台法,对从3个以上的数中找最大数的处理,非常有效。,例题:输入一个数,判断它是否能被整除,若能被整除,打印;不能被整除,打印#include void main()int n;printf(“input n:”);scanf(“%d”,程序有错吗??,4.3 if语句,多分支if语句当if-else语句中的语句2是另一条if语句时,就构成了多分支if语句。语句的一般形式为:if
11、(表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3.else if(表达式n)语句nelse 语句n+1,执行过程:,4.3 if语句,【例4.3】求如下函数式y的值。,4.3 if语句,【例4.3】求如下函数式y的值。,程序代码:#include#include void main()double x,y;printf(“Enter x:”);scanf(“%lf”,4.4 条件运算符与条件表达式,条件运算符?:,C语言中唯一的一个三目运算符优先级与结合性(13级)算术运算符 关系运算符 条件运算符 赋值运算符 右结合性常用方式 max=(ab)?a:b 等价
12、于 if(ab)max=a;else max=b;条件表达式一般形式为:表达式1?表达式2:表达式3 求值过程:,4.4 条件运算符与条件表达式,【例 4.4】从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。void main()char ch;printf(Input a character:);scanf(%c,4.5 switch语句,在C语言中,用switch语句描述多路按值选择结构。switch语句的一般形式为:switch(表达式)case 常量表达式1:语句1 case 常量表达式2:语句2.case 常量表达式n:语句n default:语句n
13、+1,执行过程:,4.5 switch语句,说明:(1)switch后面括号内的表达式的类型只限于是整型或字符型或枚举型。(2)各子句中包含的语句可以是任意条合法的C语言语句,也可以没有语句。(3)default子句可以省略,若不省略,至多出现一次。(4)各个case和default的出现次序不影响执行结果。习惯上总是将default子句写在所有case子句之后,有必要也可以写在某个case子句之前。(5)多个case子句可以共用一组执行语句。,4.5 switch语句,例如:执行下面这段代码时,若gread的值是B,结果?switch(gread)case A:printf(“GREAT!n
14、”);case B:printf(“GOOD!n”);case C:printf(“OK!n”);case D:printf(“NO!n”);default:printf(“ERROR!n”);,程序执行将输出:GOOD!OK!NO!ERROR!,如果想只执行某个子句中的语句,排斥其它的情况,最常用的方法是使用break语句,每个子句都以break语句结束。在switch语句中,执行break 语句将跳出switch语句,使控制转向switch语句的后继语句。,为什么错了?,4.5 switch语句,【例4.5】输入两个操作数及一个运算符,输出运算结果。,由于switch语句的表达式不允许实型
15、表达式,当需要以实型表达式做选择控制时,要把实型表达式值映射到一个较小范围上的整型值。,程序代码:#includevoid main()float a,b,c;char ch;printf(“Enter:”);scanf(“%f%c%f”,4.6 选择结构程序举例,【例4.6】猜随机数的程序:由键盘输入一个数,程序产生一个随机数,判断二者是否相同。,1.简单if语句只对两数是否相等做判断。#include#includevoid main()int r;int g;r=rand();/*产生一个随机数*/printf(Input a number:);scanf(%d,/*如果二个数相等,输出
16、这条信息*/,4.6 选择结构程序举例,2.if-else语句#include#includevoid main()int r;int g;r=rand();/*产生一个随机数*/printf(Input a number:);scanf(%d,/*如果二个数不相等,输出这条信息*/,4.6 选择结构程序举例,3.多分支if语句#include#includevoid main()int r;int g;r=rand();/*产生一个随机数*/printf(Input a number:);scanf(%d,4.6 选择结构程序举例,4.if语句嵌套#include#includevoid m
17、ain()int r,g;r=rand();/*产生一个随机数*/printf(Input a number:);scanf(%d,4.6 选择结构程序举例,【例4.7】设计一个数制转换的程序,程序可以进行如下的数制转换:十进制转换为十六进制、十六进制转换为十进制、十进制转换为八进制、八进制转换为十进制。要求用菜单实现选择。分析:用菜单控制的程序结构一般是:输出菜单、输入选项、判断选项、根据判断结果执行相应功能。可以按照这样的结构完成程序的设计。在实现数制转换的部分,用最简单的方式,利用库函数printf()和scanf()中的格式指令:%x和%o。,4.6 选择结构程序举例,程序代码:#in
18、cludevoid main()int chioce;int value;printf(convert:n);printf(1:decimal to hexadecimaln);printf(2:hexdecimal to decimaln);printf(3:decimal to octaln);printf(4:octal to decimaln);printf(“enter your chioce:);scanf(%d,case 1:printf(enter decimal value:);scanf(%d,case3:printf(enter decimal value:);scanf
19、(%d,*4.7 if语句嵌套,在if语句中又包含一个或多个if语句的形式称为if语句的嵌套。常见的if语句嵌套的的形式有以下几种:1.if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;2.if(表达式1)if(表达式2)语句1;else 语句2;else 语句3;3.if(表达式1)语句1;else if(表达式2)语句2;else 语句3;,【例4-10】计算:sin(x)0.5x1.5 y(x)=cos(x)1.5x4.5 tan(x)4.5x7.5分析:为了能用switch语句描述y(x)的计算,要把实型变量x的值映射到整型,
20、即对于x的每个区间用1个或多个整数表示。从题目可以看出,各个区间的上下限小数部分均为0.5,所以,只要把x加0.5再取整后,各个区间就可以映射到整数了。源程序文件名:exp4_10.cpp,#include#includevoid main()float x,y;printf(“Input x:”);scanf(“%f”,*4.7 if语句嵌套,注意:在嵌套的if语句中,else和if的配对是需要特别注意的,在实际的编程中很容易犯配对错误。具体的配对原则为:else总是与其上面离它最近的且尚未配对的if语句配对。,在程序设计时,如果出现if与else数目不相同的情况,为实现程序设计者的目的可以
21、用花括号来确定配对关系。,*4.7 if语句嵌套,【例4.8】求一元二次方程ax2+bx+c=0的根。程序代码:#include#include/*程序中要用到数学库函数*/void main()double a,b,c,delta,re,im,x1,x2;printf(“Enter a,b,c:”);scanf(“%lf%lf%lf”,if(delta=0.0)x1=re+im;x2=re-im;printf(”x1=%6.2f,x2=%6.2fn”,x1,x2);/*输出两个实根*/else printf(”x1=%6.2f+%6.2f i,x2=%6.2f-%6.2f in”,re,fabs(im),re,fabs(im);/*输出两个复根*/else if(b!=0.0)printf(“x=%6.2fn”,-c/b);/*单根*/else printf(“Error,no answer!n”);,
链接地址:https://www.31ppt.com/p-4966373.html