软件工程实验4

SA17225400【哪来的妖精 + 《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 】

实验要求

  • 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
  • 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
  • 可以将通用的Linktable模块集成到我们的menu程序中;
  • 接口规范;

实验过程

创建lab4

在目录中创建文件并编写代码

linktable.h

#ifndef _LINK_TABLE_H_
#define _LINK_TABLE_H_

#include <pthread.h>
#define SUCCESS 0
#define FAILURE (-1)

typedef struct LinkTableNode
{
    struct LinkTableNode *pNext;

}tLinkTableNode;

typedef struct LinkTable
{
   tLinkTableNode *pHead;
   tLinkTableNode *pTail;
   int SumOfNode;
   pthread_mutex_t mutex;

}tLinkTable;

tLinkTable *CreateLinkTable();

int DeleteLinkTable(tLinkTable *pLinkTable);
int AddLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode);
int DelLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode);

tLinkTableNode *GetLinkTableHead(tLinkTable *pLinkTable);
tLinkTableNode *GetLinkTableNextNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);

#endif

linktable.c

#include <stdio.h>
#include <stdlib.h>
#include "linktable.h"


tLinkTable *CreateLinkTable()
{
    tLinkTable *pLinkTable = (tLinkTable*)malloc(sizeof(tLinkTable));
    if (pLinkTable == NULL)
        return NULL;
    pLinkTable -> pHead = NULL;
    pLinkTable -> pTail = NULL;
    pLinkTable -> SumOfNode = 0;
    return pLinkTable;
}
int DeleteLinkTable(tLinkTable *pLinkTable)
{
    if (pLinkTable == NULL)
        return FAILURE;
    while (pLinkTable -> pHead != NULL)
    {
        tLinkTableNode *p = pLinkTable -> pHead;
        pLinkTable -> pHead = pLinkTable -> pHead -> pNext;
        pLinkTable -> SumOfNode--;
        free(p);
    }
    pLinkTable -> pHead = NULL;
    pLinkTable -> pTail = NULL;
    free(pLinkTable);
    return SUCCESS;
}
int AddLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode)
{
    if (pLinkTable == NULL || pNode == NULL)
        return FAILURE;
    pNode ->pNext = NULL;
    if (pLinkTable -> pHead == NULL)
        pLinkTable -> pHead = pNode;
    if (pLinkTable -> pTail == NULL)
        pLinkTable -> pTail = pNode;
    else
    {
        pLinkTable -> pTail -> pNext = pNode;
        pLinkTable -> pTail = pNode;
    }
    pLinkTable -> SumOfNode++;
    return SUCCESS;
}
int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode)
{
    if(pLinkTable == NULL || pNode == NULL)
        return FAILURE;
    if(pLinkTable->pHead == pNode)
    {
        pLinkTable->pHead = pLinkTable->pHead->pNext;
        pLinkTable->SumOfNode--;
        if(pLinkTable->SumOfNode == 0)
            pLinkTable->pTail = NULL;
        return SUCCESS;
    }
    tLinkTableNode * pTempNode = pLinkTable->pHead;
    while(pTempNode != NULL)
    {
        if(pTempNode->pNext == pNode)
        {
            pTempNode->pNext = pTempNode->pNext->pNext;
            pLinkTable->SumOfNode--;
            if(pLinkTable->SumOfNode == 0)
                pLinkTable->pTail = NULL;
            return SUCCESS;
        }
        pTempNode = pTempNode->pNext;
    }
    return FAILURE;
}
tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable)
{
    if(pLinkTable == NULL)
    {
        return NULL;
    }
    return pLinkTable->pHead;
}
tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode)
{
    if(pLinkTable == NULL || pNode == NULL)
        return NULL;
    tLinkTableNode * pTempNode = pLinkTable->pHead;
    while(pTempNode != NULL)
    {
        if(pTempNode == pNode)
            return pTempNode->pNext;
        pTempNode = pTempNode->pNext;
    }
    return NULL;
}

menu.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linktable.h"

#define CMD_MAX_LEN 128
typedef struct DataNode
{
    tLinkTableNode *pNext;
    char *cmd;
    char *desc;
    int (*handler)();
}tDataNode;

int Help();
int Date();
int Route();
int Exit();

tDataNode *FindCmd(tLinkTable *head, char *cmd)
{
    tDataNode *pNode = (tDataNode*)GetLinkTableHead(head);
    while (pNode != NULL)
    {
        if (strcmp(pNode -> cmd, cmd) == 0)
        {
            return pNode;
        }
        pNode = (tDataNode *)GetNextLinkTableNode(head, (tLinkTableNode *)pNode);
    }
    return NULL;
}

