C\C++知識回顧,浮點比較、數組、指針、結構體以及多點測試輸入沒有給定結束條件

浮點數的比較,可能是個坑,因爲存在誤差的存在,可以下列方式解決

  • const double Pi = acos(-1.0) // 順帶提一下圓周率pi的定義
    const double eps = 1e-8;
    #define Equ(a, b) (fabs((a) - (b)) < (eps)) // ab相等返回true
    #define More(a, b) (((a) - (b)) > (eps)) // a大於b返回true
    #define Less(a, b) (((a) - (b)) < (-eps)) // a小於b返回true
    #define MoreEqu(a, b) (((a) - (b)) > (-eps)) // a大於等於b返回true
    #define LessEqu(a, b) (((a) - (b)) < (eps)) // a小於等於b返回true

數組

  • 數組作爲函數參數時,對數組中的元素進行修改就等同於對原數組進行了修改
    void fun(int a[], int b[][5]) {}; 作爲參數時,一維數組第一維不需要填寫長度(二維數組第二維不用填寫長度)
    數組不能做返回類型

指針

  • 指針定義:int *p1, *p2, *p3 = &a;
    int *p = &a; p = &a; // p是a的地址,*p是a的內容
    所以在傳值的時候,可以將變量的地址傳過去(如下):
    定義:void fun(int *a){}; 使用:fun(&b) 這樣就將b地址傳過去了,或者下面這樣
    定義:void fun(int &a){}; 使用:fun(b) 這樣叫引用(這裏的&是引用、取別名,不是取地址),給變量b起一個別名a,但他們的地址是相同的
    int a = 1; a是常量還是變量? a的地址(&a)是常量、不變的,a的內容是變量、是可以賦值的;所以a是變量

結構體

  • struct studentInfo {
    int id; // 內部除了自己(studentInfo A;)其餘的數據類型都可以定義
    studentInfo *next; // 如:這裏定義自身類型的指針變量
    }A, B, stu[10]; // 可以在定義結構體的時候,直接定義表示這個結構體的變量或指針,和放在其他地方沒區別
    studentInfo A, B, stu[10]; // 這裏就是在其他地方定義,沒有區別

  • 結構體的訪問一般有兩種方式,普通變量用’.’,指針變量用’->’
    studentInfo a, *p; (訪問方式:a.next, p->next)

  • 結構體初始化,可以定義結構體變量之後,逐一對內部成員賦值,此外還可以在結構體內寫構造函數
    struct studentInfo {

    studentInfo(){} // 默認的構造函數
    studentInfo(int a){} // 可以自定義多個構造函數
    studentInfo(int a, int b){}
    };

多點測試,數據輸入問題

  • 沒有給定結束條件,默認讀到文件尾:
    對scanf來說如果讀入2個數據,會返回2,沒有讀到數據返回-1,C語言中用EOF來代表-1
    while(scanf("%d", &n) != EOF) {}
    如果讀入的是字符串,可以這麼寫:
    while(scanf("%s", str) != EOF) {}
    while(gets(str) != NULL) {}

參考:《算法筆記》

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