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