C++快速补天

发布于 2020-02-25  248 次阅读


这篇文章仅用于记录自己已经学了一次C和C++之后还不会或者不熟悉的知识点。

%8d:可以使不足8位的int变量以8位进行右对齐输出,高位用空格补齐,超过8位则效果失效。
%08d:和上面一样,只是“ ”改为“0”。

%.8f:可以让浮点数保留8位小数输出。
如果需要四舍五入,可以用round()函数。

getchar也会接收换行符\n。

取绝对值:fabs(-3.14);

上/下取整:ceil(-3.5)/floor(-3.5)

取2.0^3.0:a=pow(2.0,3.0)//8.000000六个蛋
printf("%.2f",a);//8.00

取算术平方根:sqrt(2.0)//1.414214

取对数(以自然对数为底):log(1.0)//0.000000七粒蛋

对3.1415四舍五入:lf=round(3.1415); printf("%.3f",lf);//3.142

lf=round(3.1415);
printf("%d",(int)lf);//3

sin/cos/tan(弧度制)
pi=3.14159;pi=180度

const double pi=acos(-1.0);//cos(pi)=-1
sin(pi*45/180);//(根号2)/2,即0.707107
asin/acos/atan
asin(sqrt(2.0)/2.0)//pi*0.25,即45度

switch语句:

switch(给出的表达式){
    case 击中的常量1:
        ...
        break;(若选了break则击中后直接跳出,不往下顺延)
    case 击中的常量2:
        ...
        (若这里没有break则击中后直接往下顺延,等有break击中或全部循环完后跳出)
    ......
    case 击中的常量n:
        ...
        break;(若选了break则击中后直接跳出,不往下顺延)
    default:
        ...
}

while中判断真假:while(n)//省略了"!=0"

while(!n)//省略了“!=0”,实际意思为while(n==0)

for循环中需要注意C语言括号中不允许初始化变量,而C++可以。

break & continue:退出当次循环(while,do..while,for) 和 退出当次轮回,继续下次轮回。

定义长度为size的一维数组,只能访问0~size-1的元素。
那二维数组呢?

int a[5][6]:5个长度为6的一维数组,
这时候int a[5][6]={{3,1,2},{2,3,4,5,6},{},{1}}也就能理解了。其中的空括号不能省略哦,不然会有很惊喜的结果。

数组注意用memset初始化不需要用到的元素,不然有时候也会有很惊喜的结果。

另外,

  • memset需要“string.h”的鼎力支持,

  • memset最好只赋值0或-1为何?memset是按字节赋值,因此,因此,组成int型的4个字节就会被赋同样的值,而0的补码全为0,-1的补码全为1,好弄~)(这段话需要学过计算机组成原理或者明白补码的概念的同学才能较好的理解)

  • 如果想赋值除0或-1的数字,请用fill函数(添加"algorithm.h")(如:fill(a,a+100,1);fill(vect.begin() + 2, vect.end() - 1, 4); )

  • 除了fill函数有fill_n函数(函数的作用是:给你一个起始点,然后再给你一个数值count和val。把从起始点开始依次赋予count个元素val的值。注意:不能在没有元素的空容器上调用fill_n函数,例:fill_n(vect.begin(), 4, 7);

数组元素个数超过10^6的时候,把数组定义在main函数外,不然也会有很惊喜的结果。(为什么呢?这就涉及了系统栈和静态存储区的区别,主函数申请的内部变量来自系统栈,而主函数外申请的内部变量来自静态存储区,空间大)

scanf的%c scanf的%s
能够识别空格和换行并将其输入 能够识别空格和换行来识别一个字符串的结束
getchar/putchar gets/puts
输入/输出单个字符 输入/输出一行字符并将其存放于输出在(一维数组)/(二维数组的一维)
  • 字符数组(包含一维数组和二维数组的第二维)会在末尾添加\0,正因为如此字符数组长度应该比全部字符数量加起来再多加一点。
  • puts/printf就是通过识别\0来作为字符串结尾,正因为如此,应该在除了scanf的%s和gets函数之外,如getchar和scanf的%c,在输入的每个字符串后加入\0。
  • scanf的%s和gets函数会自动添加\0。

空格ASCII码是32,\0的ASCII码是0。

strlen(a):字符串长度。(究仔细来就是数组中第一个\0前的字符个数)
strcmp(a,b):按字典序比较两个字符串大小。(数组a<数组b,则返回一个负整数)
strcat(a,b):把b接到a后面。

值传递和局部变量有关,值传递是由于传入的x只是一个副本,和函数外的同名变量或在函数外需调用本函数的变量无关。
如:

void change(int x)//形参{
    x=x+1;
}
int main(){
    int x=10;
    change(a);//在函数外需调用本函数的变量
    change(x);//函数外的同名变量
    //这里的x相较于change里int x的x是实参
    return 0;
}

