第三章    程序的选择执行

当我们走出家门是,我们会不自觉的看一下天气预报,如果下雨就带上伞。当我们走到十字路口需要过马路时,会根据红绿灯的信息选择停下还是过马路。上课时,我们会依据课表选择上课的教室。学校运动会, 我们每个人要选择是否参加项目比赛,如果选择参加,我们会根据自己的体能情况和爱好选择要参加哪个项目。购买衣服时,我们会根据自己的喜好选择衣服的颜色和款式……。生活中需要我们依据不同的条件和 情况选择做不同事情的现象到处都存在,在计算机语言中,同样需要引入选择结构(也叫分支结构)来选择事情的解决过程。

3.1if语句

【例3.1】星星公司致力于信件快递业务,收费标准为:500克以下(包括500克)收费6元,500克以上收费9元。
  • 分析:这是一个选择问题,快递员一句信件的重量W值选择收取的费用C,用数学表达式如下:
  • c=6 当w<=500
  • c=9 当w<500
程序如下:
                #include<iostream>
                using namespace std;
                int main() {
                    int c;          //定义变量
                    float w;        //定义变量
                    cout << "w=";   //提示输入
                    cin >> w;       //读入快件重量
                    if (w <= 500) c = 6;//如果w<=500,收费6元
                    else c = 9;         //否则收费9元
                    cout << "c=" << c << endl;
                    return 0;
                }
            
上述问题中用了if……else……语句,表示依据信件的重量w值,选择如何求费用c的值,对于选择问题,依据的条件是问题的关键,那么,如何表示条件?if……else……能解决怎样的问题?为了回答这些问题 ,我们将学习c++中的if语句和关系表达式。

3.1.1if语句格式

  • 格式1:
  • if(表达式) 语句
  • 功能:当条件成立即表达式的值为真时,执行语句,否则执行if语句后面的语句。执行流程图如下图所示:
  • if语句流程图
【例3.2】读入一个整数,输出该数,如果是负数,在输出该数之前加个提示"注意负数!"。
  • 分析:对于负数需要输出“注意负数!”的提示。设n存放读入的数,当n<0时,先输出“注意负数!”再输出n的值,否则直接输出n的值!
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main(){
                        int n;//定义变量n
                        cout<<"n=";//提示输入n的值
                        cin>>n; //读入n的值
                        if (n<0)//判断n是否为负数
                        cout<<"注意负数!"<<endl;//输出注意负数
                        cout<<n<<endl; //输出n的值
                        return 0;
                    }
                
说明:程序中的第7行,在写条件时,条件要加括号,第8行是满足条件要执行的语句,第9行是正常执行的语句。
  • 格式2:
  • if(表达式)
  • 语句1
  • else
  • 语句2
  • 功能:当条件成立即表达式的值为真时,执行语句1,否则执行语句2。执行流程图如下图所示:
  • if语句流程图
【例3.3】读入一个整数并判定该数是奇数还是偶数。
  • 分析:一个数如果是偶数,那么该数除以2的余数为0。设n存放读入的整数,那么n%2为0则n为偶数,否则为奇数
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main(){
                        int n;//定义变量
                        cin>>n;//读入变量n的值
                        if(n%2==0)//判断n除以2的余数是否为0
                        cout<<n<<"是偶数"<<endl;
                        else
                        cout<<n<<"是奇数"<<endl;
                        return 0;
                    }
                
说明: 程序第6行表示判断n除以2的余数是否等于0.特别注意,条件中的是否等于的书写是“==”而不是“=”,条件书写时要加括号“()“第7行是条件成立时执行的语句,第9行是条件不成立时执行的语句。
【例3.4】星星音乐社团招收社员,依据音乐成绩发放不同的广告,音乐成绩不高于80分的同学发的广告单内容是“欢迎你参加音乐社”,其他同学发的广告单内容是“非常欢迎你参加音乐社”。
方法一:打印广告单时,可以这么考虑,依据输入的音乐成绩M,当M>=80时,打印“非常欢迎你参加音乐社”,否则打印“欢迎你参加音乐社”。
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main(){
                        int m;//定义变量
                        cout<<"m=";//提示输入m的值
                        cin>>m;//读入音乐成绩
                        if (m>=80)//根据成绩打印不同的广告
                        cout<<"非常欢迎你参加音乐社";
                        else
                        cout<<"欢迎你参加音乐社" ;
                        return 0;
                }
                
方法二:也可以这么考虑,我们在分析广告词的特点时发现,音乐成绩大于等于80分的人的广告词比其他人多了“非常”两个字,所以我们只要再答应“欢迎你参加音乐社”之前判断要不要打印“非常”两个字即可。
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main(){
                        int m;//定义变量
                        cout<<"m=";//提示输入m的值
                        cin>>m;//读入音乐成绩
                        if (m>=80)//根据成绩打印不同的广告
                        coutt<<"非常";
                        coutt<<"欢迎你参加音乐社" ;
                }
                
