網(wǎng)站開發(fā)設(shè)計各部門職責(zé)寧德市疫情
一維數(shù)組
在內(nèi)存占用連續(xù)存儲單元的相同類型數(shù)據(jù)序列的存儲。
數(shù)組是靜態(tài)存儲器的塊;在編譯時確定大小后才能使用;
其聲明格式如下:
元素類型 數(shù)組名[常量];
元素類型:數(shù)組中元素的數(shù)據(jù)類型;
常量:數(shù)組的長度,即數(shù)組中存放數(shù)據(jù)的最大個數(shù);可以是數(shù),也可以是自己的常量;
如:
const int MaxSize=100;int a[MaxSize];
數(shù)組定義后,編譯系統(tǒng)為其分配地址連續(xù)的一段內(nèi)存空間.
數(shù)組名即是所分配內(nèi)存的首地址,也稱為數(shù)組的首地址;
數(shù)組聲明時為其初始化賦值
格式為: 元素類型 數(shù)組名[常量]={初值 1,初值 2,...,初值 n};
初始化時,元素的個數(shù)應(yīng)該小于等于數(shù)組的長度;
例如:
int a[10]={1,2,3}; //定義數(shù)組長度為 10,前 3 個元素初始化為 1,2,3,其它元素為 0;
int a[]={1,2,3}; //定義數(shù)組,長度省略,則長度等于初始化數(shù)據(jù)的實際個數(shù) 3。
int a[100]={0}; //數(shù)組中的值全部為0,只有{0}可以全部初始化;在做true與false時非常有用;
使用數(shù)組
數(shù)組元素通過下標來訪問,每個元素均可視為一個變量來使用,
元素的訪問方式為: 數(shù)組名[下標];
下標值的有效范圍是 0~數(shù)組長度-1;如果越界了,編譯器是可以正常運行的,但是會出錯;
除字符數(shù)組外,其它類型的數(shù)組不允許整體訪問,也就是數(shù)組的輸入輸出需要對各個元素進行,也就是? ? 數(shù)組名[下標]? ?這種方式使用;
訪問數(shù)組元素的地址格式為:
&數(shù)組名[下標]或數(shù)組名+下標
數(shù)組的內(nèi)存形象展示
例如:
int a[10];
聲明了一個長度為 10 的 int 型一維數(shù)組,
系統(tǒng)需要為 a 分配連續(xù)的 40B 的內(nèi)存空間,
元素的訪問方式為 a[i],
地址訪問方式為&a[i]或 a+i,i 值的有效范圍是 0~9。
數(shù)組在函數(shù)中的使用
數(shù)組做形參時,可以不寫下標,如a[] 表示a[]的地址(指針)
? ? ? ? 做實參時,不寫[] 只寫名;如 a
但是類型不要忘了啊!!!
viod f(int a[])//因為是地址傳遞,所以一般不要返回值;
{}
int main()
{int a[100];f(a);return 0;
}
數(shù)組的傳遞方式為地址傳遞,也就是說在自定義函數(shù)進行更改后,在主函數(shù)中也將其更改;因為地址傳遞,傳過去的是地址位置,而你在使用時,只是改變了它的值;
數(shù)組中的一下典型例子:
數(shù)組的輸入賦值與輸出:
int a[10], i; //這兩變量實現(xiàn)了數(shù)組的輸入輸出;for (i = 0; i < 10; i++) //i<10:輸入十個數(shù) 這里10可以換成一個變量,可達到更多可能;cin >> a[i];for (i = 0; i < 10; i++)cout << a[i]<<" ";
輸入10個整數(shù),存入一堆數(shù)組中,求最大值及下標;
int a[10], i,m=0; //m用來確定最大值的下標for (i = 0; i < 10; i++) cin >> a[i];for (i = 0; i < 10; i++)if(a[i]>a[m]) //這里的比大小:說明了數(shù)組的使用與變量沒有什么不同;m=i; //數(shù)組與下標的運用;cout<<a[m]<<" "<<m;
從鍵盤輸入n個整數(shù)(n<100),存放在一個一維數(shù)組中,以0結(jié)束;
int a[100],i=0;//a[]為存放的數(shù)組;i為循環(huán)的走下標的一個工具變量;//i=0因為數(shù)組的一個地址從開始;
cin >> a[i];//先輸入一個數(shù)組;若一個數(shù)組是0就沒有存放的數(shù),進不了循環(huán);
while (a[i]){ //用來判斷是否結(jié)束;i++; //i++ 使數(shù)組下標向下一位移動;cin >> a[i];}//再次存放,記住順序不要搞反了;
從鍵盤輸入n(n<100),再存放n個數(shù)在一維數(shù)組中;
int a[100],i,n;
cin >> n;
for (i = 0; i < n; i++){ //i<n:因為i從0開始,如是=n了就會多加一個數(shù)組;所有不能i<=ncin >> a[i];}
逆序輸出
將數(shù)組下標從后往前走;
for (i = n - 1; i >= 0; i--)cout << a[i] << " ";
逆序存儲
需要兩數(shù)組,一個是正序,一個逆序;
for(int i=0;i<n;i++)//n為數(shù)組的長度b[i]=a[n-1-i]; //a[n-1]才是a數(shù)組的最后一個值;
排序
將原數(shù)組從小到大排序;
普通版,有小的我就換;
//運用了兩個下標,i下標為選取的下標,j下標為與i下標比較的
for(i=0;i<n-1;i++) //n-1因為第n項為最后一位不用再往后比了;for (j = i+1; j < n; j++) //i+1從i后一個開始比較;{if (a[j] < a[i]) //要小的{int t = a[i]; //三位轉(zhuǎn)換法a[i] = a[j];a[j] = t;}}
高效版,只換了最小的;
//m起到了高效的作用
for(i=0;i<n-1;i++){m=i;for (j=i+1;j<n;j++)if (a[j]<a[m]) m=j; //只最從i往后的最小的數(shù);所以只換了i的循環(huán)只轉(zhuǎn)了一次;if (m!=i){t=a[i];a[i]=a[m];a[m]=t;}}
奇偶排序
將數(shù)組按奇數(shù)在前、偶數(shù)在后,同為奇數(shù)或偶數(shù)的按從小到大的順序排序;
在一個數(shù)組里有兩個要求的排序;
普通版:一個一個要求的做;
先選取從小到大的要求一直跟著當(dāng)條件,再先將奇放前,然后偶放后面;
//從a[]的第一個值往后一點一點的滿足條件;
//i為所選,為偶時就往后放,比比較的大時并且為奇時也往后放;
//前頭的我只要小的奇數(shù);所以偶數(shù)都要放后面;
for (i = 0; i < n; i++)//要是i走到了全是偶數(shù)時,不用管,等i走完了在偶數(shù)的循環(huán)時再解決
{for (x = i + 1; x < n; x++){if ((a[i] >= a[x] && a[x] % 2 != 0) || a[i] % 2 == 0){t = a[x];a[x] = a[i];a[i] = t;}}
}for (i = n - 1; i >= 0; i--)//奇牌完,剩偶沒有排,偶都讓我放后面了,所以這回i從后開始
{for (x = i - 1; x >= 0; x--){if (a[x] % 2 != 0)//當(dāng)比較下標走到奇時,就不用走了;{break;}if (a[x] >= a[i] && a[x] % 2 == 0){t = a[x];a[x] = a[i];a[i] = t;}}
}
簡化版:
只需要將條件都列出就好,但是不方便理解;
for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if((s[i]%2<s[j]%2)||(s[i]%2==s[j]%2)&&(s[i]>s[j])) {t=a[i],a[i]=a[j],a[j]=t}
// &&的優(yōu)先級大于|| &&兩邊的式子不用加上();
// s[i]%2<s[j]%2 表示前標為偶,后標為奇, 將偶放前,奇放后;
// 偶數(shù)=0 奇數(shù)=1
//s[i]%2==s[j]%2 表示同為偶||同為奇
//s[i]>s[j] 相同時,而且前標大就換; ||后邊的式子達到了從小到大;
數(shù)組篩選法?
在面對下標的判斷,而數(shù)組沒有任何要求時,將數(shù)組的值當(dāng)做判斷標志;
不滿足就挖去,最后只要滿足的;
int a[100] = { 0 };//將數(shù)組初始化成0,成為了中間變量,要求只與下標有關(guān);
f(a); //進行了一列的判斷;將不滿足的數(shù)組值變成非0數(shù);
for (i = 0; i < n; i++)if (a[i] == 0) cout << i << " ";
例如:輸入m、n(m,n<100),輸出[m,n]之間的素數(shù)。
#include <iostream>
using namespace std;
int h(int n) //判斷i是否為素數(shù)
{if (n == 2 || n == 3 || n == 5 || n == 7) return 0;if (n == 1 || n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0) return 1;return 0;
}void f(int a[], int m, int n) //不滿足條件的變成非0
{int i;for (i = m; i <= n; i++){if (h(i) == 1) a[i] = 1;}
}int main() //0為滿足條件的
{int n, a[101] = {0}, i, m;cin >> m >> n;f(a, m, n);for (i = m; i <= n; i++)if (a[i] == 0) cout << i << " ";return 0;
}
數(shù)組插入
插入,相當(dāng)于排隊,這時來了個老登來插排;
插排者要想插入隊伍當(dāng)中,必須先有人往后去,才能給老登留出位置;
位置怎么留呢?是被插的人先往后串一下就行了嗎?肯定不啊,那樣被插者的后一位的數(shù)據(jù)就被插者給覆蓋了;所以要想完成插隊,必須先從最后一位開始往后串一位,一次到被查的位置;
for(i=n-1;i>=x;i--)//x為被插的位置a[i+1]=a[i];
cin>>a[x]; //老登來也
n++; //n為人數(shù) 因為來了個老登所以要++;
刪除指定元素
刪掉當(dāng)指定元素相當(dāng)于一堆人正在排隊,突然有個人走掉了,這樣現(xiàn)在這個隊伍,從走掉者的后面一位開始往前串一個位置;
for(i=x+1;i<n;i++){a[i-1]=a[i];}n--;
刪除所有指定元素
//x為所要刪除的指定元素;j=0; //j最后呈現(xiàn)的數(shù)組,做到了一個數(shù)組干了兩個數(shù)組的活;for(i=0;i<n;i++){if(a[i]!=x) //i一直在進行循環(huán),而相同時j不動,這樣就將所刪的元素給越了過去;{a[j]=a[i];j++; }}n=j; //n為數(shù)組長度,因為刪除了一些元素,長度發(fā)生了變化
二維數(shù)組
聲明格式為:
元素類型 數(shù)組名[常量1][常量2]
常量1 :數(shù)組的最大行數(shù),常量?2 :數(shù)組的最大列數(shù);
C++中,二維數(shù)組中各個元素按行優(yōu)先規(guī)則在內(nèi)存占用連續(xù)的一段存儲空間;
就是每行存完,再存下一行;
如:int a[3][4]? ? ?// [3][4]代表最大長度,但是在使用時,還是從[0][0]開始從的,與一維數(shù)組類似;
二維數(shù)組初始化
如:2行3列二維數(shù)組的初始化
int a[2][3]={{1,2,3},{4,5,6}};
int a[ ][3]= {{1,2,3},{4,5,6}};
int a[ ][3]={1,2,3,4,5,6};
二維的使用
訪問格式為:數(shù)組名[行下標][列下標]
二維數(shù)組例題:
二維輸入輸出
因為是二維,所以一個i用來走下標是不夠用,所有需要兩個工具變量,一個走行,一個走列;
int i,j,a[4][5];
for (i=0;i<4;i++) //因為c++為行優(yōu)先存儲,所以一般地將代表行的變量放上面for (j=0;j<5;j++)cin>>a[i][j];
for (i=0;i<4;i++){for (j=0;j<5;j++)cout<<a[i][j]<<" ";cout<<endl; //達到了行滿換行的效果}
二維中尋找特定值
二維需要兩個變量來存儲最大值;
如:最大值
maxi=0;
maxj=0;for (i=0;i<4;i++)for (j=0;j<5;j++)if (a[i][j]>a[maxi][maxj]){maxi=i;maxj=j;}
cout<<a[maxi][maxj];
二維數(shù)組求和
1.矩陣各行、列求和:
因為是各,所以將一個二維數(shù)組的行列存放在兩個數(shù)組中一個代表行一個代表列;
求行用行的變量下標走,求列用列的變量下標走;
for(i=0;i<n;i++) for(j=0;j<m;j++)b[i]+=a[i][j];
for(i=0;i<n;i++)for(j=0;j<m;j++)c[j]+=a[i][j];
for(i=0;i<n;i++)cout<<b[i]<<" ";cout<<endl;
for(j=0;j<m;j++)cout<<c[j]<<" ";
2.對角線元素之和:重復(fù)部分不相加 ,一個矩陣擁有兩條對角線,一撇一捺;
矩陣為正方形時
for(i=0;i<n;i++)m+=b[i][i]+b[i][n-1-i];
if(n%2==1) //需要處理情況;m-=b[n/2][n/2]; //n為int;//常規(guī)的兩個變量走;不需要考慮重復(fù)部分,因為if里用的是||
for(i=0;i<n;i++)for(j=0;j<n;j++)if(i==j||i=n-1-j)m+=a[i][j];
3.周邊求和;
//普通低效版
for(i=0;i<n;i++)for(j=0;;j<m;j++)if(i==0||j==0||i==n-1||j==m-1)s+=a[i][j]; //高效進階版 使計算機少跑幾行
for(i=0;i<n;i++) //因為走的是行,所以列不動 s+=b[i][0]+[i][n-1]; //將第一列與最后一列加滿
//這里的j要是繼續(xù)從0開始走到m的話,需要在后面的s減掉四個重復(fù)的角;
for(j=1;j<m-1;j++) //因為走的是列,所以行不動 s+=b[0][j]+[n-1][j]; //將第一行與最后一行加滿
參考文獻:
[1]
[2]
[3]
[4]