創作內容

0 GP

[程式設計]C++ Primer 第1章(下) - 起步走

作者:夜下月│2013-01-31 17:36:26│巴幣:0│人氣:935
[程式設計]C++ Primer 第1章(上)
http://home.gamer.com.tw/creationDetail.php?sn=1876285

------------------------------------------------------------------------------------

本篇重點
1.5 導入Classes
1.6 C++ 程式

Typedef by wiki

------------------------------------------------------------------------------------

1.5 導入Classes

C++是一個OOP(Object-oriented programming, 物件導向程式), 而類別(Class)在OO中, 是非常重要的基礎觀念, OO可以參考wiki_物件導向程式設計.

而簡單來說, 請把類別(classes)當成一個黑盒子, 這個黑盒子會提供有限的功能(ex. 吃飯, 睡覺, 打東東), 但外界(使用者)並不用管黑盒子如何實作(ex.怎麼吃, 睡法如何, 用什麼打).

所以一個類別(class),會有許多公開(public, 外界可使用)的函式(function)與成員變數(variable), 當然也包含私有(private, 只有類別自己可使用)的函式與變數.

所以在定義一個類別時, 有幾個重點.
1.這個類別名稱是什麼?
2.它要做什麼事?
3.它有哪些成員(變數/函式)?

以書上的舉例來說, 我們寫了一個Sales_Book的類別(class), 將其定義在Sales_Book.h的標頭檔內.

//<*--------------------------  Sales_Book.h  --------------------------
#include <iostream>
#include <string>

class Sales_Book  //類別 名稱
{
public:  //公開的成員
        Sales_Book()  //類別建構式
        {
                //給予變數成員預設值
                m_strBookName = "Unknown Book";  
                m_iPrice = 0;
                m_iTotalSalesNum = 0;
        };

        void  setBookName( string sName){  m_strBookName = sName;  }  //設定書籍名稱
        void  setPrice( int iPrice){  m_iPrice = iPrice;  }     //設定單價
        void  addSalesNum( int iNum){  m_iTotalSalesNum += iNum;  }        //銷售書籍數量
        void  showSalesResult()                  //印出銷售結果
        {
                cout << "Book: "               << m_strBookName;
                cout << ", Price: $"           << m_iPrice;
                cout << ", SalesNum: $"  << m_iTotalSalesNum;
                cout << " , TotalSales: $" << m_iPrice * iTotalSalesNum << endl;
        }

private:  //私有的成員
        string m_strBookName;        //書名
        int m_iPrice;                         //單價
        int m_iTotalSalesNum;        //總銷售數量

};   //注意類別結尾 要有分號
//<*-------------------------------------------------------------------

從上面Sales_Book.h中定義的Sales_Book這個類別, 可以看到提供了4個公開方法(function),  與3個私有成員, 包含書名, 單價, 總銷售數 這些變數設為私有成員, 避免外界直接存取修改到. 而設定書籍名稱, 設定銷售單價, 設定銷售書量, 印出銷售情況. 這些為公開的方法, 用來存取私有成員, 或者執行某些功能(ex. 印出銷售情況).

然後在類別的建構式中將必要的成員變數賦予預設值;

另外在變數命名上, 最好遵照匈牙利命名法(匈牙利命名法是電腦程式設計中的一種變數命名規則), 簡單來說, 我們會在變數名稱前, 定義此變數的資料型別, 比如上述類別中的strBookName,  此為一個string, 變數名稱為bookName,   在匈牙利命名法下, 就會寫成strBookName.

//<*--------------------------  main  --------------------------
#include <Sales_Book.h>
void main()
{
        Sales_Book book1;
        book1.setBookName("helloWorld");
        book1.addSalesNum(2);
        book1.setPrice(50);
        book1.addSalesNum(3);
        book1.showSalesResult();

        system("pause");
}
//<*------------------------------------------------------------------

從main中可以看到, 建立了一個Sales_Book的類別 叫做book1. 然後操作了一些公開方法, 最後將銷售結果印出, 會得到以下畫面.
Book: helloWorld, Sales: $50 , TotalSales: $250
請按任意鍵繼續 . . .                                             

book1.setBookName("helloWorld");
這行操作為要求book1操作其類別提供的setBookName方法, 並代入"helloWorld"的字串, 當做書名.  而"點(dot)"  是實體操作成員的方法,  之後還會有 "箭頭(->)"  指標操作成員的方法.

若方法要求代入值(引數), 卻未給予, 在程式編譯時, 就會出錯. 但我們可以透過給予方法引數(arguments)預設值的方法, 省略輸入引數.

ex.將設定銷售金額做一些變更.
void  setPrice( int iPrice){  m_iPrice = iPrice;  }     //設定單價

修改為
void  setPrice( int iPrice, string tp = "NT")  //設定單價
{  
        strMoneyType = tp;  //貨幣類型
        m_iPrice = iPrice;
}

book1.setPrice(30);  //貨幣使用預設值(NT)
book1.setPrice(1, "US");  //貨幣使用美金(US)

像這樣, 我們在設定銷售金額的引數中, 增加第2引數為貨幣類別, 並給予預設值為新台幣(NT).
所以在使用上中, 若第2引數為給予, 就會使用預設值.

而最後印出的"請按任意鍵繼續" 這行字,來自於system("pause")這個方法, 若此主控台應用程式在未使用此方法,  則在程式執行的瞬間, 會來不及看到畫面就結束.

------------------------------------------------------------------------------------

1.6 C++ 程式

這邊會寫一個更完整寫複雜的程式, 先了解這隻小程式做了什麼事情為主.

