close

第四章  複合類型

 

本章節會包含下列內容

  • 創建和使用數組
  • 創建和使用C-風格字符串
  • 創建和使用string字符串
  • 使用方法get()和getling()讀取字符串
  • 混和輸入字符串和數字
  • 創建和使用結構
  • 創建和使用共同體
  • 創建和使用枚舉
  • 創建和使用指針
  • 使用new和delete管理動態內存
  • 創建動態數組
  • 創見動態結構
  • 自動存儲、靜態存儲和動態存儲
  • vector和array類簡介

 

一、數組

數組(array)是一種數據格式,能夠存儲多個同類型的值。

要創建數組,可以使用聲明語句,聲明語句要指出以下三點:

  • 存儲在每個元素中類型的
  • 數組名
  • 數組中的元素數

聲明數組的通用格式如下:

 

typeName arrayName[arraySize];

arraySize指定元素數目,它必須是整型常數或const值,即必須是已知的,不能是變量。

以下為範例:

 

short month[12];  //creat array of 12 short

數組織所已被稱為複合類型的,是因為它是使用其他類型來創建的

數組可以單獨訪問數組元素,方法是使用下標來對元素進行編號。C++的數組是由0開始進行編號的

 

 

1.程序說明

 

以下範例程序說明數組的一些屬性,包刮聲明數組、給數組元素賦值、以及初始化數組:

 

#include <iostream>
int main(){
    using namespace std;
    int yams[3];  //聲明數組
    yams[0] = 7;  //對每一個數組元素賦值
    yams[1] = 8;
    yams[2] = 6;
    
    int yamcosts[3] = {20,30,5};  //聲明數組,同時賦值給前三個元素
    cout<<"Total yams = ";
    cout<<yams[0] +yams[1] + yams[2]<<endl;
    cout<<"The package with "<<yams[1]<<" yams costs ";
    cout<<yamcosts[1]<<" cents per yam. \n";
    int total = yams[0]*yamcosts[0] + yams[1]* yamcosts[1];  //將兩個數組的第一個元素相乘,第二個元素相乘
    total = total + yams[2]*yamcosts[2];                     //將剛剛的total再加上第三個元素相乘,在賦新的值給total
    cout<<"The total yam expense is "<<total<<" cents.\n";
    cout<<"\nSize of yams array = "<<sizeof yams;           //sizeof 返回類型或數據對象的長度
    cout<<" bytes.\n";
    cout<<"Size of one element = "<<sizeof yams[0];
    cout<<" bytes.\n";
    return 0;
}

 

2.數組初始化的規則

 

C++有幾條關於初始化數組的規則:

  • 只有在定義數組時才能使用初始化。
  • 可以使用下標,分別給數組中的元素賦值。
  • 如果只對數組的一部分進行初始化,其他元素將被設置為0。
  • 將數組中所有的元素都初始化為0,只要將第一個元素初始化為0,然後讓編譯器將其他元素都初始化為0即可。

 

 

3.C++11數組初始化方法

 

  1. 初始化數組時,可以省略等號( = )
  2. 可以不在大括號內包含任何東西,這將把所有數值設置為零
  3. 列表初始化禁止縮窄轉換(例如、將long 存到 int)

 

 

二、字符串

 

C++處理字符串的方式有兩種

  1. C語言的C風格字符串(C-style-string)
  2. string類庫

 

可以將字符串存儲在 char 數組中,C風格字符串的特殊性質就是以空字符(null character)做結尾

空字符被寫作 \0

 

以下兩個都是char數組,但只有第二個才是字符串

char dog[8] = {'a','b','c','s',' ','e','r','t'};
char cat[8] = {'a','b','c','s','h','e','r','\0'}

 

以下是將字符數組初始化為字符串的方法,只需使用一個引號括起字符串即可

這種字符串被稱為:字符串常量、或是字符字面值

※用引號括起的字符串包含結尾空字符,因此不用顯示的包括它

