1. 程式人生 > 其它 >c++primer(練習3.31、3.32、3.35、3.36、3.39、3.40)

c++primer(練習3.31、3.32、3.35、3.36、3.39、3.40)

技術標籤:c++練習c++

練習3.31

#include<iostream>
using namespace std;

int main() {
    int  a[10];
    for (int i = 0; i <10 ; ++i) {
        a[i]=i;
    }
    for (auto b : a)
        cout<<b<<" ";
    return 0;
}

Result


練習3.32

將練習3.31建立的陣列拷貝給另外一個數組

#include<iostream>
using namespace std; int main() { int a[10],b[10]; //為第一個陣列賦值 for (int i = 0; i <10 ; ++i) { a[i]=i; } //輸出第一個陣列的內容 cout<<"第一個陣列內容:"<<endl; for (auto x : a) cout<<x<<" "; //將第一個陣列中的內容拷貝給第二個陣列 for (int j = 0; j <
10 ; ++j) { b[j]=a[j]; } cout<<endl; //輸出第二個陣列的內容 cout<<"第一個陣列內容拷貝到第二個陣列,則第二個陣列內容:"<<endl; for (auto y: b) cout<<y<<" "; return 0; }

Result

利用vector重寫程式,實現類似的功能

#include<iostream>
#include<vector>
using
namespace std; int main() { int i; vector<int> v1,v2; //向容器v1新增元素 while(cin>>i) v1.push_back(i); cout<<"輸出容器v1的內容:"<<endl; for (auto a:v1) cout<<a<<" "; cout<<endl; //將容器v1的元素拷貝給v2 for (auto &b:v1) v2.push_back(b); cout<<"輸出容器v2的內容:"<<endl; for (auto c:v2) cout<<c<<" "; return 0; }

Result
輸入完後Enter再Ctrl+D

他人程式碼(供參考學習)

