【基础语法】第一篇之 “读入输出”
基础语法之“读入输出”
基本介绍
在 C++ 读入有两种流派,第一种是 C++ 新出品的 cin/cout
代表的 IOS 流派。第二种是传承自 C 语言的 scanf/printf
代表的旧语法流派。当然还有一些人会使用 快读/快写 等高速读入方式,后面的文章会提及。
IOS 流派
读入
一般来讲,在新手入门时,推荐使用$cin$来读入,其格式类似于:
1
2
3
4
5
6
7
8
9
// iostream 是包含 cin/cout 的头文件,当然包括在万能头里,所以如果引用了万能头,就不必担心用不了 cin/cout 了
using namespace std;
// 另外,cin/cout 还依赖于 C++ 新出的 std 库,也就是说我们必须引用 std 命名空间才可以,就是上面那一句话,不然的话我们要在所有和 std 有关的工具前面加上 std:: 这是命名空间的引用方式,以后的文章也会提及,举个例子,如果没有引用 std 库,那么 cin/cout 会变成 std::cin/std::cout
int main(){
cin>>...//要输入的内容
return 0;
}在这里,如果你要输入一个变量,比如我们新建一个变量$a$ 。那么,我们要在 $>>$ 后面输入变量名,即$>>a$
这样就可以读入单个变量了!
如果读入的对象超出一个,那么我们该怎么办呢?
1.
第一种方法便是使用
Ctrl
+C
来把 $cin>>$ 多复制几次,就可以了。比如我们读入两个变量 $a, b$ ,那么代码就是这样:1
2
3
4
5
6
7
8
9
10
using namespace std;
int a, b;
int main(){
cin>>a;
cin>>b;
return 0;
}2.
如果你担心你的第二种方法是在 $>>a$ 后面再加一个 $>>b$ ,这样也能做到相同的效果。代码如下:Ctrl
被按坏,那就用第二种方法1
2
3
4
5
6
7
8
9
using namespace std;
int a, b;
int main(){
cin>>a>>b;
return 0;
}
输出
与读入相似,对于初学者用来输出的便是 $cout$ ,格式如下:
1
>cout<<...;
在这里要注意,在 $cin$ 中,我们不需要在 $<<$ 后面增加多余的符号(除了变量),但在 $cout$ 中,你 需要增加 多余的符号。
下列是几种类型以及要增加的变量:
| 单个变量 | 变量之间相加减 | 单个字符 | 多个字符 |
| :———: | :——————: | :———-: | :———: |
| 无添加 | 无添加 | 增加''
| 增加""
|下面我们针对单个字符和多个字符进行举例子大法:
1. 单个字符
如果我们要输出一个 $a$ ,那么我们就可以这样:
1
>cout<<'a';
这样就可以输出 $a$ 了!
2. 多个字符
如果我们要输出 $Hello$ $ world!$ ,那么我们就要这样:
1
>cout<<"Hello world";
以上就是IOS流派的全部内容了。
旧语法流派
接下来,就是万众瞩目的——旧语法流派!
读入
在基本介绍中我们就有提过
scanf/printf
这个基础格式,那么,我们就来正式的说明一下。我们先来看看读入。与
cin
不同,scanf
有着不同的输入格式,但速度更快,推荐在新手期结束后使用。其格式类似于:1
2
3
4
5
6
using namespace std;
int main(){
scanf("%...", &...);
return 0;
}很明显,使用
scanf
来读入分为三部分,我们一部分一部分的讲。1.
首先是基础的模板,即
scanf("% ", &);
,%
后面是变量的类型,&
后面是变量名。2.
在信息学基础的时候,我们主要有5大类型,下列表格是各种类型
%
后面的字母。
整形变量(int) | 整形变量(long long) | 双精度浮点数(double) | 字符型变量(char,单个) | 字符型变量(char,多个) |
---|---|---|---|---|
%d |
%lld |
%lf |
%c |
%s |
3.
最后一部分只用把你的变量名写在
&
后面就可以了!
输出
printf
与scanf
几乎一样,但是有一点要注意:printf
中 没有&
! 。格式如下:1
printf("%...", ...);
但这只是变量的输出,如果你要输出像 $Hello$ $world!$ 之类的字符,那要怎么办呢?
字符的输出:
我们只需要在
""
里打入你想要输入的字符便可,比如输出Hello world
,我们就可以这么写:1
printf("Hello world");//由于我们不需要输出变量,所以我们可以不用写后面的东西
以上就是旧语法流派的全部内容了。
FastIO 流派
如果将你追求极致的速度,那么 FastIO 流派就可以满足你的要求。此流派针对高手
快读
众所周知,
getchar
有着极快的速度,所以说,我们可以手打一个函数来解决这个问题。1
2
3
4
5
6inline void read(unsigned long long &a){
a=0; char c;
while((c=getchar())<48);
do a=a*10+(c^48);
while((c=getchar())>47);
}以上内容可以把不大于 2^64^的数快速读入。下面我来说一下它的工作原理:
- 它首先将
a
初始化为0。 - 使用
getchar()
函数获取字符,并检查是否小于48,即判断是否为数字字符的开始。 - 当遇到第一个数字字符时,通过异或操作
(c^48)
将其转换成对应的数值(例如,如果c是’5’,那么c^48就是5-48=7)。 - 然后将这个数值加到
a
上。*10
表示乘以10,因为每次循环都是当前值加上下一个数字的十位值。 - 接着继续循环,直到读取到非数字字符(大于47,因为ASCII码47对应于’/‘),这时结束循环。
总之,这个函数用于逐位读取用户输入的无符号长整数并存储在
a
中。但如果你想读入任何东西,那就需要517Group的终极快读:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25namespace FastIO
{
// char buf[1 << 20], *p1, *p2;
// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)
template<typename T> inline T read(T& x) {
x = 0;
int f = 1;
char ch;
while (!isdigit(ch = getchar())) if (ch == '-') f = -1;
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
x *= f;
return x;
}
template<typename T, typename... Args> inline void read(T& x, Args &...x_) {
read(x);
read(x_...);
return;
}
inline ll read() {
ll x;
read(x);
return x;
}
};
using namespace FastIO;以上代码就可以读入任何东西,十分强大。
- 它首先将
以上就是基础语法之“读入输出”的全部内容了,感谢大家的阅读。