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

第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一)

     “今天早上陽(yáng)光明媚啊,”老C在教研室門口深呼吸。

     “嗯,東花園顯得很漂亮啊……”小P應(yīng)聲道,兩人走過(guò)東花園,來(lái)到教研室,準(zhǔn)備妥當(dāng)后,坐在小P桌前。

     “好,我們今天先不評(píng)論你的代碼內(nèi)容,而是重新來(lái)寫這個(gè)代碼。”老C不好意思說(shuō)小P的代碼太爛以至于無(wú)法評(píng)審,所以決定另起爐灶,“然后我們拿新寫的這個(gè)版本與原來(lái)的版本做比較。”

     “也好。”小P同意。

     “這樣,我們兩個(gè)來(lái)一起寫這個(gè)代碼,這樣更快一些。”老C道。

     “好啊好啊。”

     兩人新建了一個(gè)名叫AppleGame的工程,然后老C添加了一個(gè)main.c的文件,“本來(lái)在這里應(yīng)當(dāng)使用配置管理工具的,但是因?yàn)楹?jiǎn)單起見(jiàn),我們就土 法煉鋼,采用拷貝的方法記錄版本吧。”老C一邊說(shuō)一邊在硬盤上建立了一個(gè)新目錄,起名為AppleGame_V0.01,“名字也隨便起了,不用使用 VBD等等復(fù)雜的規(guī)范,但是你千萬(wàn)注意這只是例子,以后千萬(wàn)不要隨便學(xué)啊。”老C解釋道,“至于什么配置管理和版本命名規(guī)范,我們以后再說(shuō)。”

     “槑……”小P有些暈,下意識(shí)的回答道。

     “我們的做法在一般面試、筆試的時(shí)候可千萬(wàn)不要用,完全是大炮打蚊子……在這里出現(xiàn)只是為了演示,然而如果你熟悉了這樣的開(kāi)發(fā)過(guò)程,再反過(guò)來(lái)使用更直接的方法應(yīng)付面試和筆試還是比較容易的,”老C又補(bǔ)充道,“大炮一響,黃金萬(wàn)兩……有時(shí)打打大炮也是有價(jià)值的,起碼熟悉了開(kāi)炮過(guò)程,這樣以后用大炮打黃金就駕輕就熟了……”

     “……”小P決定無(wú)視老C的自言自語(yǔ),心想人上了年紀(jì)就是有些羅嗦。

     “好,第一個(gè)任務(wù),寫一個(gè)main函數(shù)。”

     “這個(gè)簡(jiǎn)單。”小P應(yīng)道。在文件上敲下幾行代碼。


void main()
{
}

     “唉,這樣是有問(wèn)題滴……”老C說(shuō)到。

     “什么問(wèn)題?”

     “規(guī)范……”老C回答,“我們應(yīng)當(dāng)這樣寫。”老C開(kāi)始更改小P的代碼。


int main()

{

    return 0;

}

int main(int argc, char* argv[])

{

    return 0;

}


     “我們兩個(gè)中間選一個(gè),因?yàn)檫@個(gè)程序沒(méi)有命令支持,所以就第一個(gè)吧。”老C說(shuō)到,“這個(gè)是C99的新標(biāo)準(zhǔn),我們還是按照標(biāo)準(zhǔn)來(lái)吧。”老C補(bǔ)充道,“你可以 在學(xué)校圖書館查查《ISO/IEC 9899 : 1999》這個(gè)文檔,里面說(shuō)的很清楚。如果我們還使用原來(lái)的格式,可能在代碼兼容性上會(huì)出問(wèn)題,我們寫出的代碼就不能在所有編譯器上編譯通過(guò)……”

     “是么?這么復(fù)雜……”小P有些疑惑,“好吧,那么就這樣吧。”

     “那么現(xiàn)在說(shuō)說(shuō)你解決這道題的思路吧。”老C問(wèn)。

     “嗯,先設(shè)計(jì)一個(gè)循環(huán)隊(duì)列,每個(gè)隊(duì)列中的元素表示一個(gè)小朋友,1表示在對(duì)列中,0表示他不在對(duì)列中,然后開(kāi)始按照規(guī)則玩游戲,直到剩下最后一個(gè)小朋友,然后在隊(duì)列中找出這個(gè)剩下的元素,打印它的下標(biāo)……就是座位號(hào)碼啦……”

     “嗯,思路還算清晰,”老C評(píng)論,“我們姑且不論選擇循環(huán)隊(duì)列是否合適,就先按照這個(gè)思路來(lái)做,等到后面再評(píng)審更改吧。”然后他在文件中添加如下的語(yǔ)句。


int main()
{
    /* Initialize the queue. */

    /* Play the game, until the last one is found. */

    /* Search the last one's seat number.  */

    return 0;
}

     “好了,我們的第一版程序完成了。”老C拍拍手。
     “完了?”小P有些不敢相信。
     “是啊,”老C確定的說(shuō),“編程不只是寫代碼,代碼 != 程序!當(dāng)你開(kāi)始進(jìn)行思考的時(shí)候,就開(kāi)始進(jìn)行程序設(shè)計(jì)了,代碼不過(guò)是程序的表達(dá)方式。如果人類的語(yǔ)言可以在計(jì)算機(jī)上執(zhí)行,你剛才說(shuō)的話,就是代碼。是不是這樣?”
     “嗯,有些道理……”
     “編譯!好了,我們的第一版程序沒(méi)有什么問(wèn)題!”老C說(shuō)完,將main.c文件拷貝到AppleGame_V0.01文件夾下面,然后又新建了一個(gè)AppleGame_V0.02的文件夾。
     “下來(lái)我們需要一個(gè)調(diào)試宏,”老P說(shuō)到,“本來(lái)可以使用IDE為我們準(zhǔn)備的debug和release編譯選項(xiàng),但是這里我們先不用,為了明白背后的道理,我們完全自己打造一個(gè)先。關(guān)于debug和release,我們以后再說(shuō)。”
     “哦……”小P點(diǎn)點(diǎn)頭。
     老C在main.c的開(kāi)頭寫下如下代碼。

#include <stdio.h>

#define PRINT_DEBUG_INFO


#if defined(PRINT_DEBUG_INFO)
#define MY_DEBUG(str)            printf(str)
#define MY_DEBUG_1(str, par)    printf(str, par)
#else
#define MY_DEBUG(str)
#define MY_DEBUG_1(str, par)
#endif // PRINT_DEBUG_INFO

     “這幾個(gè)宏用于在調(diào)試的時(shí)候輸出一些中間信息,”老C解釋道,“如果我們想輸出調(diào)試信息,只需要#define PRINT_DEBUG_INFO就可以了,否則就注釋掉這個(gè)宏。這只是一些小技巧而已,沒(méi)有什么神秘的。”
     “是嗎?嗯,我看看……”小P琢磨著代碼。
     “下來(lái)進(jìn)行一些實(shí)質(zhì)性的,”老C接著說(shuō),“但是之前我們要了解一個(gè)規(guī)則,用問(wèn)題域的詞匯去編程,而不是解決域。”
     “槑,什么叫問(wèn)題域?解決域?”小P不解。
     “我寫你看好了。”老C說(shuō)道,然后在main.c文件中接下來(lái)的部分寫下如下內(nèi)容。

//////////////////////////////////////////////////////////////////////////
//
#define CHILDREN_NUM    20U

typedef int SEAT_NUM;
typedef enum tagEXIST_STATE { ABSENT, EXISTED } EXIST_STATE;
typedef struct tagCHILD
{
    SEAT_NUM       seatNum_;
    EXIST_STATE    existState_;
}CHILD;

#define QUEUE_LENGTH    CHILDREN_NUM
typedef CHILD QUEUE_CONTENT;
typedef struct tagQUEUE
{
    int size_;
    int index_;
    QUEUE_CONTENT queue_[QUEUE_LENGTH];
}QUEUE;

typedef struct tagAPPLE_GAME
{
    int currCountNum_;
    int childrenRemained_;
    QUEUE childrenQueue_;
}APPLE_GAME;

void InitAppleGame (APPLE_GAME* game);
int IsGameOver (APPLE_GAME* game);
void PlayGame (APPLE_GAME*  game);
int LastChildSeatNum (APPLE_GAME* game);



//////////////////////////////////////////////////////////////////////////
//
int main()
{
    APPLE_GAME theGame;
    int num;
    
    /* Initialize the game. */
    InitAppleGame(&theGame);

    /* Play the game, until the last child is found. */
    while (!IsGameOver(&theGame))
    {
        PlayGame(&theGame);
    }

    /* Search the last child's seat number.  */
    num = LastChildSeatNum(&theGame);

    printf("The last child's seat number is %d.\n", num);

    return 0;
}



//////////////////////////////////////////////////////////////////////////
//
void InitAppleGame(APPLE_GAME* game)
{
    MY_DEBUG("Init the apple game.\n");
}

int IsGameOver(APPLE_GAME* game)
{
    static int n = -1;
    
    MY_DEBUG("Only one child?\n");
    ++n;

    return n;
}

