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

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

     “啊……”小P舒服的伸著懶腰,“你知道什么是九三學(xué)社么?”
     “?”
     “就是上午睡到9點(diǎn),下午睡到3點(diǎn)……舒服……”小P用手拍拍嘴,打了一個(gè)哈欠。
     “呵呵,睡覺(jué)睡到自然醒,真是我們學(xué)生一大福利啊……”老C感嘆,“好了,閑話少說(shuō),你去開機(jī)……我去接水……”
     “哦……”
     兩人折騰一番后,終于坐在小P桌前。
     “我們現(xiàn)在根據(jù)程序的模塊將它分成幾部分,我來(lái)寫,你看看。”老C開始在電腦鍵盤上扣扣扣扣的敲打起來(lái),“我們的程序大體上分為三個(gè)主要部分,一個(gè)是 main()函數(shù),這個(gè)是程序的進(jìn)入點(diǎn)和主框架結(jié)構(gòu),負(fù)責(zé)算法部分;一個(gè)是我們的MY_DEBUG調(diào)試宏;再一個(gè)是我們的apple game游戲,提供接口供算法部分調(diào)用。根據(jù)這樣的劃分,每一個(gè)部分的規(guī)模和所擔(dān)負(fù)的責(zé)任就很清楚了。”老C一邊說(shuō),一邊在工程中添加了新的文件,并改寫 了main.c文件的內(nèi)容。

mydebug.h:

#if !defined(MY_DEBUG_H_)
#define MY_DEBUG_H_

#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 */


#endif /* MY_DEBUG_H_ */

------------------------------------------------------(華麗的分割線)

applegame.h:

#if !defined(APPLE_GAME_H_)
#define APPLE_GAME_H_

#define CHILDREN_NUM    20U

typedef int SEAT_NUM;
typedef enum tagEXISTE_STATE { ABSENT, EXISTED } EXISTE_STATE;
typedef struct tagCHILD
{
    SEAT_NUM        seatNum_;
    EXISTE_STATE    existeState_;
}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;

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

#endif /* APPLE_GAME_H_ */

------------------------------------------------------(華麗的分割線)

applegame.c:

#include "applegame.h"
#include "mydebug.h"

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;
}


------------------------------------------------------(華麗的分割線)

main.c:

#include <stdio.h>
#include "applegame.h"

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;
}

     “編譯……運(yùn)行……OK,我們的V0.03版本成功了……”老C道,他依照以前的辦法將各個(gè)新文件拷貝到AppleGame_V0.03目錄下,又新建了AppleGame_V0.04。 “我們的原則是盡量少的包含依賴關(guān)系。每個(gè)文件都包含且僅包含它們需要的頭文件,既不能多,也不能少。比如main.c,就算我知道 applegame.h中包含了stdio.h,但是并沒(méi)有明顯的線索和強(qiáng)烈的暗示告訴我applegame.h中一定包含stdio.h,所以我還是要 包含stdio.h,這樣就減小了main.c對(duì)applegame.h的一些依賴……如果哪天我一高興,決定不再在applegame.h中包含 stdio.h,這樣就可以少修改一些地方……偷懶,是程序員的美德……”
     “嗯……”無(wú)視了老C的自吹自擂,小P看了幾遍工程中的文件,“嗯,這樣的確比寫在一起清晰很多。然后呢?”
     “然后我們就繼續(xù)細(xì)化我們的代碼,你來(lái)接著寫啊。注意編碼的規(guī)范性……”老C答道。
     “好!”小P開始挽袖子。
     “不過(guò)在此之前我先教你一個(gè)乖。”老C將applegame.c文件打開,“你按一下Ctrl+Tab試試。”
     “唔……哦?文本跳轉(zhuǎn)到了applegame.h?這個(gè)……好東東啊。”小P試了試。
     “呵呵,你可以修改這個(gè)快捷鍵,我記得好像叫toggle head & source,因?yàn)槟承喝の段腋某闪薃lt+O,哈哈……”
     “囧……”忽略過(guò)老C的傻笑,小P開始完善applegame.c文件。

     經(jīng)過(guò)一陣忙碌,小P修改了applegame.h和applegame.c文件。