char bird[11] ="Mr. Cheeps";
char fish[] = "Bubbles";     //let the compiler count

 

 

1.拼接字符串

有時候,字符串很長,C++允許拼接字串字面值,任何兩個由空白(空格、換行符、制表符)的字串符常量,都會自動拼接持一個

下面所有輸出都是等效的:

cout<<"ivan is a pig!" "clover is a girl";
cout<<"ivan is a pig!clover is a girl";
cout<<"ivan is a p"
"ig!clover is a girl";

 

2.在數組中使用字符串

有兩種方法:

將數組初始化為字符串常量

將鍵盤或文件輸入讀入到數組中

 

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    const int Size = 15;
    char name1[Size];
    char name2[Size] = "C++owboy";
    
    cout<<"Howdy! I'm "<<name2;
    cout<<"! What's your name?\n";
    cin>>name1;
    cout<<"Well, "<<name1<<", your name has ";
    cout<< strlen(name1) << " letters and is stored\n";
    cout<<"in an array of "<<sizeof(name1)<<" bytes.\n";
    cout<<"Your initial is "<<name1[0]<<"\n";
    name2[3]='\0';
    cout<<"Here are the first 3 characters of my name:";
    cout<<name2<<endl;
    return 0;
    
}

9.JPG

 

sizeof 運算出整個數組的長度

strlen()函數返回的是存儲在數組中字符的長度,而不是數組本身的長度

另外,strlen()只計算可見的字符,而不把空字符計算在內

舉例來說、如果clover是個字符串,則存儲該字符串的數組長度不能短於strlen(clover)+1

 

 

3.每次讀取一行輸入

每次讀取一個單詞,例如New York,你希望程序是讀取並存儲完整的城市名,需要採用面向行而不是面向單詞的方法

1.面向行的輸入:getline()

getline()函數讀取整行,他透過回車鍵(輸入鍵)輸入的換行符來確定結尾,但不保存換行符

他在存儲字符的時候,則用空字符來代替換行符

可以使用 cin.getline() 該函式有兩個參數:

第一個用來存儲輸入行的數組名稱,第二個參數是要讀取的字符數

2.面向行的輸入:get()

get()函數讀取整行,他透過回車鍵(輸入鍵)輸入的換行符來確定結尾,且會保存換行符

但因為會保存換行符,因此二次跳用get()會因為讀取到前面一次的換行符結尾而沒讀取道任何內容

這時候要用 cin.get(); 讀取一個換行符,再進行第二次調用

 

4.cstring頭文件

每次

 

 

三、string類簡介

 

要使用string類,必須要程序中包含頭文件string(位於名稱空間std中)

string對象和字符數組的主要區別是,可以將string聲明為簡單變量,而不是數組

在很多方面,sting與使用字符組相同

  • 可以使用C風格字符串來初始化string對象
  • 可以使用cin來將鍵盤輸入到string對象中
  • 可以使用cout來顯示string對象
  • 可以使用數組表示法來訪問存儲在string對象中的字符

 

1.C++11字符串初始化

char first_name[] = {"ivan ivan ivan"};
char second_name[] {"clover clover"};
string third_name = {"awen awen awen"};
string fourth_name {"victor victor"};

 

2.賦值、拼接和附加

不能將一個數組賦給另一個數組,但可以將一個string對象賦給另一個string對象

char charr1[20];              //創建空數組
char charr2[20] = "ivankao";  //初始化數組
string str1;                  //創建空string對象
string str2 = "clover";       //初始化string對象
charr1 = charr2;              //無效,不能將一個數組賦給另一個數組
str1 = str2;                  //有效

要使

 

sting類簡化了字符串合併的操作,使用 + 將sting對象合併, 使用 += 將字符串附加到 sting對象的末尾

string str3;
str3 = str2 + str1;
str1 += str2;      //將str2附加到str1的末尾

3.string類其他操作

 

待續

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ivankao 的頭像
    ivankao

    IvanKao的部落格

    ivankao 發表在 痞客邦 留言(0) 人氣()