C++ 快速複習

by Sean. 2018 spring.

I/O

變數

變數使用

關係運算

int A,B;

布林運算

bool A,B;

if

如果… 就…,其他狀況就…

if(condition_1){ do something... }else if(condition_2){ do something... }else if(condition_3){ do something... }else{ do something... }

switch

switch(char or int){ case case_1: ... break; case case_2: ... break; default: ... }

for

重複執行

for(一開始做的事;要繼續執行的條件;最後要做什麼事){ 要做的事 }

巢狀迴圈 :

for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ cout<<i*j<<" "; } }

while

類似於 for 和 if 的合體

while(condition){ do something... }

do while - 至少一定會做一次

do{ do something... }while(condition);

break

會跳離開「最近」的一個迴圈

for(...){ for(...){ if(condition){ break; } } }

重複輸入

int a; while(cin>>a){ cout<<a+1; }

陣列

宣告已知大小的一維陣列

//資料型態 陣列名稱[陣列長度]; int score[20];

一維陣列初始化

int score[5]={50,60,80,90,100}; //陣列內容為[50,60,80,90,100] int score2[5]={70,95}; //內容為[70,95,0,0,0] int score3[5]={0}; //內容為[0,0,0,0,0]

宣告未知大小的一維陣列

int size; cin>>size; int* score; score=new int[size];

int* 代表的是一個記憶體位置,是一種型態。此型態代表的就是一個存放 int 的記憶體位置
score = new int[size] 則表示從 score 這個記憶開始配置 size 個 int 空間

一維陣列的使用

從 0 開始數!!

//陣列名稱[第幾格] score[4]=77; cin>>score[3]; cout<<score[0];

已知大小的二 (多) 維陣列宣告

int a[2][3];

二維陣列初始化

int a[2][3]={1}
1 0 0
0 0 0
int a[2][3]={1,2}
1 2 0
0 0 0
int a[2][3]={{1,1},{2,2}}
1 1 0
2 2 0

未知大小的二 (多) 維陣列宣告

int x,y; cin>>x>>y; int** a; a = new int*[x]; for(int i=0;i<x;i++){ a[i]=new int[y]; }

int** 代表的是一個記憶體位置,是一種型態。
此型態代表的就是一個存放「int 的記憶體位置」的位置

a = new int*[x] 則表示從 score 這個記憶開始配置 x 個 int * 空間

for 迴圈則是讓每個型態為 int * 的陣列,都配置一個長度是 y 的 int 空間

二 (多) 維陣列存取

從 0 開始數!!

//陣列名稱[第幾格] a[0][2]=77; cin>>a[1][2]; cout<<a[0][1];

如果 cout<<a[0] 會怎樣?
因為最外層的型態是陣列位址,所以只會印出位址!

字元字串

字元宣告、使用

char a='c'; cout<<a; cin>>a; a='#';

在字元與其對應 ASCII 編碼間轉換

char a = 'A'; int b=65; cout<<(int)a<<endl; //輸出65 cout<<(char)b<<endl; //輸出a

數字字元轉換成真實意義的整數

利用字元距離的性質! 與字元’0’相減即可。

char c='7'; cout<<'7'=0; //輸出55 cout<<'7'-'0'; //輸出7

儲存字元的陣列

char a[1000]; cin>>a; scanf("%s",&a); cout<<a;

字串宣告、使用

string a="hello world"; cin>>a; cout<<a;

存取字串的某個字

string a="apcs"; cout<<a[3]; //輸出 s

包含空格的字串輸入

使用 cin 時要特別注意空格的處理

string a; getline(cin,a);

string 的好用 function

function

回傳型態 函式名稱(參數1型態 參數1名稱,...){ 函式黑盒子的運作程式碼 return 某個答案 //此答案型態必須跟所宣告的回傳型態相同。若回傳型態是void,則可忽略這行 }

例如

int adds(int a,int b,int c){ int ans=a+b+c; return ans; } int main(){ int a=1,b=2,c=3; cout<<adds(c,a,b); //輸出 6 }

function 的實作 (implement) 或宣告 (declare) 一定要在呼叫 function 的前面

錯誤範例,無法編譯

int main(){ int a=1,b=2,c=3; cout<<adds(c,a,b); //輸出 6 } int adds(int a,int b,int c){ int ans=a+b+c; return ans; }

可以改成這樣

int adds(int,int,int); int main(){ int a=1,b=2,c=3; cout<<adds(c,a,b); //輸出 6 } int adds(int a,int b,int c){ int ans=a+b+c; return ans; }

遞迴

不斷層層呼叫自己的 funciton,直到某次滿足條件 return 了之後,才會層層 return 得到答案
例如,一個計算次方的 function,其數學式為

p o w e r ( b a s e , p o w ) = { 1 , if  p o w  is 0 b a s e p o w e r ( b a s e , p o w 1 ) , if  p o w  is not 0

遞迴 function 可寫成

int power(int base,int pow){ if(pow==0){ return 1; }else{ return(base*power(base,pow-1)); } }