第六课 条件控制语句

本文详细介绍了条件控制语句在C++编程中的使用,包括"如果…那么…"和"如果…那么…否则…"两种形式,并通过多个例题和思考题,展示了如何根据条件判断执行不同的代码块。例如,判断两个整数的大小、找出三个数中的最大值、商品打折规则以及学生分数等级等实际问题。此外,文章还强调了条件语句的嵌套使用、逻辑清晰以及注意点,帮助读者深入理解条件控制语句的运用。
摘要由CSDN通过智能技术生成

日常生活中我们常说“如果…那么(就)…”,比如“如果编程学得好,老爸就奖励
我一台笔记本电脑”。我们还常说“如果…那么(就)…否则(就)…”。如“如果明天
不下雨,我就去登山,否则就去图书馆”。
上面这样两种类型的句子都是条件判断语句,都是要根据条件的成立与否来决定是否
采取某种行动(动作)。
在计算机程序设计中也一样,经常需要进行条件判断,根据条件成立与否来选择要执
行的语句。下面举例说明。
引例:对任意给定的两个整数,输出较大的那个数。
分析:设用 a,b 表示这两个整数,在我们给定 a,b 之值后,就要判断 a 和 b 的大小,以
决定是输出 a 还是输出 b。程序如下:
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
if(a>b)cout<<a;
else cout<<b;
return 0;
}
当然,我们也可以这样来写程序:
#include<iostream>
using namespace std;
int main(){
int a,b,m;
cin>>a>>b;
m=a;
if(a<b)m=b;
cout<<m;
return 0;
}
从上面的两个程序中大家看到了条件判断语句的两种形式,下面具体介绍。
一、语句的两种形式
对应于“如果…那么…”和“如果…那么…否则…”两种句型,C++中的条件语句也
有两种形式:
1. 形式 1
if (条件) 语句 A;
2. 形式 2
if (条件) 语句 A;else 语句 B;
这两种形式的条件控制语句的执行流程可以用下图示意:
例如,要判断 x 是否为偶数,可以说“如果 x 除以 2 的余数为 0,则 x 为偶数“,写成
C++语句就是:
if (x%2==0) cout<<x<<” is even number.”;
其中,括号内的“x%2==0”就是判断条件,表达了 x 除以 2 的余数是否为 0 的意思。
其后是要执行的语句,当条件成立时,执行该语句。
程序的完整程序代码如下:
#include <iostream>
using namespace std;
int main(){
int x;
cin>>x;
if (x%2==0) cout<<x<<” is even number.”;
return 0;
}
如果把问题改成:对任意输入的自然数,判断它的奇偶性。若是奇数,输出“××× is
no yes yes 条

语句 A


