数组及字符串相关知识
一、數(shù)組的知識
Sec1.一維數(shù)組
1.數(shù)組的引入:
當(dāng)數(shù)據(jù)量很多,類型相同需要重復(fù)定義的時候,需要用數(shù)組簡化問題解法。
2.數(shù)組的使用
①定義:
數(shù)組類型 數(shù)組名 [ 常亮表達(dá)式 ] 例如:int a[100];表示a數(shù)組有100個元素,下標(biāo)由0到99.
②數(shù)組的引用方式:
數(shù)組名[下標(biāo)] 如:a[100]表示a數(shù)組第101個元素,若 i t均為int型變量,則a[i],a[j],a[i+j],a[i*j],a[j++]等都是合法元素。數(shù)組不可以一次引用一整個數(shù)組,如int a[100],b[100]; a=b;這是不合法的引用方式。
若要將數(shù)組a每一個元素的值賦值給b數(shù)組的對應(yīng)元素。可以利用循環(huán)。
for(int i=0) {b[i]=a[i]; }③數(shù)組的初始化
使用數(shù)組時要根據(jù)要解決問題的形式?jīng)Q定數(shù)組是否要初始化。初始化變量可以用以下的方法,如 int a[10]={ 0 };數(shù)組元素全部為零。int b[5]={1,2};前兩個元素為1和2,后續(xù)元素自動賦值為零。 特殊情況,如將數(shù)組在主函數(shù)外定義,自動賦初值。如下:
#include <iostream> using namespace std; int a[10]; int main() {return 0; }此時數(shù)組a的每一個元素自動賦值為0;
④數(shù)組的注意事項
越界問題,上文已經(jīng)提到a[100]的下標(biāo)為0-99;使用負(fù)數(shù),非整數(shù)或大于99的數(shù)字都會是數(shù)組越界。
⑤特殊的使用方式
1°memcpy函數(shù)(頭文件<cstring)
數(shù)組不能直接復(fù)制,可利用memcpy函數(shù)
void *memcpy(void *dest, void *src, unsigned int count);
memcpy 函數(shù)用于 把資源內(nèi)存(src所指向的內(nèi)存區(qū)域) 拷貝到目標(biāo)內(nèi)存(dest所指向的內(nèi)存區(qū)域);一個size變量控制拷貝的字節(jié)數(shù);
使用方式memcpy(b,a,sizeof(int)*k) 從a中賦值k個元素到b數(shù)組。
sizeof(int)*k表示計算int型所占字節(jié)數(shù),然后再乘以k。
類比sizeof(int*k),表示計算指向整型的指針變量k所占的字節(jié)數(shù)。
再淺顯討論sizeof的作用
sizeof(int)*k之所以用sizeof(int)*k而不是用k,因為sizeof(int)*k返回的是字節(jié)數(shù),因為數(shù)組是int 型的sizeof計算每個元素的字節(jié)長度,在乘以k既k個元素的字節(jié),因為memcyp需要知道拷貝內(nèi)存的字節(jié)數(shù)。所以拷貝是從開頭開始計算,即k個元素是從a[0]開始計算。由此可以推出將a中元素全部拷貝到b數(shù)組中,memcpy(b,a,sizeof(a))。
2°memset函數(shù)(頭文件<cstring)
void *memset(void *s , int ch , size_t n ) 在一段內(nèi)存塊中填充某一個給定的值,常用于較大的對結(jié)構(gòu)體和數(shù)組的清零操作。
memset(結(jié)構(gòu)體/數(shù)組名 , "用于替換的字符“ , 前n個字符 );
用法可以參考memcpy,也要用sizeof來計算字節(jié)。
總結(jié)內(nèi)存復(fù)制需要計算字節(jié)。
我們拿出一個題來做例子
描述
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數(shù)軸,馬路的一端在數(shù)軸0的位置,另一端在L的位置;數(shù)軸上的每個整數(shù)點(diǎn),即0,1,2,……,L,都種有一棵樹。
由于馬路上有一些區(qū)域要用來建地鐵。這些區(qū)域用它們在數(shù)軸上的起始點(diǎn)和終止點(diǎn)表示。已知任一區(qū)域的起始點(diǎn)和終止點(diǎn)的坐標(biāo)都是整數(shù),區(qū)域之間可能有重合的部分。現(xiàn)在要把這些區(qū)域中的樹(包括區(qū)域端點(diǎn)處的兩棵樹)移走。你的任務(wù)是計算將這些樹都移走后,馬路上還有多少棵樹。
輸入
第一行有兩個整數(shù)L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區(qū)域的數(shù)目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數(shù),用一個空格隔開,表示一個區(qū)域的起始點(diǎn)和終止點(diǎn)的坐標(biāo)。
對于20%的數(shù)據(jù),區(qū)域之間沒有重合的部分; 對于其它的數(shù)據(jù),區(qū)域之間有重合的情況。
輸出
包括一行,這一行只包含一個整數(shù),表示馬路上剩余的樹的數(shù)目。 樣例輸入 500 3 150 300 100 200 470 471 樣例輸出
298 來源 NOIP2005復(fù)賽 普及組 第二題
Sec2.二維數(shù)組
1.數(shù)組的引入:
當(dāng)數(shù)據(jù)與不再是單純的線性關(guān)系,類似坐標(biāo)系的數(shù)據(jù),矩陣的處理等;
2.數(shù)組的使用
①數(shù)組的定義及引用
數(shù)組類型 數(shù)組名 [表達(dá)常量式1][表達(dá)常量式2];例如int a [5][5]常量表達(dá)式1為行數(shù),常量表達(dá)式2為列數(shù)。跟一維數(shù)組一樣下標(biāo)從0開始。
引用時 數(shù)組名 [表達(dá)常量式1][表達(dá)常量式2];例如a [5][5]
初始化參考一維數(shù)組。特殊的int a[2][5]={{1,2},{2,3},{4,6},{1,2},{2,3}};
以此題為例。
描述 給定一個5*5的矩陣(數(shù)學(xué)上,一個r×c的矩陣是一個由r行c列元素排列成的矩形陣列),將第n行和第m行交換,輸出交換后的結(jié)果。
輸入 輸入共6行,前5行為矩陣的每一行元素,元素與元素之間以一個空格分開。 第6行包含兩個整數(shù)m、n,以一個空格分開。(1 <= m,n
<= 5) 輸出 輸出交換之后的矩陣,矩陣的每一行元素占一行,元素之間以一個空格分開。
樣例輸入
1 2 2 1 2
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
3 0 8 2 4
1 5
樣例輸出
3 0 8 2 4
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
1 2 2 1 2
來源 1901
Sec3.字符型數(shù)組
1.數(shù)組的定義
一維數(shù)組:char 函數(shù)名[行 常量表達(dá)式] 例如:char ch[5];
二維數(shù)組:char 函數(shù)名[列 常量表達(dá)式] 例如:char ch[2][12]
2.數(shù)組的初始化
初始化過程中,沒有被初始化的數(shù)組項編譯器會給默認(rèn)賦值’\0’;(整數(shù)數(shù)組沒有被初始化的數(shù)組項被賦值為0)。例如:char c[5] = {‘a(chǎn)’,’b’,’c’,’d’}; 中 c[4] = ‘\0’; \0即空字符。
char c[5]="abcd"字符串初始化數(shù)組的話,字符串后會跟一個空字符,所以字符串的元素數(shù)量要少于定義的空間。
3.字符型數(shù)組特殊的賦值方式,可以直接cin>>a,a為字符型數(shù)組
其余相關(guān)操作均可參考數(shù)組與二維數(shù)組。
Mo和Larry發(fā)明了一種信息加密方法。他們首先決定好列數(shù),然后將信息(只包含字母)從上往下依次填入各列,并在末尾補(bǔ)充一些隨機(jī)字母使其成為一個完整的字母矩陣。例如,若信息是“There’s
no place like home on a snowy night”并且有5列,Mo會寫成:
t o i o y h p k n n e l e a i r a h s g e c o n h s e m o t n l e w x
注意Mo只會填入字母,且全部是小寫形式。在這個例子中,Mo用字母“x”填充了信息使之成為一個完整的矩陣,當(dāng)然他使用任何字母都是可以的。
Mo根據(jù)這個矩陣重寫信息:首先從左到右寫下第一行,然后從右到左寫下第二行,再從左到右寫下第三行……以此左右交替地從上到下寫下各行字母,形成新的字符串。這樣,例子中的信息就被加密為:toioynnkpheleaigshareconhtomesnlewx。
你的工作是幫助Larry從加密后的信息中還原出原始信息(包括填充的字母)。
輸入
第一行包含一個整數(shù)(范圍2到20),表示使用的列數(shù)。
第二行是一個長度不超過200的字符串。
輸出 一行,即原始信息。
樣例輸入 5
toioynnkpheleaigshareconhtomesnlewx
樣例輸出
theresnoplacelikehomeonasnowynightx
來源 East Central North America 2004
Sec4.字符串string
C++中對于strinig的定義為:typedef basic_string string; 也就是說C++中的string類是一個泛型類,由模板而實例化的一個標(biāo)準(zhǔn)類,本質(zhì)上不是一個標(biāo)準(zhǔn)數(shù)據(jù)類型.
1.字符串操作
strcpy(p, p1) 復(fù)制字符串
strncpy(p, p1, n) 復(fù)制指定長度字符串
strcat(p, p1) 附加字符串
strncat(p, p1, n) 附加指定長度字符串
strlen§ 取字符串長度
strcmp(p, p1) 比較字符串
strcasecmp忽略大小寫比較字符串
strncmp(p, p1, n) 比較指定長度字符串
strchr(p, c) 在字符串中查找指定字符
strrchr(p, c) 在字符串中反向查找
strstr(p, p1) 查找字符串
strlwr§將大寫字母全部換為小寫字母
strupr§將小寫字母全部換為大寫字母
相對于字符型數(shù)組,字符串可以有以下操作
大小規(guī)則
1)數(shù)字0~9比字母要小。如"7"<“F”;
2)數(shù)字0比數(shù)字9要小,并按0到9順序遞增。如"3"<“8”
3)字母A比字母Z要小,并按A到Z順序遞增。如"A"<“Z”
4)同個字母的大寫字母比小寫字母要小。如"A"<“a”。
2.字符串的引用
可以直接使用名稱,例如string a;可以直接使用a代指一整個字符串。
也可以使用string a[1]代指字符串a(chǎn)的第二個元素。
以一個例題為例
描述 給定N個單詞(每個單詞長度不超過100,單詞字符串內(nèi)僅包含小寫字母)。
請求出N個單詞中共有多少個不同的單詞。
輸入 第1行包含1個正整數(shù)N。
接下來N行每行包含一個字符串。
輸出 一個整數(shù),代表不同單詞的個數(shù)
樣例輸入
5 lalala
hahaha
haha
lalala
haha
樣例輸出 3
提示
- N <= 10000000
- 不同單詞個數(shù)不超過100000
文中所使用的stl容器在本篇不做介紹,后續(xù)會發(fā)布更詳細(xì)的知識。
二、對于數(shù)組部分學(xué)習(xí)的心得
對于近期程序設(shè)計的學(xué)習(xí)感到了恐懼,因為通過string到接觸stl開始發(fā)現(xiàn)程序設(shè)計的知識體系太龐大了,有更多的知識要去學(xué)習(xí),現(xiàn)在學(xué)到的基礎(chǔ)還算不上九牛一毛,有種井底之蛙的感覺,也正是如此,要更要去克服這些困難,像在做OJ題時總會碰到一些不知道的知識,再由這些知識就能發(fā)現(xiàn)更多知識,及時不會,也開始對C的知識體系有了一些認(rèn)識,但是從Acm院級的比賽來看,有些知識很簡單,考的是想法,是解決問題的“算法”,也接觸到了STL的容器,算法,但是對于迭代器,還是沒有清晰的概念,從題中學(xué)習(xí)知識的方法確實很慢,比主動去看知識要慢的很多,但是只有從題目與知識的串聯(lián)中才能將這些知識記牢會用。對于語言的學(xué)習(xí),要愿意去接受新知識,也要有斗志,耐得住寂寞的克服一個個問題。
總結(jié)
以上是生活随笔為你收集整理的数组及字符串相关知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易语言如何实现自动识别快递公司查件免验证
- 下一篇: C语言基础知识总结