C++语言篇 第三章 选择结构

  前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。
  但是对于很多情况,顺序结构的代码是远远不够的,比如一个游戏限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。

 

第一节  if选择结构

 

一、if语句(单分支结构)

 

格式1:

        if  (条件表达式)         语句1;
 
功能:如果条件表达式的值为真,即条件成立,语句1将被执行。否则,语句1将被忽略(不被执行),程序将按顺序从整个选择结构之后的下一条语句继续执行。
 
说明:格式中的“条件表达式”必须用圆括号括起来。
 
执行流程如下图所示  :  
 
 
例3.1  读入一个整数a,若这个数为偶数在屏幕上输出yes
 
#include<iostream>
using namespace std;
int main()
{  int a;
   cin>>a;
   if(a%2==0)  cout<<"yes"<<endl;  //关系运算符==用来表达该符号的左右两边是否相等,不要写成赋值号=。
   return 0;
}

思考:如果改成为奇数在屏幕上输出NO,该如何改程序。

 
 
例3.2  读入一个数,若这个数大于1并且小于100,则输出yes。
 
#include<iostream>
using namespace std;
int main()
{  int a;
   cin>>a;
   if (a>1 && a<100)   cout<<"yes";
   return 0;
}

  

格式2 :

    if  (条件表达式)  
    {
      语句1;
      语句2;
      ……
     }   
 
 
功能:若条件成立时,则按顺序执行花括号内的多个句子,花括号{ }内的多个语子,称为语句块或复合语句。      
 
说明:书写语句块时,左右花括号要对齐,组成语句块的各语句要相对花括号缩进一层并对齐。
 
 
例3.3  读入a,b,按从小到大顺序输出
#include<bits/stdc++.h>
using namespace std;
int main ( )
{  float a,b,c;
   cin>>a>>b;
   if (a>b)
   {  c=a;
      a=b;
      b=c;	  
   }  
   cout<<"a="<<a<<" b="<<b; 
   return 0;
}

 

二、if-else语句(双分支结构)

格式1:

         if  (条件表达式)       语句1;

         else                        语句2;

功能:如果(条件表达式)的值为“真” ,即条件成立,则执行语句1。执行完“语句1”后,继续执行整个if-else语句的后继语句; 

           如果(条件表达式)的值为“假” ,即条件不成立,则跳过语句1选择执行“语句2” 。执行完语句2后,继续执行整个if-else语句的后继语句;

           也就是说if-else语句总是根据(条件表达式)的结果,选择“语句1”和“语句2”中的一个执行,执行完以后,整个if-else就算执行完了。

注意:语句1和语句2后面都要写分号 “;” 。

例3.4  根据用户输入的成绩,判断是否通过了考试。
#include<bits/stdc++.h>
using namespace std;
int main()
{ int c;
  cin >> c;
  if (c>=60) cout<<"pass! \n";   //语句1 句尾要写分号
  else       cout<<"sorry!\n";   //语句2 句尾要写分号
}

格式2 :

if  (条件表达式)   { 语句1;   语句2;   ……    }

else                    {  语句1;   语句2; ……      }

说明:若分支语句由多个句子构成,我们必须把这些句子括在一对花括号{ }内。

 

练习:用双分支语句 if  ---  else编写:  读入a,b,按从小到大顺序输出。

 

三   if语句的嵌套

在if语句中又可包含一个或多个if 语句,这种形式称为if语句的嵌套。
 
一般形式如下:        
       if(条件表达式)            
             if(条件表达式)      {语句1}    ;
             else                          {语句2}    ;      
      else              
            if(条件表达式)       {语句1}   ;
            else                           {语句2}   ;
 
注意: if 与else的配对关系,else 总是与其前面最近的尚未配对的if结合
 
如果if与else的数目不一样,为实现程序设计者的企图,可以加花括弧来确定配对关系。
例如:        
       if(条件表达式)
                  {if(条件表达式) 语句1 };
       else     语句2          ;
 
如果没有花括号,else与第二个if配对,这人例子里的花括号“{ }”限定了内嵌if 语句的范围,因此else与第一个if配对。
 
例3.7
#include<bits/stdc++.h>
using namespace std;
int main ()
{ int n;
  cin>>n;
  if (n>6)
  if (n<12)  cout<<"6<n<12";
  else       cout<<"n<=6";
}