applegame.h:

#if !defined(APPLE_GAME_H_)
#define APPLE_GAME_H_

#define CHILDREN_NUM    20U
#define KICK_OUT_NUM    7U

typedef int SEAT_NUM;
typedef enum tagEXISTE_STATE { ABSENT, EXISTED } EXISTE_STATE;
typedef struct tagCHILD
{
    SEAT_NUM        seatNum_;
    EXISTE_STATE    existeState_;
}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 kickOutNum_;
    int childrenRemained_;
    QUEUE childrenQueue_;
}APPLE_GAME;

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

#endif /* APPLE_GAME_H_ */

------------------------------------------------------(華麗的分割線)

applegame.c:

#include "applegame.h"
#include "mydebug.h"

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

    game->currCountNum_      = 0;
    game->kickOutNum_        = KICK_OUT_NUM;
    game->childrenRemained_  = CHILDREN_NUM;

    game->childrenQueue_.size_  = CHILDREN_NUM;
    game->childrenQueue_.index_ = 0;
    for (i = 0; i < game->childrenQueue_.size_; ++i)
    {
        game->childrenQueue_.queue_[i].seatNum_ = i + 1;
        game->childrenQueue_.queue_[i].existeState_ = EXISTED;
    }
}

int IsGameOver(APPLE_GAME* game)
{
    MY_DEBUG_1("The children remained %d\n", game->childrenRemained_);

    return (1 == game->childrenRemained_);
}

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

    /* If the current child is existed in the queue, count on, then check if she will be kicked out. */
    if (EXISTED == game->childrenQueue_.queue_[game->childrenQueue_.index_].existeState_)
    {
        /* Count on. */
        game->currCountNum_++;

        /* If the child counts kicked out number, then she is kicked out. */
        if (game->currCountNum_ == game->kickOutNum_)
        {
            game->childrenQueue_.queue_[game->childrenQueue_.index_].existeState_ = ABSENT;
            game->childrenRemained_--;
            game->currCountNum_ = 0;

            MY_DEBUG_1("The child kicked out is %d\n", game->childrenQueue_.queue_[game->childrenQueue_.index_].seatNum_);
        }
    }
    
    game->childrenQueue_.index_++;
    game->childrenQueue_.index_ %= game->childrenQueue_.size_;
}

int LastChildSeatNum(APPLE_GAME* game)
{
    int i;

    MY_DEBUG("Searching last child's seat number\n");

    for (i = 0; i < game->childrenQueue_.size_; ++i)
    {
        if (EXISTED == game->childrenQueue_.queue_[i].existeState_)
        {
            break;
        }
    }

    return game->childrenQueue_.queue_[i].seatNum_;        
}

   “呵呵,代碼寫得還可以,但是程序執(zhí)行結(jié)果到底對(duì)不對(duì)呢?”老C看著代碼問(wèn)道,“你可以在applegame.h中將CHILDREN_NUM的值改為1U試試看邊界的情況,然后將CHILDREN_NUM的值改為3U,KICK_OUT_NUM的值改為2U,試試看調(diào)試輸出的內(nèi)容是否正確。”
     “好啊。”小P試著更改了幾下,看了看調(diào)試輸出內(nèi)容和自己在紙上畫出的內(nèi)容,“好像沒(méi)有什么不對(duì),我又用5個(gè)小朋友和數(shù)到3被提出試了試,結(jié)果也是正確的。”
     “OK,這么說(shuō)我們的代碼經(jīng)過(guò)你的測(cè)試是正確的啦,我們終于有了自己的第一個(gè)正式版本啦。”說(shuō)完老C將所有文件拷貝到AppleGame_V0.04,然后又將AppleGame_V0.04重新命名為AppleGame_
