前言
学过了选择结构,有必要认真做几道题,巩固学过的知识。
一、示例
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=2a−b±b2−4ac
代码如下:
#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 ≤10 | 5 |
10< w ≤20 | 10 |
20< w ≤30 | 15 |
现给定货物的长、宽、高和重量,判断该货物是否可以快递,如果可以,快递费总计多少元。
输入:一行,包含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;
}
总结
有些程序代码没有完成或没有给出,读者可以自己动手试着完成之。