C:面向過程-函式
C++:面向物件-類;向下相容C
程式包含標頭檔案+主函式
簡單資料型別
long long型賦超過int型範圍的初值,需要在初值後面加上LL,否則可能會編譯錯誤
不要使用float,碰到浮點型的資料直接使用double
常量可以賦值給變數
小寫字母比大寫字母的ASCII碼值大32
(新型別名)變數名 //強制型別轉換
#define 識別符號 常量 //符號常量-巨集定義
const 資料型別 變數名 = 常量; //const常量
兩個整形做除法運算會向下取整
巨集定義實現兩數取較大值:
#define MAX(a,b) ((a)>(b)?(a):(b))
常用左移運算子來表示無窮大數INF:
const int INF =(1<<30)-1; //0x3fffffff
C語句
%c把空白符按字元讀入;其他格式符的輸入以空白符(空格、Tab、換行)為結束判斷標誌
double型的輸入輸出格式符不同
要輸出'%''\',需要在前面再加一個符號:
printf("%%");
實用的輸出格式:
printf("%5d\n",a); //右對齊輸出,高位用空格補齊
printf("%05d\n",a); //右對齊輸出,高位用0補齊
Printf("%.3f\n",a); //保留m位小數輸出
輸入輸出字元:getchar();putchar();
常用math函式:
fabs(double x); //取絕對值
floor(double x);ceil(double x); //向上取整和向下取整
pow(double r,double p); //r的p次方
sqrt(double x); //算術平方根
log(double x); //以自然對數為底的對數,其他為底的對數要用換底公式
sin(double x);cos(double x);tan(double x); //弧度制
asin(double x);acos(double x);atan(double x); //返回變數的反正弦值、反餘弦值、反正切值
round(double x); //四捨五入
pi可以定義為精確值:const double pi = acos(-1.0);
if語句、while條件判斷如果表示式是“!=0”,則可以忽略“!=0”;如果表示式是“==0”,則忽略並在表示式前新增“!”
陣列
陣列大小較大時(10的6次方級別),需要將其定義在主函式外面
memset(陣列名,值,sizeof(陣列名)); //對陣列每個元素賦值,按位元組賦值,建議只賦0或-1
gets識別換行符作為輸入結束,因此scanf完其他型別後,如果要使用gets,需要先用getchar接收空白符
如果不是使用scanf的%s格式或gets函式輸入字串,一定要再輸入字串的最後加入’\0‘,不然輸出字串會出現亂碼
strlen(字元陣列); | 得到字元陣列第一個\0前字元的個數 |
---|---|
strcmp(字元陣列1,字元陣列2); | 比較兩個字串大小,字典序 |
strcpy(字元陣列1,字元陣列2); | 把2複製給1 |
strcat(字元陣列1,字元陣列2); | 把2拼接到1後面 |
函式
函式傳遞引數的方式是值傳遞,函式定義內的引數為形參,實際呼叫的引數為實參
陣列作為引數時,函式定義第一維不需要寫長度,實際呼叫只需要寫陣列名
在函式中對陣列元素的修改就等於對原陣列元素的修改
陣列不允許作為返回型別出現
函式的巢狀呼叫
:在一個函式中呼叫另一個函式
函式的遞迴呼叫
:一個函式呼叫該函式自身
指標
一個指標指向一個變數
指標是一個unsigned型別的整數
int* a; //*放在資料型別後和變數名前都可以,放在資料型別後且有多個變數時,*只作用於第一個變數名
指標變數定義時*是變數型別說明的一部分,指標變數使用時*是取出指標指向資料的鑰匙
兩個int型的指標相減,等價於在求兩個指標之間相差了幾個int;其他型別的指標同樣適用
函式引數為指標變數時,傳遞方式為地址傳遞
定義指標變數時如果沒有初始化,它存放的地址是隨機的,如果該隨機地址指向的是系統工作區間,那麼接下來變數改變時容易出錯;所以要初始化
引用
:給原變數起了一個別名,對引用變數的操作就是對原變數的操作;在函式定義時把&加在變數名前面
結構體
結構體內不能定義本身型別,可以定義自身型別的指標變數
struct stu{
int id;
char name[20];
stu* next;
}stu,*p;
//訪問元素
stu.id
stu.name
(*p).id
(*p).name
p->id
p->name
//兩種寫法完全等價
//建構函式
struct stu{
int id;
char gender;
stu(){}
stu(int _id,char _gender){
id=_id;
gender=_gender;
}
};
//例項
stuInfo = stu(100,'M');
技巧
const double eps=1e-8;
const double Pi=acos(-1.0);
#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))
黑盒測試
:系統後臺會準備若干組輸入資料,然後讓提交的程式去執行這些資料,如果輸出的結果與正確答案完全相同(字串意義上的比較),那麼就稱通過了這道題的黑盒測試,否則會根據錯誤型別而返回不同的結果。
單點測試
:按正常邏輯執行一遍程式
多點測試
1.預設讀取到檔案末尾
while(scanf("%d",&n)!=EOF){}
while(gets(str)!=null){}
2.輸入資料滿足條件時停止輸入
在while...EOF內部進行判斷;直接把推出條件的判斷放到while語句中
3.while(t--)