今天我们来编写查询模块。这个模块分两个部分,全部显示和查找具体某个记录。
全部显示
首先,我们来看看查询功能的主函数。这个函数给出了查询模块两个功能的菜单。
// 查询记录
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;
}
}
这个方法也很基础,你看懂了吗?
![](https://img.haomeiwen.com/i145902/1d50948d8af71645.png)
具体查找
下面我们再来看根据姓名查询这个功能。在实现这个功能之前,我们首先需要在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()函数将这个记录打印在屏幕上就好了。是不是很简单呢?操作如下图:
![](https://img.haomeiwen.com/i145902/688bc3993f1b9127.png)
好了,今天就到这里。下一篇中我们会讲解如何把录入的记录保存在磁盘中。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
上一篇:21天C语言代码训练营(第十三天)
下一篇:21天C语言代码训练营(第十五天)
网友评论