V1.00,“呵呵,這下你可以對(duì)比一下我們的V1.00版本和你原來(lái)的版本。”
     “唔,現(xiàn)在的版本代碼變得多得多,但是……看起來(lái)更容易明白,而且比較容易調(diào)試和測(cè)試。”小P分析道。
     “沒(méi)錯(cuò)!代碼顯得多是因?yàn)樵黾恿撕瘮?shù),因?yàn)閱?wèn)題的規(guī)模很小,所有我們這樣做有些麻煩——但這是練習(xí)——等我們熟悉了正規(guī)的做法再去進(jìn)行直截了當(dāng)?shù)淖龇ò桑? 這樣基本功更扎實(shí)一些。”老C點(diǎn)頭,“我們?cè)賮?lái)優(yōu)化一下applegame.c文件吧,因?yàn)槔锩娴慕Y(jié)構(gòu)體點(diǎn)點(diǎn)點(diǎn)的看著實(shí)在是煩人。”他又建立了 AppleGame_V1.01目錄。
     “唔,看著的確挺煩人的,那么你打算怎么優(yōu)化么?”小P問(wèn)。
     “呵呵,把煩人的操作放到函數(shù)后面,這樣程序的結(jié)構(gòu)和意圖會(huì)更加明顯。”老C回答。
     “怎么做呢?”
     “呵呵,您瞧好咧……”老C又開始敲鍵盤,優(yōu)化applegame.c文件。

applegame.c:

#include "applegame.h"
#include "mydebug.h"

static void QueInitQueue (QUEUE* childQueue);
static int QueIsChildExisted (QUEUE* childQueue);
static void QueKickOutChild (QUEUE* childQueue);
static void QueMoveToNextChild (QUEUE* childQueue);
static int QueFindRemainedChild (QUEUE* childQueue);

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

    game->currCountNum_        = 0;
    game->kickOutNum_        = KICK_OUT_NUM;
    game->childrenRemained_    = CHILDREN_NUM;

    QueInitQueue(&(game->childrenQueue_));
}


int IsGameOver(APPLE_GAME* game)
{
    MY_DEBUG_1("The children remained %d\n", game->childrenRemained_);

    return (1 == game->childrenRemained_);
}

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

    /* If the current child is existed in the queue, count on, then check if she will be kicked out. */
    if (QueIsChildExisted(&(game->childrenQueue_)))
    {
        /* Count on. */
        game->currCountNum_++;

        /* If the child counts kicked out number, then she is kicked out. */
        if (game->currCountNum_ == game->kickOutNum_)
        {
            QueKickOutChild(&(game->childrenQueue_));
            game->childrenRemained_--;
            game->currCountNum_ = 0;

            MY_DEBUG_1("The child kicked out is %d\n", game->childrenQueue_.queue_[game->childrenQueue_.index_].seatNum_);
        }
    }
    
    QueMoveToNextChild(&(game->childrenQueue_));
}

int LastChildSeatNum(APPLE_GAME* game)
{
    int seatNum;

    MY_DEBUG("Searching last child's seat number\n");

    seatNum = QueFindRemainedChild(&(game->childrenQueue_));

    return seatNum;
}


/************************************************************************/
/* Local functions                                                      */
/************************************************************************/
static void QueInitQueue(QUEUE* childQueue)
{
    int i;

    childQueue->size_    = CHILDREN_NUM;
    childQueue->index_ = 0;
    for (i = 0; i < childQueue->size_; ++i)
    {
        childQueue->queue_[i].seatNum_ = i + 1;
        childQueue->queue_[i].existeState_ = EXISTED;
    }
}

static int QueIsChildExisted(QUEUE* childQueue)
{
    return (EXISTED == childQueue->queue_[childQueue->index_].existeState_);
}

static void QueKickOutChild(QUEUE* gameQueue)
{
    gameQueue->queue_[gameQueue->index_].existeState_ = ABSENT;
}

static void QueMoveToNextChild(QUEUE* gameQueue)
{
    gameQueue->index_++;
    gameQueue->index_ %= gameQueue->size_;
}

static int QueFindRemainedChild(QUEUE* gameQueue)
{
    int i;
    
    for (i = 0; i < gameQueue->size_; ++i)
    {
        if (EXISTED == gameQueue->queue_[i].existeState_)
        {
            break;
        }
    }

    return gameQueue->queue_[i].seatNum_;    
}

     “編譯……運(yùn)行……ok,我們的V1.01版本也好了。”老C又將所有文件拷貝到AppleGame_V1.01目錄下。
     “等等,”小P問(wèn)道,“我看不出有什么實(shí)質(zhì)性的變化啊,無(wú)非就是用一些static函數(shù)替換了原來(lái)的內(nèi)容,換湯不換藥啊。”
     “呵呵,你看不出區(qū)別是因?yàn)槟闶煜?,如果你第一次看代碼,你會(huì)覺(jué)得是在代碼中看到
