C语言程序设计教程(第2版)-课件 第4章 选择结构设计_第1页
C语言程序设计教程(第2版)-课件 第4章 选择结构设计_第2页
C语言程序设计教程(第2版)-课件 第4章 选择结构设计_第3页
C语言程序设计教程(第2版)-课件 第4章 选择结构设计_第4页
C语言程序设计教程(第2版)-课件 第4章 选择结构设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章

选择结构程序设计内容提要:1、关系表达式与逻辑表达式2、选择结构控制语句(if语句、switch语句)数据结构+算法=程序描述数据的类型、组织形式描述对数据的操作步骤1、算法:计算机求解某一问题而采用的具体方法、步骤2、两大类计算机算法:数值运算算法、非数值运算算法(求数值解、成熟)(事务管理、广泛)3、算法的特性:有穷性、确定性、输入、输出等4、算法描述:描述算法的方法有多种归纳为二大类:①文字②图形(符号)4.1算法的概念4.2算法的描述方法常用的算法描述方法:(1)带序号的自然语言描述易懂却不直观,不严格(2)流程图:灵活、自由、形象、直观,可表示任何算法输入/输出处理判断起止连接点流程线(3)N-S图(盒图):完全去掉了带箭头的流程线,算法的所有处理步骤都写在一个大矩形框(表示简单、符合结构化思想)(4)伪代码:用介于自然语言与计算机语言之间的文字及符号来描述算法(方便、易懂、便于向计算机语言过渡)例1:计算S=,写出其算法。自然语言描述:流程图描述:N-S图描述:伪代码描述:引例:计算函数值:需考虑:1)输入x2)判断x的值

3)根据x的值计算y的值

4)输出y的值显然2)3)顺序结构程序不能实现,须引入选择结构程序。#include<stdio.h>#include<math.h>intmain(){floatx,y;printf(“Enterx:”);scanf(“%f”,&x);if(x!=0.0)y=sin(x)/x;elsey=1;printf(“\nx=%5.2f\ty=%7.4f\n”,x,y);}Enterx:2x=2.00y=0.45464.1条件判断---关系表达式关系运算:是对两个量进行“比较运算”关系运算符:<、<=、>、>=、==、!=优先级别算术运算符、关系运算符、赋值运算符高低如:c>a+bc>(a+b)a==b<ca==(b<c)a=b<ca=(b<c)注意:”=”与”==”不同高低关系表达式:用关系运算符将两个表达式(算术、字符表达式)连接起来的有意义的式子。如:x!=0‘a’==‘A’a*a+b*b<Y*Y

注意:数值量比较---数字的大小字符量比较---ASCII的大小关系表达式的值:真(1)假(0)

c>a+bc>(a+b)a==b<ca==(b<c)a=b<ca=(b<c)

问:a=1,b=-5,c=‘a’时上面表达式的值结合规则:左结合4.1条件判断---逻辑表达式逻辑运算符:&&(与)、||(或)、!(非)优先级别:!&&||

高低!(非)算术运算符关系运算符&&||赋值运算符高

低例:

a>b&&b>c(a>b)&&(b>c)a!=b&&c!=0(a!=b)&&(c!=0)!a||a>b(!a)||(a>b)5>3&&2||!8<4-2((5>3)&&2)||((!8)<(4-2))逻辑量:当一个量(可以是基本类型的常量或变量)用作判断时,C编译系统认为:非0-----真、0-----假逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子(单个逻辑量、关系表达式是逻辑表达式的特例)逻辑表达式的值:真(1)、假(0)如:若a=4则

!aa&&-54||0011例1:a=3,b=2,c=1a>b&&b>c (a>b)&&(b>c)a!=b&&c!=0 (a!=b)&&(c!=0)!a||a>b (!a)||(a>b)5>3&&2||!8<4-2例2:判断某年year是否闰年?(闰年:能被4整除,但不能被100整除;或能被400整除)year%4==0&&year%100!=0||year%400==0练习:写出C语言的表达式(1)|x|>2(2)x≤1+a并y≤b(3)的定义域abs(x)>2或x>2||x<-2x<=1+a&&y<=b(x>=2||x<=1)&&x!=0或(x-1)*(x-2)>=0&&x!=0写出表达式的值:(a=2,b=0,c=-2.5)a*b||c!b&&c0||a1&&!a/c1110说明(1)运算对象的数据类型:除整型外,也可以是实型、字符型等其它类型数据。(2)子表达式计算:只有在必须计算下一个子表达式才能求解时,才计算;否则,不再计算。①对于逻辑与运算,如果第1个对象被判定为“逻辑假”,系统不再计算第2个对象(因为无论真假,都不影响整个表达式的结果)。②对于逻辑或运算,如果第1个对象被判定为“逻辑真”,系统不再计算第2个对象。思考:假设n1=1、n2=2、n3=3、n4=4、x=1、y=1,求解表达式(x=n1>n2)&&(y=n3>n4)后,x、y的值?答案:x=0,y=14.2if语句一、if语句的三种形式

1)条件执行if(e)A-----A可为简单或复合语句如:if(a>0)printf(“aispositive.\n”);if(x>y){t=y;y=x;x=t;}2)分支选择if(e)AelseB

