軟件工程第四次實驗

【ykt1504834575963+ 《軟件工程(C編碼實踐篇)》MOOC課程作業http://mooc.study.163.com/course/USTC-1000002006 】


實驗要求

  • 用可重用的鏈表模塊來實現命令行菜單小程序,執行某個命令時調用一個特定的函數作爲執行動作;

  • 鏈表模塊的接口設計要足夠通用,命令行菜單小程序的功能保持不變;

  • 可以將通用的Linktable模塊集成到我們的menu程序中;

  • 接口規範;


實驗過程

將上一節的代碼進行改造重用,將每個功能封裝成一個鏈表節點。然後在menu中調用等操作。實現更進一步的模塊化設計。

menu.c



linkable.h



linkable.c



實驗編譯截圖



實驗源代碼


1.menu.c


#include <stdio.h>  
#include <stdlib.h>  
#include "linktable.h"  
#include <string.h>  
  
int Help();  
int Quit();  
  
#define CMD_MAX_LEN 128  
#define DESC_LEN 1024  
#define CMD_NUM 10  
/* 
static tDataNode head[] = 
{ 
    {"help","this is help cmd!",Help,&head[1]}, 
    {"version", "menu program V1.0", NULL, &head[2]}, 
    {"quit", "quit from menu!", Quit, NULL} 
}; 
*/  
typedef struct DataNode  
{  
    tLinkTableNode *pNext;  
    char* cmd;  
    char* desc;  
    int   (*handler)();  
    struct DataNode *next;  
}tDataNode;  
  
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="help command";  
    pNode->handler=Help;  
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);  
    pNode=(tDataNode*)malloc(sizeof(tDataNode));  
    pNode->cmd="version";  
    pNode->desc="menu program v2.5 beta";  
    pNode->handler=NULL;  
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);  
    pNode=(tDataNode*)malloc(sizeof(tDataNode));  
    pNode->cmd="quit";  
    pNode->desc="quit this software";  
    pNode->handler=Quit;  
    AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);  
    return 0;  
}  
tLinkTable* head=NULL;  
  
int main()  
{  
    InitMenuData(&head);  
    while(1)  
    {  
        char cmd[CMD_MAX_LEN];  
        printf("Please print a cmd number > ");  
        scanf("%s",cmd);  
        tDataNode *p = FindCmd(head,cmd);  
        if(p == NULL)  
        {  
            printf("Thid is a wrong cmd!\n");  
            continue;  
        }  
        printf("%s - %s\n",p->cmd,p->desc);  
        if(p -> handler != NULL)  
        {  
            p -> handler();  
        }  
     }  
}  
  
int Help()  
{  
    ShowAllCmd(head);  
    return 0;  
}  
int Quit()  
{  
    exit(0);  
    return 0;  
}

linktable.h


#include <stdio.h>  
#include <stdlib.h>  
#include "linktable.h"  
  
tLinkTable *CreateLinkTable()  
{  
    tLinkTable *pLinkTable=(tLinkTable*)malloc(sizeof(tLinkTable));  
    pLinkTable->pHead=NULL;  
    pLinkTable->SumOfNode=0;  
    return pLinkTable;  
}  
  
int DeleteLInkTable(tLinkTable *pLinkTable)  
{  
    if(NULL == pLinkTable)  
    {  
        return FAILURE;  
    }  
    if(NULL == pLinkTable->pHead)  
    {  
        free(pLinkTable);  
        return SUCCESS;  
    }  
    tLinkTableNode *pNode=GetLinkTableHead(pLinkTable);  
    tLinkTableNode *pTempNode;  
  
    while(NULL != pNode)  
    {  
        pTempNode=pNode;  
        pNode=GetNextLinkTableNode(pLinkTable,pNode);  
        free(pTempNode);  
    }  
    free(pNode);  
    return SUCCESS;  
}  
  
int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode)  
{  
    if(NULL == pLinkTable || NULL ==  pNode)  
    {  
        return FAILURE;  
    }  
    if(pLinkTable->pHead == NULL)  
    {  
        pLinkTable->pHead=pNode;  
        return SUCCESS;  
    }  
    tLinkTableNode *ptrNode=GetLinkTableHead(pLinkTable);  
    while(ptrNode->pNext != NULL)  
    {  
        ptrNode=ptrNode->pNext;  
    }  
    ptrNode->pNext=pNode;  
    return SUCCESS;  
}  
  
int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode)  
{  
    if(pLinkTable == NULL || pNode == NULL)  
    {  
        return FAILURE;  
    }  
    if(pLinkTable->pHead == NULL)  
    {  
        free(pLinkTable->pHead);  
        return SUCCESS;  
    }  
    tLinkTableNode *ptrNode = GetLinkTableHead(pLinkTable);  
    while(ptrNode->pNext != pNode)  
    {  
        ptrNode=ptrNode->pNext;  
    }  
    tLinkTableNode *ptrTemp=ptrNode->pNext;  
    ptrNode->pNext=ptrTemp->pNext;  
    free(ptrTemp);  
    return SUCCESS;  
  
}  
  
tLinkTableNode *GetLinkTableHead(tLinkTable *pLinkTable)  
{  
    if(pLinkTable == NULL || pLinkTable->pHead == NULL)  
    {  
        return NULL;  
    }  
    tLinkTableNode *pNode=pLinkTable->pHead;  
    return pNode;  
}  
  
tLinkTableNode *GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode)  
{  
    if(pLinkTable == NULL || pLinkTable->pHead == NULL)  
    {  
        return NULL;  
    }  
    return pNode->pNext;  
}

linktable.h


#ifndef _LINK_TABLE_H_  
#define _LINK_TABLE_H_  
  
#define SUCCESS 0  
#define FAILURE (-1)  
  
typedef struct LinkTableNode  
{  
        struct LinkTableNode *pNext;  
}tLinkTableNode;  
  
typedef struct LinkTable  
{  
        tLinkTableNode *pHead;  
            tLinkTableNode *pTail;  
                int     SumOfNode;  
}tLinkTable;  
  
tLinkTable *CreateLinkTable();  
int DeleteLinkTable(tLinkTable *pLinkTable);  
int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);  
int DeleteLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);  
tLinkTableNode *GetLinkTableHead(tLinkTable *pLinkTable);  
tLinkTableNode *GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);  
  
#endif 



實驗總結

通過孟老師的課程學到了一些知識 很感謝他,同時完成課程的過程中,我親愛的同學們也幫我很多,謝謝了!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章