pat c/c++准备知识篇

1.入门知识

1. int 类型的大致范围在-2 x10^{9} ~ 2 x10^{9} , long long的类型在-9 x 10^{18} ~ 9 x 10^{18}

之间,float实际精度6~7位,double精度15~16位

2. 0~9、A~Z、a~z ASCII码分别为48~57、65~90、97~122。空格ASCII码为32

3. true输出为1,强制类型转换为(新类型名)变量名

4. 除了%c外,scanf对格式符(%d)的输入是以空白符为结束判断标志的。字符串%s读入以空格和换行符为读入结束的标志。

数据类型格式符
int        %d
long long %lld
float%f
double%lf(读入)、%f(输出)
char%c
字符串        %s

(1)%md

%md可以让不足m位的int型变量以m位进行右对齐输出,高位用空格补齐,若本身超过m位,则保持原样

(2) %0md

变量不足m位的时候用0补齐

(3)%.mf

让浮点数保留m位小数输出,保留的规则是四舍五入成双规则

 5. 常用math函数

(1) fabs(double) :取绝对值函数

(2) floor(double) 、ceil(double):向下取整和向上取整

(3) pow(double r, double p) : r^{p}

(4) sqrt(double x) :返回x的算数平方根

(5) log(double x) : 返回double型变量的以自然对数为底的对数

(6)sin(double)、cos(double)、tan(double)、asin(double)、acos(double)、atan(double)

(7) round(double x): 四舍五入

6.冒泡排序

void BubbleSort(int arrs[], int n){
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < n - i; j ++) {
            if (a[j] > a[j+1]) {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = a[j];
            }
        }
    }
}

7. 如果数组大小较大,10^{6}级别,则需要将其定义在主函数外面,否则会使程序异常退出。原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小。而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。

#include<stdio.h>
int a[1000000]
int main(){
}

8.memset——对数组中每个元素赋相同的值

memset(数组名,值,sizeof(数组名)):建议用memset函数赋0或者-1,如果赋其他值用fill函数。

9. gets输入,puts输出

gets用来输入一行字符串(识别\n作为输入结束),puts输出一行字符串,并紧跟一个换行,.

char str[20];
gets(str);

特别提醒:如果不是使用scanf函数的%s格式或者gets函数输入字符串,请一定在输入的每个字符串后面加入\0。否则printf和puts输出字符串会因为无法识别字符串末尾而输出一堆乱码。

10. string.h头文件

strlen(字符数组): 得到字符数组组中第一个\0前的字符的个数

strcmp(字符数组1,字符数组2):返回来个字符串大小的比较结果,按照字典顺序。

strcpy(字符数组1,字符数组2):将字符数组2复制给字符数组1(包括了结束符\0)

strcat(字符数组1,字符数组2):把一个字符串接到另一个字符串后面。

11.sscanf 和 sprintf

12.结构体

如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量。需要自己手动加上无参数构造器。

13. cin 和cout

想读入一整行,可以使用getline函数

#include<iomanip>
char str[100];
cin.getline(str, 100);
cout << setiosflags(ios::fixed) << setprecision(2) << 123.4567 <<endl;
//输出123.45

14. 浮点数比较

#include<math.h>
const double eps = 1e-8;
#define Equ(a,b) ((fabs((a) - (b))) < (eps)) // ==

#define More(a,b) (((a) - (b)) > (eps)) // > 和 >=

#define Less(a,b) (((a) - (b)) < (-eps)) // < 和 <=

圆周率 π = acos(-1.0)

2.语法篇

2.1 函数库

cstdio

  • char * fgets ( char * str, int num, FILE * stream ) 读取一行输入

stdlib

  • double atof(const char *str) 把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
  • int atoi(const char *str)把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
  • long int atol(const char *str)把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。

climits

包含INT_MAX、INT_MIN等

cstring

  • int sscanf(const char *str, const char *format, …) 从字符串读取格式化输入。
  • int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串

algorithm

  • sort函数:
    • sort(<type>* begin, <type>* end, bool cmp)
    • sort(iterator begin, iterator end, bool cmp)
  • copy(<#_InputIterator __first#>, _InputIterator __last, <#_OutputIterator __result#>) 用于复制数组或者可迭代容器。三个参数分别是源的起始迭代器,源的结束迭代器,副本的起始迭代器。
  • memset(<T> * first, <T> value, int sizeOf)
  • fill(G[0], G[0] + MAX_N * MAX_N, false); 这是一个二维数组的例子,要注意。
  • template ForwardIterator max_element (ForwardIterator first, ForwardIterator last); 返回stl中的最大的元素,返回的是一个指针

functional

  • greater()等,用于排序的时候从大到小排序。

2.2 常用数据结构

遍历

除了map,大部分可以使用forEach语法。如果使用迭代器语法则类似下面这样。

for(auto lt: stl.begin(); lt != stl.cend(); lt++){
	//lt->......
}

如果是map,一般是这样:

for(auto lt: stl.begin(); lt != stl.cend(); lt++){
	//lt->first表示key
	//lt->value表示value
}

逆向遍历

for(auto lt = n.rbegin(); lt != n.rend(); lt++){
        //......
}

通用操作

  • erase(iterator pos) 擦除指定位置的元素
  • erase(iterator begin, iterator end) 擦除指定范围内的元素,左开右闭
  • iterator find(value) 查找元素,只能在vector、set、map等容器中使用

string操作

有些输入比较大的题目,在函数调用中,如果string不会被改动,最好使用引用(&),以减少内存的复制。当然,不正确地使用引用会出现问题。

  • to_string(double, int, …) 将基本类型转化为字符串
  • reverse(.begin(), s.end()) 反转字符串
  • string substr(int startPos, int Len) 求字符串子串
  • char* c_str() 返回原始字符数组
  • getline(cin, string str) 用于读取一行数据
  • insert(iterator pos, char c) 插入一个字符

部分参考https://blog.csdn.net/a617976080/article/details/89676670

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值