日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组及字符串相关知识

發布時間:2023/12/15 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组及字符串相关知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、數組的知識

Sec1.一維數組

1.數組的引入:

當數據量很多,類型相同需要重復定義的時候,需要用數組簡化問題解法。

2.數組的使用

①定義:

數組類型 數組名 [ 常亮表達式 ] 例如:int a[100];表示a數組有100個元素,下標由0到99.

②數組的引用方式:

數組名[下標] 如:a[100]表示a數組第101個元素,若 i t均為int型變量,則a[i],a[j],a[i+j],a[i*j],a[j++]等都是合法元素。數組不可以一次引用一整個數組,如int a[100],b[100]; a=b;這是不合法的引用方式。
若要將數組a每一個元素的值賦值給b數組的對應元素??梢岳醚h。
for(int i=0) {b[i]=a[i]; }

③數組的初始化

使用數組時要根據要解決問題的形式決定數組是否要初始化。初始化變量可以用以下的方法,如 int a[10]={ 0 };數組元素全部為零。int b[5]={1,2};前兩個元素為1和2,后續元素自動賦值為零。 特殊情況,如將數組在主函數外定義,自動賦初值。如下:
#include <iostream> using namespace std; int a[10]; int main() {return 0; }
此時數組a的每一個元素自動賦值為0;

④數組的注意事項

越界問題,上文已經提到a[100]的下標為0-99;使用負數,非整數或大于99的數字都會是數組越界。

⑤特殊的使用方式

memcpy函數(頭文件<cstring)

數組不能直接復制,可利用memcpy函數

void *memcpy(void *dest, void *src, unsigned int count);

memcpy 函數用于 把資源內存(src所指向的內存區域) 拷貝到目標內存(dest所指向的內存區域);一個size變量控制拷貝的字節數;
使用方式memcpy(b,a,sizeof(int)*k) 從a中賦值k個元素到b數組。

sizeof(int)*k表示計算int型所占字節數,然后再乘以k。
類比sizeof(int*k),表示計算指向整型的指針變量k所占的字節數。
再淺顯討論sizeof的作用

sizeof(int)*k之所以用sizeof(int)*k而不是用k,因為sizeof(int)*k返回的是字節數,因為數組是int 型的sizeof計算每個元素的字節長度,在乘以k既k個元素的字節,因為memcyp需要知道拷貝內存的字節數。所以拷貝是從開頭開始計算,即k個元素是從a[0]開始計算。由此可以推出將a中元素全部拷貝到b數組中,memcpy(b,a,sizeof(a))。

memset函數(頭文件<cstring)

