变量、表达式与顺序语句
运算
- % 取余
- / 相除
62 / 3600 -> 0
62 % 3600 -> 62 // 秒中剔除整小时
62 / 60 -> 1
62 % 60 -> 2
题单:
654. 时间转换
判断语句
- switch语法
- ‘1’ 和 1 的区别
double m;
switch(a)
{
case 1:
m = 4.00;
break;
case 2:
m = 4.50;
break;
case 3:
m = 5.00;
break;
case 4:
m = 2.00;
break;
case 5:
m = 1.50;
break;
}
printf("Total: R$ %.2lf", m * b);
- if - else 结构
// 一半一半,执行if就不会执行else,只不过无限套娃
if (salary <= 400) x = 0.15;
else if (salary <= 800) x = 0.12;
else if (salary <= 1200) x = 0.1;
else if (salary <= 2000) x = 0.07;
else x = 0.04;
// 分成若干,大家机会均等。但条件加了限制
if (salary <= 400) x = 0.15;
if (salary > 400 && salary <= 800) x = 0.12;
if (salary > 800 && salary <= 1200) x = 0.1;
if (salary > 1200 && salary <= 2000) x = 0.07;
if (salary <= 2000)x = 0.04;
// else只会与最近的if配对。
// 当 salary 为100时,
if (salary <= 400) x = 0.15; // √ 执行
if (salary > 400 && salary <= 800) x = 0.12; // ×
if (salary > 800 && salary <= 1200) x = 0.1; // ×
if (salary > 1200 && salary <= 2000) x = 0.07; // if-else只能二选一 ×
else x = 0.04; // √ 执行
// 理想值 x = 0.15 实际值 x = 0.04 被覆盖掉
- 答案为导向
时刻想着答案是c - a
如果有改动,也是改动c值或者a值 - 若过程麻烦,全部都转换成分钟代替,算出答案再处理为小时/分钟(特殊处理加一轮 60 * 24)
循环语句
-
while语句
条件为真(!0)时执行 ( -23 也执行) -
逗号运算符(用逗号连接多个表达式,各个表达式计算顺序从左往右,最终表达式的值为”n <= 0”)
while (cin >> n, n <= 0) {} 不断读入直到第一个非负的数循环结束
while (cin >> n && n <= 0)
题单:
直至读入 N 值为正整数为止
找序列最大数和他的位置
完全数特判
要学会熟练使用if-else,两者只会执行一个
曼哈顿距离
数组
二维数组求首字母
- 读入一维数组
- a[n][0]则是每一维数组首字母
// 读入三个字符串 abc,bcd,efg
for(int i=0;i<3;i++) cin >> a[i], ss+=a[i][0];
ss = abe;
字符串
输入有空格的字符串类型
- cin读取到空格结束,空格后面的将不被保留。
- 如何保留空格输出?
- 如果不想整行读入,也可以使用getchar(逐个读,能读空格能读回车,结束为-1)
string str;
getline(cin,str);
cout << str << endl;
- 字符串遍历用for(auto &c : string)
- (加&是需要改变c值的时候,例int x = f[i][j],以下对x的操作不改变f值,而int &x = f[i][j]就可以改变)…
- 字符数组的输入输出都不需要遍历
for (auto c : s1) s2 = s2 + c + ' ';
用于字符连接,例如’a’ + ‘b’ = “ab”
for (auto c : s1) s2 += c + ' ';
用于计算的是两个字符对应的ascii的和
题单:
775. 倒排单词
772. 只出现一次的字符
767. 信息加密
763. 循环相克令
765. 字符串加空格
STL
错误积累
- Segmentation Fault
检查for循环起始到结束是否越界
检查for循环执行条件‘<’‘>’是不是反了
确实是这样