思考:对于同一个条件,方法一有两个分支,方法二只有一个分支,请思考他们的区别

3.1.2关系表达式

  • 选择结构(分支结构)问题的关键点是选择条件的描述,即if语句中(表达式)的具体表达
  • 在前面的例子中,我们很自然的用了数学中的比较运算符描述if语句中的条件。接下来我们看看在c++中怎么表示数学中的关系运算符,常用比较(关系)运算符如下:
  • 等于不等于大于小于大于等于小于等于
    ==!=><>=<=
  • 比较运算符优先级:我们需要注意在比较运算符中他们的优先级不是完全一样的,大于、大于等于、小于、小于等于的优先级是一样的,等于和不等于的优先级是一样的,但是前面四个的优先级高于后面两个的优先级。
  • 用关系运算符将两个表达式连接起来的式子叫关系表达式,其中被关系运算符连接的两个式子可以是算术表达式,也可以是关系表达式、逻辑表达式、赋值表达式、字符表达式。
  • 关系表达式的值是一个逻辑值,即“真”或“假”,如果为“真“则表示条件成立,如果为”假“则表示条件不成立。例如,关系表达式”1==3“的值为”假“,“3>=0”的值为”真“。在c++中用数值1代表”真“,用0代表”假“。
【例3.5】设a=5,b=6,c==7。写出下面关系表达式的值。
关系表达式分析
a>b0a不大于b,所以条件不成立,值为0(假)
a+b>b+c0a+b=11,b+c=13,所以条件不成立,值为0(假)
(a==3)>=(b==5)1因为(a==3)和(b==5)都不成立,他们的值都为0,所以条件成立,值为1(真)
'a'<'b'1因为'a'的ASCII值为97,'b'的ASCII码值为98,所以条件成立,值为1(真)
(a>b)>(b<c)0因为>b的值为0,b<c的值为1,所以条件不成立,值为0(假)
【例3.6】为了学生的卫生安全,学校给每个住宿生配一个水杯,每只水杯3元,大洋商城打八八折,百汇商厦买八送一,输入学校想要买水杯的数量,请你当参谋算一算:到哪家购买比较划算?输出商家的名称。
  • 分析:设变量cup存放的是需要购买水杯的数量,变量a为到大洋商城购买需要的费用,变量b为到百汇商厦购买需要的费用。那么;
  • a=cup*3*0.88
  • b=(cup-cup/8)*3
  • 在求b的过程中,cup/8表示的是cup除以8的商,也就是送的杯子的数量,即买八送一。
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main(){
                        int cup;//定义变量
                        float a,b;
                        cout<<"cup=";//提示输入购买水杯的数量
                        cin>>cup;//输入水杯的购买数量
                        a=cup*3*0.88;//大洋商城购买水杯的费用
                        b=(cup-cup/8)*3; //百汇商厦购买水杯的费用
                        if(a<b) cout<<"大洋商城"<<endl;//比较a和b的值输出商家
                        else cout<<"百汇商厦"<<endl;
                    }
                
说明: 问题中的关系表达式是到两商场购买杯子的费用比较,为了方便关系式的书写,程序中第8、9、10行采用先求出购买费用,再进行比较的方法。当需要比较的表达式比较复杂时,问题提供了比较好的解决方式
【例3.7】 学校开发了一片区域准备种果树,依据校友捐款选择树种,如果捐款少于10万,只种梨树,每棵梨树500元;捐款大于等于10万,30%用于种梨树,50%用于种桃树,每颗桃树600元, 20%用于种苹果树,每棵苹果树800元。现在请你根据输入的捐款数额,输出每种果树各种多少颗?
  • 分析:设变量money存放读入的款款数额,如果money少于10万,求种梨树数量并输出,如果money大于等于10万,求出各种果树的数量并输出。
  • a=cup*3*0.88
  • b=(cup-cup/8)*3
  • 在求b的过程中,cup/8表示的是cup除以8的商,也就是送的杯子的数量,即买八送一。
程序如下:
                    #include<iostream>
                    #include<cmath>
                    using namespace std;
                    int main() {
                        int money; //定义变量
                        cout << "money="; //提示输入
                        cin >> money; //输入捐款数额
                        if (money < 100000) cout << "梨树=" << floor(money / 500) << "棵" << endl;
                        else {
                          cout << "梨树=" << floor(money * 0.3 / 500) << "棵" << endl;
                          cout << "桃树=" << floor(money * 0.5 / 600) << "棵" << endl;
                          cout << "苹果树=" << floor(money * 0.2 / 800) << "棵" << endl;
                        }
                        return 0;
                      }
                
说明: 当if或者else有多条语句时,如程序中的第10、11、12行都是属于else这个分支下执行的语句,要用“{}”括起来,将几条语句组合成复合语句;程序中的floor函数是c++中 的向下取整函数,该函数在“cmath"库中,因此需要引入”cmath“库,floor(3.2)的值是3。
练习题