• <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>

            VC++ C++ C# Algorithm

            C++博客 首頁 新隨筆 聯系 聚合 管理
              21 Posts :: 3 Stories :: 31 Comments :: 0 Trackbacks

            #

            #include? < cassert >
            #include?
            < cctype >
            #include?
            < cmath >
            #include?
            < cstddef >
            #include?
            < ostream >
            #include?
            < string >
            using ?std::allocator;
            using
            ?std::basic_string;
            using ?std:: string
            ;
            using
            ?std::char_traits;
            using
            ?std::ostream;
            using
            ?std::tolower;
            using
            ?std::tolower;
            class ?ichar_traints: public ?char_traits < char >

            {
            public
            :
            ???
            static ? int ?compare( const ? char ? * str1, const ? char ? *
            str2,size_t?n)
            ???
            {
            ???????
            for (size_t?i = 0 ;?i < n;?i ++
            )
            ???????
            {
            ???????????
            if (str1 == 0
            )
            ???????????????
            return ? - 1
            ;
            ???????????
            else ? if (str2 == 0
            )
            ???????????????
            return ? 1
            ;
            ???????????
            else ? if (toupper( * str1) < toupper( *
            str2))
            ???????????????
            return ? - 1
            ;
            ???????????
            else ? if (toupper( * str1) > toupper( *
            str2))
            ???????????????
            return ? 1
            ;
            ???????????assert(tolower(
            * str1) == tolower( *
            str2));
            ???????????str1
            ++
            ;
            ???????????str2
            ++
            ;

            ???????}

            ???????
            return ? 0 ;
            ???}

            }
            ;
            typedef?basic_string
            < char ,ichar_traints >
            ?istring;
            inline?ostream
            & ? operator << (ostream? & os,istring &
            ?str)
            {
            ????os
            << string
            (str.c_str());
            }

            int ?_tmain( int ?argc,?_TCHAR * ?argv[])
            {
            ????? //建立二個字符大小寫不同的串
            ????istring?s1
            = " qianweifeng "
            ;
            ????istring?s2
            = " QianweiFeng "
            ;
            ????std::cout
            <<
            s1.compare(s2);
            ????
            int
            ?pause;
            ????std::cin
            >>
            pause;
            ????
            return ? 0
            ;
            }
            摘自Thinking in C++
            posted @ 2006-12-26 15:20 大熊貓 閱讀(606) | 評論 (0)編輯 收藏

            今天偶爾看道了計算機體系結構中有關編譯器優化對提高Cache性能的影響一節,其中說道如果有數組,假設int a[5000][100],我們寫下如下代碼,則第一種效率高于第二種。原因是第二個循環以100*4字節的跨距訪問存儲器,勢必造成Cache失效次數增加,增大了訪存時間,而第一種循環順序地訪問一個Cache塊中地元素,減少了失效次數,提高了Cache性能。
            ?14-4(a)
            ?2
            for?(row=0;?row<5000;?row++)
            ?
            3{
            ?
            4??for?(?col=0;?col<100;?col++?)
            ?
            5??{
            ?
            6?????sum?=?sum?+?a[row][col];
            ?
            7??}

            ?
            8}

            ?
            94-4(b)
            10
            for?(col=0;?col<100;?col++?)
            11{
            12??for?(row=0;?row<5000;?row++)
            13??{
            14????sum?=?sum?+?a[row][col];
            15??}

            16}

            但我又想起了林銳博士的高質量C++編程手冊,其中寫到:在多重循環中,如果有可能,應當將最長的循環放在最內層,最短的循環放在最外層,以減少CPU 跨切循環層的次數。按照他的說法,上面二種寫法,后一種比較好,這不就跟體系結構書上說的矛盾了嗎?我不知道誰對誰錯,也不知道減少CPU 跨切循環層的次數是怎么具體影響效率,大家不知有何看法。
            posted @ 2006-12-17 23:14 大熊貓 閱讀(1394) | 評論 (4)編輯 收藏

            一個程序二個窗口

            ??1?#include?"stdafx.h"
            ??2?#include?<map>
            ??3?#include?"MultiWindow.h"
            ??4?#define?MAX_LOADSTRING?100
            ??5?using?namespace?std;
            ??6?//?全局變量:
            ??7?HINSTANCE?hInst;????????????????????????????????//?當前實例
            ??8?TCHAR?szTitle[MAX_LOADSTRING];????????????????????//?標題欄文本
            ??9?TCHAR?szWindowClass[MAX_LOADSTRING];????????????//?主窗口類名
            ?10?
            ?11?//?此代碼模塊中包含的函數的前向聲明:
            ?12?ATOM????????????????MyRegisterClass(HINSTANCE?hInstance);
            ?13?BOOL????????????????InitInstance(HINSTANCE,?int);
            ?14?LRESULT?CALLBACK????WndProc(HWND,?UINT,?WPARAM,?LPARAM);
            ?15?LRESULT?CALLBACK????About(HWND,?UINT,?WPARAM,?LPARAM);
            ?16?using?namespace?std;
            ?17?
            ?18?class?CMyWnd;
            ?19?typedef?map<HWND,CMyWnd*>?MAPHWND2WND;
            ?20?MAPHWND2WND??mapHWND2Wnd;
            ?21?
            ?22?CMyWnd*?tmpMyWnd?=?NULL;
            ?23?
            ?24?class?CMyWnd
            ?25?{
            ?26?public:
            ?27?????static?LRESULT?CALLBACK?WndProc(HWND?hWnd,UINT?nMessage,WPARAM?wParam,LPARAM?lParam);
            ?28?
            ?29?????LRESULT?WindowProc(UINT?nMessage,WPARAM?wParam,LPARAM?lParam);
            ?30?
            ?31?
            ?32?????CMyWnd()
            ?33?????{
            ?34?????????m_hWnd?=?NULL;
            ?35?????}
            ?36?????bool?Create()
            ?37?????{
            ?38?????????tmpMyWnd??=?this;
            ?39?
            ?40?????????m_hWnd??=?CreateWindow(szWindowClass,?szTitle,?WS_OVERLAPPEDWINDOW,
            ?41?????????????0,?0,?100,100,?NULL,?NULL,?hInst,?NULL);
            ?42?
            ?43?????????if?(!m_hWnd)
            ?44?????????????return?false;
            ?45?
            ?46?
            ?47?????????return?true;
            ?48?????}
            ?49?
            ?50?????BOOL?ShowWindow(int?nCmdShow)
            ?51?????{
            ?52?????????return?::ShowWindow(m_hWnd,nCmdShow);
            ?53?????}
            ?54?
            ?55?????BOOL?UpdataWindow()
            ?56?????{
            ?57?????????return?::UpdateWindow(m_hWnd);
            ?58?????}
            ?59?
            ?60?????virtual?void?OnPaint()
            ?61?????{
            ?62?????????PAINTSTRUCT?ps;
            ?63?????????HDC?hdc?=?BeginPaint(m_hWnd,?&ps);
            ?64?????????::TextOut(hdc,0,0,"123456",6);
            ?65?????????EndPaint(m_hWnd,?&ps);
            ?66?
            ?67?????}
            ?68?
            ?69?????HWND?m_hWnd;
            ?70?};
            ?71?
            ?72?class?CMyWnd2?:?public?CMyWnd
            ?73?{
            ?74?public:
            ?75?????virtual?void?OnPaint()
            ?76?????{
            ?77?????????PAINTSTRUCT?ps;
            ?78?????????HDC?hdc?=?BeginPaint(m_hWnd,?&ps);
            ?79?????????::TextOut(hdc,0,0,"6789",4);
            ?80?????????EndPaint(m_hWnd,?&ps);
            ?81?????}
            ?82?
            ?83?????string?m_str;
            ?84?};
            ?85?
            ?86?class?CMyWnd3?:?public?CMyWnd
            ?87?{
            ?88?public:
            ?89?????virtual?void?OnPaint()
            ?90?????{
            ?91?????????PAINTSTRUCT?ps;
            ?92?????????HDC?hdc?=?BeginPaint(m_hWnd,?&ps);
            ?93?????????::TextOut(hdc,0,0,"000000",6);
            ?94?????????EndPaint(m_hWnd,?&ps);
            ?95?????}
            ?96?
            ?97?????string?m_str;
            ?98?};
            ?99?
            100?CMyWnd*?findCMyWnd(HWND?hWnd)
            101?{
            102?????MAPHWND2WND::iterator?it?=?mapHWND2Wnd.find(hWnd);
            103?????if?(it?!=?mapHWND2Wnd.end())
            104?????{
            105?????????return?it->second;
            106?????}
            107?????else
            108?????{
            109?????????mapHWND2Wnd.insert(make_pair(hWnd,tmpMyWnd));
            110?
            111?????????tmpMyWnd->m_hWnd?=?hWnd;
            112?????????return?tmpMyWnd;
            113?????????//DebugBreak();
            114?????}
            115?????return?NULL;
            116?}
            117?
            118?LRESULT?CALLBACK?CMyWnd::WndProc(HWND?hWnd,UINT?nMessage,WPARAM?wParam,LPARAM?lParam)
            119?{
            120?????CMyWnd*?pWnd?=?findCMyWnd(hWnd);
            121?????if?(pWnd?!=?NULL)
            122?????{
            123?????????return?pWnd->WindowProc(?nMessage,?wParam,?lParam);
            124?????}
            125?????else
            126?????{
            127?????????DebugBreak();
            128?????}
            129?????return?0;
            130?}
            131?
            132?LRESULT?CMyWnd::WindowProc(UINT?nMessage,WPARAM?wParam,LPARAM?lParam)
            133?{
            134?????if?(nMessage?==?WM_PAINT)
            135?????{
            136?????????OnPaint();
            137?????????return?0;
            138?????}
            139?????return?::DefWindowProc(m_hWnd,?nMessage,?wParam,?lParam);;
            140?}
            141?
            142?
            143?int?APIENTRY?_tWinMain(HINSTANCE?hInstance,
            144??????????????????????HINSTANCE?hPrevInstance,
            145??????????????????????LPTSTR????lpCmdLine,
            146??????????????????????int???????nCmdShow)
            147?{
            148??????//?TODO:?在此放置代碼。
            149?????MSG?msg;
            150?????HACCEL?hAccelTable;
            151?
            152?????//?初始化全局字符串
            153?????LoadString(hInstance,?IDS_APP_TITLE,?szTitle,?MAX_LOADSTRING);
            154?????LoadString(hInstance,?IDC_MULTIWINDOW,?szWindowClass,?MAX_LOADSTRING);
            155?????MyRegisterClass(hInstance);
            156?
            157?????//?執行應用程序初始化:
            158?????if?(!InitInstance?(hInstance,?nCmdShow))?
            159?????{
            160?????????return?FALSE;
            161?????}
            162?
            163?????hAccelTable?=?LoadAccelerators(hInstance,?(LPCTSTR)IDC_MULTIWINDOW);
            164?
            165?????//?主消息循環:
            166?????while?(GetMessage(&msg,?NULL,?0,?0))?
            167?????{
            168?????????if?(!TranslateAccelerator(msg.hwnd,?hAccelTable,?&msg))?
            169?????????{
            170?????????????TranslateMessage(&msg);
            171?????????????DispatchMessage(&msg);
            172?????????}
            173?????}
            174?
            175?????return?(int)?msg.wParam;
            176?}
            177?
            178?
            179?
            180?//
            181?//??函數:?MyRegisterClass()
            182?//
            183?//??目的:?注冊窗口類。
            184?//
            185?//??注釋:?
            186?//
            187?//????僅當希望在已添加到?Windows?95?的
            188?//????“RegisterClassEx”函數之前此代碼與?Win32?系統兼容時,
            189?//????才需要此函數及其用法。調用此函數
            190?//????十分重要,這樣應用程序就可以獲得關聯的
            191?//???“格式正確的”小圖標。
            192?//
            193?ATOM?MyRegisterClass(HINSTANCE?hInstance)
            194?{
            195?????WNDCLASSEX?wcex;
            196?
            197?????wcex.cbSize?=?sizeof(WNDCLASSEX);?
            198?
            199?????wcex.style????????????=?CS_HREDRAW?|?CS_VREDRAW;
            200?????wcex.lpfnWndProc????=?CMyWnd::WndProc;
            201?????wcex.cbClsExtra????????=?0;
            202?????wcex.cbWndExtra????????=?0;
            203?????wcex.hInstance????????=?hInstance;
            204?????wcex.hIcon????????????=?LoadIcon(hInstance,?(LPCTSTR)IDI_MULTIWINDOW);
            205?????wcex.hCursor????????=?LoadCursor(NULL,?IDC_ARROW);
            206?????wcex.hbrBackground????=?(HBRUSH)(COLOR_WINDOW+1);
            207?????wcex.lpszMenuName????=?(LPCTSTR)IDC_MULTIWINDOW;
            208?????wcex.lpszClassName????=?szWindowClass;
            209?????wcex.hIconSm????????=?LoadIcon(wcex.hInstance,?(LPCTSTR)IDI_SMALL);
            210?
            211?????return?RegisterClassEx(&wcex);
            212?}
            213?
            214?//
            215?//???函數:?InitInstance(HANDLE,?int)
            216?//
            217?//???目的:?保存實例句柄并創建主窗口
            218?//
            219?//???注釋:?
            220?//
            221?//????????在此函數中,我們在全局變量中保存實例句柄并
            222?//????????創建和顯示主程序窗口。
            223?//
            224?BOOL?InitInstance(HINSTANCE?hInstance,?int?nCmdShow)
            225?{
            226???
            227?
            228????hInst?=?hInstance;?//?將實例句柄存儲在全局變量中
            229?
            230???
            231????CMyWnd*?pWnd?=?new?CMyWnd3();
            232????if(!pWnd->Create())
            233????????return?false;
            234????pWnd->ShowWindow(nCmdShow);
            235????pWnd->UpdataWindow();
            236?
            237????pWnd?=?new?CMyWnd2();
            238?
            239????if?(!pWnd->Create())
            240????????return?FALSE;
            241????pWnd->ShowWindow(nCmdShow);
            242????pWnd->UpdataWindow();
            243?
            244????return?TRUE;
            245?}
            posted @ 2006-12-15 20:56 大熊貓 閱讀(269) | 評論 (0)編輯 收藏

            #include? < stdio.h >
            #include?
            < string .h >
            int ?main( int ?argc,? char ? * argv[])? {
            ?
            int ?i? = ? 1
            ;
            ?
            char ?buf[ 4
            ];
            ? strcpy(buf,?
            " AAAA "
            );
            ? printf(
            " %d\n "
            ,?i);
            ?
            return ? 0
            ;
            }

            這是一道C++面試題目,問在x86平臺上為什么不能輸出想要的結果。
            char ? * mycopy( char ? * ?dst, char ? * ?src)
            {
            ????
            char ? * ?cp =
            dst;
            ????
            while ( * cp ++=* src ++
            );
            ????
            return
            ?dst;

            }
            以上面就是strcpy的實現,其中沒有對邊界進行檢查,可以看到該函數把'0\'也復制到目的串內存中去了,而目的串申請的空間不夠,就把'\0'復制到i的內存中去了,x86又是littleedian(低位字節地址小),原來i內存結構是0x01 00 00 00? 現在成0x 00 00 00 00,所以輸出0了。

            注:我在Dev-C++中確實是輸出0,在VS2003中出來一個運行時檢測錯誤,說buf附近棧崩了,但輸出還是1,不知道是不是VS沒做對'\0'的復制。
            posted @ 2006-12-13 15:41 大熊貓 閱讀(989) | 評論 (2)編輯 收藏

            一個在美國IBM工作過2年,在印度公司工作了4年的項目經理與我司資深軟件開發經理有這樣一段對話。
            印方經理問:"你們每月生產多少行代碼?"
            我方經理掂量了很久,謙虛地說:"人均代碼1萬多行吧,不到2萬行"。
            印方經理聽后,眼睛瞪得圓圓的:"喔!你們已經遠遠超過國際最高水平了。"
            我方經理惴惴不安地反問:"你們的呢?"
            印方經理很認真地回答:"我們公司目前的效率為每人每月300行。"
            這是一個真實的故事,我想換了其他人(包括以前的我)也會給出同樣的答案。
            為什么與軟件大國有這么大的差距呢?
            首先我們沒有生產率的概念。大多數人是這么算的,一天編400行-500行代碼還不是小菜一碟。一個月有30天,這樣每月1萬多行還不是輕松搞掂?
            殊不知,這個偉大的假設有兩個致命的錯誤:第一、沒有考慮需求分析、概要設計、詳細設計、單元測試、集成測試、系統測試的時間,也沒有考慮文檔的時間,甚至都有可能不知道有這些過程。
            這不是笑話,試問:我們有需求分析嗎?我們有單元測試嗎?我們有編程規范,但我們遵守了嗎?
            我們的代碼花花綠綠,風格千奇百怪――
            我們不是有"開發完了,還沒有設計文檔的經歷"嗎?
            我們不是有"要轉中試了,所有人才開始埋頭苦干寫文檔"的經歷嗎?
            我們不是有人在文檔中寫過,"該軟件對人畜沒有傷害"嗎?
            當然,我們更不可能想到有review的時間,根本考慮不到質量控制?
            我們最熟悉寫程序、系統測試、維護,其他的都是多余。這是典型的小公司游擊戰的做法,一個人搞一個小軟件,不需要任何流程,沒有任何質量體系,除了寫代碼,測試以外,什么都不需要,非常自由,自以為"牛得不行",這很easy,那很容易,"管理是羅嗦,流程是麻煩",但實際的結果是什么樣大家都知道。
            第二、一天能寫400-500行代碼,并不表示,你平均每個月能寫12000-15000行代碼,道理很簡單,一個人100米速度是12秒,并不表示他的3000米速度是6分鐘。我們不是機器人,寫軟件需要思考,寫嵌入式軟件尤其需要質量。
            印度工程師是人,中國軟件工程師也是人,我們的代碼生產率與水平能高到哪里去呢?正如大家都是凡人,你突然說你比子彈還快,一蹦3層樓高。
            這真是"無知"者"無畏"?
            其實我們的生產率很低,自己不覺得罷了,很多人并不相信我司的公開數字――月產代碼才120行?如果算一算所有的人力,所有階段的時間,我們就不會驚奇這個數據了。不信的話,我們拿一個產品算一算!或許我們的經理自己都不知道在這個產品投了多少人力。華為有職業化的軟件開發管理人才嗎?目前幾乎沒有,或許我們真的有月產2萬行的編程高手,也有很多自以為能寫2萬行代碼的"泡沫"高手,但我們沒有真正專業的軟件人才!
            目前我們公司的銷售情況很好,賣得很火。但這是項目開發成功了嗎?不是,可能更多的是市場的成功,以及產品預研立項人員的成功。生命周期內還要花那么多維護費用,這怎么能算成功?如果我們造飛機,我們可能自己都不敢坐。衡量項目成功的標準與要素是什么?很多人并不知道。印度發展最快的Infosys公司告訴我們:衡量項目成功的標準是"質量、成本與進度,達到這一目標的重要條件是"流程、技術、人"。
            我們做計劃時,只有進度,或許會考慮一下成本,但從來沒有考慮過質量。我們知道項目開發的質量活動是什么嗎?我們不知道;我們知道我們的質量目標嗎?我們也沒有;我們知道如何控制我們的質量嗎?我們沒有干過。
            所以我們才無所畏懼,百折不饒。但如果我們知道"折"一次要花100萬,我們還會無所畏懼地"百折"嗎?再回頭看看一些業界標準:某印度合作公司通過了CMM5級,聯合開發項目的生產率為每月400行。其中編碼階段,印度工程師每天可以寫200至900行代碼。
            在4個月的聯合開發過程中――
            在編碼速度上,我方優秀工程師與對方差不多,但別人教會了我們如何 保證代碼規范以及編程風格的一致;
            在閱讀協議標準方面,對方的速度是我們的4-5倍;
            在設計方面,對方有明顯的優勢;
            在質量控制,我們與他們就沒有辦法比較了;
            在預測方面,對方估計工作量為36人月,我方估計為22人月,實際數為35人月。
            通過對比,我的結論是:我們富有,因為我們有很多bug;我們快速,因為我們沒有質量體系。
            有些人還以為――
            會使用配置工具sourcesafe,就知道什么是配置管理;
            會畫CANTT圖/PERT圖,就知道項目計劃是怎么回事了;
            填一下表格就是管理;
            吃一頓飯就是溝通。
            沒有對質量整體的認識,不了解其為什么這么做,大家就根據自己的過去經驗"理解"、"推測"、"認識"別人,有這么巨大的認識差距就不足為怪了。
            目前,公司在質量體系方面的培訓與推行力度的不斷加強,印度所經驗的不斷推廣,在很多方面,如流程建設、預測、質量控制、度量系統,我們已經初步了解該怎么做。但我們還要不斷地宣傳、不停地松土,讓所有的人承認自己無知,只有這樣,我們才能由"無知"變為"有識"。
            "藝低人膽大",今后,我再也不想聽這種大膽的豪言壯語?我們每月代碼1萬行"!
            posted @ 2006-11-21 15:28 大熊貓 閱讀(235) | 評論 (0)編輯 收藏

            僅列出標題
            共5頁: 1 2 3 4 5 
            伊人久久大香线蕉AV一区二区| 伊人久久大香线蕉亚洲五月天| 国产精品综合久久第一页| 国产精品女同一区二区久久| 久久99国产精一区二区三区| 精品久久久一二三区| 少妇人妻综合久久中文字幕| 人人狠狠综合久久亚洲88| 久久影视综合亚洲| 久久国产免费观看精品| 欧美大战日韩91综合一区婷婷久久青草| 久久久久亚洲AV成人网人人网站| 色偷偷88888欧美精品久久久| 精品久久久久久中文字幕| 欧美性猛交xxxx免费看久久久| 香蕉aa三级久久毛片| 精产国品久久一二三产区区别 | 亚洲狠狠婷婷综合久久蜜芽| 国产精品久久午夜夜伦鲁鲁| 青青青青久久精品国产 | 色婷婷噜噜久久国产精品12p| 久久久久久久人妻无码中文字幕爆 | 久久亚洲精品无码VA大香大香| 色综合久久久久无码专区| 久久精品国产一区二区三区| 国产亚洲精品久久久久秋霞| 久久无码人妻精品一区二区三区| 无码精品久久久天天影视| 久久久午夜精品福利内容| 亚洲狠狠久久综合一区77777| 日韩精品久久久久久免费| 久久国内免费视频| 国产成人精品久久| 亚洲欧美成人综合久久久| 久久狠狠爱亚洲综合影院| 99精品久久精品一区二区| 久久播电影网| 国产精品久久久天天影视| 国产成年无码久久久免费| 久久综合狠狠色综合伊人| 色婷婷久久综合中文久久蜜桃av|