陣列 - HackMD

文章推薦指數: 80 %
投票人數:10人

在C++中,陣列的宣告被定義如下: ... 不過可以指定單個陣列元素輸入和輸出 ... int n ; cin >> n ; //陣列的長度 for (int i=0 ; i ...       Published LinkedwithGitHub Like Bookmark Subscribe #陣列 ##前導:陣列是什麼? 變數可以幫助我們儲存資料,但如果今天有若干筆資料要輸入,我們勢必要宣告一堆變數。

```cpp intnum1,num2,num3......numn; ``` 這樣寫起來太麻煩也太累人了 於是程式設計師們開發了一個好用的工具,叫做「陣列Array」 如果`int、float、char......`是宣告一個又一個的盒子 那麼Array就是宣告N個連貫的盒子 ![](https://i.imgur.com/baSAdxh.png) ##語法:如何宣告陣列? ###在C++中,陣列的宣告被定義如下: ```cpp typearrayName[arraySize]; ``` *`type`為型別 *`arrayName`為陣列名稱,與其它型別宣告時的命名規則相同 *`arraySize`為陣列長度,只能是非負整數或是非負整數變數 ###陣列的宣告 陣列的宣告範例如下: ```cpp intarr1[3]; floatarr2[5]; doublearr3[7]; chararr4[9]; ``` ###陣列的索引值 ```cpp intarr[1000]; cout<>arr[49]>>arr[50]; cout<>arr[0]>>arr[1]>>arr[2]>>......>>arr[99]; cout<>n; //陣列的長度 for(inti=0;i>arr[i]; } for(inti=0;i以下以二維陣列作為範例 ```cpp intarr1[3][4]; floatarr2[5][6]; doublearr3[7][8]; chararr4[9][10]; ``` ```cpp intarr[3][4]={ {0,1,2,3},//初始化第1列 {4,5,6,7},//初始化第2列 {8,9,10,11}//初始化第3列 }; intarr[][]={ {0,1,2,3},//初始化第1列 {4,5,6,7},//初始化第2列 {8,9,10,11}//初始化第3列 }; intarr[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; //與上面兩個宣告方式等效 intarr[3][4]={0}; //arr有3×4個元素,全部皆為0 //注意,這是特殊用法,只有0可以這麼做,其他數值不行 //常用在建表 intarr[3][4]; arr[2][3]=50; ``` ###動態宣告 ```cpp intn; cin>>n; intarr[n]; ``` 語法錯誤但IDE(整合開發環境)會接受這種語法,使用上問題很大 尤其是區域記憶體溢出的問題,溢出時會使程式數值錯誤 **所以務必用全域宣告陣列** ```cpp intarr[50]; intmain { //讀取陣列 } ``` 如果邊界範圍為N 那麼**陣列的長度建議宣告為N+5** 這是為了**避免陣列溢位** 補充:全域宣告的陣列預設值皆為0 ##`char`與`string` ###`char` ####前導:`char`的陣列 `char`就是字元型別,一個字元變數一次可以讀取一個字元 而如果要讀取一句話,或是很多字元的時候 就要用`char`宣告一個`array` ####語法:如何宣告`char`的陣列 `char`的陣列宣告範例如下: ```cpp charch[1000]; ``` ####語法:如何初始化`char`陣列 ```cpp charch[3]={'A','B','C'}; //ch有3個元素,分別為A、B、C charch[]={'A','B','C'}; //ch的元素有A、B、C,程式會自動判斷陣列長度 charch[3]=""; //ch有3個元素,全部皆為'\0'(NULL) //注意,這是特殊用法,只有char與string型別可以這麼做,其他型別不行 //僅可用"",不可用'' charch[4]; ch[3]=50; //第4個元素ch[3]='2' //ASCII碼第50個是數字2 charch[4]; ch[3]='5'; //第4個元素ch[3]='5' //單個字元的賦值請用''或""將字元框起來 charch[4]; ch[3]='5'+1; //ch[3]=='6' //對字元進行操作,等同對ASCII碼的數值進行操作,'5'+1後的ASCII碼便是'6' charch[10]={"ColtenOrz"}; //ERROR charch[11]={"ColtenOrz"}; //大於等於兩個字元請用""將字串框起來 //"ColtenOrz"有10個字元 //C++會在字串最後放上'\0'(NULL),因此這個字串共有11個字元,所以陣列大小要為(輸入字元數+1) charch[]={"ColtenOrz"}; //ch的元素有{'C','o','l','t','e','n','','O','r','z','\0'} //程式會自動判斷陣列長度 charch[]={'C','o','l','t','e','n','','O','r','z'}; //不等價於charch[]={"ColtenOrz"}; charch[]={'C','o','l','t','e','n','','O','r','z','\0'}; //等價於charch[]={"ColtenOrz"}; ``` ###`string` ####前導:`string`的用意 不是每句話長度都相同,這樣在宣告上十分不易 於是有一個不需要考慮字元陣列長度的型別,稱作`string` `string`就是字元陣列,但我們不用知道有多少個字元 ####語法:如何宣告`string` `string`是一種型別 `string`宣告範例如下: ```cpp stringstr; ``` ####語法:如何初始化`string` ```cpp stringstr1("caterpillar"); //內容為指定的字串常量 stringstr2(str1); //以str1實例建立字串 stringstr3=str2; //以str2實例建立字串 stringstr4="Justin"; //內容為指定的字串常量 stringstr5(10,'c'); //建立有10個c的字串 stringstr6=""; //str6為'\0'(NULL) //注意,這是特殊用法,只有char與string型別可以這麼做,其他型別不行 //僅可用"",不可用'' stringstr7(str2,6,3); //從str2中的第6個位置開始複製3個字元 //str2="caterpillar"從第6位'p'開始,複製3個字元"pil"初始化str7 stringstr8=str2+"content"+str3; //混合初始化 stringstr9=str2.substr(3,9); //從str2中的第3個位置開始複製9個字元 ////str2="caterpillar"從第3位't'開始,複製9個字元"terpillar"初始化str9 stringstr10=str2.substr(); //substr的()參數為空則複製整個str2至str10 stringstr11(5,'A'); //複製5個字元A到str11 stringstr12="Hello"+"World"; //ERROR //用+串接字串時,前兩項須有其中一項為string型別變數 ``` 補充:stringstr;預設狀態下即為空字串(NULL) ####語法:如何宣告`string`陣列 `string`的陣列宣告範例如下: ```cpp stringstr[5]; ``` ####語法:如何初始化`string`陣列 ```cpp stringstr1[3]={"Jack","Colten","Suifeng"}; //宣告有3個字串的陣列 //宣告時用{}括弧住初始化的內容與用""夾著個別字串 stringstr2[5]="" //str2全為'\0'(NULL) //注意,這是特殊用法,只有char與string型別可以這麼做,其他型別不行 //僅可用"",不可用'' ``` ####語法:如何使用`string`陣列 使用字串陣列時,只需要在最後加上`[index]`即可存取字串中的元素 ```cpp stringstr[3]={"Jack","Colten","Suifeng"}; cout< C++自帶的用法與函數: ```cpp stringstr; getline(cin,str); //得到一整行的輸入,包含空格,遇到換行時終止讀取 str.size(); //得到字串長度 str.length(); //得到字串長度 str[1]='C'; //存取字串的第2個元素,型別為字元 str.at(1)='C'; //存取字串的第2個元素,型別為字元 //會有超出邊界的警告 ``` 需導入函式庫才可使用的函數: ```cpp stringstr; str.empty(); //如果字串為空則回傳True str.clear(); //清空字串 str.insert(); //在字串中插入字串 stringstr="tobequestion"; stringstr2="the"; stringstr3="ornottobe"; str.insert(6,str2); //tobethequestion //在str第6個位置的下一個位置開始插入str2 str.insert(6,str3,3,4); //tobenotthequestion //在str第6個位置的下一個位置開始插入str3的部分元素 //從str3第3個位置的下一位開始數4個元素到第7個位置 str.insert(10,"thatiscool",8); //tobenotthatisthequestion //在str第10個位置的下一個位置開始插入"thatiscool"的部分元素 //從"thatiscool"的第1個位置開始數8個元素到第8個位置 str.insert(10,"tobe"); //tobenottobethatisthequestion //在str第10個位置的下一個位置開始插入"tobe" str.insert(15,1,':'); //tobenottobe:thatisthequestion //在str第15個位置的下一個位置開始插入1個:字元 str.insert(str.end(),3,'.'); //tobe,nottobe:thatisthequestion... //從str的最後插入3個.字元 ``` ##技巧:陣列的應用與注意事項 ###建表 在輸入輸出時,題目都會要求輸出一組結果 像是輸入一個數字,要你判斷他是不是質數,因為只有一個數字,所以很簡單 但如果今天有好幾個數字要你判斷,那你勢必要對每個數字進行判斷 這也會造成程式的執行效率低下 倘若今天用建表的方式,只要執行一次就不用重複執行 而建表的概念就是實現輸入一組`index`,**只用`arr[index]`就能得到答案** b004:一個都不能少 http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b004 ###邊界 在使用陣列時,如果遇到陣列長度為`length`的`arr[i+N]` 即便`i`的值有被嚴格限制在陣列範圍 加上常數`N`後卻很可能因此超出陣列範圍,也就是陣列的邊界 因此,**要更改最大索引值為`length-N-1`以避免超出邊界** ###在邊界外賦值 ```cpp intarr[50]; //邊界為arr[49] arr[50]=1000; cout<::operator[] https://en.cppreference.com/w/cpp/container/array/operator_at std::array https://en.cppreference.com/w/cpp/container/array C++教學 http://tw.gitbook.net/cplusplus/index.html C++與演算法 https://www.csie.ntu.edu.tw/~b98902112/cpp_and_algo/index.html C語言字元陣列的定義與初始化 https://www.itread01.com/content/1550203580.html 陣列宣告和賦值總結 https://www.itread01.com/content/1546701490.html string如何初始化为空? https://bbs.csdn.net/topics/390692419 string初始化的几种方法 https://blog.csdn.net/allovexuwenqiang/article/details/4277555 C++string(初始化和部分函数的使用) https://blog.csdn.net/qq_34637408/article/details/71584616 string::insert http://www.cplusplus.com/reference/string/string/insert/ C++的輸出入cin/cout和scanf/printf誰比較快? https://chino.taipei/note-2016-0311C-%E7%9A%84%E8%BC%B8%E5%87%BA%E5%85%A5cin-cout%E5%92%8Cscanf-printf%E8%AA%B0%E6%AF%94%E8%BC%83%E5%BF%AB%EF%BC%9F/ × Signin Email Password Forgotpassword or Byclickingbelow,youagreetoourtermsofservice. SigninviaFacebook SigninviaTwitter SigninviaGitHub SigninviaDropbox SigninviaGoogle NewtoHackMD?Signup



請為這篇文章評分?