青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

huaxiazhihuo

 

有理數類的一點思考

        在寫24點的程序時,要處理除法運算,不可避免地將引入小數點,但本人對于計算機中的浮點數實在沒有太多的好感。權衡再三,終于決定下定決心寫一個有理數類(以下簡稱為CRational),以解決除法運算這個問題。并且有理數這個類也是一個很好的C++練習題,可以用來練練手,以下將看到,它的實現雖然不難,但也不是很容易。有理數這個東西,屬于用戶自定義的數據類型,c++對此的支持,真可謂完美,既不失效率,又具備美觀。c++可以讓程序員做出來的自定義類型,其行為可以表現得好像是由語言層面實現的那個樣子,不管從語法、安全、效率上講。這一點,所有的語言都沒法和c++媲美。
        不管怎么說,CRational的需求相當明確,它一定有分子、分母、然后支持加減乘除這四種運算,于是,一口氣馬上就能寫下它的定義。
class CRational
{
public:
    CRational(
int nNumberator=0int nDenominator=1);
    
int Numberator()const return m_nNum;}
    
int Denominator()const return m_nDe;}

    CRational
& operator+=(const CRational& _Right);
    CRational
& operator-=(const CRational& _Right);
    CRational
& operator*=(const CRational& _Right);
    CRational
& operator/=(const CRational& _Right);
    CRational 
operator-()const    // 一元操作符,用以取反
    {
        
return CRational(-m_nNum, m_nDe);
    }


private:
    
int m_nNum;
    
int m_nDe;
}
;
         嗯,我承認代碼很匈牙利,中MFC的毒太深。毋庸置疑,分子分母只能獲取,不能設置,函數名中,沒有加Get的前綴,實在是因為代碼中它出現的地方太多了,所以能避免就盡量避免。沒有涉及資源分配,析構函數可以忽略,拷貝構造函數和賦值函數也不用寫了,編譯器將會提供缺省的實現,足以滿足我們的要求。貌似應該還要有一個返回求取小數值的操作,但是,這個類本身就是為了避免操作小數點,而且,計算小數點值可通過分子/分母的方法計算出來??傊珻Rational的終極接口就是這個樣子了。
        每個有理數都有一個標準的等價類,這個標準的有理數的分子、分母都不能再約分了,而且可以暫時假設符號位出現于分子中,分母則為正整數,比如說,3/6、-4/-8都等價于1/2,因此,在這個有理數類中,必須有一個標準化的操作,問題是,這個標準化函數是返回一個標準的有理數還是將有理數自身直接就標準化了。經過多方面的權衡,特別是為了兼容現有的整型變量(int, char, short等),整型變量可看成分母為1的有理數,我決定讓CRational一直處于標準化的狀態下,標準化的狀態由CRational自己來維持,客戶無須知道標準化的這個細節,因此,將void standarlize()聲明于其private的區域下,其實現如下:
void CRational::standarlize()
{
    
if (m_nDe < 0)
    
{
        m_nDe 
= -m_nDe;
        m_nNum 
= -m_nNum;
    }

    
int nGcd = gcd(abs(m_nNum), m_nDe);
    m_nNum 
/= nGcd;
    m_nDe 
/= nGcd;
}

        其中,毫無疑問,gcd為最大公約數,gcd沒有訪問CRational的任何非靜態(nonstatic)變量,因此,它必將不可成為CRational的非靜態函數。將gcd聲明為靜態函數,雖然可避免污染全局空間,但也使得外部代碼必須通過CRational來調用gcd函數,語法上不方便,而且,gcd本身就是一個獨立性很強而且又通用的函數,從意義上,它也不應該屬于CRational里面的東西。因此,gcd只能為全局函數。關于靜態函數和全局函數的選擇,鑒于“類的接口要盡可能的小”的原則和其他的一些問題,只要函數不訪問類的靜態變量,也不通過類的變量來訪問到其非靜態成員,它就應該是全局函數。全局函數是好東西,某些語言為了堅持所謂的純粹的面向對象,故意不支持,實在讓人用起來很不痛快,它的污染全局空間的問題,完全可以通過命名空間來解決??傊灰赡艿脑挘蛻搶⒑瘮德暶鳛槿趾瘮?,沒什么不好。好了,請看gcd的實現。
