复习一:
printf与scanf占位符
顺序结构
小鱼的游游泳时间(p1425)
思路: 把小时转换为分钟,计算时间差再换算为时和分
#include <iostream>
using namespace std;
int main() {
int a, b, c, d, e, f;
int m;
// 输入开始时间与结束时间
cin >> a >> b >> c >> d;
// 计算游泳时间
m = (c * 60 + d) - (a * 60 + b);
e = m / 60;
f = m % 60;
cout << e << " " << endl;
// printf("%d %d",e,f);
}
成绩
使用 分数计算,避免触及 浮点运算:
printf("%d", a * 2 / 10 + b * 3 /10 + c * 5 / 10);
解法 1: 注意“A,B,C 都是 10 的整数倍”。 每一小项经过加权,即使有乘上一个小数,但是结果一定是整数。 可以把 0.2 变成 2/10, 使程序不接触浮点数,不必考虑浮点误差。
*2 / 10 ,整个运算中都是整型运算,
/
运算,自动舍去小数部分。
解法2:
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf("%d", int(a * 0.2 + b * 0.3 + c * 0.5 + 0.5)); return 0;
直接加权计算。
int(……) 是指不是整数的内容 强制转换 为 int 类型,舍掉小数位数 只保留整数 。double(……) 可以强制转换为 double 。
为什么最后加上了一个 0.5?是因为浮点误差(例如 89.9999)。
小玉买文具(p1421)
cout << (a * 10 + b) /(1*10 +9);
总结
double
: 用于存放小数的变量类型。char
: 用于存放字符的变量类型。 ASCII将每个字母和数字对应。cin>>a
: 用于读入输入的信息给表示变量 a 。 一道题目如果按照题意不好解决,不妨想想能不能换一种数据处 理的方式,比如把数字当成字符
。
短路判断
计算表达式时,如果只计算部分内容就可以确保一个表达式的结 果,那么剩余部分计算机就不会继续运算下去了。 例如:
a||(b&&!c)
,当a 为真,表达式肯定也是真,不用继续算a&&(b||c||d||e||f)
,当a 为假,表达式肯定为假x>0&&sqrt(x)-round(sqrt(x))<1e-6
,当x是负数时,后面的就不- 会继续运算,也不会造成RE。
嵌套条件
if …… else if …… else ……
体重BMI(p5714)
double m, h, BMI;
cin >> m >> h;
BMI = m / h / h;
if (BMI < 18.5)
cout << "Underweight";
else if (BMI < 24)
cout << "Normal";
else {
cout << BMI << endl;
cout << "Overweight" << endl;
}