上次,我们讲了简单的判断语句,今天,我们讲一些复杂的判断语句。
首先,我们讲一个情景:
小明在Goc课程上学会了利用pen.r指令来画椭圆,也学会了利用p.oo指令来画实心圆,今天他想利用这两个指令来画眼睛,步骤如下:
第1步:画一个宽度半径是100,高度半径是40的椭圆,颜色是1号颜色。
第2步:画一个半径是35的实心圆,颜色是1号颜色。
第3步:隐藏笔头。
程序1 | 眼睛效果(图1) |
露丝是小明的同学,她是外国人,眼睛是蓝色的,她希望小明也帮助她画一个蓝色的眼睛。
由于露丝的眼睛比小明稍微一点,所以决定实心圆的半径是30,小明很快就画出来了。
程序2 | 眼睛效果(图2) |
班上的其他同学们看到效果后都很开心,希望小明帮助它们都画一次。所以我们要融合程序1程序2。
于是小明设计了一个通用的程序:如果是中国学生就画黑色眼睛(上面的图1),如果是外国学生就画蓝色眼睛(上面的图2)。
程序读入一个变量a,如果a等于1则需要画上面出图1的眼睛效果;如果a等于2则需要画出图2的眼睛效果。
小明设计的思路如下:
第1步:定义一个变量a
第2步:读入变量a
第3步:用if语句判断,如果a等于1,则要做两件事:
(1)画一个黑色椭圆,宽度半径是100,高度半径是40.
(2)画一个黑色实心圆,半径是35。
第4步:用if语句判断,如果a等于2,则要做两件事:
(1)画一个蓝色椭圆,宽度半径是100,高度半径是40.
(2)画一个蓝色实心圆,半径是30。
程序3 |
int main() { int a; //定义a变量 cin>>a; //读入a变量 if(a==1) p.e(100,40,0); p.oo(35,0); //画黑色椭圆和黑色实心圆 if(a==2) p.e(100,40,2); p.oo(30,2); //画蓝色椭圆和蓝色实心圆 p.hide(); //隐藏笔头 return 0; } |
运行程序之后,却发现了问题,不管输入的是1还是2,画出的眼球都蓝色实心圆:
这既不是图1的眼睛效果,也不是图2的眼睛效果,程序出现了错误,为什么呢?
程序3中的if(a==1) p.e(100,40,0); p.oo(35,0); 等价于下面两条语句:
if(a==1) p.e(100,40,0);
p.oo(35,0);
程序3中的if(a==2) p.e(100,40,0); p.oo(35,0); 等价于下面两条语句:
if(a==2) p.e(100,40,0);
p.oo(35,0);
所以程序3等价于:
小明设计思路是当a等于1才画黑色实心圆,当a等于2才画蓝色实心圆。
但是可以发现程序有问题,不管a是1还是2,语句A和语句B都一定会执行,所以先画了黑色实心圆再画了蓝色实心圆,这与小明的设计思路是不符合的。应该怎么改了?我们先来了解一下if的复合语句。
if与复合语句
两条或两条以上的语句用一对{}括起来叫做复合语句,复合语句可与if语句组合使用。
if(表达式)
{
语句1;
语句2;
......
语句n;
}
表示的意义是当表达式为真,才执行复合语句。如果表达式为假,不执行复合语句。
也就是说复合语句作为一个整体,其内部的语句要么全部执行,要么全部不执行。
小明学习了复合语句后,把程序4改成了如下的程序,终于得到了正确的效果:
程序5 |
int main() { int a; //定义a变量 cin>>a; //读入a变量 if(a == 1) //如果是中国人,画黑眼睛 { p.e(100,40,0); //画黑色椭圆 p.oo(35,0); //画黑色实心圆 } if(a == 2) //如果是外国人,画蓝眼睛 { p.e(100,40,2); //画蓝色椭圆 p.oo(30,2); //画蓝色实心圆 } p.hide(); //隐藏笔头 return 0; } |
举个例子:
这次比赛有两名学生考的特别好,老师打算奖励这两名学生。用1表示男生,用2表示女生。
每个获奖的男生得到的奖励是4本书和3支笔。每个获奖的女生得到的奖励是3本书和5支笔。
老师总共需要准备多少本书和多少支笔?
先讲一下思路:
第1步: 定义两个整型变量a,b,表示两名学生。
第2步:用cin语句读入a,b的值。
第3步:定义两个变量book和pen,表示需要准备的书和笔的数量。
第4步:一开始让book和pen都赋值为0。
第5步:用if语句判断a是否为男生,如果是男生,做下面两件事:
(1)让book增加4。
(2)让pen增加3。
第6步:用if语句判断a是否为女生,如果是女生,做下面两件事:
(1)让book增加3。
(2)让pen增加5。
第7步:用if语句判断b是否为男生,如果是男生,做下面两件事:
(1)让book增加4。
(2)让pen增加3。
第8步:用if语句判断b是否为女生,如果是女生,做下面两件事:
(1)让book增加3。
(2)让pen增加5。
第9步:输出book和pen的值
程序6 | 输出结果 |
#include <bits/stdc++.h> using namespace std; int main() { int a,b; //定义变量a,b cin>>a>>b; //读入变量a,b的值 int book, pen; //定义变量book和pen book = 0; //book的初始值赋值为0 pen = 0; //pen的初始值赋值为0 if(a == 1) //如果a是男生 { book = book + 3; //增加3本书 pen = pen + 5; //增加5支笔 } if(a == 2) //如果a是女生 { book = book + 4; //增加4本书 pen = pen + 3; //增加3支笔 } if(b == 1) //如果b是男生 { book = book + 3; //增加3本书 pen = pen + 5; //增加5支笔 } if(b == 2) //如果b是女生 { book = book + 4; //增加4本书 pen = pen + 3; //增加3支笔 } cout<<book<<" "<<pen; //输出答案 return 0; } |
再举一个场景:
在日常生活中,经常碰到这样的情况:如果一个条件成立,就做A事情;否则就做B事情。
例如:如果下雨,就在室内上体育课,否则就在操场上体育课。
在程序设计中,把这种情况称为“双分支结构”。
C++中可以用if和else搭配使用实现双分支结构,格式:
if(表达式)
语句块A
else
语句块B
表示的意义是:当表达式的值是1时(即表达式为真),就执行语句块A;否则就执行语句块B。
语句块A可以是一条语句,也可以是复合语句,如果是复合语句即要用{}括起来
语句块B可以是一条语句,也可以是复合语句,如果是复合语句即要用{}括起来。
举几个例子:有两个整数a和b,按照从小到大的次序输出这两个数。
思路:
第1步: 定义两个整型变量a,b。
第2步:用cin语句读入a,b的值。
第3步:用if判断是否a<b,如果是,输出a和b; 否则输出b和a。
程序7 |
#include <bits/stdc++.h> using namespace std; int main() { int a,b; //定义变量a,b cin>>a>>b; //读入变量a,b的值 if(a < b) //如果a<b cout<<a<<" "<<b; //按照a,b的次序输出 else //否则 cout<<b<<" "<<a; //按照b,a的次序输出 return 0; } |
输出结果:
有一只蜗牛在井底,它收到了三条指令。每条指令要么是向上爬,要么是向下滑落。
如果是指令1,表示它会向上爬100厘米;如果是指令2表示它会下滑30厘米。
你的任务是计算:每当蜗牛完成一个指令后,它距离井底是多少厘米?
思路:
第1步:定义三个整型变量x,y,z,表示三次指令。
第2步:用cin语句读入x,y,z的值。
第3步:定义整型变量dis,表示蜗牛现在距离井底的高度。
第3步:一开始,初始化dis等于0。
第4步:如果x等于1,用复合语句做下面两件事
(1)dis的值增加100;
(2)输出dis。
否则,用复合语句做下面两件事
(1)dis的值减少30;
(2)输出dis。
第5步:和第(4)步同理,判断y。
第6步:和第(4)步同理,判断z。
程序8 |
#include <bits/stdc++.h> using namespace std; int main() { int x, y, z; //定义变量x, y, z cin>>x>>y>>z; //读入变量x,y,z的值 int dis = 0; //定义变量dis,表示蜗牛离井底的高度。 if(x == 1){ //如果x是向上爬指令 dis = dis + 100; //高度增加100 cout<<dis<<" "; //输出距离 } else { //否则 dis = dis - 30; //高度减少30 cout<<dis<<" "; //输出距离 } if(y == 1){ //如果y是向上爬指令 dis = dis + 100; //高度增加100 cout<<dis<<" "; //输出距离 } else { //否则 dis = dis - 30; //高度减少30 cout<<dis<<" "; //输出距离 } if(z == 1) { //如果z是向上爬指令 dis = dis + 100; //高度增加100 cout<<dis<<" "; //输出距离 } else { //否则 dis = dis - 30; //高度减少30 cout<<dis<<" "; //输出距离 } return 0; } |
优化思路:
观察上面解决问题的第4步:
如果x等于1,用复合语句做下面两件事
(1)dis的值增加100;
(2)输出dis。
否则,用复合语句做下面两件事
(1)dis的值减少30;
(2)输出dis。
可以发现,不管x的值是否等于1,有一件事是相同的:输出dis
因此可以把第4步改造成这样:
如果x等于1,则dis的值增加100;
否则dis的值减少30;
输出dis。
同理,对于y和z的判断也可以这样改造。
这样改造之后有什么好处呢?由于这样改造之后,if和else都只执行一条语句,就不需要复合语句了,代码会更加简洁。
优化代码:
程序8 |
#include <bits/stdc++.h> using namespace std; int main() { int x, y, z, dis = 0; //定义变量x, y, z, dis cin>>x>>y>>z; //读入变量x,y,z的值 if(x == 1) //如果x是向上爬指令 dis = dis + 100; //高度增加100 else //否则 dis = dis - 30; //高度减少30 cout<<dis<<" "; //输出高度 if(y == 1) //如果y是向上爬指令 dis = dis + 100; //高度增加100 else //否则 dis = dis - 30; //高度减少30 cout<<dis<<" "; //输出距离 if(z == 1) //如果z是向上爬指令 dis = dis + 100; //高度增加100 else //否则 dis = dis - 30; //高度减少30 cout<<dis<<" "; //输出距离 return 0; } |
输出结果:
这次就到这里,我们下次见!
标签:语句,30,c++,else,pen,book,------,100,dis From: https://blog.csdn.net/2401_86949778/article/details/144299692