# 陣列

簡單的說,就是用來處理同類型的連續資料用的好東西

# 一維陣列

# 定義方法

<資料型態> <標識符>[大小(陣列元素個數)];
double length[30],widtch[30];
const int N = 100,M=20;
int score[N*M];

# 初始化方法

<資料型態> <陣列名>[<常數表達式>] = {<表達式1>,<表達式2>,...};
int score[] = {98,100,80,90,98};
double average[10] = {21.0, 20.3, 7.5+3, a*b};

# 使用方法

<陣列名>[<下標>]

切記,下標的範圍是 0~ 元素個數 - 1

// 正確示範
// 定義陣列
int length[10],width[10];
// 給陣列元素賦值
length[0] = 1;
// 陣列元素參與運算
int sum = length[0]*2;
// 輸入陣列元素
cin>>length[0];
// 輸出陣列元素
cout<<length[0];
// 錯誤示範
// 對陣列整體輸入
cin>>length;
// 陣列下標超界
cout<<length[10];
// 陣列整體賦值
width = length;
// 輸出陣列整體
cout<<length;

# 字元陣列、字元串

// 字元陣列
char chr[] = {'H','e','l','l','o'};
int a = sizeof(chr); // a = 5
// 定義一個字元陣列,並使用字元串進行初始化
char chr[] = "Hello";
int b = sizeof(chr); // b = 6
// 因為除了 Hello 5 個字元外,還有一個 \0 作為結束符號

# 例子:單字字母轉小寫成大寫

寫個程式讓電腦可以輸入一個 (全小寫的) 單字,將其全轉成大寫並輸出

#include <iostream>
using namespace std;
int main()
{
    char str[10]; // 定義一個字元陣列存放單字,假設字母不超過 9 個
    int i=0; // 表示陣列的下標
    cin>>str; // 對整體輸入字元串
    while(str[i]!='\0') // 如果還不沒到結束符,則繼續在循環
    {
        str[i]=str[i]-32; // 字母的轉換,ASCII 碼差了 32
        i++;// 調整下標
	}
	cout<<str<<endl; // 整體輸出字元串
	return 0;
}

# 二維陣列

二維陣列的概念就像是一個二維的表格,由行標和列標指明陣列的元素在表格中的位置
在內存中,按照一維陣列來存放,即按行順序在內存中分配儲存單位

# 定義方法

<資料型態> <陣列名>[<常數表達式1>][<常數表達式2>];
// 常數表達式均為整數型,分別代表行數和列數
// 陣列元素個數 = 常數表達式 1 * 常數表達式 2
int score[60][3]; // 總共包含 60 * 3 = 180 個元素
const int N = 10,M = 6;
double point[N][M];

行標列標是不能用變數的喔,必須是常數表達式才行,這種定義方式又稱為靜態定義

# 初始化方法

<資料型態> <陣列名>[<行數>][<列數>] = {<表達是1>,<表達是2>,...};
// 全部元素
// 明確說明了行數和列數
int A[3][3]={1,2,3,4,5,6,7,8,9}; 
// 只說明列數,但可以根據初始化的個數和列數,確定行数
int A[][3]={1,2,3,4,5,6,7,8,9};
// 初始化的時候使用大括號,可以明確看出每行所包含的元素
int A[3][3]={ {1,2,3},{4,5,6},{7,8,9} };
// 部分元素
// 只對第一行賦值
int B[3][3]={1,2,3};
// 只對前兩行賦值
int B[3][3]={ {1,2},{4,5},{7,8} };

# 使用方法

<陣列名>[<行標>][<列標>];
// 行標範圍為 0 ~ 行數 - 1
// 列標範圍為 0 ~ 列數 - 1
int A[2][3];
A[0][0] = 2; // 下標最小元素賦值,即第一個陣列元素
A[1][2] = 1; // 下標最大元素賦值,即最後一個陣列元素

下標不能越界喔~~

# 延伸問題;一、二維陣列對應關係

如果使用一維的陣列 a[M*N] 和二維陣列 b[M][N] 表示同一個矩陣,
b[i][j] 與 a 中的那個下標的元素對應呢?
a 陣列元素

123456

b 陣列元素

123
456

b[0][0] == a[0] b[0][1] == a[1] b[0][2] == a[2]
b[1][0] == a[3] b[1][1] == a[4] b[1][2] == a[5]

可以看出就是 => b[i][j]=a[i*N+j]
(這種方法好像跟 Hash 有點關係)

#include <iostream>
using namespace std;
int main()
{
    const int m=2,n=3; // 行數 m、列數 n
    int a[m*n],b[m][n];
    int i,j; //i 和 j 為循環變數,與陣列的下標有關
    int x=1; //x 是陣列元素的值,初始值為 1
    for(i=0;i<6;i++,x++)
        a[i]=x; // 循環給陣列 a 賦值
    x=1;
    for(i=0;i<2;i++){
        for(j=0;j<3;j++,x++){
            b[i][j]=x; // 循環給陣列 b 賦值
            cout<<a[i*n+j]<<"\t"<<b[i][j]<<endl;
        }
    }
    return 0;
}

# 多維陣列

int A[5][4][3]; // 類似 5 行 4 列 3 層的魔術方塊結構
double B[3][3][3]; // 類似 3 行 3 列 3 層的魔術方塊結構

# 結構

可以用來表示某事物的多個特徵,並保證多個陣列之間的關係。

# 結構類型

# 定義方法

struct <結構體名>
{
    <類型名1> <成員名表1>; // 定義方式和普通定義變數相同
    <類型名1> <成員名表2>;
    <類型名2> <成員名表3>; 
    ........
};
struct Date{
    int year,month,day;
};

