简介
本文将讲述C++的重要一环——输入和输出。它将能让你的“小黑框”输出内容,也是设计算法时的重要展示方式。
C语言风格
既然是C++学习,为什么还要学C的输入输出呢?因为时间问题。在做题时,C语言的输入输出在没有O2优化 的编译器上要比C++的输入输出快很多!是很多TLE的罪魁祸首,故我们要学习它。
语法格式
#include<cstdio> //头文件
#include<iostream> //iostream也包括
scanf("<类型占位符>",&<变量列表>); //输入
printf("<类型占位符>/<内容>",[变量列表]); //输出
常用类型占位符
数据类型 | int | long long | float | double | char | bool |
占位符 | %d | %lld | %f | %lf | %c | 直接用%d (1和0) |
实例
#include<cstdio>
using namespace std;
int main(){
int a;
long long b;
float c;
double d;
char e;
bool f=true;
scanf("%d %lld %f %lf %c",&a,&b,&c,&d,&e); //'&'是取地址符号,一定不能丢!!!
printf("%d %lld %f %lf %c %d",a,b,c,d,e,f); //输出不用取地址符号
printf("\n%.2lf",d); //'\'开头为转义字符,'\n'是换行
//保留n位小数,占位符就用%.nf/%.nlf
return 0;
}
运行结果
12 114514 3.14 6.288888 a
12 114514 3.140000 6.288888 a 1
6.29
--------------------------------
Process exited after 0.81 seconds with return value 0
Press ANY key to exit...
%f占位符默认保留6位小数,bool类型输出1是因为整数中1是true,0是false。
#include<cstdio>
using namespace std;
int main(){
printf("%d %.2f %% \nI'm very good!",12,5.678);
//printf的引号中,除占位符以外的内容都将原样输出,输出'%'可以用'%%'
return 0;
}
运行结果
12 5.68 %
I'm very good!
--------------------------------
Process exited after 0.2862 seconds with return value 0
Press ANY key to exit...
#include<cstdio>
using namespace std;
int main(){
printf("%d %d %f %c\n",12,14+15,4.56,'c');
//变量列表也可以是常量和表达式,字符常量要加单引号''
return 0;
}
C++风格
C++的输入输出以格式简短闻名,但也有弊端,如C语言篇中所说,O2优化没有的话就会很慢。
语法格式
#include<iostream> //输入输出流
using namespace std; //一定声明命名空间!
cin >> <输入变量名>;
std::cin >> <输入变量名>; //如果没有using语句的话可以这样
cout << <输出内容/变量>;
std::cout << <输出内容/变量>; //同上
实例
#include<iostream>
#include<iomanip> //保留小数头文件
using namespace std;
int main(){
int a;
long long b;
float c;
double d;
char e;
bool f=false;
cin>>a>>b>>c>>d>>e;
cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<endl;
//cout直接输出变量,"endl"是换行,也可以用"\n"代替
cout<<fixed<<setprecision(3)<<d<<"\n"; //保留三位小数输出
//输出小数时最好用printf,因为简单
return 0;
}
运行结果
12 114514 3.14 6.288888 a
12 114514 3.14 6.28889 a 0
6.289
--------------------------------
Process exited after 1.198 seconds with return value 0
Press ANY key to exit...
#include<iostream>
using namespace std;
int main(){
cout<<"我真棒!"; //cout引号里的东西原样输出
cout<<R"(71842370
C++最棒 \n ***^
a)"; //C++11的新特性raw string literal技术,括号里的东西(包括空行、转义字符)全部原样输出。
return 0;
}
C++11 的 raw string literal 技术,让你体会复制粘贴的恐惧。
运行结果
我真棒!71842370
C++最棒 \n ***^
a
--------------------------------
Process exited after 0.4453 seconds with return value 0
Press ANY key to exit...
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
double a,b;
cin>>a>>b;
cout<<fixed<<setprecision(2)<<a<<" + "<<setprecision\
(2)<<b<<" = "<<setprecision(2)<<a+b<<endl;
cout<<a<<" - "<<b<<" = "<<setprecision(2)<<a-b<<endl;
cout<<a<<" * "<<b<<" = "<<setprecision(2)<<a*b<<endl;
cout<<a<<" / "<<b<<" = "<<setprecision(2)<<a/b<<endl;
return 0;
}
解释:第一个cout加上了保留小数是因为精度问题,大家可以自己去掉试一下;fixed只有一个是因为流文件一个程序只要声明一次就行了。
运行结果
1.2 4.56789
1.20 + 4.57 = 5.77
1.20 - 4.57 = -3.37
1.20 * 4.57 = 5.48
1.20 / 4.57 = 0.26
--------------------------------
Process exited after 4.116 seconds with return value 0
Press ANY key to exit...
练习
建议完成洛谷的P1000 P1001 B2002 B2025 B2005五题,思考题P5705 。
补充
O2优化的具体实现
在代码开头加入以下代码
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
这样就可以实现O2优化,加快cin cout的速度。
cin加速的另一种方法
在主函数main内加入以下代码
std::ios::sync_with_stdio(0);
cin.tie(0);
这样是去除cin的缓存,也能起到加速的效果 (这条语句后scanf sscanf 等C的输入输出流都将失效!)
C++17标准下,加入以上代码的cin cout速度可能超过scanf 和 printf 的速度。
本期内容就到这里啦,希望大家多多练习,早日“成神”!
掰掰ヾ(•ω•`)o
文章可以转载,但请注明作者,谢谢
本文介绍了C++中的输入输出机制,包括C语言风格的scanf和printf以及C++风格的cin和cout。文章强调了在特定情况下C语言的输入输出速度优势,并提到C++的O2优化和cin加速技巧。同时,提供了多个实例来展示不同输入输出的使用方法。
3395

被折叠的 条评论
为什么被折叠?