unsigned int gcd(unsigned int x, unsigned int y)   
{   
    unsigned  
int  nTimes=0;   
    
for (; 0 == (x&1&& 0 == (y&1); x>>=1, y>>=1)
        
++nTimes;

    
if (x < y)
        swap(x, y);

    
while (y > 0)
    
{
        
for (; 0 == (x & 1 );x >>= 1 )
            ;   

        
if (x < y)
            swap(x, y);
        x 
-= y;
        
if (x < y)
            swap(x, y);
    }

    
return x << nTimes;
}
 
        其算法源于《編程之美》,可看成是非遞歸的版本。咦,怎么會這么長,與日常所見的到似乎不太一樣,高效算法的代碼貌似都會很長,好比strlen。再仔細看,里面居然沒有取余的操作。嗯,它的算法核心,用移位和減法這兩種快速的運算來替代取模這種慢速運算。
有了standarlize()之后,CRational的幾個函數的實現如下所示:
CRational::CRational(int nNumberator, int nDenominator)
: m_nNum(nNumberator), m_nDe(nDenominator)
{
    assert(nDenominator 
!= 0);
    standarlize();
}


CRational
& CRational::operator+=(const CRational& _Right)
{
    m_nNum 
= m_nNum*_Right.m_nDe + _Right.m_nNum*m_nDe;
    m_nDe 
*= _Right.m_nDe;
    standarlize();
    
return *this;
}
……
        構造函數中,似乎應該檢查分母為0的情況,然后拋出異常。但是,這屬于契約使用的問題,用戶違背的契約,一切后果,必須自己承擔,我們的代碼無須對此負責。
        此外,就是各種+、-、*、/、==、輸出等各種全局運算符重載的操作了。得益于C++的缺省類型轉換,我們不用再做其他事情,就可以很好地讓我們的CRational很好地與融入到原有的各種整型世界中去。當然,為了效率起見,似乎有必要針對各種整型提供+、-、*、/的各種重載版本(complex就是這樣做的),但在此,確實沒有必要。缺省類型轉換有時雖然會帶來一些問題,但是,當確實需要它的時候,它就能發揮重大作用了。C++的各種特性就是這樣,你可以不用,它也不打擾你(你要故意或無意用錯,那也沒辦法),當真正需要到的時候,特性的威力就顯示出來了。很多人之所以愿意沉迷于C++,就在于它不剝奪程序員的任何一點選擇的權利。
ostream& operator << (ostream& outconst CRational& rat)
{
    cout 
<< rat.Numberator();
    
if (rat.Denominator() != 1)
        cout 
<<  "/" << rat.Denominator();
    
return out;
}


CRational 
operator+(const CRational& _Left, const CRational& _Right)
{
    CRational _Tmp(_Left);
    
return _Tmp += _Right;
}
……
        嗯,一再寫這些入門級的文章,本座也很自覺有失身價,也算是對網絡世界的一點回報吧。只要有一個人看了,能有所啟發,在下就心滿意足了,為免誤人子弟,也歡迎有人批評指正。

posted on 2012-06-04 11:23 華夏之火 閱讀(1417) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩在线一二三| 久久综合五月| 国产深夜精品| 久久国产精品99国产精| 久久精品亚洲热| 精品成人一区二区三区| 欧美成人一区二区三区在线观看 | 午夜精彩国产免费不卡不顿大片| 亚洲欧美另类久久久精品2019| 国产欧美精品一区aⅴ影院| 欧美综合国产| 亚洲国产日本| 性8sex亚洲区入口| 在线日本成人| 欧美午夜电影完整版| 午夜精品福利视频| 亚洲激情在线播放| 欧美影院成年免费版| 亚洲国产毛片完整版| 欧美性猛交视频| 久久精品30| 日韩一区二区精品视频| 久久躁狠狠躁夜夜爽| 一区二区免费在线播放| 国产一区二区三区自拍 | 国产精品高潮呻吟久久av无限| 午夜久久久久久| 亚洲韩国一区二区三区| 欧美一区二区三区婷婷月色 | 久久综合九色综合欧美狠狠| 99国产精品久久| 免费在线观看日韩欧美| 亚洲一区二区免费看| 91久久久久久久久久久久久| 久久久天天操| 精品69视频一区二区三区 | 午夜激情综合网| 久久在线视频| 欧美一区二区三区在线免费观看| 欧美va天堂va视频va在线| 亚洲欧美日韩高清| 在线观看日韩av电影| 国产精品综合色区在线观看| 欧美另类高清视频在线| 久久亚洲一区二区| 亚洲欧美日韩网| 亚洲图片在线观看| 亚洲精品久久视频| 亚洲成人在线视频播放 | 国产精品无人区| 欧美日韩国产综合新一区| 久久综合九色99| 欧美主播一区二区三区| 亚洲尤物在线视频观看| 99热免费精品在线观看| 亚洲黄色尤物视频| 免费美女久久99| 老司机午夜免费精品视频| 欧美一区二区三区久久精品茉莉花| 一本久久综合亚洲鲁鲁五月天| 亚洲国产成人av在线| 在线日本高清免费不卡| 影音欧美亚洲| 亚洲大胆av| 揄拍成人国产精品视频| 在线看片一区| 亚洲国产精品传媒在线观看| 亚洲国产精品高清久久久| **性色生活片久久毛片| 在线欧美福利| 亚洲激情社区| 亚洲精品免费在线观看| 日韩亚洲在线| 99香蕉国产精品偷在线观看| 正在播放欧美视频| 亚洲一区二区黄色| 午夜国产精品视频| 久久超碰97人人做人人爱| 久久精品国产99国产精品| 久久免费精品视频| 男女激情久久| 亚洲国产日韩欧美在线99| 亚洲激情电影中文字幕| 亚洲精品美女在线观看| 中文有码久久| 亚洲欧美日韩一区二区| 久久精品免视看| 免费一级欧美片在线播放| 免费一级欧美在线大片| 欧美日韩视频在线第一区| 国产精品久久久久久久久久久久久久 | 麻豆国产精品777777在线| 蜜桃久久精品一区二区| 99精品99| 国产欧美一区二区精品性色| 久久综合一区二区三区| 亚洲精品欧美极品| 欧美一区二区三区日韩视频| 樱桃国产成人精品视频| 欧美另类专区| 欧美综合国产精品久久丁香| 蜜桃久久精品一区二区| 欧美福利在线观看| 夜夜嗨av色一区二区不卡| 性娇小13――14欧美| 免费av成人在线| 国产精品免费网站在线观看| 国产综合精品| 99精品欧美一区二区三区综合在线| 亚洲欧美一区二区三区极速播放| 久久久噜噜噜| 亚洲免费电影在线| 久久精品国语| 国产精品国产一区二区| 亚洲第一精品影视| 午夜精品一区二区三区在线视 | 欧美mv日韩mv国产网站| 日韩视频在线观看国产| 久久久成人网| 国产精品大片| 亚洲国产精品视频一区| 午夜精品在线看| 亚洲国产成人久久综合| 欧美一区二区三区四区在线| 欧美激情综合亚洲一二区| 韩日精品视频一区| 亚洲女爱视频在线| 亚洲国产精品一区在线观看不卡 | 亚洲精品婷婷| 久久久久国产精品www| 9人人澡人人爽人人精品| 免费成人高清| 国产一区二区三区不卡在线观看 | 亚洲精品免费在线| 久久久欧美精品| 国产日韩成人精品| 亚洲午夜国产一区99re久久| 欧美国产日韩在线| 久久精品成人欧美大片古装| 国产精品网站一区| 亚洲性视频h| 亚洲日韩视频| 免费一区二区三区| 亚洲国产成人午夜在线一区| 久久大逼视频| 亚洲一区www| 国产精品国产三级国产普通话蜜臀| 最近中文字幕mv在线一区二区三区四区 | 久久视频在线免费观看| 亚洲一区激情| 国产精品三上| 篠田优中文在线播放第一区| 亚洲无亚洲人成网站77777 | 一本一本大道香蕉久在线精品| 能在线观看的日韩av| 久久免费高清视频| 毛片精品免费在线观看| 女同性一区二区三区人了人一| 欧美福利专区| av不卡在线| 欧美一区二区三区四区在线观看 | 亚洲综合色网站| 国产精品久久久久久久久久久久| 亚洲综合色在线| 亚洲一二区在线| 国产老肥熟一区二区三区| 欧美在线首页| 久久精品一区二区三区不卡| 在线电影欧美日韩一区二区私密| 裸体一区二区三区| 另类酷文…触手系列精品集v1小说| 亚洲电影天堂av| 亚洲国产1区| 欧美午夜精品久久久久久孕妇| 香蕉久久夜色精品| 欧美一级大片在线观看| 极品少妇一区二区三区| 欧美波霸影院| 欧美日韩国产一区二区三区地区| 亚洲综合三区| 久久精品理论片| 亚洲欧洲三级| 亚洲一区二区高清| 国内精品久久久久久 | 久久精品国产99| 亚洲日本在线观看| 制服丝袜激情欧洲亚洲| 国产偷国产偷亚洲高清97cao| 你懂的视频欧美| 欧美日韩精品二区第二页| 午夜综合激情| 久久亚洲精品中文字幕冲田杏梨| 亚洲最黄网站| 性欧美大战久久久久久久免费观看| 在线成人免费观看| 一本色道久久加勒比精品| 国产无一区二区| 亚洲欧洲精品一区二区| 国产免费成人在线视频| 亚洲第一在线|