当e为真值(非0)时执行A,否则执行B或后续语句。

if(a>0)printf(“Aispositive.\n”);elseprintf(“Aisnotpositive.\n”);A或B都可以是单一语句,也可以是复合语句;

else部分不能独立存在,即else前一定有一个“;”,它必定是if语句的一部分。注意:在C语言中,表达式e的值为非0时,系统均按“真值”处理。如:if(‘a’)printf(“O.K.”);x=-5;if(x)printf(“O.K.”);y=0;if(y==0)printf(“O.K.”);

y=0;if(y)printf(“O.K.”);读程序,写出它所完成的功能。#include<stdio.h>intmain(){floatx,y;printf(“Enterx:”);scanf(“%f”,&x);if(x==0)y=1;elsey=(x*5+1)/x;printf(“\nx=%4.1f\ty=%4.1f\n”,x,y);}y=1;if(x!=0)y=(x*5+1)/x;问:若将y=1与if语句调换位置,程序结果会相同吗?例:任给a,b,c三个数,按从大到小的顺序输出。分析:1)对于任意两个数a,b:

若a>b,则输出a,b;否则输出b,a。2)对于三个数,有6种可能:

a>b>ca>c>bb>a>cb>c>ac>a>bc>b>a3)使用判断---交换法若a<b,则交换a和b

若a<c,则交换a和c,结果a最大若b<c,则交换b和c,结果a>b>cabc567若a<b,则交换a和babc657若a<c,则交换a和c,结果a最大abc756若b<c,则交换b和c,结果a>b>cabc765#include<stdio.h>intmain(){inta,b,c,t;printf(“inputa,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c);if(a<b){t=a;a=b;b=t;}if(a<c){t=a;a=c;c=t;}if(b<c){t=b;b=c;c=t;}printf(“%d,%d,%d”,a,b,c);}3)elseif形式

if(P1)S1elseif(P2)S2…..elseif(Pn-1)Sn-1elseSn

系统从上到下的逐个判断条件P,一旦发现某条件Pi满足时,则执行与它有关的语句Si,并跳过其他剩余的阶梯。若所有条件均不满足,执行最后一个else语句或后续语句。下一语句P1S1真假P2S2真假Pn-1Sn-1真假Sn…………注意:else与最近的if相匹配。【例】根据成绩打印出等级。

(0-59:E60-69:D70-79:C80-89:B90-100:A)算法分析:设成绩为score,假设取值在0-100之间,没有错误的输入。

60>score≥0E

70>score≥60D80>score≥70C90>score≥80B100≥score≥90A#include"stdio.h"intmain(){intscore;printf("score=");

scanf("%d",&score);if(score>=0&&score<60)printf("gradeisE");if(score>=60&&score<70)printf("gradeisD");if(score>=70&&score<80)printf("gradeisC");if(score>=80&&score<90)printf("gradeisB");if(score>=90)printf("gradeisA");}#include"stdio.h"intmain(){intscore;printf("score=");

scanf("%d",&score);if(score>=0&&score<60)printf("gradeisE");

elseif(score<=69)printf("gradeisD");elseif(score<=79)printf("gradeisC");

elseif(score<=89)printf("gradeisB");elseprintf("gradeisA");}注意条件的表示形式和顺序1#include"stdio.h"2intmain()3{/*E:0-59D:60-69C:70-79B:80-89A:90-100*/

4intscore;5printf("score=");6scanf("%d",&score);7if(score>=90&&score<=100)8printf("gradeisA");9elseif(score>=80)10printf("gradeisB");11elseif(score>=70)12printf("gradeisC");13elseif(score>=60)14printf("gradeisD");15else16printf("gradeisE");

}4.2if语句二、if语句的嵌套

if(P1)if(P2)AelseBelseif(P3)CelseD#include<stdio.h>#include<math.h>intmain(){floatx,y;printf(“inputx:”);scanf(“%f”,&x);if(x<-3.0)y=x-1.0;elseif(x>=-3.0&&x<=3.0)y=sqrt(9.0-x*x);elsey=log10(x);printf(“x=%0.1f\ty=%0.1f\n”,x,y);}

例:计算函数if(x<=3.0)……if(x<-3.0)y=x-1.0;if(x>=-3.0&&x<=3.0)y=sqrt(9.0-x*x);if(x>3)y=log10(x);……例:计算函数二、if语句的嵌套比较:if(x)if(y)printf(“1”);elseprintf(“2”);if(x){if(y)printf(“1”);}elseprintf(“2”);由此看出:通过加“{}”可改变else的层位,从而改变程序的执行流程。二、if语句的嵌套if(x)if(y)printf(“1”);elseprintf(“2”);【练习1】假定所有变量均已正确说明,下列程序段运行后x的值是

a=b=c=0; x=35; if(!a)x=-1; elseif(b); if(c)x=3; elsex=4;A)34B)4C)35D)3【练习2】当a=1,b=3,c=5,d=4时,执行完下面程序段后x的值为