输入3    输出:

输入7   输出:

输入15    输出:

 

若想让else部分与第一个if语句配对,则要引入一个复合语句,将上述语句写成如下形式:

#include<bits/stdc++.h>
using namespace std;
int main ()
{ int n;
  cin>>n;
  if (n>6)
  {  if (n<12)  cout<<"6<n<12";}
  else       cout<<"n<=6";
}

输入3    输出:

输入7   输出:

输入15    输出:

 

 

第二节   switch语句(多分支条件语句)

条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程 序结构会显得复杂,其至凌乱。为方便实现多情况选择,C++ 提供了一种switch开关语句。

语句格式:  

switch(表达式)  

{ case  常量表达式1:     语句序列1;     break;

  case  常量表达式2:     语句序列2;     break;

  ……

  case  常量表达式n:     语句序列n;     break;

  default:                             语句序列n+1;  

}            

说明:

1、该语句中可以使用一次或多次case标号,但只能使用一次default标号,或者省略整个default部分;

2、多个case标号也允许使用在同一个语句序列的前面;

3、每个语句标号有保留字case和后面的常量表达式及冒号组成,每个常量表达式通常为常数或字符。

执行过程:

1、先计算出switch后面圆括号内表达式的值。假定这,若它不是整型,系统会自动舍去其小数部分,只取整数部分作为结果值。

2、依次计算出每个case后常量表达式的值。假定它们为M1、M2、…,同样若它们的值不是整型,则自动转换为整型。

3、让M依次同M1、M2、…进行比较。一旦遇到M与某个值相等,则就从对应标号的语句开始执行;在碰不到相等的情况下,若存在default子句,则就执行其冒号后面的语句序列,否则不执行任何操作;

4、当执行到复合语句最后的右花括号时就结束整个switch语句的执行。

注意:

1、case语句后的各常量表达式的值不能相同,否则会出现错误码。

2、每个case或default后,可以包含多条语句,不需要用“{”和“}”括起来。

3、各case和default子句先后顺序可以变动,这不会影响程序执行结果。

4、每一条case语句后要用break语句中断。如果case语句后没有break语句,则程序运行完成当前case语句后,继续运行下一条case语句。

5、default子句可以省略,default后面的语句末尾可以不必写break。

6、程序设计风格提示:写switch语句时,switch(表达式)单独一行,各case分支和default分支要缩进两格并对齐,分支处理语句要相对再缩进两格,以体现不同层次的结构。

例3.8  根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。

#include<iostream>
using namespace std;
int main()
{   int weekday;
    cin>>weekday;
    switch(weekday)
    {   case 1:cout<<"Monday"<<endl;   break;
        case 2:cout<<"Tuesday"<<endl;  break;
        case 3:cout<<"Wednesday"<<endl;break;
        case 4:cout<<"Thursday"<<endl; break;
        case 5:cout<<"Friday"<<endl;   break;
        case 6:cout<<"Saturday"<<endl; break;
        case 7:cout<<"Sunday"<<endl;   break;
        default:cout<<"input  error!";
    }    
}

例3.9:计算器程序,编程设计一个简单的计算器程序,要求根据用户从键盘输入如下形式的表达式:

操作数1    运算符op    操作数2

然后,计算并输出表达式的值

指定的运算符为     加(+)     减(-)     乘(*)     除(/)

#include<iostream>
using namespace std;
int main()
{  int data1, data2;                                                /*定义两个操作符*/
   char op;                                                         /*定义运算符*/
   printf("Please enter the expression:");
   scanf("%d%c%d",&data1,&op,&data2);                               /*输入运算表达式*/
   switch (op) 
   { case '+':printf("%d + %d = %d\n",data1,data2,data1+data2);break;/*处理加法*/
     case '-':printf("%d - %d = %d\n",data1,data2,data1-data2);break;/*处理减法*/
     case '*':printf("%d * %d = %d\n",data1,data2,data1*data2);break;/*处理乘法*/
     case '/':if(0==data2) printf("Division by zero!\n");
              else         printf("%d/%d = %d\n",data1,data2,data1/data2); 
              break;                                                 /*处理除法*/
     default: printf("Unknown operator! \n");
	}
}