关于指针的一些东西:只要明白

printf("%d,%d",&a,a);//a=1
int *p1,p2;//p1是int*型,p2是int型
int *p3=&a;
int *p4;
p4=&a;
printf("%d,%d %d",&a,a,*p4);//a的地址,a的值,a的值
//int是int*的基类型
//p存地址,*p是元素

int *p5=b;//b[10]={1},p5为b[0]
printf("%d",*p);//输出a[0]的值
printf("%d",*(a+i));//a+i等同&a[i]
void swap(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}
int main(){
    int a=1,b=2;
    int *p1=&a,*p2=&b;
    swap(p1,p2);
    ...
}

两指针的值:q=2687608,p=2686688,因此q-p=5;(一个int型变量占用4Byte)

swap:值传递,指针传递和引用传递。
如果不使用指针传递,也可以使用引用(起别名)(int &x,不是取地址)

为什么无法通过交换传递的地址(交换指针)达成交换两个变量的效果,就是因为对指针变量本身的修改无法作用到两个变量的效果。
特别注意这段代码:

void swap(int *&p1,int *&p2){
    int *temp=p1;
    p1=p2;
    p2=temp;
}
int main(){
    int a=1,b=2;
    int *p1=&a,*p2=&b;
    swap(p1,p2);
    printf("%d%d",*p1,*p2);
    return 0;
}

结构体:

struct student{
    char gender;
    char name[20];
}Alice,Bob,stu[1000],*p;//创建两个代表并说明最多可以定义1000个student型
student Alce;
student stu[1000];
struct student{
    student a;//会报错,循环定义
    student *b;//不会报错,可定义自身类型的指针变量
}
Alice.name;
(*p).name;
p->name;//与(*p).name;等价

构造函数对结构体进行初始化:

struct student{
    char gender;
    char name[20];
    student(char _gender,char _name[20]){
        gender=_gender;
        name=_name;
    }
};

struct student{
    char gender;
    char name[20];
    student(char _gender,char _name[20]):gender(_gender),name[20](_name[20]){}
};//也可初始化多个构造函数以区分不同的业务场景

浮点数因为误差的比较(极小数eps取10^-8,const double eps=le-8;)

#define Equ(a,b) ((fabs((a)-(b)))<(eps))
#define More(a,b) (((a)-(b))>(eps))
#define Less(a,b) (((a)-(b))<(-eps))
#define MoreEqu(a,b) (((a)-(b))>(-eps))
#define LessEqu(a,b) (((a)-(b))<(eps))

如果本来应该是0但是因为精度成了一个很小的负数,若需要开方,直接开会导致错误,需要用eps修正后再开方。
若结果为-0.00,也可以用eps修正。

黑盒

多点:
输入:
while...EOF
while...break
while(T--)
输出:
正常输出
每组数据输出之后都额外加空行
每组数据输出之间有空行,最后没有空行

分割线

(1)变量名第一个字符:字母或下划线
变量名其他字符:字母或下划线或数字

(2)int型范围:-2^31~(2^31)-1,大致范围在-2*10^9~2*10^9(占用32bit/4Byte)

longlong类型:-2^63~(2^63)-1,大致范围在-9*10^18~9*10^18

float类型:-2^128~2^128,实际精度在6~7位

double类型:-2^1024~2^1024,实际精度在15~16位

字符型:-2^8~2^8

其中,LL来说,如果取值范围超过2.147*10^9,需要用LL型存储。
另外,若LL型赋的值超过2^31-1(即2.147*10^9),需要在初值后加上LL。
小写字母的ASCII值比大写大32.

转义字符中\0表示空字符(不是空格)

在C语言中使用布尔型需要添加头文件stdbool.h

非0都会转换为true(-1和1都是true)

#define pi 3.14 //可以直接用pi,不用定义变量,也不用去敲3.14
但是注意,define第二个参数能多加括号就多加。
#define ADD(a,b) ((a)+(b))(define会将a和b原封不动直接套进去,如果不加括号而遇到乘除这种优先级高的,直接gg)
typedef long long LL;

运算符:
区分a++和++a

a=1,b=2
n1=a++;
n2=++b;

输出:a=2,n1=1,b=1,n2=2;

左移,右移,位与,位或,位异或,位取反

区别“scanf("%c",&c);”和“scanf("%s",str);”。

区别“scanf("%lf",&lf);”和“printf("%f",lf);”。

scanf是除了%c对其他格式符如%d的输入是以空白符即空格和换行符为结束判断标志的。
scanf的%c可以读入空格和换行。
scanf的%s是以空白符即空格和换行符为结束判断标志的。

本文标题:《C++快速补天》

本文链接:https://wnag.com.cn/941.html

特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~


正因为有要好好实现的梦想,所以今天也要好好加油。