第8课 选择结构程序举例

前言

学过了选择结构,有必要认真做几道题,巩固学过的知识。

一、示例

1. 奇数偶数判断

提示:判断条件如下

n % 2 == 0

2. 单位阶跃函数问题

f ( t ) = {   1 , t > 0   0.5 , t = 0   0 , t < 0 f(t)= \begin{cases} \ 1, & t>0 \\ \ 0.5, & t=0 \\ \ 0, & t<0 \end{cases} f(t)=  1, 0.5, 0,t>0t=0t<0

#include<iostream>

using namespace std;

int main() {
	double t, result;
	cin >> t;
	if(t>0) {
		result = 1;
	} else if(t==0) {
		result = 0.5;
	} else {
		result = 0
	}
	cout << result << endl;
	return 0;
}

3. 笔记本购买问题

期末来临了,班长卡路用剩余班费 x 元(整数)购买若干个笔记本,以奖励给一些学习好、表现好的同学。已知商店里有3种笔记本,它们的单价为6元、5元和4元。卡路想买尽量多的笔记本(奖励尽量多的同学),同时他又不想有剩余钱,于是他编了一个程序,制订出一种买笔记本的最佳方案。
【算法分析】
对于以上的实际问题,要买尽量多的笔记本,易知都买4元的笔记本肯定可以买最多笔记本。因此最多可买的笔记本为(x 除以4的商)本。因为卡路要把钱用完,故我们可以按以下方法将钱用完:
(1)如果买完(x 除以4的商)本4元本,还剩0元,则5元本和6元本就不买了;
(2)如果买完(x 除以4的商)本4元本,还剩1元,则4元本少买1个,换成一个5元本即可;
(3)如果买完(x 除以4的商)本4元本,还剩2元,则4元本少买1个,换成一个6元本即可;
(4)如果买完(x 除以4的商)本4元本,还剩3元,则4元本少买2个,换成一个5元本和一个6元本即可。
从以上对买笔记本方案的算法设计,可以看出笔记本的数目都是(x除以4的商),因此该方案为最优方案。
因此
定义5个整型变量notebook6、 notebook5、 notebook4、 total_money 和 remain,其中 notebook6、 notebook5、 notebook4 分别表示6元本数、5元本数和4元本数, total_money表示剩余的班费,remain 表示整除4后的余数。

#include<iostream>

using namespace std;
//期末来临了,班长卡路用剩余班费 x 元(整数)购买若干个笔记本,
//以奖励给一些学习好、表现好的同学。已知商店里有3种笔记本,
//它们的单价为6元、5元和4元。卡路想买尽量多的笔记本(奖励尽量多的同学),
//同时他又不想有剩余钱,于是他编了一个程序,制订出一种买笔记本的最佳方案。
int main() {
	int notebook6, notebook5, notebook4;
	int  total_money, remain;
	cout << "Input the total money of the class: " << endl;
	cin >> total_money;
	notebook4 = total_money / 4;
	remain = total_money % 4;
	if(remain==0) {
		notebook6=0, notebook5=0;
	} else if(remain==1) {
		notebook6=0, notebook5=1; notebook4--;
	} else if(remain==2) {
		notebook6=1, notebook5=0; notebook4--;
	} else if(remain==3) {
		notebook6=1, notebook5=1; notebook4-=2;
	}
	cout << notebook6 << '\t' << notebook5 << '\t' << notebook4 << endl;
	return 0;
}

下面是程序的一次输入输出。

Input the total money of the class:
87
1       1       19

4. 共享单车问题

近几年,共享单车逐渐融入了我们的生活,小蓝车、小红车、小黄车……种类繁多,方便了人们的出行。但实际上并非骑车总会快于走路,因为骑车总要找车、开锁、停车、锁车等,要耽误一些时间。
卡路发现了这个问题,并测算了时间,从找到自行车到开锁并骑上单车的平均时间为27s、停车锁车的平均时间为23s、步行每秒行走1.2m、骑车每秒行走3m。卡路决定编一段程序完成骑车快还是走路快的判断:给定一次要行走的距离,判断是骑车快还是走路快。如果骑车快,输出 Bike ;如果走路快,输出 Walk ;如果一样快,则输出 Equ 。

#include<iostream>

using namespace std;

//共享单车问题
//从找到自行车到开锁并骑上单车的平均时间为27s、
//停车锁车的平均时间为23s、步行每秒行走1.2m、骑车每秒行走3m。
int main() {
	int distance;
	double walktime, biketime;
	const double walkspeed=1.2, bikespeed=3.0;	//m/s
	cout << "Input the distance(meter): " << endl;
	cin >> distance;
	walktime = distance/walkspeed;
	biketime = distance/bikespeed + 27 + 23;
	
	if(walktime<biketime) {
		cout << "Walk" << endl;
	} else if(walktime==biketime) {
		cout << "Equ" << endl;
	} else {
		cout << "Bike" << endl;
	}
	return 0;
}

5. 圆的运算问题

给定圆的半径r,求圆的周长、面积。

#include<iostream>
#include<cmath>	// M_PI
using namespace std;

class Circle {
	private:
		double r;
	public:
		void set_r(double x) {
			r = x;
		}
		double circumference() {
			return 2*M_PI*r;
		}
		double area() {
			return M_PI*r*r;
		}
};

int main() {
	Circle circle1;
	double r;
	cout << "Input the circle radius: ";
	cin >> r;
	circle1.set_r(r);
	cout << "Circumference: " << circle1.circumference() << endl;
	cout << "Area: " << circle1.area() << endl;

	return 0;
}

二、课后练习

1. 整数判定问题

给定一个非0整数n,判断它是否既是3的倍数又是7的倍数。若是,输出YES,否则输出NO。

if(n%3==0 and n%7==0) cout << "YES" << endl;
else cout << "NO" << endl;

2. 比较两个整数大小问题

关键代码如下:

if(a>b) cout << a << endl;
else cout << b << endl;

3. 比较三个整数大小问题

给定3个整数a、b、c,要求按从大到小的顺序(降序)输出它们。
代码如下:

#include<iostream>
using namespace std;

//采用选择排序的思想排序3个数(降序) 
int main() {
	int a, b, c, temp;	//temp中存放较大者 
	cout << "Input 3 number: " << endl;
	cin >> a >> b >> c;
	if(a<b)  {
		temp = a;
		a = b;
		b = temp;
	}
	if(a<c) {
		temp = a;
		a = c;
		c = temp;
	}
	if(b<c) {
		temp = b;
		b = c;
		c = temp;
	}
	
	cout << "排序后:" << a << " " << b << " " << c << endl;
	return 0;
}

下面的代码使用泡排序的思想降序排序3个数 ,其采用把当前最小者放到当前最后面位置。

#include<iostream>
using namespace std;

//采用冒泡排序的思想排序3个数(降序) 
//采用把当前最小者放到当前最后面位置
int main() {
	int a, b, c, temp;	//temp中存放较大者 
	cout << "Input 3 number: " << endl;
	cin >> a >> b >> c;
	if(a<b)  {
		temp = a;
		a = b;
		b = temp;
	}
	if(b<c) {
		temp = b;
		b = c;
		c = temp;
	}
	if(a<b) {
		temp = a;
		a = b;
		b = temp;
	}
	
	cout << "排序后:" << a << " " << b << " " << c << endl;
	return 0;
}

4. 计算一元二次方程问题

给定3个整数a、b、c,计算一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0的实根。
分析:其求根公式为
x = − b ± b 2 − 4 a c 2 a x = \frac { -b \pm \sqrt{b^2-4ac}} {2a} x=2ab±b24ac
代码如下:

#include <iostream>
#include <cmath>
using namespace std;

//the Real Root of One Variable Quadratic Equation
int main() {
	double a,b,c,d,x1,x2;
	cout<<"请输入一元二次方程的系数(a,b,c):"; 
	cin >> a >> b >> c; 
	d = b*b-4*a*c;
	//判断方程是否有实数解 
	if(d>0)	{	
		x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
		x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
		cout<<"方程的根为: "<<x1<<", "<<x2<<endl;
	} else if(d==0) {
		x1 = x2 = -b/(2*a);
		cout<<"方程的根为: "<<x1<<", "<<x2<<endl;
	} else {
		cout<<"该方程无实数根."<<endl;
	}
	return 0; 
}

5. 简单计算器设计问题

设计一个简单的计算器,仅仅支持实数的加、减、乘、除这4种运算。

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	double a, b;
	char op;
	cin >> a >> op >> b;
	switch(op) {
		case '+':
			cout << a+b << endl; break;
		case '-':
			cout << a-b << endl; break;
		case '*':
			cout << a*b << endl; break;
		case '/':
			cout << fixed << setprecision(6) << a/b << endl; break;
	}
	return 0;
}