QueMoveToNextChild(&(game->childrenQueue_))感 覺(jué)好些,還是看到一堆鬼畫符似的結(jié)構(gòu)體點(diǎn)點(diǎn)點(diǎn)的感覺(jué)好?”老C解釋道,“意圖,這里強(qiáng)調(diào)意圖,因?yàn)槭褂昧撕瘮?shù)你一眼就可以看出程序執(zhí)行的意圖,而如果是一 堆代碼的話,你還要反應(yīng)半天;如果明白了意圖,再去看代碼,感覺(jué)會(huì)好很多——而且你可以根據(jù)代碼意圖提出更好的實(shí)現(xiàn)方法;同時(shí)這樣也減少了代碼中注釋的工 作量——一般在維護(hù)代碼的時(shí)候人們很少去修改注釋的;最后,如果你的具體實(shí)現(xiàn)需要被維護(hù),這樣也給維護(hù)代碼的人提供了線索,無(wú)需他在源代碼程序中找來(lái)找 去……如果不小心還有可能將你的代碼進(jìn)行錯(cuò)誤的修改……”他找到水杯,喝了一大口,“總之不要害怕小而短的函數(shù),有時(shí)它們對(duì)閱讀代碼的人來(lái)說(shuō)是很好的伙 伴……”
     “哦,有些道理。那么會(huì)不會(huì)影響程序執(zhí)行的效率呢?”
     “……會(huì)有一些,不過(guò)你要理解20-80原則……”
     “什么是20-80原則?”小P問(wèn)。
     “就是說(shuō)影響程序執(zhí)行效率的代碼只占代碼總量的20%,我們?nèi)绻岣咝剩枰?0%的經(jīng)歷投放到這20%的代碼上——一般來(lái)說(shuō)都是一些算法、方案上 的問(wèn)題。換句話說(shuō),除非需要,否則不要進(jìn)行效率優(yōu)化——可維護(hù)性要高于效率——再說(shuō)我們這樣做對(duì)效率的影響是微乎其微的。”
     “哦,”小P點(diǎn)點(diǎn)頭,“為什么你的static函數(shù)命名這樣奇特?”
     “唔……習(xí)慣。因?yàn)檫@些函數(shù)作用于Queue這個(gè)模塊,所以我使用Que作為前綴,表示函數(shù)屬于Queue模塊,然后采用動(dòng)賓結(jié)構(gòu)進(jìn)行命名……習(xí)慣、習(xí)慣而已。”老C笑道。
     “模塊?什么是模塊?”小P追問(wèn)。
     “呵呵,這個(gè)是我們下來(lái)需要討論的問(wèn)題,和我們的V1.02版本有些關(guān)系。”老C說(shuō)完又新建了一個(gè)AppleGame_V1.02的目錄。
     兩人抬頭看看天色,已經(jīng)接近黃昏了,于是老C決定暫停一下,“這個(gè)……我們還是先去喂腦袋吧……人是鐵……”
     “呵呵,好吧,我知道一個(gè)東北菜館還不錯(cuò)……我請(qǐng),我請(qǐng)……”小P拍拍口袋。
     “呵呵,總讓你請(qǐng)多不好意思,我請(qǐng),我請(qǐng)……”兩人一邊推讓,一邊向門口走去。

(V1.02還在后面喔)

posted on 2009-02-04 22:10 Anderson 閱讀(2065) 評(píng)論(9)  編輯 收藏 引用

評(píng)論

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

羨慕小P,可以有朋友交流,促進(jìn),不像我們自學(xué)的這種,恩,慢慢琢磨  回復(fù)  更多評(píng)論   

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

繼續(xù)力挺老C  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第八碗 陳老C演迭代開發(fā) 潘小P學(xué)漸進(jìn)編程(之三) 2009-02-05 11:18 yzb

