--- tags: C++, 程式設計 --- # C++ 陣列與指標 (上) ## 一、陣列 ### (一)宣告 ```cpp= int a[5]; //宣告一個有5個元素的int陣列 //【單獨設定陣列裡的值】 a[0]=10; //陣列的索引是從0開始 a[1]=15; a[2]=20; a[3]=25; a[4]=30; a[5]=38; cout<<"a[0]="<<a[0]<< endl; // a[0] = 10 cout<<"a[4]"<<"a[4]"<<endl; // a[4] = 38 for (int i =0; i<5;i++) a[i]=i*5; //0,5,10,15,20 for (int i=0; i<5;i++) cout <<"a["<<i<<"]"<<a[i]<<endl; //a[0]=0 //a[1]=5 //a[2]=10 //a[3]=15 //a[4]=20 ``` ### (二)設定初始值 ```cpp= //【方法一】直接設定 int b[5] = {1,2,3,4,5}; //設定5格陣列,並給5個值 int c[]= {1,2,3,4,5}; //設定陣列不給值,系統看你給幾個值給幾格。 int d[5]={1,2,2} //設定5格陣列,但只給3個值,其餘系統會補零 {1,2,2,0,0} //【方法二】單一輸入 cin>>a[0]; cin>>a[1]; //【方法三】使用迴圈 cout << "請輸入五個數" <<endl; for(int i = 0; i < 5; i++ ) { cout< < "請輸入第"<<(i+1)<<"個數字:" cin >> a[i]; } ``` ### (三)陣列大小 ```cpp= //sizeof() cout << sizeof(a) << "個位元組" <<endl; //20個位元組 cout << sizeof(b) << "bytes" <<endl; //20 bytes ``` ### (四)應用 #### 1、找最大值 ```cpp= //【方法一】 int Max = a[0]; for(int i =1; i <5;i++) { if(a[i]>Max) Max = a[i]; } ``` #### 2、找最小值 ```cpp= //【方法一】 int Min = a[0]; for(int i =1; i <5;i++) { if(a[i]<Min) Min = a[i]; } ``` #### 3、氣泡排序(初等) ```cpp= //【方法一】寫法版本有很多種 //假設A[5]={6,3,7,1,9} //由大排到小 for(int i =0; i< ; i++){ for(int j = (i+1) ; j < 5 ;j++){ if(a[i] < a[j]){ a[i] = a[j]; a[j] = temp; } } } // 回合一:9,3,6,1,7 // 回合二:9,7,3,1,6 // 回合三:9,7,6,1,3 // 回合四:9,7,6,3,1 // 回合四:9,7,6,3,1 ``` ## 二、字元陣列 ### (一)宣告 ```cpp= char ch[5]; //宣告格子為5的陣列(裡面的資料為字元) ch[0] = 'a'; //陣列索引一樣從零開始 ch[1] = 'b'; ch[2] = 'c'; ch[3] = 'd'; ch[4] = 'e'; for (int i = 0; i < 5 ; i++) ch[i] = i + 97; //a,b,c,d,e 【字元的數字為ASCII碼】 for(inr i=0; i<5;i++) cout <<"ch["<<i<<"]=" << ch[i] << endl; //a,b,c,d,e ``` [可參考前筆記變數(上)(四)](/EdKRVklvRCmfNCN7pFw_Gg) ### (二)設定初始值 ```cpp= int f[] ={1,2,3,4,5}; char n1[]="John Simth"; //方法一 Char n2[] = {'M','a','r','r','y','','W','h','i','t','e'} //方法二 // 方法一與二的差異在是否有結束字元 \0 cout << n1 <<endl; //output: John Simth cout << n2 <<endl; //output: Marry white+亂碼 ``` #### 使用方法一:程式會在在字元後自動加結束字元 | J | o | h | n | | s | i | m | t | h | \0 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | #### 使用方法二:程式會不會在字元後加結束字元,所以會一直往後找到結束字元才結束 () | M | a | r | y | | W | h | i | t | e | X | X | X | X | X | X | ... | X | \0 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---- | --- | #### (三)字串大小 ```=cpp cout << sizeof(n1) << "bytes" <<endl; // 11 bytes (10字元+結束字元) cout << sizeof(n2) << "bytes" <<endl; // 10 bytes (由設定初始值記憶體空間) ``` ##### cout 會有印出至結束位元停止,但sizeof不會但使用【方法一】系統會多加一個結束字元故+1 bytes ## 三、標準函式庫 [可參考前筆記(一)](/IzUZdhn6RYmX-QC6ce7rYg) ### (一)strlen()、cin.getline()指令 ```cpp= #include <cstring> //補充在程式開頭 //strlen() //字串長度 //cin.getline(陣列,格子) //輸入字串使用 char name[80]; cout << "請輸入一字串:"; cin.getline(name,80); //假如使用者輸入 Taipei City cout << sizeof(name) << endl; // 80 空間大小 cout << strlen(name) << endl; // 11 字串長度 ``` #### 1、重要補充 ##### (1)cin.ignore(); (忽略前面的資料流) ##### (2)範例 ```cpp= int i; cout <<"請輸入一整數:"; cin >> i; //留下換行符號的資料流 cout <<"請輸入一字串:"; cin.getline(name,80); //假如使用者輸入 Taipei City cout << sizeof(name) << endl; // 80 空間大小 cout << strlen(name) << endl; // 0 字串長度 //故會影響答案正確性 //如果cin.getline()出現問題 //改善:將cin.ignore()指令打在cin.getline的上一個即可。 ``` ### (二)strcpy,strncpy 複製字串 #### (因為安全性問題,目前改用strcpy_s, strncpy_s,使用方法一樣) #### 1、範例 ```cpp= char str1[]="Lazy Boy"; char str2[]="Cute Girl"; char str3[]="Pink Panther"; cout << "str1:" << str1 << endl; //str1: Lazy Boy cout << "str1:" << str2 << endl; //str2: Cute Girl cout << "str1:" << str3 << endl; //str3: Pink Panther // str2 = str1 為錯誤示範 strcpy_s(str2,str1); //str2 = str1 = Lazy Boy cout << "str2:" << str2 << endl; //str2: Lazy Boy //部分修改取代 strcpy_s(str3,str1,4); //str3(前4個字被取代) cout << "str3:" << str3 << endl; //str3: Lazy Panther ``` ### (三)strcmp,strncmp 比對字串(相同回傳0) #### 以下並非比較內容,而是比較【address】 #### 1、範例 ```cpp= str1 == str2; str1 > str2; str1 < str2; if(strcmp(str1,str2)==0){ cout << "字串內容相同"; } if(strcmp (str1,str3,4)==0){ cout << "字串的前4個字內容相同"; } ``` ## 四、練習 ### (一)題目一: (1) 由鍵盤輸入任意5個數(小數),輸出最小值Min與平均值Avg ```cpp= #include <iostream> using namespace std; /*題目1:由鍵盤輸入任意5個數(小數),輸出最小值Min與平均值Avg*/ int main() { float A[5]; int i,j; float sum; sum = 0.0; for (i = 0; i < 5; i++) { cout << "請輸入A["<< i << "]的值:"; cin >> A[i]; } int min = A[0]; for (i = 1; i < 5; i++) { if (min > A[i]) min = A[i]; } cout << "陣列中最小值:" << min << endl; for (i = 0; i < 5; i++) { sum = sum + A[i]; } sum = sum / 5; cout << "陣列中的值平均數為:" << sum; } ``` ### (二)題目二: 在「字元陣列」中放入10個英文字母「television」,然後將字母依小到大(a到z)順序從螢幕輸出。 ```cpp= #include <iostream> using namespace std; /*題目2:在「字元陣列」中放入10個英文字母「television」,然後將字母依小到大(a到z)順序從螢幕輸出*/ int main() { char A[10]; int i, j, k; float sum; for (i = 0; i < 10; i++) { cout << "請輸入A[" << i << "]的字元:"; cin >> A[i]; } for (i = 0; i < 10; i++) { for (j = i + 1; j < 10; j++) { if (A[i] > A[j]) { k = A[i]; A[i] = A[j]; A[j] = k; } } } cout << "陣列內容由小排列至大" << endl; for (i = 0; i < 10; i++) { cout << A[i]; } } ``` ### (三)題目三: 請宣告兩個整數型別的一維陣列,其中一個設定初始值,然後將此陣列的值,複製到另一個陣列。 ```cpp= #include <iostream> using namespace std; /*題目3:請宣告兩個整數型別的一維陣列,其中一個設定初始值,然後將此陣列的值,複製到另一個陣列。*/ int main() { int A[10], B[10]; int i, j; for (i = 0; i < 10; i++) { cout << "請輸入A[" << i << "]的值:"; cin >> A[i]; } cout << endl; cout << "陣列A的內容:" << endl; for (i = 0; i< 10; i++) cout << A[i] << ","; cout << endl; cout << "陣列B的內容:" << endl; for (j = 0; j < 10; j++) { B[j] = A[j]; cout << B[j] << ","; } } ```