扩展上题如下
计算机自动出题(100以内正整数的四则算术运算)
给出的伪代码如下:

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	double a, b;
	short int op;
	//随机生成两个正整数运算数;
    //随机生成四则运算符号op,0表示加法,1表示减法,2表示乘法,3表示整数除法
	switch(op) {
		case 0:
			//显示加法运算表达式,输入结果,判断正确与否; break;
		case 1:
			//显示减法运算表达式,输入结果,判断正确与否; break;
		case 2:
			//显示乘法运算表达式,输入结果,判断正确与否; break;
		case 3:
			//显示整数除法运算表达式,输入结果,判断正确与否; break;
	}
	return 0;
}

计算机自动出题(100以内正整数的四则算术运算)
参考代码如下:

#include <iostream>
#include <ctime>
#include <cstdlib>	// srand
using namespace std;
//用0调用时间函数time(),将其返回值强制转换为unsigned型,作为参数来调用srand()函数。
//srand()是为rand()函数初始化随机发生器的启动状态,以产生伪随机数,
//所以常把srand()称为种子函数。//用time()返回的时间值做种子的原因是
//time()返回的是实时时间值,每时毎刻都在变化,这样产生的伪随机数就有以假乱真的效果。
int main() {
	int a, b, op, result1, remainder;
	srand((unsigned)time(0));
	a = rand() % 100;	//产生[0,100)之间的随机整数 
	b = rand() % 100;
	//b = 800 + rand() % (900-800);	//产生[800,900)之间的随机整数
	op =  rand() % 4;	//随机生成四则运算符号op,0表示加法,1表示减法,2表示乘法,3表示整数除法
	cout << a << endl;
	cout << b << endl;
	cout << op << endl;
	cout << RAND_MAX << endl;
	//a中存放较大数,b中存放较小数
	if(a<b) {
		remainder = a;
		a = b;
		b = remainder;
	}
	switch(op) {
		case 0:
			cout << a << " + " << b << " = ";
			cin >> result1;
			if(a+b == result1)	cout << "You are right!\n";
			else cout << "You are wrong!\n";
			break;
		case 1:
			cout << a << " - " << b << " = ";
			cin >> result1;
			if(a-b == result1)	cout << "You are right!\n";
			else cout << "You are wrong!\n";
			break;
		case 2:
			cout << a << " ×" << b << " = ";
			cin >> result1;
			if(a*b == result1)	cout << "You are right!\n";
			else cout << "You are wrong!\n";
			break;
		case 3:
			cout << a << " ÷" << b << " = ";
			cin >> result1;
			cout << a << " % " << b << " = ";
			cin >> remainder;
			if(a/b == result1 && a%b == remainder)	
				cout << "You are right!\n";
			else cout << "You are wrong!\n";
			break;
	}
	return 0;
}