更著小P一起,
和老C加油.
挺啊,期待...  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第八碗 陳老C演迭代開發(fā) 潘小P學(xué)漸進(jìn)編程(之三)[未登錄](méi) 2009-02-06 09:39 Sunny

不錯(cuò).加油  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第八碗 陳老C演迭代開發(fā) 潘小P學(xué)漸進(jìn)編程(之三)[未登錄](méi) 2009-02-06 22:16 Steven

不錯(cuò),期待連載!  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第八碗 陳老C演迭代開發(fā) 潘小P學(xué)漸進(jìn)編程(之三) 2009-02-16 19:11 supersand

兄弟,寫的不錯(cuò),繼續(xù)呀,等著呢。。。  回復(fù)  更多評(píng)論   

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

好久沒(méi)出新的了,等的急啊 。。。  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第八碗 陳老C演迭代開發(fā) 潘小P學(xué)漸進(jìn)編程(之三) 2009-03-01 02:06 寶寶阿涕

0.03版的main中怎么是include的applegame.h啊

好像應(yīng)該是applegame.c才對(duì)樣

這個(gè)不錯(cuò)哦,感覺(jué)復(fù)習(xí)一下C,大一只學(xué)了一點(diǎn)點(diǎn),都忘了

喜歡老C的教學(xué)方式啊  回復(fù)  更多評(píng)論   

# re: 第一桶 從C到C++ 第八碗 陳老C演迭代開發(fā) 潘小P學(xué)漸進(jìn)編程(之三) 2009-04-17 15:55 ty

