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

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

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

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

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

     “也好。”小P同意。

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

     “好啊好啊。”

     兩人新建了一個(gè)名叫AppleGame的工程,然后老C添加了一個(gè)main.c的文件,“本來(lái)在這里應(yīng)當(dāng)使用配置管理工具的,但是因?yàn)楹?jiǎn)單起見(jiàn),我們就土 法煉鋼,采用拷貝的方法記錄版本吧。”老C一邊說(shuō)一邊在硬盤(pán)上建立了一個(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ù),寫(xiě)一個(gè)main函數(shù)。”

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


void main()
{
}

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

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

     “規(guī)范……”老C回答,“我們應(yīng)當(dāng)這樣寫(xiě)。”老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é)校圖書(shū)館查查《ISO/IEC 9899 : 1999》這個(gè)文檔,里面說(shuō)的很清楚。如果我們還使用原來(lái)的格式,可能在代碼兼容性上會(huì)出問(wèn)題,我們寫(xiě)出的代碼就不能在所有編譯器上編譯通過(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ō),“編程不只是寫(xiě)代碼,代碼 != 程序!當(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)頭寫(xiě)下如下代碼。

#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不解。
     “我寫(xiě)你看好了。”老C說(shuō)道,然后在main.c文件中接下來(lái)的部分寫(xiě)下如下內(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ě)成可以 用現(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è)試我們即將要編寫(xiě)出來(lái)的代碼。我們的代碼是否易于被測(cè)試,關(guān)系到我們代碼質(zhì)量的生命!”老C解釋道,“如果你一 開(kāi)始就考慮到這些問(wèn)題,并留有充分的余地,那么在做代碼自測(cè)和測(cè)試人員測(cè)試時(shí),會(huì)節(jié)省組織內(nèi)部大量的精力……算了,這些也是要靠編寫(xiě)代碼的規(guī)模積累起來(lái)的 經(jīng)驗(yàn),你以后會(huì)慢慢的明白的。但是,無(wú)論如何你在編寫(xiě)代碼的時(shí)候要保持足夠的意識(shí),要不斷提醒自己,我所寫(xiě)的代碼易于測(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 閱讀(1776) 評(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   管理


<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

導(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>
            亚洲人成网站777色婷婷| 美国成人直播| 欧美中文在线字幕| 亚洲激情小视频| 欧美日韩一区自拍| 国产精品国产a级| 欧美日韩精品国产| 欧美电影免费| 欧美色欧美亚洲高清在线视频| 久久综合狠狠综合久久综合88| 欧美一区二区三区啪啪| 久久免费视频在线观看| 久久中文精品| 欧美高清视频一区二区| 国产精品成人va在线观看| 欧美日韩在线电影| 欧美揉bbbbb揉bbbbb| 国产一区白浆| 在线观看欧美日韩国产| 亚洲欧洲精品一区二区精品久久久| 亚洲精品美女免费| 这里只有精品电影| 亚洲欧美制服另类日韩| 毛片精品免费在线观看| 欧美国产日本韩| 91久久在线| 亚洲制服丝袜在线| 久久一区二区三区四区| 欧美精品免费看| 国内精品福利| 99香蕉国产精品偷在线观看| 亚洲视频观看| 欧美激情亚洲国产| 亚洲深夜福利在线| 久久精品成人| 国产精品www| 伊人夜夜躁av伊人久久| 99天天综合性| 欧美激情一区二区三区在线 | 亚洲最黄网站| 91久久精品一区二区别| 新67194成人永久网站| 狂野欧美性猛交xxxx巴西| 亚洲日本无吗高清不卡| 欧美在线观看一区| 欧美日韩亚洲综合一区| 亚洲欧美乱综合| 亚洲欧美日韩视频一区| 猛男gaygay欧美视频| 亚洲免费av观看| 久久精品一区四区| 国产麻豆91精品| 日韩亚洲精品视频| 久久久亚洲一区| 性欧美大战久久久久久久免费观看| 免费成人黄色av| 国产一区二区三区直播精品电影 | 亚洲欧美视频在线观看| 欧美成人中文字幕| 欧美日韩一区二区在线观看 | 欧美国产日韩免费| 国产综合久久久久影院| 午夜精品久久久久久久久久久久| 亚洲理伦在线| 欧美激情视频一区二区三区在线播放 | 日韩一级免费| 欧美日韩亚洲成人| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美日本在线一区| 一区二区三区你懂的| 亚洲黄色尤物视频| 另类春色校园亚洲| 国内精品久久久久久| 免费美女久久99| 久久久综合网站| 激情久久综合| 亚洲国产欧美国产综合一区| 免费一级欧美片在线观看| 在线看不卡av| 午夜精品偷拍| 性色av一区二区三区| 国产欧美欧洲在线观看| 欧美一区二区在线看| 久久av一区二区| 亚洲第一精品久久忘忧草社区| 久久亚洲图片| 中文久久精品| 国产模特精品视频久久久久| 性欧美长视频| 久久久国产一区二区| 亚洲精品国产精品乱码不99按摩| 最新国产精品拍自在线播放| 免费日韩av| 免费久久99精品国产| 亚洲在线第一页| 亚洲欧美日韩一区二区三区在线| 国产精品日韩精品欧美精品| 亚洲精品欧美精品| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩亚洲高清一区二区| 性欧美18~19sex高清播放| 亚洲性视频网址| 国产一区视频观看| 亚洲一区二区在线免费观看视频 | 国产精品美女一区二区| 欧美制服丝袜| 午夜精品一区二区三区四区 | 国产伦理一区| 欧美福利在线观看| 欧美日韩一区二区在线播放| 亚洲精品在线看| 亚洲在线国产日韩欧美| 亚洲国产精品精华液2区45| 亚洲免费观看高清完整版在线观看熊| 欧美成人免费全部| 久久成人羞羞网站| 欧美国产一区在线| 久久久精品性| 国产精品网站在线观看| 欧美大片网址| 国产精品一区亚洲| 一区二区三区三区在线| 1000部国产精品成人观看 | 香港久久久电影| 一本一道久久综合狠狠老精东影业 | 99精品国产99久久久久久福利| 亚洲作爱视频| 亚洲激情另类| 亚洲精品中文字幕在线| 亚洲日本激情| 久久精品国产69国产精品亚洲| 一本色道久久| 欧美日韩视频在线一区二区观看视频 | 欧美成年人网站| 久久视频在线看| 国产精品任我爽爆在线播放| 亚洲人体1000| 欧美成人精品一区二区| 久久综合婷婷| 中文一区字幕| 亚洲精品乱码久久久久久| 性色av一区二区三区| 亚洲日本精品国产第一区| 免费的成人av| 久久中文欧美| 国产亚洲一二三区| 亚洲精品久久久一区二区三区| 91久久夜色精品国产网站| 久久久综合网站| 欧美国产激情二区三区| 亚洲黄页一区| 欧美人与性动交a欧美精品| 另类人畜视频在线| 国产色综合网| 欧美一区二区三区日韩| 欧美在线日韩精品| 精品成人一区二区| 美女露胸一区二区三区| 91久久久久久| 日韩视频欧美视频| 国产精品欧美一区二区三区奶水| aa级大片欧美三级| 久久成人免费视频| 亚洲国产日韩在线| 欧美日韩亚洲国产精品| 午夜亚洲伦理| 亚洲国产高清在线| 欧美一区二区福利在线| 亚洲成人中文| 欧美日韩在线一区| 久久精品国产亚洲a| 亚洲国产成人av| 午夜精品久久久久久久久久久久久| 国内精品久久久久久久果冻传媒| 男女激情视频一区| 亚洲一区亚洲| 亚洲韩国日本中文字幕| 欧美在线国产| 99国产精品久久久久久久久久| 国产精品一级二级三级| 欧美电影免费观看大全| 欧美一区二区三区免费观看| 亚洲精品亚洲人成人网| 老牛影视一区二区三区| 午夜精品久久久久| 亚洲精品你懂的| 国产亚洲欧美日韩精品| 欧美人成在线视频| 另类av导航| 久久精品理论片| 亚洲专区免费| 夜夜嗨av一区二区三区中文字幕 | 亚洲另类自拍| 久久噜噜噜精品国产亚洲综合| 99伊人成综合| 亚洲欧洲精品一区二区| 一区二区三区在线高清| 国产日本欧美一区二区三区| 狠狠干狠狠久久| 亚洲欧美一区二区三区极速播放|