Goc画眼睛
齐观察
小明在Goc课程上学会了利用pen.r指令来画椭圆,也学会了利用p.oo指令来画实心圆,今天他想利用这两个指令来画眼睛,步骤如下:
第1步:画一个宽度半径是100,高度半径是40的椭圆,颜色是1号颜色。
第2步:画一个半径是35的实心圆,颜色是1号颜色。
第3步:隐藏笔头。
程序1 | 眼睛效果(图1) |
![]() | ![]() |
露丝是小明的同学,她是外国人,眼睛是蓝色的,她希望小明也帮助她画一个蓝色的眼睛。
由于露丝的眼睛比小明稍微一点,所以决定实心圆的半径是30,小明很快就画出来了。
程序2 | 眼睛效果(图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(表达式)
{
语句1;
语句2;
......
语句n;
}
表示的意义是当表达式为真,才执行复合语句。如果表达式为假,不执行复合语句。
也就是说复合语句作为一个整体,其内部的语句要么全部执行,要么全部不执行。
小明学习了复合语句后,把程序4改成了如下的程序,终于得到了正确的效果:
程序5 | |
|
例题1
题目描述
这次比赛有两名学生考的特别好,老师打算奖励这两名学生。用1表示男生,用2表示女生。
每个获奖的男生得到的奖励是4本书和3支笔。每个获奖的女生得到的奖励是3本书和5支笔。
老师总共需要准备多少本书和多少支笔?
输入格式
一行,两个整数,每个整数要么是1要么是2。1表示男生,2表示女生。
输出格式
2个整数,分别表示老师需要准备的书和笔的数量,中间空格分开。
输入样例1
2 1
输出样例1
7 8
解决问题步骤
第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 | 输出结果 |
| ![]() |
本题用到了复合语句
if-else双分支结构
齐观察
在日常生活中,经常碰到这样的情况:如果一个条件成立,就做A事情;否则就做B事情。
例如:如果下雨,就在室内上体育课,否则就在操场上体育课。
在程序设计中,把这种情况称为“双分支结构”。
C++中可以用if和else搭配使用实现双分支结构,格式:
if(表达式)
语句块A
else
语句块B
表示的意义是:当表达式的值是1时(即表达式为真),就执行语句块A;否则就执行语句块B。
语句块A可以是一条语句,也可以是复合语句,如果是复合语句即要用{}括起来
语句块B可以是一条语句,也可以是复合语句,如果是复合语句即要用{}括起来。
例题2
题目描述
有两个整数a和b,按照从小到大的次序输出这两个数。
输入格式
一行,两个整数。
输出格式
两个整数,从小到大的次序,中间空格分开。
输入样例1
8 6
输出样例1
6 8
解决问题步骤
第1步: 定义两个整型变量a,b。
第2步:用cin语句读入a,b的值。
第3步:用if判断是否a<b,如果是,输出a和b; 否则输出b和a。
参考程序
程序7 |
|
例题3
题目描述
有一只蜗牛在井底,它收到了三条指令。每条指令要么是向上爬,要么是向下滑落。
如果是指令1,表示它会向上爬100厘米;如果是指令2表示它会下滑30厘米。
你的任务是计算:每当蜗牛完成一个指令后,它距离井底是多少厘米?
输入格式
一行,三个整数,每个整数要么是1要么是2,其中1表示向上爬,2表示下滑。
数据保证任意时刻,蜗牛距离井底的高度不会是负数。
输出格式
共3个整数,表示蜗牛每次完成指令之后离井底多少厘米。
输入样例1
1 2 2
输出样例1
100 70 40
输入样例2
1 2 1
输出样例2
100 70 170
解决问题步骤
第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 |
|
优化代码
观察上面解决问题的第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 |
|