同一結構的元素不能同名,但可以與結構外的其他變數同名

# 結構變數

定義好結構變數後,就可以宣告該結構的變數。

# 宣告方式

struct <結構名> <變數列表>;

# 宣告時機

  • 定義結構類型後宣告
struct Date today;
  • 定義結構類型同時宣告,可以省略結構名
struct Date{int year,month,day;} today;
//Date 為結構名稱,可以省略變成:
struct {int year,month,day;} today;

# 初始化方法

struct <結構名> <變數1> = {<數據列表>}, <變數2> = {<數據列表>};
struct Date today ={2020,10,1},yesterday={2020,9,30};
//today 的 year,month,day 被定義為 2020, 10, 1
//yesterday 的 year,month,day, 被定義為 2019,9,30

# 使用方法

使用成員運算子 (分量運算子) .

<變數名>.<成員名>
today.year=2020; // 對 today 的成員 year 賦值
today.month=10;
today.day=1;

# 結構陣列

以一維陣列為例

# 定義方法

struct <結構名> <結構陣列名>[<陣列大小=元素個數>];
struct Date dates[30];

# 初始化方法

struct <結構名> <結構陣列名>[<陣列大小>] = {<結構類型值列表>};
struct Date dates[30] = { {2020,9,30},{2020,10,1},{2020,10,2} };
//dates 共有 30 個元素,僅有 0、1、2 號元素被賦值
struct Date dates[] = { {2020,9,30},{2020,10,1},{2020,10,2} };
// 省略下標,該結構僅包含 3 個元素

# 使用方法

<結構陣列名>[<整數表達式>].<成員名>
today[i].year=2020;
today[i].month=10;
today[i].day=1;

# 例子:簡易通訊錄

按照通訊錄格式紀錄 3 位聯絡人信息並輸出信息
通訊錄內容要求:

  • 姓名
  • 性別
  • 連絡電話 1
  • 連絡電話 2
#include <iostream>
using namespace std;
int main()
{
    // 定義結構型態 telelist、結構陣列 list 包含 3 個元素
    struct telelist {
        char[8] name;
        char sex;
        char[12] phone1;
        char[12] phone2;
    } list[3];
    int i;
    for(i=0;i<=2;i++) {
        cin>>list[i].name>>list1[i].sex>>list[i].phone1>>list[i].phone2;
    }
    for(i=0;i<=2;i++) { 
        cout<<list[i].name<<"/"<<list[i].sex<<"/"<<list[i].phone1<<"/"<<list[i].phone2<<endl;
    }
    return 0;
}

# 枚舉

可以檢查變數取值的合法性

# 枚舉類型

# 定義方法

enum <枚舉類型名>{枚舉常數名};
enum Week {Sun, Mon, Tes, Wed, Thu, Fri, Sat};
// 默認值賦值為 Sun=0,Mon=1,Tes=2,Wed=3,Thu=4,Fri=5,Sat=6
enum Coin {PENNY=1, NICKEL=5, DIME=10, QUARTER=25, HALF_DOLLAR=50, DOLLAR=100};
enum Color {red, yellow, blue=1, white, black};
// red=0,yellow=1,blue=1,white=2,black=3
//blue 之前的元素按照默認的方式賦值,blue 後的元素按逐個加 1 的方式分配整數

枚舉常數是以標識符形式表示的整數型數,而不是字元串或字面常數

# 枚舉變數

# 宣告時機

  • 定義枚舉類型後宣告
enum Color background, foreground;
  • 定義枚舉類型同時宣告
enum Week {Sun=7, Mon=1, Tes, Wed, Thu, Fri, Sat} begin, end;

# 使用方法

不同類型的枚舉變數不能相互賦值

// 定义一个枚举类型 Week,和两个 Week 变量 begin end
enum Week {Sun=7,Mon=1,Tes,Wed,Thu,Fri,Sat} begin, end;
// 錯誤示範
// 直接輸入枚舉變數
cin>>begin;
// 整數賦予枚舉變數
begin=1;
// 正確示範
// 將枚舉常數賦予枚舉變數
begin=Mon;
end=Sun;
// 相同類型的枚舉變數賦值
begin= end;
// 整數強轉類型後賦值給枚舉變數
begin=(Week)1;
// 將枚舉變數賦予整數變數
int a=begin;
// 將枚舉常數賦予給整數變數
int b=Sun;
// 可以直接輸出枚舉變數,輸出的是變數的整數值
cout<<begin;
// 枚舉變數可以參與數學運算,結果為整數值
cout<<end-begin;

# 例子:三色球組合

口袋中有紅、黃、藍 3 種顏色的小球各一個,從中取出兩個,顯示各種可能的組合。

#include <iostream>
using namespace std;
int main()
{
    enum color{red,yellow,blue}; // 定義枚舉類型 color,包括三個元素
    int temp,i,j;
    for(i=red;i<=yellow;i++) // 枚舉變數使用,模擬第 1 次取球
    {
        for(j=i+1;j<=blue;j++) // 模擬第 2 次取球
        {
            for(int t=0;t<2;t++) // 處理每次取球的顏色
            {
                switch(t) 
                {
                    case 0: temp=i; break; // 第 1 次由第一層的 i 决定
                    case 1: temp=j; break; // 第 2 次由第二層的 j 决定
                }
                switch((enum color)temp) // 強制轉換為枚舉變數
                {
                    case red: cout<<"red"<<"\t"; break;
                    case yellow: cout<<"yellow"<<"\t"; break;
                    case blue: cout<<"blue"<<"\t"; break;
                }
            }
            cout<<"\n";
        }
    }
    return 0;
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay