- level 1:语法基础课
第 2 讲 printf 语句与分支结构
- 2023-8-2 16:12:45 @
学习语言最好的方式就是实践,每当掌握一个新功能时,就要立即将这个功能应用到实践中。
一、printf 输出格式
注意:使用 printf 时最好添加头文件 #include<cstdio>
。
#include <bits/stdc++.h>
using namespace std;
int main()
{
printf("Hello World!");
return 0;
}
- Int、float、double、char 等类型的输出格式:
(1) int:%d
(2) float: %f , 默认保留6位小数
(3) double: %lf , 默认保留6位小数
(4) char: %c , 回车也是一个字符,用'\n'
表示
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 3;
float b = 3.12345678;
double c = 3.12345678;
char d = 'y';
printf("%d\n", a);
printf("%f\n", b);
printf("%lf\n", c);
printf("%c\n", d);
return 0;
}
- 所有输出的变量均可包含在一个字符串中:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 3;
float b = 3.12345678;
double c = 3.12345678;
char d = 'y';
printf("int a = %d, float b = %f\ndouble c = %lf, char d = %c\n", a, b, c, d);
return 0;
}
练习:输入一个字符,用这个字符输出一个菱形:
#include <bits/stdc++.h>
using namespace std;
int main()
{
char c;
cin >> c;
printf(" %c\n", c);
printf(" %c%c%c\n", c, c, c);
printf("%c%c%c%c%c\n", c, c, c, c, c);
printf(" %c%c%c\n", c, c, c);
printf(" %c\n", c);
return 0;
}
练习:输入一个整数,表示时间,单位是秒。输出一个字符串,用”时:分:秒”的形式表示这个时间。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
int hours = t / 3600;
int minutes = t % 3600 / 60;
int seconds = t % 60;
printf("%d:%d:%d\n", hours, minutes, seconds);
return 0;
}
- 扩展功能
(1) float, double等输出保留若干位小数时用:%.4f, %.3lf
#include <bits/stdc++.h>
using namespace std;
int main()
{
float b = 3.12345678;
double c = 3.12345678;
printf("%.4f\n", b);
printf("%.3lf\n", c);
return 0;
}
(2) 最小数字宽度
a. %8.3f
, 表示这个浮点数的最小宽度为 8,保留 3 位小数,当宽度不足时在前面补空格。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 3;
float b = 3.12345678;
double c = 3.12345678;
printf("%5d\n", a);
printf("%8.4f\n", b);
printf("%7.3lf\n", c);
return 0;
}
b. %-8.3f
,表示最小宽度为 8,保留 3 位小数,当宽度不足时在后面补上空格
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 3;
float b = 3.12345678;
double c = 3.12345678;
printf("%-5d!\n", a);
printf("%-8.4f!\n", b);
printf("%-7.3lf!\n", c);
return 0;
}
c. %08.3f
, 表示最小宽度为 8,保留 3 位小数,当宽度不足时在前面补上 0
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 3;
float b = 3.12345678;
double c = 3.12345678;
printf("%05d\n", a);
printf("%08.4f\n", b);
printf("%07.3lf\n", c);
return 0;
}
二、if 选择结构
早上起床,顺序穿衣服刷牙吃早饭,如果今天下雨就带伞出门,如果今天不下雨就不带伞出门
- 基本
if-else
语句
当条件成立时,执行某些语句;否则执行另一些语句。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin >> a;
if (a >= 60 )
{
cout << "及格" << endl;
cout << "真棒!" << endl;
}
else
{
cout << "不及格" << endl;
cout << "别灰心,再接再厉!" << endl;
}
cout << "结束" << endl;
return 0;
}
else 语句可以省略:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin >> a;
if (a >= 60 )
{
cout << "及格" << endl;
cout << "真棒!" << endl;
}
cout << "结束" << endl;
return 0;
}
当只有一条语句时,大括号可以省略,也可以写到一行:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin >> a;
if (a >= 60 ) cout << "及格" << endl;
else cout << "不及格" << endl;
cout << "结束" << endl;
return 0;
}
- 常用比较运算符
(1) 大于 >
(2) 小于 <
(3) 大于等于 >=
(4) 小于等于 <=
(5) 等于 ==
(6) 不等于 !=
前四种优先级一致,后两种优先级一致,前四种高于后两种。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
if (a > b) printf("%d > %d\n", a, b);
if (a >= b) printf("%d >= %d\n", a, b);
if (a < b) printf("%d < %d\n", a, b);
if (a <= b) printf("%d <= %d\n", a, b);
if (a == b) printf("%d == %d\n", a, b);
if (a != b) printf("%d != %d\n", a, b);
return 0;
}
练习:输入一个整数,输出这个数的绝对值。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin >> x;
if (x > 0) cout << x << endl;
else cout << -x << endl;
return 0;
}
练习:输入两个整数,输出两个数中较大的那个。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
if (a > b)
cout << a << endl;
else
cout << b << endl;
return 0;
}
if-else
语句内部也可以是if-else
语句。
练习:输入三个整数,输出三个数中最大的那个。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
/*
如果 a >= b:
如果 a >= c:
a 是最大值
否则
c 是最大值
否则
如果 b >= c:
b 是最大值
否则
c 是最大值
*/
if (a > b)
cout << a << endl;
else
cout << b << endl;
return 0;
}
注意:浮点数通过不同的算法算出的有效位数虽然一致,但因计算机中表示浮点数的精度位数有限,做比较时要规定一个精度误差,再做比较
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
int main()
{
double a = 3;
double b = sqrt(a) * sqrt(a);
printf("%.20lf\n", b);
// if (a == b) puts("相等");
// else puts("不相等");
if (fabs(a - b )< eps) puts("相等");
else if (a < b - eps) puts("小于");
else puts("大于");
return 0;
}
if-else
连写:
输入一个 0 到 100 之间的分数,
如果大于等于 85,输出 A;
如果大于等于 70 并且小于 85,输出 B;
如果大于等于 60 并且小于 70,输出 C;
如果小于 60,输出 D;
#include <bits/stdc++.h>
using namespace std;
int main()
{
int grade;
cin >> grade;
if (grade >= 85) printf("A");
else // 蕴含着 grade < 85
{
if (grade >= 70) printf("B");
else // 蕴含着 grade < 70
{
if (grade >= 60) printf("C");
else // 蕴含着 grade < 60
{
printf("D");
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int grade;
cin >> grade;
if (grade >= 85) printf("A");
else if (grade >= 70) printf("B");
else if (grade >= 60) printf("C");
else printf("D");
return 0;
}
练习:
1.简单计算器输入两个数,以及一个运算符+
,-
,*
,/
,输出这两个数运算后的结果。
当运算符是/
,且除数是 0 时,输出Divided by zero!
; 当输入的字符不是+
,-
,*
,/
时,输出Invalid operator!
。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
char c;
cin >> a >> b >> c;
if (c == '+') cout << a + b << endl;
else if (c == '-') cout << a - b << endl;
else if (c == '*') cout << a * b << endl;
else if (c == '/')
{
if (b == 0) cout << "Divided by zero!" << endl;
else cout << a / b << endl;
}
else cout << "Invalid operator!" << endl;
return 0;
}
2.判断闰年。闰年有两种情况:
四年一闰,百年不闰,四百年又闰
闰年366 平年365 闰年学习day ++
(1) 能被 100 整除时,必须能被 400 整除;
(2) 不能被 100 整除时,被 4 整除即可。
输入一个年份,如果是闰年输出yes
,否则输出no
。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int year;
cin >> year;
if (year % 100 == 0)
{
if (year % 400 == 0) cout << "yes" << endl;
else cout << "no" << endl;
}
else
{
if (year % 4 == 0) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}
三、条件表达式
/*
期末评选三好学生:
如果 成绩优秀 并且 受欢迎 并且 有责任感
那么就给他颁发三好学生
*/
if (成绩优秀)
if (受欢迎)
if (有责任感)
{
}
(1) 与 &&
(2) 或 ||
(3) 非 !
and
可以看成 乘法
,or
可以看成 加法
, 优先级 &&
> ||
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
if (a > b && (c > d || a > d)) cout << "" << endl; // 短路原则
if (a > b || c > d) cout << "" << endl;
if (!(a > b)) cout << "" << endl;
return 0;
}
例题:输入三个数,输出三个数中的最大值。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
if (a >= b && a >= c) cout << a << endl;
else if (b >= a && b >= c) cout << b << endl;
else cout << c << endl;
return 0;
}
练习:用一条if语句,判断闰年。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int year;
cin >> year;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
备注:
-
C++中唯一的三目运算符:
x = 5 > 3 ? 10 : 12
x = 3 == 9 ? 25 : 18
优先级:单目 > 双目 > 三目
-
switch语句
Q: cin/cout为什么会超时(TLE)?
A: cin/cout因为默认同步stdin/stdout而变慢,并产生更多的系统调用而受到性能影响,可以在main函数开头加入下面代码加速:
ios::sync_with_stdio(false);
cin.tie(0);
* 另外,请使用'\n'而不是 endl ,因为endl默认会增加刷新操作,而导致输出缓冲失效,降低效率。