而指標(ptr)是c/c++程式語言的精隨, 會在第4章提到,  map 這個容器的使用則在第10章會有較詳細的介紹,  Iterators迭代器是在第3章中做說明.

先簡單解釋typedef的用途, 顧名思義它指的是型別(type)def(define,定義), 也就是將現有的型別名稱, 給予另一個自定義的名稱, 可以看似縮寫. 例如我們可以將一個無號的整數 另外取名為 uINT,  之後使用時兩者的型別都是相同的, 可以讓程式碼看起來更簡潔明瞭.
ex. typedef unsigned int  uINT;


------------------------------------  程式內容  ----------------------------

#include <iostream>
#include <string>
#include <map>

#include <Sales_Book.h>

typedef map<string, Sales_Book> MAP_BOOK;

string g_strInput;

void bookOperating(MAP_BOOK::iterator &iter)  //書籍銷售操作
{
        Sales_Book *tmpBook = &iter->second;
        tmpBook->setBookName(g_strInput);

        while(true)
        {
                system ("cls");//清除畫面

                std::cout << "--- Book: \"" << iter->first << "\" ---" <<endl;
                std::cout << "Input operating..." << endl;
                std::cout << "[1]:add sales num" << endl;
                std::cout << "[2]:set sales price" << endl;
                std::cout << "[x]:return back" << endl;
                std::cin >> g_strInput;

                if(g_strInput.compare("x") == 0)
                {
                        break;
                }
                else if(g_strInput.compare("1") == 0)
                {
                        system ("cls");//清除畫面

                        std::cout << "--- Book: \"" << iter->first << "\" ---" <<endl;
                        std::cout << "Input add sales num..." << endl;
                        std::cin >> g_strInput;

                        tmpBook->addSalesNum(atoi(g_strInput.c_str()));
                }
                else if(strInput.compare("2") == 0)
                {
                        system ("cls");//清除畫面

                        std::cout << "--- Book: \"" << iter->first << "\" ---" <<endl;
                        std::cout << "Input set price..." << endl;
                        std::cin >> g_strInput;

                        tmpBook->setPrice(atoi(g_strInput.c_str()));
                }
        }
}

void _tmain()  //主程式
{
        MAP_BOOK mapStore;
        while(true)
        {
                system ("cls");//清除畫面
                std::cout << "Input Book Name to operating or [x] to Exit" << endl;
                std::cin >> g_strInput;

                if(strInput.compare("x") == 0) // 字串比較
                {
                        break;
                }
                else
                {
                        MAP_BOOK::iterator iter = mapStore.find(g_strInput);
                        if(iter == mapStore.end())
                        {
                                mapStore[g_strInput] = Sales_Book();
                                iter = mapStore.find(g_strInput);
                        }
                        bookOperating(iter); //書籍銷售操作
                }
        }
        system ("cls");//清除畫面

        for(MAP_BOOK::iterator iter = map_Store.begin(); iter != map_Store.end(); iter++)
        {  
                iter->second.showSalesResult();  //印出銷售資訊
        }
        system("pause");
}

------------------------------------  程式結束  ----------------------------

要了解這支程式做的事情, 一樣先從main()這個主函式開始看, 我們透過typedef將map<string, Sales_Book>定義為MAP_BOOK這樣的型別名稱, 並且產生了一個叫做mapStore的物件去做管理, 接著利用一個無窮迴圈while(true) 讀取cin的輸入值,決定要離開書籍銷售操作還是要繼續管理.

在這邊會先用到string類別底下的compare( string target)這個方法, 最基本的用法, 就是比較兩字串是否相同, string.compare(target) == 0 當結果為0則兩字串相同,  所以我們將輸入的值為"x"當做離開操作的判斷點,  輸入其它的字串, 則當做書名做查找與操作.

MAP_BOOK::iterator iter = mapStore.find(g_strInput);
在這邊使用了一個疊代器去幫助我們尋找資料, map的基本結構是由key跟value組成,  在例子中使用的key型別為string也就是書名, 必須為唯一, 而value則是資料本身放了Sales_Book類別的物件.

iterator 基本上可以把它想像成它是一個搜尋器, 它會從你提供給它的容器中, 去找尋你要的東西,
但尋找的順序你並不知道, 也不需要知道,  若iter == mapStore.end() 則表示已查找到最末位仍未找到指定的資料, 所以我們可以知道這本書尚未管理過,  就建一筆新的資料放入map容器中,  接著透過寫好的函式 bookOperating(iter) 對這本書做操作 .

在bookOperating這個函式中, 有用到" &"(references, 參考) 跟 "  * "(pointers, 指標), 一樣會在後面的章節中在做說明,  而bookOperating 中一樣有個無窮迴圈, 透過使用者輸入的g_strInput去做string.compare的字串比較做操作,

在main()主函式的最後, 我們離開了書籍操作的流程, 然後透過疊代器(iterator)將map內所有的書籍銷售結果印出.

而這支程式有個小瑕疵, 就是在atoi(g_strInput.c_str())  將字串轉成整數時, 若字串不是數字(ex. "hello") 則轉換結果會是0, 這個問題不難解決, 但不是本章重點就略過不提了.
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=1884879
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式設計|C++|C語言|c/c++

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★ponderzs 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[程式設計]C++ Pr... 後一篇:[程式設計]C++ Pr...

追蹤私訊切換新版閱覽

作品資料夾

Pixis買夠 母雞卡的觀眾們
https://home.gamer.com.tw/creationDetail.php?sn=6117253 買夠+母雞卡評論正式公開看更多我要大聲說昨天18:11


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】