如果if语句中的“内嵌语句”(即语句1或语句2)也是if语句,就构成了“嵌套if语句”。
嵌套的基本格式
嵌套if语句有2种形式:
- 嵌套在else分支中,格式如下:
if (表达式1) 语句1;
else if (表达式2) 语句2;
else if …
else语句n; - 嵌套在if分支中,格式如下:
if (表达式1){
if (表达式2) 语句1;
else 语句2 ;
}
else 语句3;
配对原则
C++规定:在嵌套if语句中,if和else按照“就近配对”的原则配对,即相距最近且还没有配对的一对if和else首先配对。
试分析下面的2组语句有何区别?
//语句1:
if(n%3==0)
if(n%5==0) cout<<n<<″是15的倍数″<<endl;
else cout<<n<<″是3的倍数但不是5的倍数<<endl; //else与第二个if配对
//语句2:
if(n%3==0){
if(n%5==0) cout<<n<<″是15的倍数″<<endl;
}
else cout<< n <<″不是3的倍数″; //else与第一个if配对
两个语句的差别虽然仅在于一对“{}”,但逻辑关系却完全不同。
关于if嵌套语句的几点说明:
- if语句用于解决二分支的问题,嵌套if语句则可以解决多分支问题。
- 2种嵌套形式各有特点,应用时注意区别,考虑一下是否可以互相替换。
- 由上述2个语句可以看出:if中嵌套的形式较容易产生逻辑错误,而else中嵌套的形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用在else分支中嵌套的形式。
应用举例
【例2.6】用嵌套if语句完成改写【例2.5】, 求三个整数中的最大值。
#include <iostream>
using namespace std;
int main(){
int a, b, c, max;
cout<<"输入三个整数:";
cin>>a>>b>>c;
if(a>b&&a>c) max=a;
else if(b>a&&b>c) max=b;
else max=c;
cout<<"最大数为:max="<<max<<endl;
return 0;
}
【例2.7】某商场优惠活动规定,某商品一次购买5件以上(包含5件)10件以下(不包含10件)打9折,一次购买10件以上(包含10件)打8折。设计程序根据单价和客户的购买量计算总价。
#include <iostream>
using namespace std;
int main(){
float price,discount,amount; //单价、折扣、总价
int count; //购买件数
cout<<"输入单价:"<<endl;
cin>>price;
cout<<"输入购买件数:"<<endl;
cin>>count;
if(count<5) discount=1;
else if(count<10) discount=0.9;
else discount=0.8;
amount=price*count*discount;
cout<<"单价:"<< price<<endl;
cout<<"购买件数:"<<count<<"/t/t"<<"折扣:"<<discount<<endl;
cout<<"总价:"<<amount<<endl;
return 0;
}
【例2.8】求一元二次方程ax2+bx+c=0的根。系数a(a≠0)、b、c由键盘输入。
#include <iostream>
#include <cmath>
using namespace std;
int main(){
float a,b,c;
float delta,x1,x2;
cout<<"输入三个系数a(a!=0), b, c:"<<endl;
cin>>a>>b>>c;
cout<<"a="<<a<<'/t'<<"b="<<b<<'/t'<<"c="<<c<<endl;
delta=b*b-4*a*c;
if(delta==0){
cout<<"方程有两个相同实根:";
cout<<"x1=x2="<<-b/(2*a)<<endl;
}
else if(delta>0){
delta=sqrt(delta);
x1=(-b+delta)/(2*a);
x2=(-b-delta)/(2*a);
cout<<"方程有两个不同实根:";
cout<<"x1="<<x1<<'/t'<<"x2="<<x2<<endl;
}
else cout<<"方程无实根!"<<endl;//delta<0
return 0;
}