
🫧个人主页:小年糕是糕手
🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!
目录
[6.1、getchar( )](#6.1、getchar( ))
前言:距离蓝桥杯比赛开赛还有不到40天的时间,博主自己也在准备比赛,正好也可以为大家带来新博客,从0开始为大家带来备考路线,如果你现在是一个新手小白啥都不会,那们跟着我,相信你35天之后会变得不一样,我会从最基础知识开始讲解,后面为大家带来数据结构以及STL,然后为大家介绍基础的算法,每篇博客内容会很长,但是我尽量还是采用大白话的形式为大家解释,这样可能不太标准但是我觉得更加直观符合我们小白快速上手,博客里面也会有很多题目供大家练习,需要大家花大量的时间,加油!
35天的计划概述
我的计划是前12天带大家了解C++、数据结构及STL、13-25天带大家了解一些基础算法,再花7天时间对算法进行提高,最后三天大量刷真题...当然常说计划赶不上变化,希望可以坚持!
工具的选择与安装
C++我们常使用的工具是DevC++和VS2022,网上有大量的安装使用教程,这里就不多过于赘述
一、第一个C++程序
1.1、程序模板
相信大家都听过计算机语言中的"Hello World",现在我们用VS为大家演示这第一个C++程序 -- 在屏幕上打印Hello World.
cpp
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
大家先简单了解一下这个程序即可,这就是一个C++的简单模板,除了cout那一行其他的大家可以现在理解为一个公式,大部分程序开始都需要写入这些内容,大家可以自行在电脑上敲敲代码感受一下,下面我们来追步理解这个C++程序
1.2、main函数和头文件
main函数大家可以理解为是一个程序的入口 ,任何C++程序不管多长有多少行代码都是从main函数开始执行的,int代表的是一个整型也就是整数的意思,表示的是main函数执行结束的时候返回的是一个整型类型的值,我们在函数最后写的return 0在这里就对的上了,0就是一个整数,return的含义相比就不需要我为大家解释了,这里需要关注的是main函数是一个程序的入口且有且只有一个。
大家看到的**#include<iostream>**就是一个头文件,头文件可以理解为C++代码开头必备的一个文件,前期大家写代码的时候无脑写上去就好了,后面有更多头文件再为大家细细讲解。
这里额外为大家讲解一下"Hello Wrold"是什么,这是一个字符串,大家简单理解就是字符所组成的一个串,用双引号括起来的多个字符就是字符串,用单引号括起来的就表示的一个字符。如果我们想打印"I LOVE C++"只需要给双引号里面的内容进行更改就好了。
1.3、cout和cin
就一句话为大家概括,cin是输入,cout是输出,cout<<" "<<endl,这个是一个输出的模板也就是我们所说的在屏幕上打印,cin是输入,cin>>后面跟着的就是输入内容,<<是流插入运算符和cout配合使用,>>是流提取运算符和cin配合使用,cout后面的endl是换行的意思,大白话换一行。如果大家有C语言的基础,大家肯定知道printf和scanf,我们在使用这俩个的时候需要知道数据的类型比较麻烦,大家写代码中还是以cout和cin为主!
cpp
#include<iostream>
using namespace std;
int main()
{
int num;
cin >> num;
cout << num << endl;
return 0;
}
我们来看一下上面这段最基础的C++代码,这段代码的意思就是我们定义了一个整型(int)类型的变量num,cin>>num就是我们将给这个num从屏幕上输入一个值,cout<<num就是我们在屏幕上打印出这个num的值,这里我们可以深入理解一下,num实际上是一块空间,cin是完成输入操作的,输入一个整数存放在num中,cout完成输出操作的,将num中的值打印在屏幕上。
下面我们来解释endl,他其实是换行的意思,我们来打印俩段代码供大家直观理解:


更专业一点endl应该叫刷新缓冲区。
1.4、命名空间
下面我们来看using namespace std;using就是使用的意思,namespace就是名字空间也就是命名空间,我们来举一个现实中的例子,我们学校经常会发生一个事情叫做重名,当一个班级里面俩个人名字一样就会造成名字冲突,一般情况下,这时候学校一般会在分班的时候将这俩个人分入俩个不同的班级,这里学校就相当于一快大的空间,这块大的空间里有班级这样的小空间,小空间里又有不同名字的学生可以简单理解为变量,在C++中变量、函数都是大量存在的,这些变量、函数如果都在同一块空间就会造成命名冲突,为了防止这种情况发生,namespace关键字就这样出现了,std是C++标准库的名字空间名,C++将标准库的定义实现都放到这个命名空间中,当我们需要使用标准库的内容时就需要加上using namespace std;这其实是一种非常暴力的方法,当我们定义好using namespace std之后后续标准库的内容就可以直接使用了,但是我们还可以局部使用:
cpp
#include<iostream>
//using namespace std;
int main()
{
int num = 100;
int sum = 200;
std::cout << num << std::endl;
std::cout << sum;
return 0;
}
//后面的就是注释的意思,他后面的内容是对代码没有影响的//
//注释有俩种写法
//1、//
//2、/* */
//注释就是为了方便别人去看懂我们的代码和让我们代码更加易懂
练习一
下面的题目都建议大家自行先去解决,解决不了可以利用AI辅助。
https://www.luogu.com.cn/problem/B2002
https://www.luogu.com.cn/problem/B2003
https://www.luogu.com.cn/problem/B2005
三、数据类型
简单数据类型
├─ 字符型 char
├─ 整型 int、short、long、long long
├─ 浮点型 float、double、long double
└─ 布尔类型 bool
大家第一眼看肯定不太能理解,现在我来为大家一一解释:
2.1、字符型
字符型翻译过来就是字符类型,我们键盘上可以敲出各种字符,如:a,1,%,&...这些都是字符,字符我们之前说过是用单引号括起来的,如:'a','1','%','&'。为了可以表示这些字符我们将他们统称为字符型,C语言中就是char,说到字符型我们就离不开ASCII码表,
网站如下,大家可以了解一下:
https://zh.cppreference.com/w/cpp/language/ascii
https://zh.cppreference.com/w/cpp/language/ascii
我们不需要记住所有的 ASCII 码表中的数字,使用时查看就可以,不过我们最好能掌握几组特殊的数据:
字符 A~Z 的 ASCII 码值从 65~90
字符 a~z 的 ASCII 码值从 97~122
对应的大小写字符(a 和 A)的 ASCII 码值的差值是 32
数字字符 0~9 的 ASCII 码值从 48~57
换行 \n 的 ASCII 值是:10
ASCII 码值从 0~31 这 32 个字符是不可打印字符,无法打印在屏幕上观察
2.2、整型
说到整型大家可以直接直白理解为整数就好了,整型也有很多种,我们最常用的是int,其他的有short int就是短整型我们一般可以直接写成short,long int就是长整型,long long int就是更长的整型,我们之前说过int就是可以看成是定义空间,short就是定义一个比int小的空间,long就是更大的一块空间,long long就是更大的一块空间。
2.3、浮点型
浮点型我们可以直接理解为小数,浮点数也有分类,float、double、long double这样的,float就是单精度浮点数,double就是双精度浮点数,long doubule更长的双精度浮点型,我们先记住,浮点型就是用来描述小数的。

简单点就是我们定义小数的时候一般情况下用double,如果用float时候要在小数后面加上f,数字大的小数我们用long double
2.4、布尔类型
这是一种比较特殊的类型,他是一种表述真 / 假的类型,就是这种类型创建的变量只能用来表示真 / 假,布尔类型的变量的值可以是 true 或 false ,这种类型类型的变量专门用来表示真或假的。当然在C和C++中,0表示假,非0表示真,有时候不使用bool 类型也能表达相同的逻辑。
2.5、signed与unsigned
这也是俩个关键字,signed我们翻译过来是有符号的,unsigned翻译过来就是无符号的,他们都是用来修饰类型的(只可以修饰字符型和整型,不可以修饰浮点型和布尔类型),我们可以理解为,signed修饰的类型表示带有正负号,即可以为负值,unsigned修饰的类型表示不带有正负号,所以只能表示0和正整数,对于int类型,默认是带有正负号的,也就是说int等同于signed int。由于这是默认情况,关键字signed一般都省略不写,但是写了也不算错,但是char不一定就是signed char,这是取决于编译器的(常见的编译器上char就是signed char)。
那这时候有人就会说我们全用signed就好了啊,即方便也都可以用,但是我们没有考虑空间的问题,signed和unsigned所表示的大小是一样的,变量声明为signed的好处就是同样长度的内存能够表示的最大整数值,增大了一倍。
2.6、数据类型长度和取值范围
在学习这部分内容之前我们先来了解一个关键字sizeof,这也是一个操作符,专门用来计算特定数据类型的长度的,单位是字节。sizeof计算出的结果是size_t类型的,这也是一种类型不过我们前面没有介绍,size_t指的是无符号整数,sizeof操作符的操作数可以是类型,也可以是变量名或者表达式,sizeof的操作数如果不是类型,是表达式的时候可以省略掉后面的括号的。

我们来看下面的一段代码:

这就代表一个整型的长度就是四个字节,他和a的大小是无关的,下面我们来看各种数据类型的长度:

这里我们需要注意这是在64为,vs2022中算出来的结果,我们还需要知道一个点,sizeof(long)>=sizeof(int);
该如何理解这些数据类型的长度呢?其实我们使用这些数据类型可以向内存申请空间(就是创建变 量),不同的数据类型一次性申请的空间大小是有差异的,你可以这样理解:

1Byte = 8bit
下面我们简单了解一下类型的取值范围,像 int 类型取值大概就是:-2.1*10^9~2.1*10^9,这里就是10^9这样的数量级,大家了解即可,可以稍微关注一下下面几个:

2.7、typedef
在C++中有一个关键字是和类型有关的,是用来给类型重命名的。当有一个类型比较复杂的时候,可以简化类型。typedef 在竞赛中经常使用,可以提升编码速度。typedef使用的基本语法形式:

下面举几个例子:
cpp
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
//上⾯代码的意思是将unsigned int类型重命名为uint
//使⽤uint创建的变量和使⽤unsigned int是⼀样的,其他几个与其一致
uint num1 = 0;//等价于 unsigned int num1 = 0;
ll num2 = 0; //等价于 long long num2 = 0;
ull num3 = 0; //等价于 unsigned long long num3 = 0;
练习二
https://www.luogu.com.cn/problem/B2018
https://ac.nowcoder.com/acm/problem/21993
http://ybt.ssoier.cn:8088/problem_show.php?pid=1016
三、变量和常量
相信通过前面的学习大家对变量和常量多多少少有了一些理解,变量字面意思就是变化的量,常量就是固定的一个值。
3.1、变量
我们前面创建过int a这种,这里面我们知道int是数据类型,那么a就是变量名,这个a就是我们创建出来的整型类型的变量,我们还可以创建double b、size_t c、short d...变量名原则上是可以根据我们的喜好来自行创建,但是也需要符合如下的规则:

我们这里还需要了解一下变量的初始化,int a =1;这就是一个变量的初始化;char ch = 'a';这也是一个变量的初始化,变量创建的同时我们给他赋予一个值这就是变量的初始化。
但是我们要注意下面的操作:
cpp
int a;
a = 20
这不是一个初始化,这是一个赋值操作,意思是我们首先定义了一个随机变量a,然后给这个a赋值为20
最后我们来看一下变量的一个分类,变量分为局部变量和全局变量,下面我们通过代码来理解一下:
cpp
#include<iostream>
using namespace std;
int a = 20;//全局变量
int main()
{
int a = 10;//局部变量
cout << a << endl;
return 0;
}
当我们运行这段代码打印出来的结果是10,我们就需要明白一个局部优先的原则,局部变量的优先级是高于全局变量的。(局部变量建议初始化 !)
全局变量:在大括号外部定义的变量就是全局变量全局变量的使用范围更广,整个工程中想使用,都是有办法使用的
局部变量:在大括号内部定义的变量就是局部变量局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的
如果上述的代码我们不想打印10,就想打印20我们又该如何操作呢?
cpp
#include<iostream>
using namespace std;
int a = 20;//全局变量
int main()
{
int a = 10;//局部变量
cout << ::a << endl;
return 0;
}
C++中:: 被称为作用域解析运算符,他的作用是明确我们访问的变量 / 函数 / 类成员的作用域,上述我们的操作就是想访问全局的a,后续我们会对这个操作符细致讲解,大家先行了解一下即可。
3.2、常量
常量就是不能被改变的值,通常我们C++中的常量有三种:

1°字面常量
整型常量:
100,-5,0,0x123整型常量一般可以写成 10 进制、8 进制、16 进制。10 进制数字,如:
6、17、22、1238 进制数字,一般是数字 0 开头的,比如:012,01616 进制数字,一般是 0x 开头的数字,比如:0x123,0xFF字符常量:
'a'浮点型常量:
3.14,1E6(科学计数法的形式)
这里涉及到了进制转换,大家先了解一下即可,后面的博客会细致讲解
2°#define定义的常量
#define定义常量规则如下:
#define 常量名 内容
我们来看下面的代码运行结果:

#define就相当于一个直接替换,将a直接替换成我们定义的b,他是不关注类型的,只关注定义的名字和内容是什么。
3°const定义的常量
除了上面的方式之外,C++中还可以使用const来定义常量,这种常量会有具体的类型。比#define 定义常量更加严谨。语法形式如下:
const 类型 常量名字 = 常量值;
我们依旧来看下面的一段代码:
cpp
#include<iostream>
using namespace std;
int main()
{
const int m = 100;
m = 10;
return 0;
}
这里的m = 10就会报错,因为m已经被我们从一个变量改变为常量,所以我们再去给m赋值就会报错,后面我们会经常使用const,到时候大家也会更加深入的理解。(为了区分常量和变量,我们可以给定义的常量使用大写,变量写成小写方便我们区分)
练习三
https://www.luogu.com.cn/problem/B2007
https://www.luogu.com.cn/problem/B2614
四、操作符详解
4.1、算术操作符
我们数学中的加减乘除在编程中对应的是+、-、*、/,这里我们补充一个取模%,这些操作符都是双目操作符因为他们有两个操作数,下面我们用代码来展示他们的用法:

我们需要关注的是这里的除法,7 / 2我们数学中是3余1,但是编程中我们都是取整数
如果我们想要他结果是3.5,我们就需要两个运算数必须至少有一个浮点数,这时就会进行浮点数除法。

/除法的操作符,除数不能为 0,如果除数为 0,程序会崩溃的。%取模操作符的计算结果是两个操作数进行除法运算后的余数。- 取模操作符的操作数只能是整型,不能是浮点型,这个编译器会报语法错误的。
- 负数也是支持取模的,但是负数求模结果的正负号由第一个运算数(操作数)的正负号决定。

最后我们来关注一个现象叫做数值溢出,实际运算过程中可能会存在加法操作导致数据范围超过当前数据类型规定的范围,我们举个例子:
cpp
#include <iostream>
using namespace std;
int main()
{
char a = 'Z'; //90
char b = a + 'Z'; //180
cout << b << endl; // 输出了不显⽰的内容
//printf是格式化输出,后⾯章节会讲,这⾥暂不做讲解
printf("%d", b); // -76,char的⼗进制内容
return 0;
}
以char类型为例, char的数值范围在 -128 ~ 127 ,当字符相加超过最大值后,打印出来的结果会变成负数,这与数据的存储有关。(大家先了解一下即可)

4.2、赋值操作符
这部分其实我们之前就用过了,我们创建一个整型变量a,给他赋值为100;赋值操作符 = 是一个随时可以给变量赋值的操作符,赋值运算符是把右边的值赋值给左边的。
赋值操作符也可以连续赋值:
cpp
int a = 10;
int b = 0;
int c = 1;
c = b = a + 1;
我们要记住连续赋值,是从右往左赋值的但是这样的代码往往不容易理解,我们还是建议拆开写
这里还有复合赋值符,有很我们先了解俩个:+=和-=,a+=10,他的意思就是a = a + 10,只不过这样写比较方便,a -=20,他的意思就是a = a -20;这样我们也可以类比出*=和/=
4.3、单目操作符
前面介绍的操作符都是双目操作符,即有2个操作数。除此之外还有一些操作符只有一个操作数,被称为单目操作符。如 ++、--、+(正)、-(负) 就是单目操作符。
++是一种自增的操作符,又分为前置++和后置++,--是一种自减的操作符,也分为前置--和后置--。请一定要注意:
- 前置
++或者后置++,都是让操作数自增 1 的。- 前置
--或者后置--,都是让操作数自减 1 的。
我们只需要记住一个口诀即可:前置++ / --先++ / -- 再使用;后置++ / --先使用再++ / --
这里的 + 是正号, - 是负号,都是单目操作符。 运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。一般的用法是我们用来将一个正数变为负数。
练习四
https://ac.nowcoder.com/acm/problem/21990
https://ac.nowcoder.com/acm/problem/21991
https://ac.nowcoder.com/acm/contest/18839/1031
https://www.luogu.com.cn/problem/P1425
http://ybt.ssoier.cn:8088/problem_show.php?pid=2064
五、类型转换
5.1、混合运算时的类型转换
字符、整数、浮点数可以混合运算,在这种情况下首先要将不一致的数据类型进行转换,类型统一后才能进行计算。
这里边一般涉及两类转换:整型提升和算术转换。
整型提升 :表达式之中的
char和short类型一定会先转换成int类型,然后参与运算。算术转换:表达式中出现下面的任意两种类型的值进行计算的时候,要先将要较下面的类型转换成另外一种类型才能计算。
long doubledoublefloatunsigned long intlong intunsigned intint这些转换都是隐式自动发生的,有些编译器会报警告,写程序的人并没有感知到,也不需要操心细节。
cpp
#include <iostream>
using namespace std;
int main()
{
//案例1
char a = 'a'; //97
int b = 10;
char c = a + b; //这⾥a会发⽣整型提升,a+b的结果存放到c中,⼜发⽣截断
cout << c << endl;
//案例2
int c1 = 10;
double d = 3.14;
double e = c1 + d; //c+d的时候,这⾥c会发⽣算数转换,转换为double类型
cout << e << endl;
return 0;
}
我们来分析一下上述的代码:
步骤 1:理解变量初始化
char a = 'a':a是字符型变量,存储的是'a'的 ASCII 值 97(char 本质是 1 字节的整型);int b = 10:b是整型变量,值为 10。步骤 2:执行
a + b时的「整型提升」C++ 规定:表达式中的
char/short会先自动转换成int类型,再参与运算 (这就是「整型提升」)。所以a + b的实际计算过程:
a(char 类型,值 97)→ 提升为int类型,值仍为 97;- 计算
97 + 10 = 107(结果是 int 类型)。步骤 3:赋值给
char c时的「截断」
c是 char 类型(仅 1 字节),而107是 int 类型(4 字节),赋值时会截断高位,只保留低 1 字节(107 在 char 范围内,无溢出):
107对应的 ASCII 字符是'k';最终
cout << c输出字符k。
步骤 1:理解变量初始化
int c1 = 10:整型变量,值为 10;
double d = 3.14:双精度浮点型变量,值为 3.14。步骤 2:执行
c1 + d时的「算术转换」C++ 规定:不同数值类型运算时,会自动转换成「更高精度」的类型 (避免精度丢失),转换优先级(从低到高):
int < float < double < long double所以
c1 + d的实际计算过程:
c1(int 类型,值 10)→ 自动转换成double类型,值为10.0;- 计算
10.0 + 3.14 = 13.14(结果是 double 类型)。步骤 3:赋值给
double e
e是 double 类型,直接存储13.14,cout << e输出13.14。
5.2、赋值时的类型转换
当赋值操作符两端的数据类型不一致的时候,这时就需要类型转换,这种转换也是隐式自动发生的。
转换规则如下:
float 和 double 赋值给 int,直接截断小数部分,保留整数部分。
int a = 3.14; //这里a得到的是3
较小的类型转换较大类型,直接转换,值不变。
较大的类型转换较小的类型,一般会发生截断,按照较小类型的长度,保留低位数据给较小的类型。
这些转换都是隐式自动发生的,有些编译器会报警告,写程序的人并没有感知到,也不需要操心细节。
5.3、强制类型转换
在C/C++中也会有强制类型转换,根据实际的需要将某⼀数据的数据类型转换为指定的数据类型,强制类型转换是临时转换的,不影响变量本身的类型。语法形式如下:
(类型名)表达式
double d = 3.14;
int a = (int)d;
上述代码的意思就是将d强制类型转换成int类型赋值给a
我们需要注意的是一般int类型的取值在10^9,如果题目中超出了这个值,我们就要考虑使用long long这种类型来进行操作了。
练习五
https://www.luogu.com.cn/problem/B2016
https://www.luogu.com.cn/problem/B2017
https://www.luogu.com.cn/problem/B2018
六、getchar和putchar
getchar()和putchar()是属于C语言的库函数,C++是兼容C语言的,所以C++中只要正确包
含头文件也可以正常使用这两个函数。
6.1、getchar( )
函数原型如下:
cpp
int getchar(void);
getchar()函数返回用户从键盘输入的一个字符,使用时不带有任何参数。程序运行到这个命令就会暂停,等待用户从键盘输入,等同于使cin或scanf()方法去读取一个字符。

getchar()不会忽略起首的空白字符,总是返回当前读取的第一个字符,无论是否为空格。如果读取失败,返回常量
EOF,由于EOF通常是-1,所以返回值的类型要设为int,而不是char。如何让
getchar()函数读取失败,返回-1呢?其实需要在输入字符之前,直接按Ctrl+z就可以。

那么大家肯定会觉得这个有点多此一举了,但实际上getchar()通常和putchar()是一对,配合使用的。
6.2、putchar
函数原型如下:
cpp
int putchar(int character);
putchar()函数将它的参数字符输出到屏幕,操作成功时,putchar()返回输出的字符,否则返回常量EOF,这两个函数在后面算法中的快速读写用处很大,大家先了解一下即可。

七、printf和scanf
这部分内容建议大家去找一些视频来进行学习效率会比较高,这部分只为大家列出习题供大家练习,如果大家目前不想学这两个函数可以重点关注一下这篇博客的8.2部分,目前阶段可以做一个有效的替代。
https://ac.nowcoder.com/acm/problem/21992
https://www.luogu.com.cn/problem/B2012
https://www.luogu.com.cn/problem/B2013
https://www.luogu.com.cn/problem/B2014
https://www.luogu.com.cn/problem/B2015
https://www.luogu.com.cn/problem/B2004
https://ybt.ssoier.cn/problem_show.php?pid=2069
八、cin和cout
8.1、概述
cin是 C++ 中提供的标准输入流对象,一般针对的是键盘,也就是从键盘上输入的字符流,使用cin来进行数据的提取,cin一般是和>>(流提取运算符)配合使用的。cin的功能和scanf是类似的。
cout是 C++ 中提供的标准输出流对象,一般针对的控制台的窗口,也就是将数据以字符流的形式输出到控制台窗口上显示。cout一般是和<<(流插入运算符)配合使用。cout的功能和printf是类似的。我们在写程序的时候,经常需要处理数据,不管什么类型的数据都是以字符流的形式输入和输出的,也就是不管在键盘上输入什么类型的数据,还是将程序中的各种类型的数据输出显示到控制台屏幕上,都是以字符流的形式处理的。
cin和cout的输入输出非常的方便,不需要手动控制格式,能够自动识别变量类型。
cin使用细节:
cin在读取的时候是根据用户的输入,从前往后,从上往下依次扫描。
cin在读取的过程中遇到空格,自动会跳过,所以不要担心在想要的字符前输入空白字符。当一行读取结束的时候,会自动换行,读取下一行的内容。
cin后面不可以跟换行endl。
当然了cin和cout也可以连续的输入和输出,这点都是scanf和printf所不及的,scanf和printf也有自己的好处,后面我们再细致讲解
8.2、cout的格式输出

1°控制宽度和填充
setw:设置字段宽度(只对紧接着的输出项有效)。setfill:设置填充字符。
注意:使用这俩个函数的时候要包含头文件<iomanip>
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a = 123;
cout << a << endl;
cout << setw(5) << a << endl;//setw就是设置宽度,设置宽度为5
cout << setw(7) << a << endl;//setw设置宽度为10
cout << setw(7) << setfill('*') << a << endl;//setfill就是将宽度不够的地方用*填充
return 0;
}

