天天看點

C++快速補天

這篇文章僅用于記錄自己已經學了一次C和C++之後還不會或者不熟悉的知識點。

(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是以空白符即空格和換行符為結束判斷标志的。

%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--)

輸出:

正常輸出

每組資料輸出之後都額外加空行

每組資料輸出之間有空行,最後沒有空行

版權所有:可定部落格 © WNAG.COM.CN

本文标題:《C++快速補天》

本文連結:https://wnag.com.cn/941.html

特别聲明:除特别标注,本站文章均為原創,本站文章原則上禁止轉載,如确實要轉載,請電聯:[email protected],尊重他人勞動成果,謝過~