输入和输出
1.scanf和printf
示例一
int a, b;
scanf("%d %d", &a, &b); // 输入2 9
printf("%d, %d\n", a, b); // 输出2,9
示例二
double a, b;
scanf("%lf %lf", &a, &b);
printf("%.2lf, %.3lf\n", a, b); // 自动四舍五入
// 输入:3 5
// 输出:3.00, 5.000
如何对一个数实现四舍五入?
利用C++中<cmath>库中的round()函数,它用于将一个浮点数四舍五入到最接近的整数。
在 C 语言中 round 函数用于对浮点数 float 或者 double或者 longdouble 四舍五入,也是一个比较常用的函数,其返回值类型为double,并非int类型。
示例三
char c1, c2;
scanf("%c:%c", &c1, &c2);
printf("%c,%c", c1, c2);
// 输入:a:b
// 输出:a,b
%c
格式说明符用于读取一个字符。它会读取输入流中的下一个字符,包括空格、制表符、换行符等。
示例四
char s[10];
scanf("%s", s);
printf("%s", s);
// 输入:Hello World
// 输出:Hello
%s
输入遇到空格和回车就会停下,所以输入Hello World, %s会认为之间的空格是分割,所以只读取了Hello。
示例五
char s[15];
scanf("%[^\n]", s);
printf("%s", s);
// 输入:Hello World
// 输出:Hello World
其中,[]中是一个正则表达式,表示只要不是回车就读进去。
数据类型 | 格式控制符 |
---|---|
char | %c |
int | %d |
short | %hd |
long | %ld |
long long | %lld |
unsigned int | %u |
unsigned short | %hu |
unsigned long | %lu |
unsigned long long | %llu |
float | %f |
double | %lf |
long double | %Lf |
string | %s |
scanf和printf的优势:
1)格式化输入和输出
2)效率高
3)对于浮点数,精确几位小数的设置方便等
scanf和printf的缺点:
1)需要选定正确的格式控制符,不同类型的格式控制符不同,容易出错
2)cin、cout取消同步流与scanf、printf的效率相等
2.cin和cout
示例一
int a, b;
cin >> a >> b; // 自动判断变量类型
cout << a << " " << b << "\n";
// 输入:2 3
// 输出:2 3
示例二
double a, b;
cin >> a >> b;
cout << a << " " << b << "\n";
// 输入: 2 3
// 输出: 2 3
示例三
double a, b;
cin >> a >> b;
cout << fixed << setprecision(3) << a << " " << b << "\n";
// 输入:2 3
// 输出:2.000 3.000
示例四
char ch;
cin >> ch;
cout << ch;
// 输入: a
// 输出: b
示例五
char s[10];
cin >> s;
cout << s;
// 输入:lan qiao
// 输出:lan
// 注意:cin输入字符串也是遇到空格或回车就结束。
示例六
string s;
getline(cin, s);
cout << s;
//输入:lan qiao
//输出:lan qiao
//getline从输入流中读取一行文本, 遇到空格不结束,遇到回车结束
3.取消同步流
由于cin和cout需要自动判断变量类型等内部原因,读写效率比scant和printf更低。当数据量较大时,可能导致程序运行超时。我们可以通过取消同步流来加速cin和cout,加速后效率相差无几。
取消同步流
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
4.示例
4.1 示例一
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 150;
int a[N];
int main() {
// 取消同步流
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n; // 输入数组大小
for(int i = 1; i <= n; i ++) cin >> a[i]; // 遍历数组并输入
for(int i = n; i >= 1; i --) cout << a[i] << " ";
return 0;
}
输入输出
5
1 2 3 4 5
5 4 3 2 1
4.2 示例二
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 150;
char s[N];
int main() {
// 取消同步流
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> s + 1; // 从s[1]开始输入
for(int i = 1; s[i]; i ++) cout << s[i];
return 0;
}
输入输出
lanqiao
lanqiao
4.3 示例三
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 150;
char s[N];
int main() {
scanf("%s", s);
for(int i = 0; s[i]; i ++) cout << s[i] << '\n';
return 0;
}
输入输出
l
a
n
q
i
a
o
4.4 示例四
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 150;
double a[N];
int main() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%lf", &a[i]);
double sum = 0;
for(int i = 1; i <= n; i ++) sum += a[i];
printf("%.2lf\n", sum); // 保留2位小数, 并且四舍五入
return 0;
}
输入输出
5
1.0 2.313 6.22 5.47 9.299
24.30