2°控制数值格式
fixed:以固定小数点表示浮点数,设置后就不会以科学计数法展示了。scientific:以科学计数法表示浮点数。setprecision:设置浮点数的精度,以控制小数点后的数字位数,一般先固定小数点,再设置精度。
注意:使用这三个函数的时候也要包含头文件<iomanip>
cpp
#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
double pi = 3.141592653589793;
cout << "默认: " << pi << endl;
cout << "固定小时点方式: " << fixed << pi << endl;
cout << "科学计数法方式: " << scientific << pi << endl;
cout << "固定小数点,小数点后2位有效数字: " << fixed << setprecision(2) << pi << endl;
return 0;
}

3°控制整数格式
dec:以十进制格式显示整数(默认)。hex:以十六进制格式显示整数。oct:以八进制格式显示整数。
cpp
#include <iostream>
using namespace std;
#include <iomanip>
int main() {
int n = 123;
cout << "十进制 : " << dec << n << endl;
cout << "十六进制: " << hex << n << endl;
cout << "八进制 : " << oct << n << endl;
return 0;
}

4°控制对齐方式
left:左对齐right:右对齐(默认)
cpp
#include <iostream>
using namespace std;
#include <iomanip>
int main() {
int n = 123;
cout << "右对齐: " << setw(7) << right << n << endl;
cout << "左对齐: " << setw(7) << left << n << endl;
return 0;
}

练习八
https://www.luogu.com.cn/problem/P5705
https://www.luogu.com.cn/problem/P5708
