程序设计与问题求解_第1页
程序设计与问题求解_第2页
程序设计与问题求解_第3页
程序设计与问题求解_第4页
程序设计与问题求解_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第2章选择结构程序设计缪裕青2015.32本章主要内容关系运算与关系表达式逻辑运算与逻辑表达式简单分支选择结构条件运算符与条件表达式多分支选择结构选择结构的嵌套程序设计举例3顺序结构例:交换x和y两个变量的值 如何交换?

10x20yx=y;y=x;4顺序结构(续)例:交换两个变量的值1020xytemp1020y20x20xtemp1010ytemp10(a)第一步temp=x(b)第二步x=y(c)第三步y=temptemp=x;x=y;y=temp;temp=xx=yy=temp5顺序结构(续)例:交换两个变量的值#include<stdio.h>intmain(){ intx=10,y=20; //定义变量并初始化

inttemp; //定义一个整型变量作为中间交换之用

printf("交换前:x=%d,y=%d\n",x,y);

temp=x; x=y; y=temp; printf("交换后:x=%d,y=%d\n",x,y);return0;}6问题:有x,y两个整型变量,如果x比y大就交换,否则不交换。算法?问题延伸x>y?开始结束YN不再顺序执行,有分支变量x,y交换x,y不交换根据表达式的值判断走哪个分支x>y是什么表达式?7关系运算符又称比较运算符,优先次序为:

<<=>>===!=

关系表达式的结果类型为bool,值为true或false。若关系成立,结果为true(1);否则,结果为false(0)。例: a=3,b=5;

a>=b

a<b

a==b a!=b

关系运算与关系表达式优先级相同(高)

优先级相同(低)结果为0结果为1结果为0结果为1注意“=”与“==”的区别8练习:如何写关系表达式?

x≤60 写成

a=0 写成

c+d≠e+f 写成

u≥10-7

写成关系运算与关系表达式(续)0≤x≤10如何表示?x<=60a==0(c+d)!=(e+f)u>=1.0E-70<=5<=10表示什么意思?结果?等价于(0<=5)<=10等价于1<=10,结果为19逻辑运算也被称为布尔运算,值只能为true

或false。&&与运算(a>b&&b>c);a大于b,并且b大于c||或运算(a>b

||b>c);a大于b,或者b大于c!非运算(求反)(!a);求a的相反值并不改变a的值逻辑运算与逻辑表达式!(逻辑非)&&(逻辑与)||(逻辑或)优先级高低10运算:

0&&0=0,0&&1=0,1&&0=0,1&&1=1

0||0=0,0||1=1,1||0=1,1||1=1 !0=1,!1=0练习:如何写逻辑表达式?0≤x≤10写成: 若x=5,结果?a<0或者a>10写成: 若a=15,结果?b不大于0写成: 若b=6,结果?逻辑运算与逻辑表达式(续)(x>=0&&x<=10)1(a<0)||(a>10)1!(b>0)或者(b<=0)011逻辑运算与逻辑表达式(续)练习:如何写逻辑表达式?i和j均小于或等于100,或者i和j均大于k(i<=100&&j<=100)||(i>k&&j>k)ch是英文大写字母(ch>='A')&&(ch<='Z')判断某一年year是否是闰年的条件是满足下列两个条件之一:能被4整除,但不能被100整除;能被400整除;

year%4==0 year%100!=0 year%400==0((year%4==0)&&(year%100!=0))||(year%400==0)12运算符优先级括号!算术运算符关系运算符&&||赋值运算符低高用括号来控制运算顺序更直观、方便,并减少出错的概率c>a+ba>b==ca=b>c等价于c>(a+b)等价于(a>b)==c等价于a=(b>c)z=!a&&b||x>y&&c+d②①③④⑤⑥⑦13运算符优先级(续)x=5<=10表示什么意思?结果?等价于x=(5<=10),结果x=1(x=5)<=10表示什么意思?结果?结果x=5,5<=10表达式值为15<=x<=10与5<=x&&x<=10一样吗?当x=15,结果不一样!14选择结构C语言中实现选择结构的语句:if语句if-else语句switch-case语句15语法格式:语句块可以是一条语句,也可以是用大括号括起来的复合语句简单分支选择结构——if语句表达式?truefalse语句块语义:if(表达式)

{语句块}16问题:有x,y两个整型变量,如果x比y大就交换,否则不交换。简单分支选择结构——if语句(续)#include<stdio.h>intmain(){intx=10,y=20,temp;printf("交换前:x=%d,y=%d\n",x,y);if(x>y)//交换x,y

{temp=x;x=y;y=temp;

}

printf("交换后:x=%d,y=%d\n",x,y);return0;}x>y?开始结束YN变量x,y交换x,y不交换一条if语句17语法格式:简单分支选择结构——if-else语句表达式?truefalse语句块1语句块2if(表达式)

{语句块1}else

