实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
2017-10-15 18:31
706 查看
实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
学号:SA17225091
1.实验要求
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
可以将通用的Linktable模块集成到我们的menu程序中;
接口规范;
2.实验过程
创建lab4目录,编写linktable.h linktable.c menu.c
linktable.h
linktable.c
menu.c
编译 运行 测试
上传到版本库
https://github.com/lgddd/gr_lab/tree/master/lab4
3.实验心得
这次实验实现了一个通用的LinkTable模块的接口设计,这是编程原则“高内聚低耦合”的一个体现,有利于提高编程的可重用性和效率。以后我也会把这种思想运用其他代码的编写中。
4.总结
本次实验将通用的Linktable模块集成到我们的menu程序中。
定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!
● 接口规范
● 内聚和耦合
● 通用原则
学号:SA17225091
1.实验要求
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
可以将通用的Linktable模块集成到我们的menu程序中;
接口规范;
2.实验过程
创建lab4目录,编写linktable.h linktable.c menu.c
linktable.h
#ifndef LINKTABLE_H #define LINKTABLE_H #include<pthread.h> #define SUCESS 0 #define FAILURE (-1) //LinkTable Node Type typedef struct LinkTableNode { struct LinkTableNode * pNext; }tLinkTableNode; //LinkTable Type typedef struct LinkTable { tLinkTableNode *pHead; tLinkTableNode *pTail; int SumOFNode; pthread_mutex_t mutex; }tLinkTable; tLinkTable * CreateLinkTable(); //Delete a LINKtable int DeleteLinkTable(tLinkTable * pLinkTable); int AddLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode * pNode); int DeLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode *pNode); tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable); tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode); #endif
linktable.c
#include<stdlib.h> #include<stdio.h> #include "linktable.h" tLinkTable *CreateLinkTable() { tLinkTable *pTable =(tLinkTable*)malloc(sizeof(tLinkTable)); pTable->pHead=NULL; pTable->pTail=NULL; pTable->SumOFNode=0; return pTable; } int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode) { if(pLinkTable ==NULL) { printf("Error,The table is empty!\n"); exit(0); } else if (pNode == NULL) { printf("The node is empty!\n"); return 0; } else if (pLinkTable->pHead == NULL) { pLinkTable->pHead = pNode; pLinkTable->pTail = pNode; pLinkTable->SumOFNode = 1; } else { pLinkTable->pTail->pNext = pNode; pLinkTable->pTail = pNode; pLinkTable->SumOFNode++; } return 0; } int DeleteLinkTable(tLinkTable *pLinkTable) { free(pLinkTable); return 0; } tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable) { if (pLinkTable == NULL) { printf("The table is empty!\n"); exit(0); } return pLinkTable->pHead; } tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode) { if (pLinkTable == NULL) { printf("Erroe,The table is empty!\n"); exit(0); } else if (pNode == NULL) { printf("Erroe,The node is empty!\n"); exit(0); } return pNode->pNext; }
menu.c
#include<stdio.h> #include<string.h> #include<stdlib.h> #include "linktable.h" int Help(); int Quit(); #define CMD_MAX_LEN 128 #define DESC_LEN 1024 #define CMD_NUM 10 typedef struct DataNode { tLinkTableNode *pNext; char *cmd; char *desc; int (*handler)(); }tDataNode; int InitMenuData(tLinkTable **ppLinkTable) { *ppLinkTable=CreateLinkTable(); tDataNode *pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="help"; pNode->desc="menu list:"; pNode->handler=Help; AddLinkTableNode(*ppLinkTable,(tLinkTableNode*)pNode); pNode=(tDataNode*)(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="version"; pNode->desc="menu program v2.5"; pNode->handler=NULL; AddLinkTableNode(*ppLinkTable,(tLinkTableNode*)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="quit"; pNode->desc="quit from menu program v 2.5"; pNode->handler=Quit; AddLinkTableNode(*ppLinkTable,(tLinkTableNode*)pNode); return 0; } tLinkTable *head=NULL; //show all cmd in list int ShowAllCmd(tLinkTable *head) { printf("menu list:\n"); tDataNode *p=(tDataNode*)GetLinkTableHead(head); while(p!=NULL) { printf("%s-\n%s\n",p->cmd,p->desc); p=(tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode*)p); } return 0; } tDataNode *FindCmd(tLinkTable *head,char *cmd) { tDataNode *p=(tDataNode*)GetLinkTableHead(head); while(p!=NULL) { if(strcmp(p->cmd,cmd)==0) { return p; } p=(tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode*)p); } return NULL; } int main() { InitMenuData(&head); while(1) { char cmd[CMD_MAX_LEN]; printf("Input a cmd number:"); 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(); } } } int Help() { ShowAllCmd(head); return 0; } int Quit() { exit(0); }
编译 运行 测试
上传到版本库
https://github.com/lgddd/gr_lab/tree/master/lab4
3.实验心得
这次实验实现了一个通用的LinkTable模块的接口设计,这是编程原则“高内聚低耦合”的一个体现,有利于提高编程的可重用性和效率。以后我也会把这种思想运用其他代码的编写中。
4.总结
本次实验将通用的Linktable模块集成到我们的menu程序中。
定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!
● 接口规范
● 内聚和耦合
● 通用原则
相关文章推荐
- “软件工程(C编码实践篇)”实验报告【实验四:用可重用的链表模块来实现命令行菜单小程序V2.5】
- 软件工程(C编码实践篇)”实验报告 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 文章标题 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- [高级软件工程实验]用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇) 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验报告五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序
- 用可重用的链表模块来实现命令行菜单小程序V2.5
- 学习之路——用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇)”实验报告 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8