有關結構體的認識應用


最近把結構體的部分知識又仔細的研究學習了一下,總結了一下內容,希望者篇文章對那些對結構體模糊的人c結構體

 1, 結構體是一種自定義的數據類型,也是用來存儲多個數據的大容器不過結構體要比數組靈活,它可以存儲不同類型的數據

2, 結構體的定義

    struct + 結構體名字 {大括號中填寫結構體成員,多個結構體成員之間通過分號間隔}

     如下:

    struct student {

        // 結構體成員

        char name[20];//存儲姓名

        char sex;   // 存儲性別

        int number; //存儲學號

        int score;  // 存儲分數

    };// 分號是結構體定義結束的標誌,必不可少


     

3, typedef 類型重定義,即給已有的類型重新起一個名字,新的名字和原類型具有同樣的功能;

     

    typedef 第一種格式, 先定義結構體類型,然後再typedef

     :typedef int  integer;

     給結構體類型 struct student 重新定義一個名字Stu

     typedef struct student Stu;

     

    typedef 第二種格式, 定義結構體的同時,typedef (這種格式比較常用)

    typedef struct point1 {

        float abscissa; //存儲橫座標

        float ordinate; //存儲縱座標

    }Poi1;

     其中Poi1此後可以作爲一個數據結構類型應用

     : Poi1 p1 = {};就是定義了一個結構體類型變量p1

4, 結構體變量訪問結構體成員的方式,通過結構體變量.結構體成員,

     : printf("number = %d\n",stu.number);

5, 結構體數組:

     // 定義一個學生結構體變量

    Stu person[4] = {{"Frank",'f',22,10086,87},{"Duck",'f',28,10087,93},{"Xiaoming",'f',27,10088,93},{"Phone",'f',25,10089,75}};

    // 運用結構體數組對學生按成績排序:

    for (int i = 0; i < 4; i ++) {

        if (person[i].score > scoreMax.score) {

            scoreMax = person[i];

        }

        if (person[i].age < ageMin.age) {

            ageMin = person[i];

        }

    }



6, 結構體內存分配原則

     以結構體成員所規定的存儲空間最大的空間大小爲單位來進行分配,

     最大空間的最小整數倍

7, 結構體可以嵌套, 即在一個結構體中的結構體成員是另一個結構體類型的變量

     :先定義一個日期的結構體Date

    typedef struct  birthday

    {

        int year;

        int month;

        int day;

    }Birth;


     :結構體嵌套, 在一個結構體中的結構體成員是另一個結構體類型的變量

    typedef struct stu {

        char name[20];   //存儲學生姓名

        char sex;       //存儲學生性別

        int age;        // 存儲學生年齡

        int score;     //存儲學生分數

        Birth birth;   //出生日期

    }Stu;

     

     8,練習

1), 定義一個結構體變量(包含年月日),計算該日在本年中爲第幾天?要求寫一個days函數。參數是此結構體類型的變量,返回值是整數。

    int days(date dat)

    {

        int a[12] = {0,31,59,90,120,151,181,212,243,273,304,334};

        int day = 0;

        BOOL isTrue ; // 用於判斷該年是否爲閏年

        // 判斷該年是否爲閏年

        if (dat.year % 400 == 0 || (dat.year % 4 == 0 && dat.year % 100 != 0)) {

            isTrue = 1;  // 如果該年是閏年,isTrue 1

        } else {

            isTrue = 0;

        }

        day += a[dat.month - 1] + dat.day;

        day += isTrue && dat.month >= 3 ? 1 : 0;

        return day;

    }

2), 5名學生保存在結構體數組中,編程按學生的姓名降序排序

    

    void sortName(Stu a[],int n)

    {

        for (int i = 0; i < n - 1; i ++) {

            for (int j = 0; j < n - 1 -i ; j ++) {

                if (strcmp(a[j].name, a[j + 1].name ) < 0)  {

                    Stu temp = a[j]; //temp 爲中間變量,用於交換兩個結構體元素

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }

        }

        

    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章