实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
来源:互联网 发布:ubuntu搭建owncloud 编辑:程序博客网 时间:2024/06/05 09:30
实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
学号: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 Typetypedef struct LinkTableNode{ struct LinkTableNode * pNext;}tLinkTableNode;//LinkTable Typetypedef struct LinkTable{ tLinkTableNode *pHead; tLinkTableNode *pTail; int SumOFNode; pthread_mutex_t mutex;}tLinkTable;tLinkTable * CreateLinkTable();//Delete a LINKtableint 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 10typedef 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 listint 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程序中。
定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!
● 接口规范
● 内聚和耦合
● 通用原则
阅读全文
0 0
- 实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇)”实验报告 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- “软件工程(C编码实践篇)”实验报告【实验四:用可重用的链表模块来实现命令行菜单小程序V2.5】
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 文章标题 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- [高级软件工程实验]用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序
- 用可重用的链表模块来实现命令行菜单小程序V2.5
- 用可重用的链表模块来实现命令行菜单小程序V2.5
- Python测试框架doctest
- 数学 喝喝喝
- 网站建设
- MVP
- linux 进程间通信之管道和有名管道
- 实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
- Windows平板 区分当前是鼠标点击还是触摸
- LeetCode 239. Sliding Window Maximum 题解(上)
- 第一、二章课后习题——问答题
- angular文字的禁词
- Android学习-使用DatePicker以及TimePicker显示当前日期和时间
- 解析数组或集合类型json
- 【OpenCV_contri】找出任意物体可能在的位置(Selective search,物体检测)
- XL..