语句 B 语句 A
odd number.”;若是偶数,则输出“××× is even number.”。其中“×××”代表输入的自
然数。则上面程序中的条件语句应该换成第二种形式:
if (x%2==0) cout<<x<<”is even number.”;
else cout<<x<<” is odd number.”;
思考:将两整数 a 和 b 中的较小者保存到变量 m 中,写出相应的条件控制语句。
二、使用注意事项
1、若条件成立要执行多条语句,这些语句必须用一对花括号“{}”括起来构成一个复
合语句(语句块),格式为:
if (条件){
语句 1;
语句 2;
……
语句 n;
}
对条件控制语句第二种形式 else 后的语句也有同样的要求。
例如,将两个整数 a,b 中的较大者保存在 a 中,较小者保存在 b 中,我们可以这样做:
if(a<b){
int t=a;
a=b;
b=t;
}
我们应该这样来理解上面的句子:a,b 中事先都有相应的值,但谁大谁小我们不知道。
所以这里判断一下,若 a 比 b 小的话,就将 a 和 b 的值互换一下;否则就不换。这样的话,
不管原来 a 和 b 的值如何,执行完这个条件控制语句后,a 的值一定是较大的一个,b 的值
为较小的一个。
2、条件控制语句中的条件有简单的条件,就是一个简单的判断,如"a<b";也有稍微
复杂点的,如"x%2==1";还有更为复杂些的,几个简单条件的复合判断。
例如,判断 a,b,c 三个整数中,a 是不是最大的一个,条件应该这样表达:a>=b&&a>=c
又如,判断成绩 x 是不是在 75 分与 90 分之间(包括 75 但不包括 90),条件应该这样
表达:75<=x&&x<90,不能写成:75<=x<90。
前面 C++运算符一节已详细介绍了 C++中的关系运算(比较运算)和逻辑运算。一个
关系运算就是一个简单条件;而一个逻辑运算就是一个复合条件。
3、条件控制语句还可以嵌套使用,即在条件控制语句中,条件成立时要执行的语句或
条件不成立时要执行的语句都可以是另一个条件控制语句。如:
1)if(a>b)if(b>c)m=c;
2)if(a>b)m=b;else if(b>c) m=c;
3)if(a>b)if(b>c)m=c;else m=b;
但在嵌套使用条件控制语句时,要注意程序执行的流程。
上面的句子 1)可以理解成:if(a>b&&b>c)m=c;
句子 2)中虽然有两个"if"、只有一个"else",但这个"else"毫无疑问是对其前面的条件
a>b 的否定,也就是说,在"a>b"这个条件不成立时执行"if(b>c) m=c;",这不会有疑问。
但语句 3)却不同,"else"的前面有两个"if",那么这个"else"是否定哪个条件的呢?
C++规定,"else"总是与其前面最近的一个尚未有"else"与之配对的"if"配合。
因此,语句 3)中"else"是对条件"b>c"的否定。如果要让这个"else"否定条件"a>b",应
该写成下列形式:
if(a>b){if(b>c) m=c;}else m=b;
用一对大括号把嵌套的"if(b>c) m=c;"括起来,这个"else"就是否定前面的那个条件"a>b" 了。
思考 1:看下面的程序段,在不同输入的情况下,给出它的输出。
cin>>a>>b>>c;
m=a;
if(a>b)if(b>c)m:=c
else m:=b;
cout<<m;
该程序段在执行之后,输入"3 2 1"、”3 1 2”、”2 3 1”,输出分别是什么吗?
思考 2:指出下面嵌套条件控制语句中的"else"与条件的匹配关系:
if(p==2*q)if(q==3*r)x=p+q+r;else if(r==4*p)x=r-q-p;else x=p*q*r;
提示:所这个条件语句改为下列形式:
if(p==2*q) if(q==3*r)x=p+q+r;
else if(r==4*p)x=r-q-p;
else x=p*q*r;
这样看是不是清楚多了?
三、例题
【例题 1】明明的压岁钱得之不不易,要由爸爸的打分 x 和妈妈的打分 y 综合决定。方
法是:如果 x≥80 且 y≥80,他可以得一个 A;如果 x≥80 但 y<80,他就得一个 B;若 x<80, 则不管 y 是多少,他就只能得 C 了。
编程任务,根据输入的爸妈的打分 x,y,输出明明所得的等级。
解:这样的问题,首先应理清思路,理好内部的逻辑关系。初学者很可能会如下表达:
int x,y;
cin>>x>>y;
if (x>=80&&y>=80) cout<<"A"<<endl;
if (x>=80&&y<80) cout<<"B"<<endl;
if (x<80) cout<<"C"<endl;
尽管这样写也能解决问题,但代码显得臃肿,判断多。有时还会因逻辑不清导致错误。
所以不建议同学们这样写。下面使用 if 语句的嵌套来表述:
#include<iostream>
using namespace std;
int main(){
int x,y;
cin>>x>>y;
if (x>=80)
if (y>=80) cout<<"A"<<endl;
else cout<<"B"<<endl; //与第 2 个 if 配对
else cout<<"C"<<endl;//与第 1 个 if 配对
return 0;
}
【例题 2】输入三个整数,输出其中的最大数。
解:用 x,y,z 分别代表这三个整数,我们可能会写出这样的代码段:
cin>>x>>y>>z;
if(x>=y&&x>=z)cout<<x;
if(y>=x&&y>=z)cout<<y;
if(z>=x&&z>=y)cout<<z;
但如果代码这样写,可能会有不正确的结果。如,如果输入的三个数有两个以上相同,
就会有重复输出,想想看,为什么?
我们也可能会这样表达:
if(x>=y&&x>=z)cout<<x;
else if(y>=x&&y>=z)cout<<y;
else cout<<z;
这种表达无疑是正确的。
下面的程序代码中又是另一种表达,大家注意体会。
#include <iostream>
using namespace std;
int main(){
int x,y,z,m;
cin>>x>>y>>z;
m=x;
if(m<y)m=y;
if(m<z)m=z;
cout<<m;
return 0;
}
大家看下,这个程序中找三个整数中的最大者,是不是有点像比武中的“打擂台”?这
里,m 是“擂台”,第一个数 x 站在台上,为“擂主”;y 先上台与“擂主”比,若 y>x,则
“擂主”换人变成 y,否则“擂主”不变仍为 x;然后,z 上台与“擂主”(注意,此时的
擂主可能为 x 也可能是 y),若 z 比“擂主”大,则“擂主”换为 z,否则仍为原“擂主”。
这样最后的“擂主”一定是三个数中的最大者。
“打擂台”法是从一批数据中找最值的最常用的方法,大家要熟记。
思考:输入四个整数,输出其中最大的那个数。尝试分别用上面的几种表达方式,哪
个表达方式更好?
【例题 3】商品优惠活动。
问题描述
某商场在搞优惠促销活动。规定:某商品一次购买 5 件以上(包括 5 件)、10 件以下
(不包含 10 件)打 9 折,一次购买 10 件以上(包含 10 件)打 8 折。
请你设计程序,根据客户购买的商品价格和购买数量,计算商品总价(客户应付款数),
保留两位小数输出。
输入样例 1
18.5 2
输出样例 1
37.0
输入样例 2
18.5 10
输出样例 2
148.00
解:用 price 表示商品价格,count 表示购买商品数量,discount 表示拆扣率,amount
表示客户应付款额(即题中总价)。根据题意,折扣与商品数量的关系如下:






 

 当 时