{语句块2}语义:18简单分支选择结构——if-else语句(续)问题:求整型变量x的绝对值分析:如何求|x|? ifx>=0,|x|=xelse|x|=-x[算法]:(1)输入x(2)求y=|x|(3)输出yifx>=0,y=xelsey=-x#include<stdio.h>intmain(){intx,y;scanf("%d",&x);

if(x>=0)

{y=x;

}else

{y=-x;

}

printf("|x|=%d\n",y);return0;}一条if-ese语句19条件运算符与条件表达式语法格式:

表达式1?表达式2:表达式3说明:表达式1必须是bool类型语义例:y=x>=0?x:-x;if(x>=0)y=x;elsey=-x;表达式1?truefalse表达式2表达式3x>=0?(y=x):(y=-x)20运算符优先级(续)括号算术运算关系运算逻辑运算条件运算赋值运算低高例:max=x>y?x:ymax=((x>y)?x:y)21多分支选择结构——多if-else语句例:有一函数

编一程序,输入一个x值,要求输出相应的y值。解题思路:用if语句检查x的值,根据x的值决定赋予y的值由于y的可能值不是两个而是三个,因此不可能只用一个简单(无内嵌if)的if语句来实现22多分支选择结构——多if-else语句解题思路:方法1(1)用3个独立的if语句处理:输入x若

x<0,则y=-1若

x=0,则y=0若

x>0,则y=1输出x和yscanf("%d",&x);if(x<0)y=-1;if(x==0)y=0;if(x>0)y=1;printf("x=%d,y=%d\n",x,y);23多分支选择结构——多if-else语句解题思路:方法2(2)用一个嵌套的if语句处理:输入x若x<0,则y=-1否则(隐含x>=0)

x=0,则y=0

否则

y=1输出x和yscanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);24多分支选择结构——多if-else语句scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);scanf("%d",&x);if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;printf("x=%d,y=%d\n",x,y);提倡内嵌if放在else中25多分支选择结构——多if-else语句例:将百分制成绩转换成5分制成绩[算法分析]: 转换关系:

90≤score≤100,优

80≤score<90,良

70≤score<80,中

60≤score<70,及格

score<60,不及格if(score>=90&&score<=100){printf("优\n");}if(score>=80&&score<90){printf("良\n");}if(score>=70&&score<80){printf("中\n");}if(score>=60&&score<70){printf("及格\n");}if(score<60){printf("不及格\n");}当成绩为90判断几次?为50判断几次?能否减少判断次数?26if(表达式1)语句块1;elseif(表达式2)语句块2;elseif(表达式3)语句块3;┇

elseif(表达式n)语句块n;else语句块n+1;多分支选择结构——多if-else语句(续)例:将百分制成绩转换成5分制成绩#include<stdio.h>intmain(){ intscore; printf("请输入(百分制)分数:"); scanf("%d",&score);

if(score<60) {printf("不及格\n");}

else//>=60

if(score<70) {printf("及格\n");}

else//>=70

if(score<80){printf("中\n");}

else//>=80

if(score<90) {printf("良\n");}

else//>=90 {printf("优\n");}return0;}多路分支注意:else与if必须配对使用,对齐可以更便于阅读。良好的程序风格:锯齿形

——缩进排27多分支选择结构——switch语句多路(开关)选择语句语法格式:

switch

(整型表达式)

{

case数值1:

语句块1;break;

case数值2:

语句块2;break;

case数值3:

语句块3;break;

...

default:

语句块n;

}28有break情况语句块3语句块1表达式的值等于?数值1其他语句块2语句块n数值2数值3…多分支选择结构——switch语句(续)后面语句29多分支选择结构——switch语句没有break的情况

switch

(整型表达式)

{

case数值1:

语句块1;

case数值2:

语句块2;

case数值3:

语句块3;

...

default:

语句块n;

}30多分支选择结构——switch语句(续)没有break的情况语句块3语句块1表达式的值等于?数值1其他语句块2语句块n数值2数值3…没有实现多路分支31多分支选择结构——switch语句(续)例:将百分制成绩转换成5分制成绩[算法分析]:有5个分数档,因此有5个分支。如何从一个百分制成绩得到5个分支的数值,整型表达式如何构造?数值如何设置?90≤score≤100,优80≤score<90,良70≤score<80,中60≤score<70,及格score<60,不及格90≤score≤100,优80≤score≤89,良70≤score≤

79

,中60≤score≤

69

,及格score<60

,不及格“百分成绩/10=”?9,1087632例:将百分制成绩到5分制成绩转换#include<stdio.h>intmain(){ intscore; printf("请输入(百分制)分数:"); 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");

}

