陣列
陣列的引入:
我們引入陣列的目的是為了處理更多的資料,處理更加複雜的問題。
處理更多的資料就讓我們聯想到輸入輸出資料,當輸入輸出多組資料時,可以用之前學過的cin>>…,cout<<…;scanf(),printf();來解決,但是資料多了,就會暴露繁冗不便的弊端,於是我們就引入了陣列。陣列又分為一維陣列,二維陣列,字元陣列等多種形式。
對於一維陣列:
陣列的定義要宣告在main函式之外,那樣陣列才能開得很大,如果在main函式之內,陣列稍大就會異常退出。
其定義格式為:型別識別符號 陣列名[常量表示式]
其陣列名命名規則須與變數名一致,常量表示式表示陣列元素的個數,絕對不能是變數。 陣列的初始化在定義時可以一起完成:
格式:型別識別符號 陣列名[常量表示式]=,可以通過此方式對陣列全部賦值,也可以賦值部分,值1,值2…代表先賦值前面的儲存單元,依次類推。如果對陣列所有元素均賦值為0,可簡寫為:{}。
需要注意的是下標範圍,不能越界,儲存元素從第乙個儲存單位開始儲存,例:int a[10];
第乙個儲存單位為a[0],最後乙個儲存單位為a[9],a[10]不屬於該陣列的空間範圍,超出陣列儲存單位(越界)的儲存元素未知。
當下標在陣列定義範圍內時,下標可以為任意值為整型的表示式,該表示式裡可以包含變數和函式呼叫,通過對陣列下標變數的處理來對陣列元素進行除錯處理,陣列元素可以像同型別的普通變數那樣使用,對其進行賦值、運算等操作。
陣列一般與迴圈結構結合使用,掌握好陣列與迴圈結構的結合才能讓我們更好地解決問題。例如寫入5組資料,可以結合迴圈結構:
for(int i = 1;i<=5;i++)
cin>>a[i];
當然陣列的使用也是有限制的,c++語言中只能逐個引用陣列元素,而不能一次引用整個陣列,例如:int a[100],b[100],a=b;這樣的寫法是非法的。如果要從陣列a中複製k個元素到b組中,可以引用:memcpy(b,a,sizeof(int)*k),當然(int)隨元素的資料型別而改變,如果是浮點數,寫為(double)。如果把陣列a中的元素全部複製到陣列b中,可使用memcpy(b,a,sizeof(a))。使用memcpy函式要包含在標頭檔案cstring中。
對於二維陣列:
一維陣列可以表示一行,那麼二維陣列便可以表示乙個面,即行與列。
其一般格式為:
資料型別 陣列名[常量表示式1][常量表示式2]
例int a[10][10];
其實質為10*10的正方形**,可儲存100個元素,其中第乙個下標表示行數,第二個下標表示列數,即第一行第一列表示為a[0][0],第m行n列表示為a[m-1][n-1]。
二維陣列的初始化:與一維陣列類似,可以將每一行分開寫在各自的括號裡,也可以把所有的資料寫到乙個括號裡,但是並不提倡這種做法,因為資料太多出錯率高且不易檢查。
對於字元陣列:
字元陣列是指元素為字元的陣列,用來存放字串行或字串。
字元與字串幾點區別:
字串有乙個結束符(『\n』),因此字串常量所佔的位元組數等於字串所佔位元組數加1。
字元常量由單引號括起來,字串常量由雙引號括起來。
字元常量只能是單個字元,字串常量可以是多個字元。
字元常量可以賦值給字串常量,反之則不行。
字串使用時,需要注意其輸入輸出形式:
輸入: scanf(「%s」,字串名稱);不可加取位址符&,輸入多個字串時,以空格隔開。當然如果遇到需要輸入一行字串時,可以考慮使用gets(字串名稱);但是gets只能輸入乙個字串,不像scanf以讀取空格為結束,而是以讀取到換行符為結束。兩者各有優點,依情況選取使用。
輸出:輸出時可使用puts(字串名稱);來輸出 ,輸出乙個字串和乙個換行符,例puts(a)等價於printf(「%s\n」,a)。
對於陣列的使用,在一維陣列上可用於多資料的輸入輸出,排序等;在二維陣列上我們也可以研究一些平面上的問題,計算鞍點,處理矩形,甚至可以做貪吃蛇、掃雷等二維平面小遊戲。
舉幾個經典的例子:
一、排序問題,可以分為氣泡排序,插入排序,選擇排序等。
氣泡排序:
for (int i=1; i<=n; ++i) cin>>a[i]; //輸入數值
for (int j=1; j<=n-1; ++j) //冒泡法排序
for (int i=1; i<=n-j; ++i) //兩兩相比較
if (a[i]函式排序:如果是從小到大按順序排也可以使用函式sort();需要包含在標頭檔案#include 庫中,sort(a,a+n); //兩個引數分別為待排序陣列的首位址和尾位址。
倒置排序:
while(b!=0)
//利用此段將數字倒置,例1234變為4321.
二、對於二維陣列的使用,解決數學問題依然要了解公式或者尋求規律:
例如:正方形與長方形數量問題:
描述設有乙個n*m方格的棋盤(1≤m,n≤100)。
求出該棋盤中包含多少個正方形、多少個長方形(不包括正方形)。
例如:當n=2,m=3時
正方形的個數有8個;
即邊長為1的正方形有6個;
邊長為2的正方形有2個。
長方形的個數有10個
即21的長方形有4個
12的長方形有3個
31的長方形有2個
32的長方形有1個
借用公式:
#includeusing namespace std;
int main()
{ int n,m,i,x=0,y;
cin>>n>>m;
for(i=1;i<=n&&i<=m;i++)
x+=(n-i+1)*(m-i+1);
y=(n+1)*(m+1)*n*m/4;
cout《尋求規律:
#include#includeusing namespace std;
int main()
{ int a[100],b[100];
int n,m,g=0,h=0;
cin>>n>>m;
for(int i=0;i相對來說,還是公式法簡單一些,執行起來節約時間。很多東西都是需要我們尋求規律並結合公式來寫**的。
感悟:
學完陣列之後依然覺得數學思維的重要性,很多東西都是來找規律的,不同的規律,不同的想法編寫的**有難有易,執行起來也有所不同。
例如:求最大公約數,可以乙個個來試,也可以通過輾轉相除(歐幾里得演算法)來解決;查詢資料,可以逐個查詢,也可以通過折半(二分法)來查詢;排序問題更可以用氣泡排序來解決等。
好的規律,好的方法都可以更快更簡便的解決問題,我們現在解決問題的關鍵也是來找到規律,發現規律,很多時候寫**卡住的地方都是卡在了不知道怎麼解決問題,不懂得其中的規律。這也是以後要加強學習的地方。
C語言陣列的學習與使用
陣列 從語義上說就是資料的組合。元素 陣列內存放的單個資料 下標 陣列內的元素所對應在陣列的位置 越界 超出陣列下標的位置進行訪問 定義陣列的語法 陣列內的元素型別 陣列名 陣列的大小 例如int arr 10 陣列的遍歷及訪問陣列內的所有元素 遍歷輸出 int arr 10 int i 0 for...
C 基礎 陣列的認識 學習 與使用
博主近期要發布一些關於c 基礎的內容 比較適用於初學c 的同學,希望對大家有幫助 陣列 應用資料型別的其中一種 概念 儲存一組具有相同型別的資料結構 資料型別 中括號 陣列名 賦值 花括號括起來 裡面放值,逗號隔開多個值 int arr 索引,標記 console.writeline arr 0 動...
陣列與多維陣列的定義與使用
簡述 陣列是可以用於儲存多個相同型別的資料。陣列的定義分三步 建立物件 分配空間 賦值定義 int a 僅定義乙個陣列物件a。a newint 5 int b newint 5 5代表該陣列的長度 int c 在建立物件時就賦值,可以new int,因為數值時系統會自動根據數值長度分配空間使用 陣列...