“小朋友们,让我们通过一系列实验来掌握if语句和双分支语句的基本用法,”我说,”通过这些实验,你们将学会如何使用条件判断来解决各种实际问题。”
10.2.1 基本比较运算
实验一:两个数比大小
题目描述:有A,B两个数,请将其中较大数打印出来。
样例输入:
5 3
样例输出:
5
代码实现:
// 方法一:使用第三个变量存储较大值
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量a和b
cin >> a >> b; // 输入两个整数
int c = a; // 先假设a较大,将a的值赋给c
if(b > a){ // 判断b是否大于a
c = b; // 如果b更大,则更新c的值为b
}
cout << c; // 输出较大的数
return 0;
}
// 方法二:使用swap函数交换
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量a和b
cin >> a >> b; // 输入两个整数
if(a < b){ // 判断a是否小于b
swap(a, b); // 如果a小于b,交换a和b的值
// 相当于 int t=a; a=b; b=t;
}
cout << a; // 输出a(此时a已经是较大的数)
return 0;
}
// 方法三:提前返回
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量a和b
cin >> a >> b; // 输入两个整数
if(a > b){ // 判断a是否大于b
cout << a; // 如果a更大,则输出a
return 0; // 结束程序
}
cout << b; // 如果a不大于b,则输出b
return 0;
}
// 方法四:使用两个独立的if语句
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量a和b
cin >> a >> b; // 输入两个整数
int c; // 定义变量c存储较大的数
if(a > b){ // 判断a是否大于b
c = a; // 如果a更大,则c等于a
}
if(b > a){ // 判断b是否大于a
c = b; // 如果b更大,则c等于b
}
cout << c; // 输出较大的数
return 0;
}
// 方法五:使用if-else语句
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量a和b
cin >> a >> b; // 输入两个整数
int c; // 定义变量c存储较大的数
if(a > b){ // 判断a是否大于b
c = a; // 如果a更大,则c等于a
}else{ // 否则(a不大于b)
c = b; // c等于b
}
cout << c; // 输出较大的数
return 0;
}
// 方法六:使用max函数
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量a和b
cin >> a >> b; // 输入两个整数
int c = max(a, b); // 使用max函数找出a和b中的较大值
cout << c; // 输出较大的数
return 0;
}
思考:
- 方法一使用了一个额外的变量c来存储最大值,初始设为a,如果b更大则更新
- 方法二通过swap函数将较大的数交换到a,然后输出a
- 方法三通过提前返回避免了额外的变量,如果a大则直接输出a并结束程序
- 方法四使用两个独立的if语句,但若a等于b则c没有赋值,可能导致错误
- 方法五使用if-else结构,保证了无论a和b的关系如何,c都会有值
- 方法六使用了C++标准库中的max函数,代码最简洁
实验二:十位大还是个位大
题目描述:请从键盘读入一个两位数,计算一下,这个两位数的十位和个位,哪一位更大,输出更大的那一位。
样例输入:
73
样例输出:
7
代码实现:
// 方法一:使用变量存储最大值
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n
cin >> n; // 输入一个两位数
int g = n % 10; // 计算个位数(除以10的余数)
int s = n / 10; // 计算十位数(整除10的结果)
int m = g; // 先假设个位数更大
if(s > g){ // 判断十位是否大于个位
m = s; // 如果十位更大,则更新m的值
}
cout << m; // 输出较大的数位
return 0;
}
// 方法二:提前返回
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n
cin >> n; // 输入一个两位数
int g = n % 10; // 计算个位数
int s = n / 10; // 计算十位数
if(g > s){ // 判断个位是否大于十位
cout << g; // 如果个位更大,则输出个位
return 0; // 结束程序
}
cout << s; // 如果十位不小于个位,则输出十位
return 0;
}
// 方法三:使用两个独立的if语句
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n
cin >> n; // 输入一个两位数
int g = n % 10; // 计算个位数
int s = n / 10; // 计算十位数
if(g > s){ // 判断个位是否大于十位
cout << g; // 如果个位更大,则输出个位
}
if(g <= s){ // 判断个位是否小于等于十位
cout << s; // 如果个位小于等于十位,则输出十位
}
return 0;
}
// 方法四:使用if-else语句
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n
cin >> n; // 输入一个两位数
int g = n % 10; // 计算个位数
int s = n / 10; // 计算十位数
if(g < s){ // 判断个位是否小于十位
cout << s; // 如果十位更大,则输出十位
}else{ // 否则(个位大于等于十位)
cout << g; // 输出个位
}
return 0;
}
// 方法五:使用max函数
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n
cin >> n; // 输入一个两位数
cout << max(n % 10, n / 10); // 使用max函数比较个位和十位,并输出较大的数位
return 0;
}
思考:
- 方法一使用变量m存储最大值,初始设为个位,如果十位更大则更新
- 方法二使用提前返回,如果个位大则直接输出个位并结束程序
- 方法三使用两个独立的if语句,确保了两种情况都能处理
- 方法四使用if-else结构,确保只有一个分支被执行
- 方法五使用max函数直接在输出语句中进行比较,代码最简洁
- 所有方法都使用了n%10获取个位,n/10获取十位
10.2.2 实际应用问题
实验三:打电话
题目描述:超市有一门公共电话,收费标准是,如果通话时间在10分钟内,那么按照1.5元/分钟收费,如果通话时间超过10分钟(含10分钟)按照1.2元/分钟收费。请编程从键盘读入一个整数n,代表通话时间,按照要求计算出应付金额是多少?(计算结果保留1位小数)。
样例输入:
15
样例输出:
18.0
代码实现:
// 方法一:C语言风格
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int n; // 定义整数变量n表示通话时间
//cin >> n;
scanf("%d", &n); // 输入通话时间(分钟)
double f; // 定义浮点数变量f表示费用
f = n * 1.5; // 先按1.5元/分钟计算费用
if(n >= 10){ // 判断通话时间是否大于等于10分钟
f = n * 1.2; // 如果是,则按1.2元/分钟重新计算
}
//cout << fixed << setprecision(1) << f;
printf("%.1f", f); // 输出费用,保留1位小数
return 0;
}
// 方法二:使用变量存储费率
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n; // 定义整数变量n表示通话时间
cin >> n; // 输入通话时间(分钟)
double d = 1.5; // 默认费率为1.5元/分钟
if(n >= 10){ // 判断通话时间是否大于等于10分钟
d = 1.2; // 如果是,则费率为1.2元/分钟
}
double f = n * d; // 计算总费用
cout << fixed << setprecision(1) << f; // 输出费用,保留1位小数
return 0;
}
// 方法三:提前返回
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n; // 定义整数变量n表示通话时间
cin >> n; // 输入通话时间(分钟)
double f; // 定义浮点数变量f表示费用
if(n >= 10){ // 判断通话时间是否大于等于10分钟
f = n * 1.2; // 如果是,则按1.2元/分钟计算
cout << fixed << setprecision(1) << f; // 输出费用,保留1位小数
return 0; // 结束程序
}
f = n * 1.5; // 如果通话时间小于10分钟,则按1.5元/分钟计算
cout << fixed << setprecision(1) << f; // 输出费用,保留1位小数
return 0;
}
// 方法四:使用两个独立的if语句
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n; // 定义整数变量n表示通话时间
cin >> n; // 输入通话时间(分钟)
double d; // 定义浮点数变量d表示费率
if(n < 10){ // 判断通话时间是否小于10分钟
d = 1.5; // 如果是,则费率为1.5元/分钟
}
if(n >= 10){ // 判断通话时间是否大于等于10分钟
d = 1.2; // 如果是,则费率为1.2元/分钟
}
double f = n * d; // 计算总费用
cout << fixed << setprecision(1) << f; // 输出费用,保留1位小数
return 0;
}
// 方法五:使用if-else语句
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n; // 定义整数变量n表示通话时间
cin >> n; // 输入通话时间(分钟)
double d; // 定义浮点数变量d表示费率
if(n >= 10){ // 判断通话时间是否大于等于10分钟
d = 1.2; // 如果是,则费率为1.2元/分钟
}else{ // 否则(通话时间小于10分钟)
d = 1.5; // 费率为1.5元/分钟
}
double f = n * d; // 计算总费用
cout << fixed << setprecision(1) << f; // 输出费用,保留1位小数
return 0;
}
思考:
- 方法一使用C语言风格的输入输出函数,具有良好的兼容性
- 方法二引入了变量d存储费率,根据条件设置不同的费率后再计算
- 方法三使用提前返回,直接在if块中计算并输出结果
- 方法四使用两个独立的if语句设置费率,适合初学者理解
- 方法五使用if-else结构确保只有一个分支被执行,逻辑更清晰
- 所有方法都需要处理浮点数输出格式,保留1位小数
实验四:打折问题
题目描述:小明在超市购买了3个商品,今天超市的活动是超过100的部分可以打八折,请计算小明需要付多少钱(保留两位小数)。
样例输入:
50 30 40
样例输出:
116.00
代码实现:
// 方法一:直接计算
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int a, b, c; // 定义三个整数变量表示商品价格
cin >> a >> b >> c; // 输入三个商品价格
double sum = a + b + c; // 计算商品总价
if(sum > 100){ // 判断总价是否超过100
sum = 100 + (sum - 100) * 0.8; // 如果超过100,则超过部分打八折
}
cout << fixed << setprecision(2) << sum; // 输出总价,保留两位小数
return 0;
}
// 方法二:使用C语言风格
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int a, b, c; // 定义三个整数变量表示商品价格
scanf("%d%d%d", &a, &b, &c); // 输入三个商品价格
int sum = a + b + c; // 计算商品总价
if(sum > 100){ // 判断总价是否超过100
double result = 100 + (sum - 100) * 0.8; // 如果超过100,则超过部分打八折
printf("%.2f", result); // 输出打折后的总价,保留两位小数
return 0; // 结束程序
}
printf("%.2f", sum * 1.0); // 如果不超过100,则输出原价,保留两位小数
return 0;
}
// 方法三:使用两个独立的if语句
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int a, b, c; // 定义三个整数变量表示商品价格
cin >> a >> b >> c; // 输入三个商品价格
double sum; // 定义浮点数变量sum表示总价
if((a + b + c) <= 100){ // 判断总价是否不超过100
sum = a + b + c; // 如果不超过100,则总价不变
}
if((a + b + c) > 100){ // 判断总价是否超过100
sum = 100 + ((a + b + c) - 100) * 0.8; // 如果超过100,则超过部分打八折
}
cout << fixed << setprecision(2) << sum; // 输出总价,保留两位小数
return 0;
}
// 方法四:使用if-else语句
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int a, b, c; // 定义三个整数变量表示商品价格
scanf("%d%d%d", &a, &b, &c); // 输入三个商品价格
double sum; // 定义浮点数变量sum表示总价
if((a + b + c) <= 100){ // 判断总价是否不超过100
sum = a + b + c; // 如果不超过100,则总价不变
}else{ // 否则(总价超过100)
sum = 100 + ((a + b + c) - 100) * 0.8; // 超过部分打八折
}
printf("%.2f", sum); // 输出总价,保留两位小数
return 0;
}
思考:
- 方法一首先计算总价,然后根据条件应用打折策略
- 方法二使用C语言风格的输入输出函数,并使用提前返回简化代码
- 方法三使用两个独立的if语句分别处理两种情况
- 方法四使用if-else结构确保只有一个分支被执行,逻辑更清晰
- 所有方法的打折逻辑都是:100元以内不打折 + 超过100元的部分打八折
- 需要正确处理输出格式,保留两位小数
实验五:装跳绳
题目描述:学校买了n条跳绳,同学们要把跳绳装进箱子,每个箱子能装30条,一共需要多少个箱子?
样例输入:
100
样例输出:
4
代码实现:
// 方法一:计算后向上修正
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n表示跳绳数量
cin >> n; // 输入跳绳数量
int m = n / 30; // 计算完整装满的箱子数
if(n % 30){ // 判断是否有余数(n % 30 != 0)
m += 1; // 如果有余数,则需要额外一个箱子
}
cout << m; // 输出需要的箱子总数
return 0;
}
// 方法二:使用逻辑非判断是否能整除
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n表示跳绳数量
cin >> n; // 输入跳绳数量
if(!(n % 30)){ // 判断是否能整除(n % 30 == 0)
cout << n / 30; // 如果能整除,则输出n/30
return 0; // 结束程序
}
cout << n / 30 + 1; // 如果不能整除,则输出n/30+1
return 0;
}
// 方法三:两个独立的if语句
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n表示跳绳数量
cin >> n; // 输入跳绳数量
int m; // 定义整数变量m表示箱子数量
if(!(n % 30)){ // 判断是否能整除(n % 30 == 0)
m = n / 30; // 如果能整除,则箱子数为n/30
}
if(n % 30){ // 判断是否不能整除(n % 30 != 0)
m = n / 30 + 1; // 如果不能整除,则箱子数为n/30+1
}
cout << m; // 输出需要的箱子总数
return 0;
}
// 方法四:使用if-else语句
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n表示跳绳数量
cin >> n; // 输入跳绳数量
int m; // 定义整数变量m表示箱子数量
if(!(n % 30)){ // 判断是否能整除(n % 30 == 0)
m = n / 30; // 如果能整除,则箱子数为n/30
}else{ // 否则(不能整除)
m = n / 30 + 1; // 箱子数为n/30+1
}
cout << m; // 输出需要的箱子总数
return 0;
}
// 方法五:使用数学技巧
#include <iostream>
using namespace std;
int main() {
int n; // 定义整数变量n表示跳绳数量
cin >> n; // 输入跳绳数量
int m = (n + 29) / 30; // 使用(n+29)/30计算向上取整的结果
cout << m; // 输出需要的箱子总数
return 0;
}
思考:
- 方法一先计算整除的箱子数,再根据是否有余数决定是否加1
- 方法二使用逻辑非和提前返回,处理能整除的情况
- 方法三使用两个独立的if语句分别处理两种情况
- 方法四使用if-else结构确保只有一个分支被执行
- 方法五使用了数学技巧(n+29)/30,这是一种常用的向上取整方法
- 这个问题本质上是”向上取整”的典型应用