int ShowAllCmd(tLinkTable * head)
{
    tDataNode * pNode = (tDataNode *)GetLinkTableHead(head);
    while(pNode != NULL)
    {
        printf("%s - %s\n", pNode->cmd, pNode->desc);
        pNode = (tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode *)pNode);
    }
    return 0;
}

int InitMenuData(tLinkTable ** ppLinkTable){
    *ppLinkTable = CreateLinkTable();
    tDataNode* pNode = (tDataNode*)malloc(sizeof(tDataNode));
    pNode->cmd = "help";
    pNode->desc = "Menu List:\n";
    pNode->handler = Help;
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);

    pNode = (tDataNode*)malloc(sizeof(tDataNode));
    pNode->cmd = "version";
    pNode->desc = "Menu Programe V1.0\n";
    pNode->handler = NULL;
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);

    pNode = (tDataNode*)malloc(sizeof(tDataNode));
    pNode->cmd = "date";
    pNode->desc = "Print the date\n";
    pNode->handler = Date;
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);

    pNode = (tDataNode*)malloc(sizeof(tDataNode));
    pNode->cmd = "route";
    pNode->desc = "Print the route table\n";
    pNode->handler = Route;
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);

    pNode = (tDataNode*)malloc(sizeof(tDataNode));
    pNode->cmd = "exit";
    pNode->desc = "The Programe will exit\n";
    pNode->handler = Exit;
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);
    return 0;

}
tLinkTable *head = NULL;

int main()
{
    char cmd[CMD_MAX_LEN]; 
    InitMenuData(&head); 
     while(1)
    {    
        printf("\nPlease input your cmd:\n");
        scanf("%s",cmd);
        tDataNode *p = FindCmd(head,cmd);
        
        if(p == NULL)
        {
            printf("This is a wrong cmd!\n");
            continue;
        }
        printf("%s - %s\n", p->cmd, p->desc);
        if(p->handler != NULL)
        {
            p->handler();
        }
    }

    return 0;
}
int Help()
{
    ShowAllCmd(head);
    return 0;
}
int Date()
{
    system("date");
    return 0;
};

int Route()
{
    system("route");
    return 0;
};
int Exit()
{
    exit(0);
    return 0;
};

运行截图

上传到GitHUb:

实验小结

这次实验内容较多,中间出现了一点曲折,调了很久终于成功运行了。通过这次学习学到了很多东西。

转载于:https://www.cnblogs.com/raincute/p/7679025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引言 1.1编写目的 图书管理系统详细设计是设计的第二个阶段,这个阶段的主要任务是在图书管理系统概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模块的内部细节,包括算法和详细数据结构,为编写源代码提供必要的说明。 概要设计解决了软件系统总体结构设计的问题,包括整个软件系统的结构、模块划分、模块功能和模块间的联系等。详细设计则要解决如何实现各个模块的内部功能,即模块设计。具体的说,模块设计就是要为已经产生的图书管理各子系统设计详细的算法。但这并不等同于系统实现阶段用具体的语言编码,它只是对实现细节作精确的描述,这样编码阶段就可以将详细设计中对功能实现的描述, 直接翻译、转化为用某种程序设计语言书写的程序。 1.2 参考资料 《实用软件工程》 《Oracle数据库》 《数据结构》 《软件工程概述》 2.软件结构 3.模块描述 3.1 模块名称 登陆模块 3.1.1功能描述 (1)功能类型:查询数据 (2)功能描述: 提高系统的安全性 (3)前提业务: 无 (4)后继业务: 02管理模块 (5)功能约束:权限约束 3.1.2类属性和类方法 3.1.3 重要的算法 进行对索要登陆人员进行信息注册,给予所登陆的账号进行登陆,并且进行验证。 3.2 模块名称 管理模块 3.2.1功能描述 (1) 功能类型:其他 (2)功能概述: 总体归纳图书馆管理功能 (3) 前提业务:登陆模块(01) (4) 后续业务: 021, 022, 023, 024, 03(5)功能约束: 权限约束 (6) 约束描述: (7) 操作权限:图书馆管理人员 3.2.2类属性和类方法 3.2.3 重要的算法 1).图书编号生成(自动生成)录入时自动生成,对于新书的编号,显示添加图书完成后的页面中 2).图书信息修改(即对该类图书总量能修改,包含图书的编号 数据库操作,根据数据库显示修改之前,后的页面 3).注销(破损图书) 数据库操作,注销页面 唯一编号--检索出先关书籍信息--删除 4).查询 3.3 模块名称 (031)图书信息查询模块 3.3.1功能描述 (1) 功能类型:查询数据 (2)功能概述: 显示查询结果 (3)前提业务: 无 (4) 后继业务: (5) 功能约束:没有约束; (6)约束描述: (7)操作权限: 面向所有用户 3.3.2类属性和类方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值