软件工程(C编码实践篇) 第五次作业实验报告

本次实验旨在用C语言修复lab5-1.tar.gz中的bug,并通过回调函数优化链表模块,实现命令行菜单小程序V2.8。在找bug的过程中,发现quit命令无法运行的问题源自SearchLinkTableNode()函数的while循环,修正后成功排除错误。接着优化代码结构,使用git进行版本控制,并理解回调函数的概念和应用。
摘要由CSDN通过智能技术生成

网易云课堂昵称:sa17225159
《软件工程(C编码实践篇)》MOOC课程作业 http://mooc.study.163.com/course/USTC-1000002006

实验五:用callback增强链表模块来实现命令行菜单小程序V2.8

实验要求

新创建一个目录lab5完成实验。

然后将lab5-1.tar.gz中的代码(即解压后lab5.1/目录下的源文件)直接放到lab5/目录下继续完成后面的实验内容

实验要求(参照视频中的具体实验过程) 本实验在提供的代码基础上进行

  • 给lab5-1.tar.gz找bug,quit命令无法运行的bug
  • 利用callback函数参数使Linktable的查询接口更加通用
  • 注意接口的信息隐藏

一定要及时提交代码以防丢失

实验过程

1. 找bug

因为实验代码lab5-1.tar.gz在实验楼的环境中,所以我先在实验楼中将代码解压,如下图
这里写图片描述
然后将代码上传至github,地址是https://github.com/libaoquan95/seClass_lab5.1.git,过程如下
这里写图片描述
这里写图片描述
这里写图片描述

然后再将代码下载至本机虚拟机中运行,这么做只是因为我不习惯实验楼的环境。
这里写图片描述
运行发现执行quit命令不能正确退出,且程序报错:

Input a cmd number > quit
This is a wrong cmd!

检查源代码,发现在menu.c的main()函数中,当p==NULL时会报此类型错误。

tDataNode *p = FindCmd(head, cmd);
if( p == NULL)
{
    printf("This is a wrong cmd!\n ");
    continue;
}

猜测是FindCmd()函数出现问题。

/* find a cmd in the linklist and return the datanode pointer */
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
    return  (tDataNode*)SearchLinkTableNode(head,SearchCondition);
}

而FindCmd()函数仅仅是调用了linktable.c中的SearchLinkTableNode()函数,所以继续在SearchLinkTableNode()中排查错误。

/*
 * Search a LinkTableNode from LinkTable
 * int Conditon(tLinkTableNode * pNode);
 */
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
    if(pLinkTable == NULL || Conditon == NULL)
    {
        return NULL;
    }
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != pLinkTable->pTail)
    {    
        if(Conditon(pNode) == SUCCESS)
        {
            return pNode;                   
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

问题出现在while循环中,循环会在访问到链表最后一个节点之前退出循环,而quit命令位于链表尾部,所以执行quit命令会出现问题,将代码修改如下:

/*
 * Search a LinkTableNode from LinkTable
 * int Conditon(tLinkTableNode * pNode);
 */
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
    if(pLinkTable == NULL || Conditon == NULL)
    {
        return NULL;
    }
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != NULL)
    {    
        if(Conditon(pNode) == SUCCESS)
        {
            return pNode;                   
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

重新编译并运行
这里写图片描述
bug已被排除。

2. 优化代码结构

1.建立远程仓库,并下载到本地,远程仓库地址:https://github.com/libaoquan95/seClass_lab5.git

git clone https://github.com/libaoquan95/seClass_lab5.git

并进入版本库并复制 menu.c linktable.h linktable.c 文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值