return0;}一条switch语句如果没有break?#include<stdio.h>intmain(){intscore;printf("请输入(百分制)分数:");scanf("%d",&score);switch(score/10) {case10:case9: printf("优\n");case8: printf("良\n");case7: printf("中\n"); case6: printf("及格\n");default: printf("不及格\n");}return0;}如何检验输入数据是否满足输入值范围?×33完全嵌套是合法的选择结构的嵌套合法非法√×交叉嵌套是非法的34选择结构的嵌套(续)ififelseelseifswitchelseswitchifelse√×ififelseelseififelseelse√√ifelseswitch√35例:将百分制成绩到5分制成绩转换#include<stdio.h>intmain(){ intscore; printf("请输入(百分制)分数:"); scanf("%d",&score); if(score>=0&&score<=100)

{

switch(score/10) //根据转换值进行分支选择

{ case10: case9: printf("优\n");break; case8: printf("良\n");break; case7: printf("中\n"); break; case6: printf("及格\n");break; default: printf("不及格\n");

}

}

elseprintf("输入数据错误\n");

return0;}判断是否符合取值范围36程序设计举例例1:输入一小写字母将其转换为大写字母。[分析]:小写字母与大写字母之间的关系?从ASCII码表知道,大小写对应字母之间的差值是32,如:'A'的值是65、'a'的值是97,两者的差值是32。[算法]:输入:charlcase,ucase;计算:ucase=lcase-32;//转换公式输出:ucase;#include<stdio.h>//将输入的小写字母转换成大写字母输出intmain(){charlcase,ucase;printf("请输入要转换的小写字母:");scanf("%c",&lcase);ucase=lcase-32;printf("对应的大写字母:%c\n",ucase);return0;}如果变量lcase中的小写字母后面不再使用,程序中可以减少变量吗?37程序设计举例(续)例1:输入一小写字母将其转换为大写字母。[算法]:输入:charch;计算:ch=ch-32;输出:ch;#include<stdio.h>//将输入的小写字母转换成大写字母输出intmain(){ charch; printf("请输入要转换的小写字母:"); scanf("%c",&ch);

ch=ch-32; printf("对应的大写字母:%c\n",ch);return0;}程序还可以改进吗?如果没有ASCII表可查,如何知道相差32?38程序设计举例(续)例1:输入一小写字母将其转换为大写字母。

32='a'-'A'#include<stdio.h>//将输入的小写字母转换成大写字母输出intmain(){ charch; printf("请输入要转换的小写字母:"); scanf("%c",&ch); ch=ch-'a'+'A'; printf("对应的大写字母:%c\n",ch);return0;}如果将大写字母转换成小写字母,程序如何写?39程序设计举例(续)例1:输入一小写字母将其转换为大写字母。如果输入的不是小写字母怎么办?#include<stdio.h>//将输入的小写字母转换成大写字母输出intmain(){ charch; printf("请输入要转换的小写字母:"); scanf("%c",&ch); ch=ch-'a'+'A'; printf("对应的大写字母:%c\n",ch);return0;}40程序设计举例(续)例1:输入一小写字母将其转换为大写字母。#include<stdio.h>//将输入的小写字母转换成大写字母输出intmain(){ charch; printf("请输入要转换的小写字母:"); scanf("%c",&ch);

if(ch>='a'&&ch<='z') ch=ch-'a'+'A'; printf("对应的大写字母:%c\n",ch);return0;}通过检验输入数据来增加程序的强壮性!一条语句41程序设计举例(续)例2:求一元二次方程ax2+bx+c=0的根,其中系数a,b,c为实数,由键盘输入。[分析]:△=b2-4ac

当△>0时,方程有两个实根 当△=0时,方程有重根 当△<0时,方程有两个共轭复根设42解题思路:输入a,b,c计算deltadelta≥0计算x1,x2输出无实根输出x1,x2真假43#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,delta,p,q;printf("Pleaseinputa,b,c=");scanf("%lf%lf%lf",&a,&b,&c);delta=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(delta))/(2*a);

if(delta>=0) {printf("x1=%f\nx2=%f\n",p+q,p-q);}

else { printf("x1=%f+j%f\n",p,q); printf("x2=%f-j%f\n",p,q); }}库函数一条语句44#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,delta,p,q;printf("Pleaseinputa,b,c=");scanf("%lf%lf%lf",&a,&b,&c);delta=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(delta))/(2*a);

if

(fabs(delta)<=1e-6) {printf("x1=x2=%f\n",p);}

elseif(delta>1e-6) {printf("x1=%f\nx2=%f\n",p+q,p-q);}

else{ printf("x1=%f+j%f\n",p,q); printf("x2=%f-j%f\n",p,q); }}较小的数近似045程序设计举例(续)例3:求两个整数中的较大者。[分析]:设整数x和y的较大值为max,可以直接将x和y进行比较,若x>=y,则较大值为x,即max=x,否则,较大值为y,即max=y。#include<stdio.h>intmain(){intmax,x,y;printf("pleaseinputxy:");scanf("%d%d",&x,&y);

if(x>=y) {max=x;}

else {max=y;}printf("max=%d\n",max);return0;}#include<stdio.h>intmain(){intmax,x,y;printf("pleaseinputxy:");

温馨提示

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

评论

0/150

提交评论