void *memset(void *s , int ch , size_t n ) 在一段內存塊中填充某一個給定的值,常用于較大的對結構體和數組的清零操作。
memset(結構體/數組名 , "用于替換的字符“ , 前n個字符 );
用法可以參考memcpy,也要用sizeof來計算字節。
總結內存復制需要計算字節。
我們拿出一個題來做例子

描述
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。

由于馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分?,F在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走后,馬路上還有多少棵樹。

輸入
第一行有兩個整數L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。

對于20%的數據,區域之間沒有重合的部分; 對于其它的數據,區域之間有重合的情況。
輸出
包括一行,這一行只包含一個整數,表示馬路上剩余的樹的數目。 樣例輸入 500 3 150 300 100 200 470 471 樣例輸出
298 來源 NOIP2005復賽 普及組 第二題

#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main(){int lon[10000];int l=0,n=0;int sum=0;cin>>l>>n;int s=0,o=0;memset(lon , 1 , sizeof() )for(int i=0;i<n;i++){cin>>s>>o;for(int t=s;t<=o;t++){lon[t]=0;}}for(int i=0;i<=l;i++){sum=sum+lon[i];}cout<<sum;return 0;}

Sec2.二維數組

1.數組的引入:

當數據與不再是單純的線性關系,類似坐標系的數據,矩陣的處理等;

2.數組的使用

①數組的定義及引用
數組類型 數組名 [表達常量式1][表達常量式2];例如int a [5][5]常量表達式1為行數,常量表達式2為列數。跟一維數組一樣下標從0開始。
引用時 數組名 [表達常量式1][表達常量式2];例如a [5][5]
初始化參考一維數組。特殊的int a[2][5]={{1,2},{2,3},{4,6},{1,2},{2,3}};

以此題為例。

描述 給定一個5*5的矩陣(數學上,一個r×c的矩陣是一個由r行c列元素排列成的矩形陣列),將第n行和第m行交換,輸出交換后的結果。

輸入 輸入共6行,前5行為矩陣的每一行元素,元素與元素之間以一個空格分開。 第6行包含兩個整數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

#include<iostream>using namespace std;int main(){int a[6][6];int l1=0,l2=0;for(int t=1;t<6;t++){for(int i=1;i<6;i++){cin>>a[t][i];}}cin>>l1>>l2;for(int t=1;t<6;t++){a[0][t]=a[l1][t];a[l1][t]=a[l2][t];a[l2][t]=a[0][t];}for(int t=1;t<6;t++){for(int i=1;i<6;i++){cout<<a[t][i]<<' ';}cout<<endl;}

Sec3.字符型數組

1.數組的定義

一維數組:char 函數名[行 常量表達式] 例如:char ch[5];
二維數組:char 函數名[列 常量表達式] 例如:char ch[2][12]

2.數組的初始化

初始化過程中,沒有被初始化的數組項編譯器會給默認賦值’\0’;(整數數組沒有被初始化的數組項被賦值為0)。例如:char c[5] = {‘a’,’b’,’c’,’d’}; 中 c[4] = ‘\0’; \0即空字符。
char c[5]="abcd"字符串初始化數組的話,字符串后會跟一個空字符,所以字符串的元素數量要少于定義的空間。

3.字符型數組特殊的賦值方式,可以直接cin>>a,a為字符型數組

其余相關操作均可參考數組與二維數組。

Mo和Larry發明了一種信息加密方法。他們首先決定好列數,然后將信息(只包含字母)從上往下依次填入各列,并在末尾補充一些隨機字母使其成為一個完整的字母矩陣。例如,若信息是“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”填充了信息使之成為一個完整的矩陣,當然他使用任何字母都是可以的。

Mo根據這個矩陣重寫信息:首先從左到右寫下第一行,然后從右到左寫下第二行,再從左到右寫下第三行……以此左右交替地從上到下寫下各行字母,形成新的字符串。這樣,例子中的信息就被加密為:toioynnkpheleaigshareconhtomesnlewx。

你的工作是幫助Larry從加密后的信息中還原出原始信息(包括填充的字母)。

輸入
第一行包含一個整數(范圍2到20),表示使用的列數。
第二行是一個長度不超過200的字符串。
輸出 一行,即原始信息。
樣例輸入 5
toioynnkpheleaigshareconhtomesnlewx
樣例輸出
theresnoplacelikehomeonasnowynightx
來源 East Central North America 2004

#include<iostream> #include<cstring> #include <stdlib.h> using namespace std; int main() {char a[210][210];int n=0,w=0,s=0;int mid;string b;cin>>n>>b;w=b.size()/n; // 這里使用的srting與srting.size()下文將會講解for(int i=1;i<=w;i++){for(int t=1;t<=n;t++){a[i][t]=b[s];s++;}if(i%2==0){for(int t=1;t<=(n+1)/2;t++){mid=a[i][t];a[i][t]=a[i][n+1-t];a[i][n+1-t]=mid;}}}for(int i=1;i<=n;i++){for(int t=1;t<=w;t++){cout<<a[t][i];}}return 0; }

Sec4.字符串string

C++中對于strinig的定義為:typedef basic_string string; 也就是說C++中的string類是一個泛型類,由模板而實例化的一個標準類,本質上不是一個標準數據類型.

1.字符串操作

strcpy(p, p1) 復制字符串
strncpy(p, p1, n) 復制指定長度字符串
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§將小寫字母全部換為大寫字母

相對于字符型數組,字符串可以有以下操作
  • s.empty(); // s為空串 返回true
  • s.size(); // 返回s中字符個數 類型應為:string::size_type
  • s[n]; // 從0開始相當于下標訪問
  • s1+s2; // 把s1和s2連接成新串 返回新串
  • s1=s2; // 把s1替換為s2的副本
  • v1==v2; // 比較,相等返回true
  • !=, <, <=, >, >=
  • 大小規則
    1)數字0~9比字母要小。如"7"<“F”;
    2)數字0比數字9要小,并按0到9順序遞增。如"3"<“8”
    3)字母A比字母Z要小,并按A到Z順序遞增。如"A"<“Z”
    4)同個字母的大寫字母比小寫字母要小。如"A"<“a”。

    2.字符串的引用

    可以直接使用名稱,例如string a;可以直接使用a代指一整個字符串。
    也可以使用string a[1]代指字符串a的第二個元素。
    以一個例題為例

    描述 給定N個單詞(每個單詞長度不超過100,單詞字符串內僅包含小寫字母)。

    請求出N個單詞中共有多少個不同的單詞。

    輸入 第1行包含1個正整數N。
    接下來N行每行包含一個字符串。
    輸出 一個整數,代表不同單詞的個數
    樣例輸入
    5 lalala
    hahaha
    haha
    lalala
    haha
    樣例輸出 3
    提示

    • N <= 10000000
    • 不同單詞個數不超過100000
    #include<iostream> #include<set> #include <vector> using namespace std; int main() {vector<string> a;set<string> b;string c;int n;cin>>n;while(n--) {cin>>c;a.push_back(c); }b.insert(a.begin(),a.end());cout<<b.size()<<endl;return 0; }

    文中所使用的stl容器在本篇不做介紹,后續會發布更詳細的知識。

    二、對于數組部分學習的心得

    對于近期程序設計的學習感到了恐懼,因為通過string到接觸stl開始發現程序設計的知識體系太龐大了,有更多的知識要去學習,現在學到的基礎還算不上九牛一毛,有種井底之蛙的感覺,也正是如此,要更要去克服這些困難,像在做OJ題時總會碰到一些不知道的知識,再由這些知識就能發現更多知識,及時不會,也開始對C的知識體系有了一些認識,但是從Acm院級的比賽來看,有些知識很簡單,考的是想法,是解決問題的“算法”,也接觸到了STL的容器,算法,但是對于迭代器,還是沒有清晰的概念,從題中學習知識的方法確實很慢,比主動去看知識要慢的很多,但是只有從題目與知識的串聯中才能將這些知識記牢會用。對于語言的學習,要愿意去接受新知識,也要有斗志,耐得住寂寞的克服一個個問題。

    總結

    以上是生活随笔為你收集整理的数组及字符串相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。