21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第十四天)

今天我們來(lái)編寫(xiě)查詢(xún)模塊。這個(gè)模塊分兩個(gè)部分,全部顯示和查找具體某個(gè)記錄。

全部顯示

首先,我們來(lái)看看查詢(xún)功能的主函數(shù)。這個(gè)函數(shù)給出了查詢(xún)模塊兩個(gè)功能的菜單。

// 查詢(xún)記錄
void SearchRecord()
{
    int loop = 1;
    while (loop)
    {
        CleanScreen();

        // 顯示全部
        printf("==== 全部記錄 ====\n\n");
        ListTraverShow();

        ////
        int t;
        printf("\n\n下一步\n");
        printf("1. 顯示全部\n");
        printf("2. 查找\n");
        printf("0. 返回\n");
        printf("----------------\n");
        printf("請(qǐng)輸入要使用的功能:");

        scanf("%d", &t);

        if (t == 1)
        {
            // Do nothing
        }
        else if (t == 2)
        {
            FindRecord();
        }
        else
        {
            loop = 0;
        }
    }
}

這個(gè)函數(shù)的基本流程如下:

1. 清屏

在執(zhí)行查詢(xún)之前,擦掉屏幕上的全部?jī)?nèi)容,從邏輯上告訴用戶(hù)進(jìn)入了一個(gè)新的功能模塊。

2. 顯示全部記錄

這里我們調(diào)用了上一篇中實(shí)現(xiàn)的ListTraverShow()這個(gè)函數(shù),將鏈表中保存的全部記錄打印在屏幕上。

3. 打印菜單

將三個(gè)操作的操作碼打印在屏幕上,方便用戶(hù)參照輸入。輸入1時(shí),函數(shù)執(zhí)行下一個(gè)循環(huán),自動(dòng)重復(fù)打印全部記錄。輸入2時(shí),調(diào)用FindRecord()函數(shù)進(jìn)入具體的檢索方法。

4. 流程控制

這里需要注意的是我們用來(lái)控制函數(shù)流程的方法。我們選擇了一個(gè)while循環(huán)作為函數(shù)的主流程。我們通過(guò)修改循環(huán)控制變量loop的值來(lái)控制是否跳出循環(huán)。

while (loop)
{
}

這種寫(xiě)法是程序設(shè)計(jì)中非常常見(jiàn)的,特別是在多線程編程中會(huì)頻繁用到,希望大家能夠掌握。

當(dāng)然,我們說(shuō)程序員最不缺的就是方法,我們還有很多其他的方法來(lái)實(shí)現(xiàn)同樣的流程控制。最容易想到的就是寫(xiě)一個(gè)死循環(huán),while(true){},之后在while的循環(huán)內(nèi)部通過(guò)條件語(yǔ)句加break實(shí)現(xiàn)跳出動(dòng)作。

while (true)
{
    if ( ... )
    {
        break;  
    }
}

這個(gè)方法也很基礎(chǔ),你看懂了嗎?

顯示全部記錄

具體查找

下面我們?cè)賮?lái)看根據(jù)姓名查詢(xún)這個(gè)功能。在實(shí)現(xiàn)這個(gè)功能之前,我們首先需要在ListNode.c中實(shí)現(xiàn)這樣一個(gè)函數(shù)。

Record* ListFind(char* pStrName)
{
    ListNode* pNode;
    for (pNode = g_pL; pNode->_pR != NULL; pNode = pNode->_pNext)
    {
        if (strcmp(pNode->_pR->_pStrName->pBuf, pStrName) == 0)
        {
            return pNode->_pR;
        }
    }

    return NULL;
}

這個(gè)函數(shù)的功能是輸入一個(gè)字符串,之后在_pR指向的鏈表中找到匹配的記錄。方法實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,遍歷鏈表中的節(jié)點(diǎn),這個(gè)上一篇中已經(jīng)學(xué)會(huì)了。我們通過(guò)strcmp()這個(gè)庫(kù)函數(shù)來(lái)比較姓名字符串,找到匹配的節(jié)點(diǎn)后將這個(gè)節(jié)點(diǎn)中的Record指針?lè)祷丶纯?。不要忘了在ListNode.h中加入這行代碼:

Record* ListFind(char* pStrName);

有了這個(gè)函數(shù),我們就能輕松地在main.c中寫(xiě)出功能代碼了:

void FindRecord()
{
    char str[50];
    int loop = 1;
    int t;

    gets(str); // Remove '\t'
    CleanScreen();

    printf("==== 查找記錄 ====\n\n");

    printf("請(qǐng)輸入需要查找的姓名:\n");
    printf("姓名:");

    gets(str);

    Record* pRecord = ListFind(str);

    if (pRecord == NULL)
    {
        printf("未找到%s的資料。\n", str);
    }
    else
    {
        RecordPrint(pRecord);
    }
    
    system("pause");
}

是不是全部都能看懂呢?這里拿到Record后,我們只需要調(diào)用之前實(shí)現(xiàn)的RecordPrint()函數(shù)將這個(gè)記錄打印在屏幕上就好了。是不是很簡(jiǎn)單呢?操作如下圖:

查詢(xún)具體記錄

好了,今天就到這里。下一篇中我們會(huì)講解如何把錄入的記錄保存在磁盤(pán)中。

我是天花板,讓我們一起在軟件開(kāi)發(fā)中自我迭代。
如有任何問(wèn)題,歡迎與我聯(lián)系。


上一篇:21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第十三天)
下一篇:21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第十五天)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評(píng)論 25 709
  • 上一篇中,我們說(shuō)到錄入的數(shù)據(jù)需要保存在一個(gè)雙向鏈表中,今天我們就來(lái)說(shuō)說(shuō)這個(gè)數(shù)據(jù)結(jié)構(gòu)該如何實(shí)現(xiàn)。 鏈表 每一種數(shù)據(jù)結(jié)...
    天花板閱讀 1,938評(píng)論 2 7
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,687評(píng)論 18 399
  • 每到山腰總忘還,小村竟在白云間。 當(dāng)時(shí)一聚好消閑。 已見(jiàn)落霞?xì)堈绽?,猶聞醉語(yǔ)月華邊。 人間天上共嬋娟。
    雪窗_武立之閱讀 371評(píng)論 0 4
  • 小學(xué),放學(xué)了,可天空下起了大雨。所有的同學(xué)都等在屋檐下焦急得等著父母來(lái)接自己回家。有的父親開(kāi)著車(chē),接上孩子揚(yáng)長(zhǎng)而去...
    Lillie閱讀 379評(píng)論 0 0

友情鏈接更多精彩內(nèi)容