if-else与复合语句

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

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

题目描述

这次比赛有两名学生考的特别好,老师打算奖励这两名学生。用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输出结果
#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;

本题用到了复合语句

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
#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;
}

例题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
#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;
}

你们的习题投票又来咯!超超超超超超超超超超超超超超超超超简单的嘞!(还看,收你们的来了~)

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值