平時一直寫的都是Java,但有時候一些OJ須要必須使用C/C++,雖然學過,但好多用法都不是太清楚了,本身整理了一下C語言處理OJ問題時最經常使用的操做,應付一些基本的算法題應該不成問題。算法
源代碼——預處理器Preprcessor——擴展源代碼——編譯器Compiler-——彙編代碼——彙編器Assembler——目標代碼(simple.obj)——連接器Linker——可執行代碼(simple.exe)——加載器loader——內存執行——控制檯輸出。express
內置庫函數,在stdio.h
(頭文件)中定義。數組
scanf("format string",argument_list);
例如scanf("%d",&number)
語句從控制檯讀取整數,並將給定值存儲在數字變量中。函數
printf("format string",argument_list);
格式字符串("format string"
)能夠是%d
(整數),%c
(字符),%s
(字符串),%f
(float)等)。指針
C語言中有4種類型的數據類型。code
類型 | 包含的類型 |
---|---|
基本數據類型(Basic Data Type) | int, char, float, double |
派生數據類型(Derived Data Type) | array, pointer, structure, union |
枚舉數據類型(Enumeration Data Type) | enum |
Void數據類型(void Data Type) | void |
\n |
新行 |
---|---|
\r |
回車 |
\t |
水平製表符 |
\v |
垂直製表符 |
\0 |
null |
switch
表達式必須是整數或字符類型。case
值必須是整數或字符常量。orm
switch(expression){ case value1: //code to be executed; break; //optional case value2: //code to be executed; break; //optional ...... default: code to be executed if all cases are not matched; }
語法:(type)value
; 始終建議將較低的值轉換爲較高值以免數據丟失。內存
// 無類型轉換:Output: 2 int f= 9/4; printf("f : %d\n", f ); //使用類型轉換:Output: 2.250000 float f=(float) 9/4; printf("f : %f\n", f );
在經過值調用函數時,原始值不被修改。在經過引用的調用中,原始值可被修改並反映到外部調用者。字符串
void change(int num) { num = num + 10; } void change(int *num) { *num = *num + 10; } int main() { int x = 200; change2(x); // 經過值調用,變量x並無改變 change2(&x); // 經過引用調用,變量x已經改變了 return 0; }
經過值調用 | 經過引用調用 |
---|---|
將值的副本傳遞給函數 | 將值的地址傳遞給函數 |
函數內的更改不會反映在函數外 | 函數內部的改變也反映在函數的外部 |
將在不一樣的內存位置建立實際和正式的參數 | 將在相同的內存位置建立實際和正式的參數 |
// 這段代碼頗有意思 int main(){ int a = 10, b = 20, *p1 = &a, *p2 = &b; printf("Before swap: *p1=%d *p2=%d\n", *p1, *p2); *p1 = *p1 + *p2; *p2 = *p1 - *p2; *p1 = *p1 - *p2; printf("\nAfter swap: *p1=%d *p2=%d\n", *p1, *p2); } // Output //Before swap: *p1=10 *p2=20 //After swap: *p1=20 *p2=1
int main(){ // 數組聲明初始化 int arr[5]; // 聲明大小,後賦值 int arr2[5] = {1,2,3,4,5} // 聲明賦值 int arr3[] = {1,2,3,4,5} // 二維數組 int arr4[3][4] = {0}; // 初始化是一個好習慣 int arr5[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}}; int j, k; // 遍歷 for(j = 0; j < 3; j++) { for(k = 0; k < 4; k++){ printf("%d ", arr5[j][k]); } printf("\n"); } // 將數組做爲參數傳遞給函數 int arr[5] = {5,4,3,2,1}; bubsort(arr,5); // 調用 } // 函數要聲明 void bubsort(int arr[], int len){ }
C語言中的字符串是由\0
(空字符)終止的字符數組。gets()
函數從用戶讀取字符串,puts()
函數打印字符串。這兩個函數都在<stdio.h>
頭文件中定義。get
char ch[]={'h', 'e', 'l', 'l', '0', '\0'}; char ch2[]="hello"; // 輸入輸出 char str[10]; printf("輸入一個字符串:\n"); gets(str); puts(str); // 字符串函數,在"string.h"庫中定義。 // strlen();字符串長度 int len = strlen(str); printf("字符串長度:%d\n", len); // strcpy(destination,source);字符串拷貝 char str2[10]; strcpy(str2,str); // 將字符串str拷貝到字符串str2 // strcat(first_string, second_string)函數鏈接兩個字符串,結果返回到first_string char str3[] = " world"; strcat(str, str3); // strcmp(first_string, second_string)函數比較兩個字符串,若是兩個字符串相等,則返回0。 if(strcmp(str, str2) == 0); // strrev(string)函數返回給定字符串的反轉字符串。 printf("字符串反轉: %s \n", strrev(str)); // strlwr(string)函數返回給定字符串的小寫形式 printf("小寫形式: %s \n", strlwr(str)); // strupr(string)函數返回給定字符串的大寫形式 printf("大寫形式: %s \n", strupr(str));
// 定義一個結構體 struct employee { int id; char name[50]; float salary; }; // 在main中聲明一個結構體變量 struct employee e1; // 賦值調用 e1.id = 110; // 結構體數組 // 就是將結構體以數組形式保存 struct employee e[10]; // 至關於定義了10個結構體變量 // 結構體嵌套 struct Employee { int id; char name[20]; struct Date { int dd; int mm; int yyyy; }doj; }e1; // 賦值 e1.id = 110; e1.doj.yyyy = 2019;
聯合體
像結構體同樣,聯合體(Union
)在C語言中是一個用戶定義的數據類型,用於保存不一樣類型的元素。但它並不佔全部成員的內存總和。它只佔最大成員的內存,它分享最大成員的內存。
經常使用函數:
編號 | 函數名稱 | 功能描述 |
---|---|---|
1 | fopen() | 打開新的或現有的文件 |
2 | fprintf() | 將數據寫入文件 |
3 | fscanf() | 從文件讀取數據 |
4 | fclose() | 關閉文件 |
// FILE *fopen( const char * filename, const char * mode ); // int fprintf(FILE *stream, const char *format [, argument, ...]) // int fscanf(FILE *stream, const char *format [, argument, ...]) #include <stdio.h> main() { FILE *fp; // 寫文件 fp = fopen("file.txt", "w"); fprintf(fp, "Hello World\n"); fclose(fp); // 讀文件 char buff[255]; fp = fopen("file.txt", "r"); while(fscanf(fp, "%s", buff)!=EOF){ printf("%s ", buff ); } fclose(fp); }
math.h
頭文件中定義和實現有各類方法。math.h
頭文件的經常使用函數以下。
序號 | 函數 | 描述 |
---|---|---|
1 | ceil(number) |
舍入給定數字。它返回大於或等於給定數字的整數值。 |
2 | floor(number) |
舍入給定數字。它返回小於或等於給定數字的整數值。 |
3 | sqrt(number) |
返回給定數字的平方根。 |
4 | pow(base,exponent) |
返回給定數字的冪值。 |
5 | abs(number) |
返回給定數字的絕對值。 |