if(a<b) if(c<d)x=1; else if(a<c)if(b<d)x=2;elsex=3;elsex=6; elsex=7;A)1B)2C)3D)6例:判断某年是否闰年。闰年:年份year能被4整除,但不能被100整除;或能被400整除if((year%4==0&&year%100!=0)||(year%400==0))leap=1;elseleap=0;4.2if语句三、条件运算符与条件表达式1.条件运算符:?和:/*唯一的三目运算符*/2.条件表达式:e1?e2:e3

如:a>b?a:bx==0?1:sin(x)/x3.执行过程:

1)计算e12)e1值为非0(真),计算并返回e2的值否则计算并返回e3的值4.2if语句三、条件运算符与条件表达式4.运算顺序:高于赋值运算,低于算术、关系、逻辑运算如:y=x==0?1:sin(x)/x;5.条件运算符的结合方向是“右结合”如:a>b?a:c>d?c:d等价于:a>b?a:(c>d?c:d)例:读程序,写出程序完成的功能。#include<stdio.h>intmain(){inta,b,max;printf(“inputdatatoaandb:”);scanf(“%d,%d”,&a,&b);

max=a>b?a:b;printf(“Themaxis%d\n”,max);}printf(“Themaxis%d\n”,max=a>b?a:b);printf(“Themaxis%d\n”,a>b?a:b);找出a、b两个数中的大数。例:任意输入一个字符,若是大写字母,将其转换成小写字母;如果不是,不转换。分析:判断一个字符ch是否为大写字母的方法

ch>=‘A’&&ch<=‘Z’ch>=65&&ch<=90大写字母转换为小写字母的方法:ch+32由前面的例子可以看出,对于二分支、并对同一变量赋值时用条件表达式最方便。ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch;4.3开关语句

开关语句又称为多分支选择语句,它比用嵌套的if语句实现多分支问题,程序结构清晰、易读。一、格式

switch(e){casec1:语句1casec2:语句2……casecn:语句n[default:语句n+1]}其中:表达式e可以是整型、字符型常量表达式ci必须与表达式e类型一致(整型与字符型通用)二、执行过程1.计算表达式e的值2.若与常量表达式ci值一致,则从语句i开始执行;直到遇到break语句或switch语句的“}”。3.若与任何常量表达式值均不一致时,则执行default语句或执行后续语句。注意:1)常量表达式ci仅起语句标号作用,不作求值判断;2)常量表达式的值必须是唯一的,没有先后次序;3)多个case语句可共用一组执行语句。如:switch(x){case1:printf(“statement1”);break;case2:printf(“statement2”);break;default:printf(“default”);}如果case1、case2中没有break;结果是什么?例:用switch语句评价学生的成绩

score>=90优秀score>=80良好score>=70中score>=60及格score<60不及格#include<stdio.h>intmain(){intscore;printf(“inputascore:”);scanf(“%d”,&score);switch(score/10){case10:case9:printf(“优秀\n”);break;case8:printf(“良好\n”);break;case7:printf(“中\n”);break;case6:printf(“及格\n”);break;default:printf(“不及格\n”);}}关键:如何表示表达式和常量,常量的取值与表达式有关。例运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:s<250km没有折扣

250≤s<5002%折扣

500≤s<10005%折扣

1000≤s<20008%折扣

2000≤s<300010%折扣

3000≤s15%折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:f=p*w*s*(1-d)

int(s/250)0:d=01:d=22、3:d=54~7:d=88~11:d=10其他:d=15

#include<stdio.h>

intmain()

{

intc;

floatp,w,d,f,s;

scanf(“%f,%f,%f”,&p,&w,&s);

c=s/250;

switch(c){

case0:d=0;break;

case1:d=2;break;

case2:case3:d=5;break;

case4:case5:case6:case7:d=8;break;

case8:case9:case10:

case11:d=10;break;

default:d=15;}

f=p*w*s*(1-d/100.0);

printf(“freight=%15.4f\n”,f);}#include<stdio.h>intmain(){floatx,y,z;charop; printf("请输入需要计算的式子,如1+2:\n"); scanf("%f%c%f",&x,&op,&y); switch(op) { case'+':z=x+y;printf("%f+%f=%f\n",x,y,z);break;case'-':z=x-y;printf("%f-%f=%f\n",x,y,z);break;case'*':z=x*y;printf("%f*%f=%f\n",x,y,z);break; case'/':if(y!=0){z=x/y;printf("%f/%f=%f\n",x,y,z);} elseprintf("你输入的除数为零,非法!\n"); break; default:printf("你输入的式子有误!\n"); }}1.若从键盘上输入5,则程序的输出结果是

。#include<stdio.h>intmain(){intx;scanf("%d",&x);if(x++>5)printf("%d\n",x);elseprintf("%d\n",x--);}A.7 B.6 C.5 D.42.下列程序的输出结果是

。#include“stdio.h”intmain(){intx=1,a=0,b=0;switch(x){case0:b++;case1:a++;case2:a++;b++;}printf(“a=%d,b=%d\n”,a,b);}A)a=2,b=1B)a=1,b=1C)a=1,b=0D)a=2,b=23.若从键盘上输入3和4,则程序的输出结果是

。#include<stdio.h>intmain(){inta,b,s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论