void PlayGame(APPLE_GAME* game)
{
    MY_DEBUG("Play game...\n");
}

int LastChildSeatNum(APPLE_GAME* game)
{
    int n = 1;
    MY_DEBUG("Searching last child's seat number\n");

    return n;
}

     “喏,就是這個(gè)意思,盡量用現(xiàn)實(shí)生活的語(yǔ)言對(duì)需要解決的問(wèn)題進(jìn)行描述,并將關(guān)系相近的變量用結(jié)構(gòu)體放在一起。”老C說(shuō),“然后將對(duì)這些名詞的操作寫成可以 用現(xiàn)實(shí)生活語(yǔ)言表達(dá)的函數(shù),并將結(jié)構(gòu)體作為函數(shù)的入口參數(shù)傳入函數(shù)中。”老C咽了一口唾沫,“咳咳,你再比較比較我們這兩版的注釋有什么變化?”
     “叫我看看……”小P開(kāi)始比較代碼,“哦,在這個(gè)版本你用 game 代替了 queue,用 child 代替了 one, 但是有什么實(shí)質(zhì)區(qū)別?”小P有些不解。
     “嗯,這個(gè)是一個(gè)用問(wèn)題域詞匯編程而不是解決域詞匯編程的例子,最大的優(yōu)點(diǎn)是意圖明確,容易理解,代碼可讀性強(qiáng);另外一個(gè)好處是相對(duì)穩(wěn)定——比如用 game 代替 queue——其一,評(píng)審代碼的人可能會(huì)不明白這個(gè)queue是做什么的,為什么和下面的初始化函數(shù)格格不入,從而造成你頻繁的回答大量的溝通性的問(wèn)題, 這將大大影響你生活的穩(wěn)定性和質(zhì)量;其二,如果我們將來(lái)——我是說(shuō)如果——使用list數(shù)據(jù)結(jié)構(gòu)來(lái)替換queue,避免了還要更改注釋的風(fēng)險(xiǎn)——代碼更新 而注釋陳舊,正是我們?cè)谶M(jìn)行項(xiàng)目開(kāi)發(fā)時(shí)一個(gè)特別特別特別的n次冪嚴(yán)重的問(wèn)題……而使用問(wèn)題域的詞匯,只要需求不發(fā)生變更,則我們就不需要修改什么而導(dǎo)致一 些……代碼人格上的分裂……”
     “哦,我再消化消化……”小P開(kāi)始看代碼,“下面這些函數(shù)的實(shí)現(xiàn)是什么意思?”
     “嗯,是測(cè)試,”老C說(shuō),“我們先不看具體函數(shù),先看看main()函數(shù)的主要結(jié)構(gòu)。”

int main()
{
    APPLE_GAME theGame;
    int num;
    
    /* Initialize the game. */
    InitAppleGame(&theGame);

    /* Play the game, until the last child is found. */
    while (!IsGameOver(&theGame))
    {
        PlayGame(&theGame);
    }

    /* Search the last child's seat number.  */
    num = LastChildSeatNum(&theGame);

    printf("The last child's seat number is %d.\n", num);

    return 0;
}

     “我們用實(shí)際的代碼完善剛才的注釋——?jiǎng)偛诺淖⑨屍鋵?shí)就是偽代碼的一部分——然后在框架函數(shù)中加入測(cè)試代碼,檢驗(yàn)我們的算法是否可行。”老C解釋道,“現(xiàn)在我們的算法一目了然,你看看是否是用問(wèn)題域的詞匯表達(dá)算法更清晰一些呢?比一些a,b,c之類,或者其類似的解決域內(nèi)的名字更好理解吧?”
     “哦,我再看看……”小P答道,“我要消化一下……”
     “嗯,”等小P抬起頭,老C補(bǔ)充道,“接下來(lái)一個(gè)重要的規(guī)則是先構(gòu)思如何測(cè)試,更先于編碼!”
     “稍等,”可能被新的信息灌輸?shù)挠行╊^暈,“這個(gè)是什么意思?”小P有些反應(yīng)不過(guò)來(lái)。
     “就是說(shuō),在編碼之前,我們要先想好如何測(cè)試我們即將要編寫出來(lái)的代碼。我們的代碼是否易于被測(cè)試,關(guān)系到我們代碼質(zhì)量的生命!”老C解釋道,“如果你一 開(kāi)始就考慮到這些問(wèn)題,并留有充分的余地,那么在做代碼自測(cè)和測(cè)試人員測(cè)試時(shí),會(huì)節(jié)省組織內(nèi)部大量的精力……算了,這些也是要靠編寫代碼的規(guī)模積累起來(lái)的 經(jīng)驗(yàn),你以后會(huì)慢慢的明白的。但是,無(wú)論如何你在編寫代碼的時(shí)候要保持足夠的意識(shí),要不斷提醒自己,我所寫的代碼易于測(cè)試嗎?”
     “好,我記住了。”小P說(shuō)。
     “呵呵,其實(shí)經(jīng)歷了一些挫折你才會(huì)真正明白——不過(guò)就算建立了概念也不錯(cuò)。”老C笑道,“現(xiàn)在你編譯并運(yùn)行一下代碼吧,觀察一下屏幕輸出的信息……”
     “好,”小P看了看文件底部的函數(shù)實(shí)現(xiàn),然后又看了看屏幕輸出信息,“哦,算法的脈絡(luò)這樣看就比較清楚了,果然我腦海中就是這么想的,不過(guò)現(xiàn)在更具體,也好追蹤了。”
     “O.K.!我們第二版的程序又有了!”
     “這么快?為什么?”小P不解道。
     “我們驗(yàn)證了算法,證實(shí)算法框架運(yùn)行與設(shè)計(jì)——就是你腦海中的步驟——是一致的,這樣當(dāng)然ok了!”老C一邊說(shuō)一邊將main.c拷貝到AppleGame_V0.02,并且又新建了一個(gè)AppleGame_V0.03目錄。