受教了,對(duì)博主的景仰之情如黃河之水滔滔不絕,希望博主繼續(xù)!  回復(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>
            国产精品一级| 亚洲素人在线| 99亚洲精品| 欧美日韩一区在线观看视频| 亚洲美女免费视频| 亚洲综合国产精品| 国产一区二区黄| 免费久久99精品国产| 亚洲理论在线| 久久精品99国产精品酒店日本| 激情欧美一区| 欧美日韩亚洲国产一区| 亚洲自拍偷拍视频| 欧美freesex交免费视频| 一本色道久久99精品综合| 国产精品美女999| 久久九九国产精品怡红院| 91久久国产精品91久久性色| 一本一本久久| 激情伊人五月天久久综合| 欧美大片在线观看| 亚洲影院一区| 亚洲激情视频| 欧美综合国产| 亚洲精品乱码久久久久久黑人| 国产精品成人v| 狂野欧美一区| 性做久久久久久久免费看| 欧美激情一区二区三区在线| 亚洲欧美制服中文字幕| 伊人婷婷久久| 国产乱人伦精品一区二区| 欧美1区2区视频| 欧美亚洲一区在线| 99re在线精品| 亚洲国产日韩欧美在线动漫| 久久精品卡一| 亚洲男人的天堂在线aⅴ视频| 亚洲丁香婷深爱综合| 国产欧美一区二区三区久久| 欧美日韩精品福利| 久久综合网hezyo| 欧美综合激情网| 亚洲免费人成在线视频观看| 亚洲精品在线免费观看视频| 你懂的视频一区二区| 久久精品国产一区二区电影| 亚洲一区二区三区四区中文 | 国外成人免费视频| 国产精品乱码一区二三区小蝌蚪 | 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲国产精品99久久久久久久久| 国产精品人人爽人人做我的可爱| 欧美日韩高清在线| 欧美激情亚洲自拍| 免费视频亚洲| 久久亚洲精品伦理| 久久国产欧美精品| 午夜老司机精品| 亚洲欧美电影在线观看| 妖精视频成人观看www| 亚洲激情国产| 亚洲品质自拍| 亚洲美女精品一区| 亚洲人久久久| 亚洲卡通欧美制服中文| 亚洲精品美女免费| 亚洲精品国产欧美| 亚洲精品国产精品国产自| 亚洲国产精品高清久久久| 欧美国产日韩一二三区| 欧美电影资源| 亚洲国产黄色| 亚洲另类视频| 中文网丁香综合网| 亚洲一区二区三区在线播放| 亚洲主播在线播放| 欧美尤物一区| 麻豆9191精品国产| 欧美精品成人在线| 欧美日韩中文字幕| 国产精品视频999| 国产日韩精品一区观看| 韩国成人理伦片免费播放| 在线观看亚洲a| 最近看过的日韩成人| 亚洲精品综合精品自拍| 亚洲在线一区二区三区| 欧美一区二区三区在线免费观看| 久久精品国产亚洲精品| 欧美1区2区| 99精品欧美一区二区三区| 午夜精品久久久久久久久久久久久| 欧美一区二区三区在线观看 | 夜夜嗨av一区二区三区四区| 亚洲五月婷婷| 久久精品一区二区三区四区| 欧美成人国产| 99国产精品久久久久老师| 亚洲欧美日韩国产综合在线 | 国产日韩精品在线播放| 在线观看视频亚洲| 亚洲特黄一级片| 久久久久免费观看| 亚洲激情影院| 性欧美激情精品| 欧美精品久久久久久久免费观看 | 精品999网站| 99综合电影在线视频| 性欧美暴力猛交69hd| 欧美黄色小视频| 一区二区三区精品久久久| 欧美一区二区成人6969| 欧美国产日韩a欧美在线观看| 国产精品久久久久久影视| 亚洲第一精品电影| 亚洲欧美制服另类日韩| 欧美激情精品久久久久久黑人| 亚洲午夜久久久久久久久电影院 | 欧美mv日韩mv亚洲| 国产九区一区在线| 99视频日韩| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲人成人99网站| 久久久国产精品一区二区中文| 欧美日韩在线电影| 在线看片一区| 久久成人在线| 99视频精品免费观看| 女主播福利一区| 国产小视频国产精品| 亚洲一区二区三区在线看| 欧美成人综合网站| 欧美与欧洲交xxxx免费观看 | 国产在线播精品第三| 亚洲永久网站| 亚洲精品乱码久久久久久久久| 久久久久国产成人精品亚洲午夜| 国产精品久久99| 一区二区三区 在线观看视频 | 欧美色中文字幕| 亚洲肉体裸体xxxx137| 久久久久久久综合日本| 一区二区三区欧美亚洲| 欧美激情视频网站| 亚洲韩国青草视频| 免费在线成人av| 久久国产婷婷国产香蕉| 国产一区999| 久久精彩免费视频| 香蕉成人伊视频在线观看 | 亚洲午夜极品| 亚洲免费激情| 欧美日韩免费观看一区| 亚洲欧洲中文日韩久久av乱码| 模特精品在线| 蜜臀久久久99精品久久久久久| 国产一区在线观看视频| 欧美在线视频在线播放完整版免费观看| 99精品免费视频| 国产精品成人免费视频| 亚洲欧美另类中文字幕| 亚洲淫片在线视频| 国产精品揄拍一区二区| 久久精品欧洲| 久久九九精品| 亚洲电影天堂av| 亚洲国产日韩在线一区模特| 欧美国产成人在线| 香蕉成人啪国产精品视频综合网| 国产精品成人一区二区三区夜夜夜 | 欧美国产第一页| 一本色道久久88综合亚洲精品ⅰ| 亚洲毛片一区二区| 欧美日韩在线三级| 欧美一区二区三区啪啪| 欧美在线一二三区| 亚洲电影天堂av| 亚洲日本一区二区| 国产精品久久久久影院亚瑟| 欧美自拍丝袜亚洲| 久久久久一区| 夜夜精品视频一区二区| 亚洲女人小视频在线观看| 国产亚洲一区在线| 欧美激情1区2区| 国产精品久久久久久福利一牛影视 | 久久人人爽人人爽爽久久| 亚洲国产精品福利| 亚洲裸体在线观看| 国产精品丝袜久久久久久app| 欧美一区二区在线播放| 久久久中精品2020中文| 一本色道久久综合亚洲精品婷婷| 一道本一区二区| 国内伊人久久久久久网站视频| 欧美激情第1页| 国产精品最新自拍| 欧美成人自拍视频| 国产精品久久久久久久午夜 |