1.2变量及其输入
1. c++中的scanf printf
主要是这章的内容可仔细研究的不太多,这里就由我带大家看一下c++中的scanf和printf的使用方法以及可以实现的内容
首先,两者的一般格式是:
scanf(格式控制, 输出表列)
printf(格式控制,输出表列)
具体数据类型与其对应格式符的内容如下
说明符 | 对用数据类型 | 描述 |
---|---|---|
d | int | 十进制整型,占用4字节,数据范围在-231-1~231-1之内 |
u | unsigned int | 十进制整型,定义则确定为正数 |
o | unsigned int | 八进制整型 |
x | unsigned int | 十六进制整型 |
f/lf | float/double | 不同精度的浮点型(float最大为六位,double为15位) |
e | float/double | 将浮点型通过科学计数法表示出来 |
g | float/double | 对浮点型选取最优的方式(e或f的一种)表示出来 |
d | int | 十进制整型,占用4字节,数据范围在-231-1~231-1之内 |
c | char | 字符型,同时也可以将输入的整型转化为对应ascii码的字符型 |
c | char | 字符型,同时也可以将输入的整型转化为对应ascii码的字符型 |
s | char* | 字符数组,或者称为字符串,输入时不用添加地址运算符& |
p | void* | 16进制形式的指针 |
这里要注意的是:
1.其中d,x,o可以进行一些数值比较小的数据转化,但是若输入的数字为负数,转化出来的结果为该进制下的反码
#include <iostream>
using namespace std;
int main( )
{
int a;
scanf("%d",&a);
printf("%x",a);
return 0;
}
结果如下
2.字符串和字符的输入输出,因为牵扯到空格和回车的问题,最好根据实际情况使用对应的工具,此处并不做赘述
这里举一个比较经典的例子:
#include <iostream>
using namespace std;
int main( )
{
int a; float b; char c;
scanf("%d %f %c",&a,&b,&c); //注意在变量名前要加地址运算符&
printf("a=%d,b=%f,c=%c\n",a,b,c);
return 0;
}
其中printf双引号里面的都是对应的格式,%加格式符可以理解为后面变量在格式里面的代替(在%的后面紧跟着加上*,则该输入并不参与输出和存储的操作),其中python中的format方法功能和这个非常相似
输出的结果如下:
可以看到f格式符是默认保留六位小数的,那我们如何根据我们的需要保留小数点后几位呢?
我们需要了解到一个知识点叫做.precision(精度)
我看了一下概念直接解释起来还是比较复杂的,于是直接放代码:
#include <iostream>
using namespace std;
int main( )
{
double a;
scanf("%lf",&a);
printf("%.10lf",a);
return 0;
}
这里在.和lf中间加上的数字10就代表了精确到多少位小数
所以输出结果如下:
如果精确到20位呢
哎呀出错啦(因为20位已经超过了double的最高精度了)
如果是整型使用了精度呢?
#include <iostream>
using namespace std;
int main( )
{
int a;
scanf("%d",&a);
printf("%.2d\n",a);
printf("%.10d",a);
return 0;
}
结果如下
这里.10d的作用就是用0补全前面的数位
(这里补充一点,就是.0xd和.xd的作用都是一样的)
.precision()的功能就介绍到这里,接下来介绍一下域宽和转义字符
域宽的概念就是将输出的数据放在规定的空间(几何)大小之内
依旧先看代码:
#include <stdio.h>
int main() {
int PAGES=931;
printf("*%2d*\n", PAGES); //输出的字段长度大于最小宽度,不会截断输出
printf("*%10d*\n", PAGES); //默认右对齐,左边补空格
printf("*%*d*\n", 2, PAGES); //等价于 printf("*%2d*\n",PAGES)
return 0;
}
(复制粘贴就很爽)
这里默认是右对齐的,python里面是封装的比较好的,如果左对齐的话,只需要在数字的前面加一个负号就可以了。
printf("%-10d\n",101010);
关于转义字符呢,我将它分为两类,第一种是由于本身在c++中有固定的含义,所以在输入输出时,需要在这类字符前加一个\确保其输入输出成功
例如:
\\,\?,\’,\"
事实上,在csdn博客编辑中也是遵循这个规则的,所以我在编辑上面例子时,编写的内容其实是\\······
第二种的话就是有一定的含义,类似于\n在格式中代表换行
其他的还有:
转义字符 | 含义 |
---|---|
\a | 叫一声(真的会叫哦) |
\b | 退格 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
这里的内容大家自己尝试一下就ok啦!
2. c++中的 const 和 define
const没啥好说的
就是const+变量类型名称+变量名+"="+数值(const和变量名的位置是可以调换的)
代表定义了一个不允许改变的量
这里要注意的是,不允许改变的只是被定义的这个变量,例如我用const声明了一个指针,那么这个指针指向的变量是可以改变的
至于#define是一种宏定义,是相对而言比较复杂的,所以这里介绍两种在算法学习中比较常见的用法:
1.定义常量
#define+常量名+数值(注意这里千万不要加;)
2.定义一个函数
#define+宏名+(形参)+函数内容
例如:
#define M(y) y*y+3*y
#define MAX(a,b) (a>b)?a:b
用的比较多的实际上还是const