当 时
当 时
0.8 10
0.9 5 10
1 5
count
count
count
discount
总价计算:amount=price*count*discount。程序中我们根据输入的顾客购买数量,确定
相应的拆扣率 discount,然后根据该式计算总价。
参考程序如下:
#include<cstdio>
int main(){
int count;
float price,amount;
scanf(“%f%d”,&price,&count);
if(count<5)discount=1;
else if(count<10)discount=0.9;
else discount=0.8;
amount=price*count*discount;
printf(“%0.2f\n”,amount);
return 0;
}
【例题 4】给定一名学生的语文和数学成绩,判断他是否恰好有一门课不及格(成绩小
于 60 分为不及格)。输入的两门成绩均是 0 到 100 之间的整数。
输出规定:若该生恰好有一门课不及格,输出 1;否则输出 0。
如输入
50 80
则输出
1
解:设用 a,b 分别代表该同学的语文和数学成绩,恰好有一门不及格,有两种情况,一
青少年信息学奥林匹克竞赛
©程老师信息学奥赛课堂 58
种是 a<60 而 b>=60;另一种情况是 a>=60 而 b<60。所以很容易写出下列程序。
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
if (a<60&&b>=60||a>=60&&b<60) cout<<1;
else cout<<0;
return 0;
}
下面的程序是另一种表达方式,请同学们思考领会。
#include<iostream>
using namespace std;
int main()
{
int a,b,cnt=0;
cin>>a>>b;
if(a<60)cnt++;
if(b<60)cnt++;
if(cnt==1) cout<<1;
else cout<<0;
return 0;
}
【例题 5】苹果和虫子 2
描述
你买了一箱 n 个苹果,很不幸的是买了后箱子里混进了一条虫子。虫子每 x 小时能吃
掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过 y 小时,你还有多少
个完整的苹果?
输入
输入仅一行,包括 n,x 和 y(均为正整数)。
输出
输出也仅一行,剩下的苹果个数
样例输入
10 4 9
青少年信息学奥林匹克竞赛
©程老师信息学奥赛课堂 59
样例输出
7
解:虫子 x 小时吃一个苹果,y 小时能吃掉的完整苹果数为 y/x,若 y 除以 x 有余数,
还有一个苹果虫子正在吃,还没有吃完,完整苹果数还要减掉 1。我们这里还得注意另一种
特殊情况,那就是剩下的完整苹果数不可能小于零。
参考程序如下:
#include<iostream>
using namespace std;
int main(){
int n,x,y;
cin>>n>>x>>y;
n=n-y/x;
if (y%x) n--; //考虑没有吃完的苹果
if (n<0) n=0; //考虑剩下的苹果数不可能为负值
cout<<n<<endl;
return 0;
}
习题六
1、判断数的正负
描述
给定一个整数 N,判断其是正数还是负数。
输入
一个整数 N(-10^9 <= N <= 10^9)。
输出
如果 N > 0, 输出 positive;
如果 N = 0, 输出 zero;
如果 N < 0, 输出 negative
样例输入
18
样例输出
青少年信息学奥林匹克竞赛
©程老师信息学奥赛课堂 60
positive
2、奇偶 ASCII 值判断
描述
任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO
例如,字符 A 的 ASCII 值是 65,则输出 YES,若输入字符 B(ASCII 值是 66),则输
出 NO。
输入
输入一个字符
输出
如果其 ASCII 值为奇数,则输出 YES,否则,输出 NO
样例输入
A
样例输出
YES
3、判断是否为两位数
描述
判断一个正整数是否是两位数(即大于等于 10 且小于等于 99)。
输入
一个正整数,不超过 1000。
输出
一行。若该正整数是两位数,输出 1,否则输出 0。
样例输入
54
样例输出
1
4、收集瓶盖赢大奖
描述
某饮料公司最近推出了一个“收集瓶盖赢大奖”的活动:如果你拥有 10 个印有“幸运”、
或 20 个印有“鼓励”的瓶盖,就可以兑换一个神秘大奖。
现分别给出你拥有的印有“幸运”和“鼓励”的瓶盖数,判断是否可以去兑换大奖。
青少年信息学奥林匹克竞赛
©程老师信息学奥赛课堂 61
输入
一行,包含两个整数,分别是印有“幸运”和“鼓励”的瓶盖数,用一个空格隔开。
输出
一行。若可以兑换大奖,输出 1,否则输出 0。
样例输入
11 19
样例输出
1
5、判断能否被 3,5,7 整除
描述
给定一个整数,判断它能否被 3,5,7 整除,并输出以下信息:
1)能同时被 3,5,7 整除,直接输出 3 5 7,每个数中间一个空格。
2)只能被其中两个数整除,输出这两个数,小的在前,大的在后。例如:3 5 或者 3 7
或者 5 7,中间用空格分隔。
3)只能被其中一个数整除,输出这个除数。
4)不能被任何数整除,输出小写字符‘n’,不包括单引号。
输入
输入一行,包括一个整数。
输出
输出一行,按照描述要求给出整数被 3,5,7 整除的情况。
样例输入
105
样例输出
3 5 7
6、计算邮资
描述
根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在 1000 克以内(包括
1000 克), 基本费 8 元。超过 1000 克的部分,每 500 克加收超重费 4 元,不足 500 克部分
按 500 克计算;如果用户选择加急,多收 5 元。
输入
输入一行,包含一个整数和一个字符,以一个空格分开,分别表示包裹重量(单位为
青少年信息学奥林匹克竞赛
©程老师信息学奥赛课堂 62
克)和是否加急。如果字符是‘y’,说明选择加急;如果字符是‘n’,说明不加急。
输出
输出一行,包含一个整数,表示邮费。
样例输入
1200 y
样例输出
17
7、三角形判断
描述
给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。
输入
一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开。
输出
如果能构成三角形,则输出“yes” ,否则输出“no”。
样例输入
3 4 5
样例输出
yes
8、判断闰年
描述
判断某年是否是闰年。
输入
输入只有一行,包含一个整数 a(0 < a < 3000)
输出
一行,如果公元 a 年是闰年输出 Y,否则输出 N
样例输入
2006
样例输出
N
青少年信息学奥林匹克竞赛
©程老师信息学奥赛课堂 63
9、点和正方形的关系
描述
有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,
1),x 是横轴,y 是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正
方形边界)。
输入
输入一行,包括两个整数 x、y,以一个空格分开,表示坐标(x,y)。
输出
输出一行,如果点在正方形内,则输出 yes,否则输出 no。
样例输入
1 1
样例输出
yes
10、简单计算器
描述
一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况,数据
和运算结果不会超过 int 表示的范围。
输入
输入只有一行,共有三个参数,其中第 1、第 2 参数为整数,第 3 参数为操作符(+,-,*,/)。
输出
输出只有一行,一个整数,为运算结果。然而:
1)如果出现除数为 0 的情况,则输出:Divided by zero!
2)如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!
输入样例
1 2 +
输出样例
3

未带完续......

想看的更快的,可以点这里:传送门下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值