例3.10  期末来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。

【分析】

        对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为x div 4支。由于小q要把钱用完,故我们可以按以下方法将钱用完:

        若买完x div 4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完x div 4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;

        若买完x div 4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。

        从以上对买笔方案的调整,可以看出笔的数目都是x div 4,因此该方案的确为最优方案。

#include<iostream>
using namespace std;
int main()
{   int a,b,c,x,y;  //a,b,c分别表示在买笔方案中,6元、5元和4元钱笔的数目,x,y分别表示剩余班费和买完最多的4元笔后剩的钱
    cin>>x;         //输入x
    c=x/4;          //4元笔最多买的数目
    y=x%4;          //求买完c支4元笔后剩余的钱数y
    switch (y)      //判断购买方案
    { case 0: a=0; b=0;       break;
      case 1: a=0; b=1; c--;  break;
      case 2: a=1; b=0; c--;  break;
      case 3: a=1; b=1; c-=2; break; 
    }
    cout<<a<<' '<<b<<' '<<c<<endl;     //三个数间以空格隔开
    return 0;
}

 

四、练习

1、在北大校园里,没有自行车,上课办事会很不方便.但实际上,并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间.假设找到自行车,开锁并骑上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米。请判断走不同的距离去办事,是骑车快还是走路快。

2、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 

3、一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

4、将字母'A','B','C','D'分别转换成1,2,3,4,其他的字符转换成5

5、编一个“念数字”的程序,它能让计算机完成以下工作:当你输入一个0至9之间的数后,计算机就会用汉字拼音印出这个数的念结束。

6、现在学生档案中经常采用等级评价,于是李老师想将百分制成绩转化为等级。
    李老师的成绩单上的成绩都是整数,他约定等级与百分制之间的对应关系如下:
     A:90~100     B:80~89    C:60~79    D:0~59
    请编程将任意给定的分数转化为等级。

7、移动的机器人
    在一个平面直角坐标系上,一个机器人处于某格点(x0,y0)处,格点的坐标均为整数。有一个遥控器可以让机器人实现7种可能的运动方式,它们依次是:
  1、向左走一个单位;
  2、向右走一个单位;
  3、向上走一个单位;
  4、向下走一个单位;
  5、走到格点(x0,y0)关于x轴的对称点;
  6、走到格点(x0,y0)关于y轴的对称点;
  7、走到格点(x0,y0)关于原点的对称点;

其中,以横坐标x值增大为向右,以纵坐标y值增大为向上。现已知机器人的初始位置(x0,y0)以及遥控器此次发出的指令编号i(1<=i<=9),问机器人执行指令后所到的位置。
输入:三个整数x0,y0,i,彼此之间用空格隔开。 
输出:两个整数x和y,即机器人移动后的坐标。 

8、学校超市里有三种笔,单价分别为6元、5元、4元,班长想用余下的班费(≥8)购买尽可能多的笔,同时他又不想有余钱,帮班长订出一种买笔方案,并输出每种笔的数目。  

9、 若a=true,b=false, x=7,y=12 ,m=3 ,n=35求下列布尔表达式的值。
     a and not (m>n) and (x<y-m) or a and b 

10、输入三个数,按由大到小的顺序打印出来这三个数。

11、输入一个三位数,将数字重新排列,组成一个尽可能大的三位数,打印出这个数。

12、输入三个数,判断它们是否可以组成一个三角形。

13、输入任意一个字符,判断其ASC码是否是奇数。若是输出‘YES’,否则输出‘NO’。

14、判断一个正整数是否是两位数(即大于等于10,且小于等于99)

15、判断一个数n能否同时被3和5整除。

16、输入三角形的三个边,判断它是何类型的三角形(等边,等腰,直角,普通,或不是三角形)

17、试编写一个根据随机产生两个操作数和随机产生一个运算符,由计算机输出运算结果的程序。这里只考虑加(+)、减(-)、乘(*)、除(/)四种运算。

18、答题游戏:
         计算机随机出题,你答题,并给出相应提示。
         两个操作数均为两位数,运算符为+、-、*、/,
         答对输出:You are so clever.答错输出:Sorry
样例输出格式如下:q
14+32=? 46
You are so clever
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值