(請(qǐng)等待V0.03版本)

posted on 2009-01-23 03:36 Anderson 閱讀(1778) 評(píng)論(6)  編輯 收藏 引用

評(píng)論

# re: 第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一)[未登錄](méi) 2009-01-23 12:40 Len

看來(lái)更新的速度很快呀,又要結(jié)冊(cè)出版了  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一)[未登錄](méi) 2009-01-23 16:45 ypp

非常不錯(cuò),原創(chuàng)作品,極力支持  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一) 2009-01-23 17:22 winsty

現(xiàn)在用純C開(kāi)發(fā)的機(jī)會(huì)太少了吧
個(gè)人覺(jué)得某些規(guī)范在OOP下并不合適  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一) 2009-01-23 23:55 imnobody

真的很棒,i like  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一) 2009-02-04 00:24 zoujer

此章學(xué)到很多東西,期待更精彩的~~~~~  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第六碗 陳老C演迭代開(kāi)發(fā) 潘小P學(xué)漸進(jìn)編程(之一) 2009-02-04 09:03 tmhlcwp

之前在"C++博客"上有看到過(guò)同風(fēng)格的博文,但現(xiàn)在找不到了,有誰(shuí)知道的告訴下哈,謝謝了  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(6)

隨筆檔案(21)

文章檔案(1)

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            伊人精品成人久久综合软件| 久久成人国产精品| 欧美专区18| 亚洲欧美日韩成人高清在线一区| 老司机成人在线视频| 久久av红桃一区二区小说| 欧美日韩第一区日日骚| 亚洲高清免费在线| 伊人久久综合97精品| 午夜久久资源| 欧美一区二区三区四区视频| 国产精品国产三级国产专区53| 亚洲精品精选| 99国产精品久久| 欧美精品二区| 亚洲日本理论电影| 一区二区三区**美女毛片| 欧美电影在线观看完整版| 欧美刺激性大交免费视频| 悠悠资源网久久精品| 久久免费偷拍视频| 欧美成人情趣视频| 亚洲人成网站影音先锋播放| 美女主播精品视频一二三四| 欧美韩日精品| 亚洲美女精品久久| 欧美日韩和欧美的一区二区| 日韩香蕉视频| 性久久久久久久久久久久| 国产精品一区二区女厕厕| 亚洲尤物在线视频观看| 欧美专区日韩视频| 国内精品伊人久久久久av一坑| 久久福利毛片| 亚洲成人在线视频播放| 亚洲第一免费播放区| 女同一区二区| 99国产精品久久| 亚洲欧美综合| 黑人操亚洲美女惩罚| 免费欧美日韩国产三级电影| 亚洲品质自拍| 欧美一区二区三区视频免费播放| 国内精品久久久| 免费观看成人鲁鲁鲁鲁鲁视频| 91久久精品一区二区三区| 亚洲一区综合| 一区二区三区在线视频播放| 欧美xx视频| 亚洲一区二区欧美| 欧美bbbxxxxx| 亚洲一区日本| 伊人久久男人天堂| 欧美日韩高清区| 羞羞漫画18久久大片| 亚洲第一在线综合网站| 亚洲淫性视频| 亚洲成人在线网| 欧美日韩妖精视频| 久久精品夜色噜噜亚洲a∨| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲欧美日韩另类| 久久精品日韩| 夜久久久久久| 精品91免费| 欧美天堂亚洲电影院在线播放| 亚洲图片欧美午夜| 女同性一区二区三区人了人一 | 亚洲国产天堂久久综合网| 亚洲欧美日韩电影| 亚洲黄色高清| 国产欧美一区二区三区在线看蜜臀 | 久久疯狂做爰流白浆xx| 91久久精品国产91性色tv| 国产麻豆成人精品| 欧美日韩国产在线一区| 久久久精品国产99久久精品芒果| 亚洲片在线观看| 久久青草福利网站| 亚洲欧美日韩人成在线播放| 亚洲精品一区二区三区四区高清 | 亚洲第一在线综合在线| 久久精品免费看| 亚洲欧美日韩天堂| 亚洲精品专区| 亚洲国产精品成人综合色在线婷婷 | 欧美专区中文字幕| 亚洲精品之草原avav久久| 美日韩在线观看| 香蕉视频成人在线观看| 一区二区三区国产在线| 亚洲精品美女91| 亚洲国产色一区| 狠狠色伊人亚洲综合网站色| 国产深夜精品| 国产午夜久久久久| 国产性做久久久久久| 国产伦精品一区二区三区免费| 欧美极品在线视频| 欧美黄色成人网| 欧美va天堂在线| 欧美成人一区二区三区片免费| 久久久噜久噜久久综合| 久久亚洲国产成人| 麻豆精品精品国产自在97香蕉| 久久久国产精品一区| 久久精品一级爱片| 久久精品一二三| 麻豆九一精品爱看视频在线观看免费| 欧美一区国产在线| 久久精品亚洲一区二区| 久久综合国产精品| 免费观看成人www动漫视频| 麻豆国产精品va在线观看不卡| 美女黄网久久| 欧美精品播放| 欧美亚洲成人网| 国产精品一区二区在线观看网站| 国产精品毛片| 好男人免费精品视频| 亚洲国产视频a| 一区二区三区视频观看| 午夜精品免费在线| 久久久99爱| 亚洲第一在线视频| 99精品视频网| 性伦欧美刺激片在线观看| 久久久久久久性| 欧美激情一区二区久久久| 欧美日韩三级一区二区| 国产精品丝袜91| 樱桃成人精品视频在线播放| 日韩一级免费| 久久精品亚洲精品国产欧美kt∨| 麻豆国产精品777777在线| 亚洲激情视频| 亚洲欧美日韩精品在线| 久久综合电影| 国产精品久久久久999| 精品成人国产| 日韩一级在线| 久久天天躁狠狠躁夜夜av| 最新亚洲激情| 久久av在线| 欧美体内谢she精2性欧美| 好吊成人免视频| 亚洲一区二区三区777| 久久综合九色综合欧美狠狠| 99re66热这里只有精品3直播| 欧美一级专区免费大片| 欧美精品三级| 精品动漫一区| 亚洲综合不卡| 亚洲国产精品传媒在线观看 | 亚洲美女黄网| 欧美专区18| 国产精品高潮在线| 亚洲欧洲精品一区二区三区| 久久国产主播精品| 亚洲久色影视| 久久综合亚州| 国产亚洲精品bt天堂精选| 99re6这里只有精品视频在线观看| 久久精品99无色码中文字幕| 亚洲精品韩国| 狂野欧美一区| 黄色成人在线免费| 亚洲欧美中日韩| 日韩视频在线免费观看| 美女主播一区| **欧美日韩vr在线| 久久久精品一区| 亚洲欧美综合精品久久成人| 欧美日韩国产一区二区| 亚洲日本va午夜在线电影| 久久综合五月天婷婷伊人| 翔田千里一区二区| 国产精品久久久亚洲一区 | 久久久之久亚州精品露出| 亚洲在线观看视频网站| 国产精品v日韩精品v欧美精品网站| 日韩一本二本av| 亚洲黄色成人| 欧美电影资源| 亚洲欧洲综合另类| 亚洲夫妻自拍| 欧美成人在线免费观看| 亚洲精美视频| 亚洲高清激情| 欧美激情综合色综合啪啪| 亚洲精品一区二区三区福利| 欧美激情一区在线| 欧美成人一区在线| 99精品国产福利在线观看免费 | 午夜精品久久久久久久久| 国产精品入口尤物| 欧美在线观看网站| 性18欧美另类| 在线观看国产一区二区| 欧美sm视频|