21天C语言代码训练营(第十四天)

今天我们来编写查询模块。这个模块分两个部分,全部显示和查找具体某个记录。

全部显示

首先,我们来看看查询功能的主函数。这个函数给出了查询模块两个功能的菜单。

// 查询记录
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("请输入要使用的功能:");

        scanf("%d", &t);

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

这个函数的基本流程如下:

1. 清屏

在执行查询之前,擦掉屏幕上的全部内容,从逻辑上告诉用户进入了一个新的功能模块。

2. 显示全部记录

这里我们调用了上一篇中实现的ListTraverShow()这个函数,将链表中保存的全部记录打印在屏幕上。

3. 打印菜单

将三个操作的操作码打印在屏幕上,方便用户参照输入。输入1时,函数执行下一个循环,自动重复打印全部记录。输入2时,调用FindRecord()函数进入具体的检索方法。

4. 流程控制

这里需要注意的是我们用来控制函数流程的方法。我们选择了一个while循环作为函数的主流程。我们通过修改循环控制变量loop的值来控制是否跳出循环。

while (loop)
{
}

这种写法是程序设计中非常常见的,特别是在多线程编程中会频繁用到,希望大家能够掌握。

当然,我们说程序员最不缺的就是方法,我们还有很多其他的方法来实现同样的流程控制。最容易想到的就是写一个死循环,while(true){},之后在while的循环内部通过条件语句加break实现跳出动作。

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

这个方法也很基础,你看懂了吗?

21天C语言代码训练营(第十四天)_第1张图片
显示全部记录

具体查找

下面我们再来看根据姓名查询这个功能。在实现这个功能之前,我们首先需要在ListNode.c中实现这样一个函数。

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

这个函数的功能是输入一个字符串,之后在_pR指向的链表中找到匹配的记录。方法实现起来很简单,遍历链表中的节点,这个上一篇中已经学会了。我们通过strcmp()这个库函数来比较姓名字符串,找到匹配的节点后将这个节点中的Record指针返回即可。不要忘了在ListNode.h中加入这行代码:

Record* ListFind(char* pStrName);

有了这个函数,我们就能轻松地在main.c中写出功能代码了:

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

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

    printf("==== 查找记录 ====\n\n");

    printf("请输入需要查找的姓名:\n");
    printf("姓名:");

    gets(str);

    Record* pRecord = ListFind(str);

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

是不是全部都能看懂呢?这里拿到Record后,我们只需要调用之前实现的RecordPrint()函数将这个记录打印在屏幕上就好了。是不是很简单呢?操作如下图:

21天C语言代码训练营(第十四天)_第2张图片
查询具体记录

好了,今天就到这里。下一篇中我们会讲解如何把录入的记录保存在磁盘中。

我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。


上一篇:21天C语言代码训练营(第十三天)
下一篇:21天C语言代码训练营(第十五天)

你可能感兴趣的:(21天C语言代码训练营(第十四天))