1. 程式人生 > >2018-2019-1 20189221 《從問題到程式》第 8 周學習總結

2018-2019-1 20189221 《從問題到程式》第 8 周學習總結

2018-2019-1 20189221 《從問題到程式》第 8 周學習總結

第九章 結構和其他資料機制

結構(struct)、聯合(union)、列舉(enum)等資料機制的概念、意義和用途,使用方法。

9.1結構(struct)

C語言的結構(structure)用於把多個型別可能不同的資料物件集合起來。C結構是由若干結構的成分或成員(可不同型別的資料項物件)組合而成的複合資料。一個(或一類)結構中的每個成員都給定了一個名字,通過成員名實現對結構成員的訪問。

9.1.1結構宣告與變數定義

結構描述用關鍵字struct引導,結構說明的 基本形式是:

    struct { 成員說明序列 }; 

定義結構變數:

struct {
     int n;
     double x, y; 
} st1, st2; 

定義結構型別

typedef struct {     
    double x, y; 
} POINT; 

typedef struct { 
    POINT center;     
    double radius; 
} CIRCLE; 

typedef struct { 
    POINT lu;     
    POINT rd; 
} RECTANGLE; 

9.1.2結構變數的初始化和使用

結構變數也可以在定義時直接初始化。為結構提供初始值的形式與陣列一樣。
對結構變數的操作主要是整體賦值和結構成員訪問。
訪問結構成員的操作用圓點運算子(.)描述

pt2.y = pt1.y + 2.4; 
circ1.center.x = 2.07; 
circ1.center.y = pt1.y; 

9.1.3結構、陣列與指標

結構裡可以包含陣列成員,也可以定義以結構作為元素的陣列。
兩種實現方式:
用一個兩維字元陣列和一個計數器陣列,用一個字元指標陣列和一個計數器陣列
可能更合理的方式——採用一種結構來表示與一個關鍵字有關的所有資訊。

typedef struct {     
    char * key;     
    int count; 
} KEYC; 

9.1.4 欄位

欄位:使人在需要時能把幾個結構成員壓縮到一個基本資料型別成員裡存放,這可以看作是一種資料壓縮表示方式。

struct pack {     
    unsigned a:2;     
    unsigned b:8;     
    unsigned c:6; 
} pk1, pk2; 

採用欄位壓縮方式,通常會使訪問結構成員的操作效率下降很多。

9.2結構與函式

函式處理儲存在結構中的資料:

    1. 個別地將結構成員的值傳遞給函式處理。
    1. 將整個結構作為引數值傳遞給函式,一般將這種引數稱作結構引數。
    1. 將結構的地址傳給函式,也就是說傳遞指向結構的指標值。這稱為結構指標引數。

9.2.1處理結構的函式

採用動態建立與管理:

  • 建立的結構的存在期不受建立操作所在位置的約束
  • 通過指標傳遞也不必做整個結構的複製。

9.2.2程式例項

int main() {     
    int n, inum = 0;     
    ACCITEM accbook[NACCOUNT]; 

    initialization(); 
    while ((n = getcommand()) >= 0) {         
    switch (n) { 
    case 0: /* 由使用者得到賬目檔名並讀入 */ 
        inum = readfile(NACCOUNT, accbook);              
        break;         
    case 1: /* 計算 終餘額 */             
        balance(inum, accbook);             
        break;         
    case 2: /* 統計所有收入 */             
        receipts(inum, accbook);             
        break;         
    case 3: /* 統計所有支出 */             
        expenditures(inum, accbook);             
        break; 
    case 4: /* 列印大額支出,向用戶要求額度限 */             
        printsome(inum, accbook);             
        break; 
    default: /* 錯誤命令。輸出錯誤資訊 */             
        errmessage();             
        break; 
    } 
} 
    finalization();     
    return 0; 
} 


9.3聯合(union)

一個聯合是幾個型別不同(也可以相同)的成員的組合,其中每個成員各有一個名字。從這些方面看,聯合與結構很相似。聯合與結構的差異在於它們的表示方式不同。在一個結構(變數)裡,結構的各成員順序排列儲存,每個成員都有自己獨立的儲存位置。聯合的情況不是這樣,一個聯合變數的所有成員共享從同一片儲存區。因此一個聯合變數在每個時刻裡只能儲存它的某一個成員的值。

union {     
    int n;     
    double x;     
    char c; 
} u1, u2; 

9.4列舉(enum)

列舉說明的基本形式是:

    enum 列舉標誌 {列舉常量名, ...}; 

9.6連結結構(自引用結構)

簡單的連結結構是通過線性連結形成的表,或稱連結表。

二叉樹結構:

兩種方式定義自引用結構:

    char word[20]; 
    int count; 
typedef struct node {     
    char word[20];     
    int count;     
    struct node *next; 
} NODE, *LINK; 

9.7欄位