可以继续完善上面的程序,譬如增加相应的代码,以保证在做除法运算时,除数不会为0。

6. 快递计费问题

某快递公司对快递包裹有如下规定:若包裹的长、宽、高任一尺寸超过1000mm或重量超过30kg,不予快递;对可以快递的包裹,每件收取手续费10元,再加上表8-2据重量计算的费用。
表8-2 据重量计算的费用表

重量/kg收费标准/元
w ≤105
10< w ≤2010
20< w ≤3015

现给定货物的长、宽、高和重量,判断该货物是否可以快递,如果可以,快递费总计多少元。
输入:一行,包含4个单精度正实数 a 、b 、c 和 w (0< a, b, c <10000),单位:mm ;0< w <100,单位:kg ),即货物的长、宽、高和重量,这4个数据用空格分隔。
输出:一行,如果货物超出标准,输出"不予快递";否则,输出货物的快递费。
样例输入1:
1200 500 200 50
样例输出1:
不予快递!
样例输入2:
500 300 200 18.5
样例输出2:
30

7. 分段计费(计算出租车的车费)

设出租车收费标准为:3公里内收费5元;3公里到10公里之内每公里收费2.04元;10公里以上,每公里收费1.5元。编制出租车的收费程序。

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
	double distance, fare;
	cout << "请输入坐车里程(km): ";
	cin >> distance;
	if(distance<=3) {
		fare = 14;
	} else if(distance>3 && distance<=10) {
		fare = 14 + 2.0*(distance-3);
	} else if(distance>10) {
		fare = 14 + 2.0*(10-3) + 1.5*(distance-10);
	}
	cout << fare << endl;
	return 0;
}

8. 停车场收费计算问题

设停车场可以停放3类汽车,分别用C代表轿车,B代表客车,T代表卡车。收费标准如下表所示。输入汽车的类型,入库和出库的时间,输出应交的停车费。

车辆类型收费标准
轿车(C)3小时内,每小时5元。3小时后,每小时10元
客车(B)2小时内,每小时10元。2小时后,每小时15元
卡车(T)1小时内,每小时10元。1小时后,每小时15元

给出代码框架如下:

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	char vehicle_type;
	cout << "Input vehicle type (C|B|T): ";
	cin >> vehicle_type;
	if(vehicle_type=='c' || vehicle_type=='b' || vehicle_type=='t') {
		vehicle_type = vehicle_type - 32;
	}
	cout << vehicle_type << endl;
	if(vehicle_type!='C' && vehicle_type!='B' && vehicle_type!='T') {
		cout << "没有这种车型(请重新输入车型)。" << endl;
		return 0;
	}
	switch(vehicle_type) {
		case 'C':
			cout << "car" << endl;
			break;
		case 'B':
			cout << "bus" << endl;
			break;
		case 'T':
			cout << "truck" << endl;
			break;
	}
	return 0;
}


总结

有些程序代码没有完成或没有给出,读者可以自己动手试着完成之。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值