  • 容器的下標運算子由庫模板定義的,只能用於vector型別的運算物件,下標型別size_type,size_type由string類型別和vector類型別定義的型別,用以儲存任意string物件或vector物件的長度,標準庫型別將size_type定義為unsigned型別
  • 陣列下標型別定義為size_t型別,size_t是一種機器相關的無符號型別,它被設計的足夠大以便能表示記憶體中任意物件的大小,在cstddef標頭檔案中定義了size_t型別
#include<iostream>
#include<vector>
using namespace std;

int main() {
    int arr[10];
    int arr2[10];
    //為陣列arr賦值
    for (int i = 0; i <10 ; ++i) {
        arr[i]=i;
    }
    //將arr1的值拷貝給arr
    for (int j = 0; j <10 ; ++j) {
        arr2[j]=arr[j];
    }

    vector<int> v(10);//10個0
    vector<int> v2(v);//將v直接賦值給v2
    //將陣列arr的元素拷貝給容器v
    //這裡容器的下標運算子由庫模板定義的,只能用於vector型別的運算物件,下標型別size_type
    //size_type由string類型別和vector類型別定義的型別,用以儲存任意string物件或vector物件的長度
    //標準庫型別將size_type定義為unsigned型別
    //陣列的下標運算子,陣列下標型別定義為size_t型別,size_t是一種機器相關的無符號型別,它被設計的足夠大以便能表示記憶體中任意物件的大小
    // 在cstddef標頭檔案中定義了size_t型別
    for (int k = 0; k!=10 ; ++k) {
        v[k]=arr[k];
    }
    for (auto i:v2)
        cout<<i<<" ";
    cout<<endl;
    return 0;
}

Result


練習3.35

編寫一段程式,利用指標將陣列中的元素置為0
設計知識:
int*p=a;等價於int *p=&a[0];其中&a[0]為指向陣列首元素的指標

int a[5];
int *p=a;

指標與數字相加後仍為指標,指標a向後移動5個位置,指標e指向尾元素的下一個位置(下一個位置這個不存在的元素唯一的用處就是提供其他地址用於初始化e)

int *e=a+5;

完整過程:

#include<iostream>
using namespace std;

int main() {
    int a[5]={1,2,3,4,5};
    int *p=a,*e=a+5;
    cout<<"原陣列內容:"<<endl;
    for (int i = 0; i <5 ; ++i) {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    cout<<"用指標將陣列元素置0後:"<<endl;
    for (;p!=e;++p) {
        *p = 0;
        cout<<*p<<" ";//這裡的*p為解引用,獲得指標p所指向的元素
    }
}

Result


練習3.36

編寫一段程式,比較兩個陣列是否相等。

兩個陣列相等需同時滿足以下兩個條件:

  • 陣列大小相等
  • 陣列中對應位置的元素相等
#include<iostream>
using namespace std;

bool compare(int *p1, int *e1, int *p2, int *e2){
    //傳入分別指向兩個陣列首元素的指標和陣列中指向尾元素下一個位置的指標
    //兩個指標做差得到陣列的大小,如果陣列大小不相等,則兩個陣列不相等
    if((e1-p1)!=(e2-p2))
        return false;
    else {              //兩個陣列大小相等
        //首尾指標不等說明陣列非空,++i,++j向後移動指標
        for (int *i = p1, *j = p2; (i != e1) && (j != e2); ++i, ++j)
            if (*i != *j)//陣列內某個對應位置的元素不相等
                return false;
    }
    //如果均沒有執行上述程式碼說明兩個陣列大小,並且對應位置的元素相等
    return true;
}
int main() {
    int a1[3]={0,1,2};
    int a2[3]={0,2,3};
    cout<<"陣列a1的內容:";
    for (auto a : a1)
        cout<<a<<" ";
    cout<<endl;
    cout<<"陣列a2的內容:";
    for (auto b :a2)
        cout<<b<<" ";
    cout<<endl;
    //傳入兩個陣列指向首元素的指標和陣列指向尾元素下一個位置的指標
    if (compare(begin(a1),end(a1),begin(a2),end(a2)))//如果返回true則if(1)兩個陣列相等
        cout<<"兩個陣列相等"<<endl;
    else
        cout<<"兩個陣列不相等"<<endl;
    return 0;
}

Result

再寫一段程式,比較兩個vector物件是否相等

  • 當且僅當v1和v2的元素數量相同且對應位置的元素值都相同
  • vector支援的操作含有:判斷兩容器是否相等的運算(即v1==v2)
#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v1{0,2,3},v2{0,2,3};
    if (v1==v2)
        cout<<"兩個容器相等"<<endl;
    else
        cout<<"兩個容器不相等"<<endl;

    return 0;
}

Result


由以上練習,對比在string或vector中使用迭代器和在陣列中使用迭代器

1.在string或vector中使用迭代器

vector<int> v;
auto b=v.begin();//b代表指向容器v第一個元素的指標
auto e=v.end();//e指向容器v尾元素的下一個位置的指標,表示已經處理完容器中的所有元素
const vector<int> cv;
auto it2=cv.cbegin();

2.在陣列中使用迭代器

int a[]={0,1,2};
int *beg = begin(a);//指向a陣列首元素的指標
int *last = end(a);//指向a陣列尾元素的下一位置的指標

練習3.39

編寫一段程式,比較兩個string物件

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s1="hello";
    string s2="world";
    cout<<"字串s1:"<<s1<<endl;
    cout<<"字串s2:"<<s2<<endl;
    if (s1<s2)
        cout<<"字串s1小於s2";
    else
        cout<<"字串s1大於s2";
    return 0;
}

Result

再編寫一段程式,比較兩個C風格字串的內容

要想比較C風格字串需要呼叫strcmp函式,比較的是內容,如果兩個字串相等,strcmp返回0;如果前面的字串較大,返回正值;如果後面的字串較大,返回負值

#include<iostream>
#include <cstring>
using namespace std;
int main(){
    const char c1[] = "A string example";
    const char c2[] = "A different string";
    cout<<"字串c1:"<<c1<<endl;
    cout<<"字串c2:"<<c2<<endl;
    //if (c1<c2)  未定義的:試圖比較兩個無關地址,這裡實際上比較的是兩個const char*的值
    //strcmp(c1,c2)<0和兩個string物件的比較效果一樣(可參考對比上一個程式)
    if(strcmp(c1,c2)<0)
        cout<<"字串c1小於c2";
    else
        cout<<"字串c1大於c2";

    return 0;
}

Result


練習3.40

編寫一段程式,定義兩個字元陣列並用字串字面值初始化它們:接著再定義一個字串陣列存放前兩個陣列連線後的結果。使用strcpy(拷貝字串)和strcat(連線字串)把前兩個陣列的內容拷貝到第三個陣列中

#include<iostream>
#include <cstring>
using namespace std;
int main(){
    //C風格字串
    const char a[]="A string example";
    const char b[]="A different string";
    char c[100];
    //C風格字串的函式strcpy,strcat
    strcpy(c,a);//將a拷貝到c中
    strcat(c," ");//將空格連線到c的後面
    strcat(c,b);//將b連線到(變化後的)c的後面
    cout<<c<<endl;
    return 0;
}

Result