1. 程式人生 > >c++primer 筆記(一)

c++primer 筆記(一)

宣告:此文是博主拜讀《C++ Primer (3E)》一書的筆記,一切版權屬於原作者。

    記得剛上大學,我們開的第一門計算機語言課就是C++,當時真是很痛苦,很苦逼啊。初次接觸計算機語言,感覺亞歷山大啊。

     最近公司要培訓c++課,提供了C++ Primer(3E)的電子檔(記得自己以前買過這本書,現在不知道哪裡去了),我剛拜讀了第一篇第一章第一節,就被這段文字吸引了,突然感覺計算機不那麼。。了。

      再次記錄下這段文字,作為學習筆記,以鼓勵自己。

        程式常常是針對某些要解決的問題和任務而編寫的。我們來看一個例子,某個書店將每本售出圖書的書名和出版社,輸入到一個檔案中,這些資訊以書售出的時間順序輸入,每兩週店主將手工計算每本書的銷售量,以及每個出版社的銷售量。報表以出版社名稱的字母順序排列,以使下訂單。現在,我們希望寫一個程式來完成這項工作。
        解決大問題的一種方法,是把它分解成許多小問題,理想情況下,這些小問題可以很容易地被解決。然後,再把它們合在一起,就可以解決大問題了。如果新分割的小問題解決起來還是太大,就把它分割得再小一些,重複整個過程,直到能夠解決每個小問題。這個策略就是分而治之(divide and conquer) 和逐步求精(stepwise refinement)。 書店問題可以分解成四個子問題或任務:
        1 讀銷售檔案
         2 根據書名和出版社計算銷售量
         3 以出版社名稱對書名進行排序
        4 輸出結果
       我們知道怎樣解決第1, 2 和4 個子問題,因此它們不需要進一步分解,但是第3 個子問題解決起來還是有些大。所以,對這個子問題重複我們的做法繼續分解:
        3a 按出版社排序
        3b 對每個出版社的書按書名排序
        3c 在每個出版社的組中比較相鄰的書名如果兩者匹配增加第一個的數量刪除第二個
        3a ,3b, 和3c 所代表的問題現在都已經能夠解決了,由於我們能夠解決這些子問題。因此,也就能夠有效地解決原始的大問題了,而且我們也知道任務的原始順序是不正確的,正確的動作序列應該是
        l 讀銷售檔案
        2 對檔案排序——先按出版社然後在出版社內部按書名排序
        3 壓縮重複的書名
        4 將結果寫入檔案
        這個動作序列就是演算法algorithm, 下一步我們把演算法轉換成一種特定的程式設計語言————在這裡是C++語言。

用啞函式實現上面所說過程:

#include <iostream>
using namespace std;

void readIn() { cout << "readIn()\n"; }
void sort() { cout << "sort()\n"; }
void compact() { cout << "compact()\n"; }
void print() { cout << "print()\n"; }

int main()
{
        readIn();
        sort();
        compact();
        print();
        return 0;
}

        上面這種漸進式生成程式的方法,可以避免在程式設計過程中出現各種問題,試圖一下子就能寫出一個完全成功的程式幾乎是不可能的。

        iostream是輸入/輸出流庫標準檔案(注意它沒有後綴),它包含cout 的資訊,這對我們的程式是必需的,#include 是前處理器指示符(preprocessor directive), 它把iostream 的內容讀入我們的文字檔案中。在C++標準庫中定義的名字,如cout, 不能在程式中直接使用,除非在前處理器指示符 #include <iostream>後面加上語句using namespace std;       這條語句被稱作using 指示符(using directive)。 C++標準庫中的名字都是在一個稱作std 的名字空間中宣告的,這些名字在我們的程式文字檔案中是不可見的,除非我們顯式地使它們可見,using 指示符告訴編譯器要使用在名字空間std 中宣告的名字。

變數的定義:下面以一個例子來看變數的定義,在這裡首先提出的是變數與記憶體區域相關聯。

下面是一組C++語句,
        int book_count = 0;
        book_count = books_on_shelf + books_on_order;
        cout << "The value of book_count: " << book_count;
        第一條語句是一個宣告(declaration) 語句,book_count 被稱為識別符號(identifier) 或符號變數(symbolic variable),簡稱,變數或者物件(object)。 它定義了計算機記憶體的一塊區域,並且與名字book_count 相關聯,被用來儲存整數值。0 是一個文字常量(literal constant),book_count 被初始化為0。

        標準C++中,如果main()函式沒有顯式地提供返回語句,則它預設返回0。

        C++定義了一組內建的基本資料型別,整數型別int ,浮點數型別float, 字元型別char, 以及只有false 和true 兩個值的布林型別boolean。 每種型別都與C++語言中
某一個關鍵字keyword 相關聯,程式中的每個物件都與一個特定的型別相關聯。

        C++標準庫還提供了一組擴充套件的基本資料型別,其中包括字串string, 複數complex number, 向量vector 和列表list。 例如
        // 為了使用string 物件下面的標頭檔案是必需的
        #include <string>
        string current_chapter = "Getting Started";
        // 為了使用vector 物件下面的標頭檔案是必需的
        #include <vector>
        vector<string> chapter_titles( 20);
       current_chapter 是一個字串物件,被初始化為字串文字“Getting Started” 。chapter_title是一個向量,包含有20 個字串型別的元素,以下這種特殊語法:
        vector <string>
        指示編譯器建立一個能夠存放字串元素的向量型別,要定義一個能夠存放20 個整數的向量物件,我們可以這樣寫:
        vector<int> ivec(20);