“软件工程(C编码实践篇)”实验报告【实验七:将menu设计为可重用的子系统】
2017-11-06 14:41
549 查看
实验资料
网易云课程地址:实验七:将menu设计为可重用的子系统网易云课堂昵称:Natsukashiii
学号:SA17225129
我的github地址
实验要求
为menu子系统设计接口,并写用户范例代码来实现原来的功能;使用make和make clean来编译程序和清理自动生成的文件;
使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令;
可以使用getopt函数获取命令行参数。
实验过程
1.创建实验文件夹;2.创建menu.h文件,代码如下;
#ifndef _MENU_H #define _MENU_H /* add cmd to menu */ int MenuConfig(char* cmd, char *desc, int(*handler)(int argc, char* argv[])); /* Menu Engine Execute */ int ExecuteMenu(); #endif
3.创建test.c作为用户执行接口,使用getopt函数获取命令行参数,使menu子系统支持带参数的复杂命令,代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "menu.h" int testarg(int argc, char *argv[]) { const char *optString = "lah"; opterr = 0; int opt; while ((opt = getopt(argc, argv, optString)) != -1) { switch (opt) { case 'l': printf("this -l option\n"); break; case 'a': printf("this -a option\n"); break; case 'h': printf("in this cmd, you have 3 option can use:\n"); printf("-l\n"); printf("-a\n"); printf("-h\n"); break; default: break; } } // reset global valuable optind optind = 0; return 0; } int Quit(int argc, char *argv[]) { exit(0); } int main(int argc, char *argv[]) { MenuConfig("version", "Menu program v3.0", NULL); MenuConfig("testarg", "test arg option", testarg); MenuConfig("quit", "quit ", Quit); ExcuteMenu(); return 0; }
4.为使用make命令编译文件, makefile代码如下
CC_PTHREAD_FLAGS = -lpthread CC_FLAGS = -c CC_OUTPUT_FLAGS = -o CC_DEBUG_FLAGS = -g CC c78f = gcc TARGET = test OBJS = linktable.o menu.o test.o RM = rm RM_FLAGS = -f all: $(OBJS) $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS) .c.o: $(CC) $(CC_FLAGS) $< clean: $(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bak
5.linkatable.h代码如下:
#ifndef _LINK_TABLE_H_ #define _LINK_TABLE_H_ #include <pthread.h> #define SUCCESS 0 #define FAILURE (-1) /* * LinkTable Node Type */ typedef struct LinkTableNode { struct LinkTableNode * pNext; }tLinkTableNode; /* * LinkTable Type */ typedef struct LinkTable tLinkTable; /* * Create a LinkTable */ tLinkTable * CreateLinkTable(); /* * Delete a LinkTable */ int DeleteLinkTable(tLinkTable *pLinkTable); /* * Add a LinkTableNode to LinkTable */ int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode); /* * Delete a LinkTableNode from LinkTable */ int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode); /* * Search a LinkTableNode from LinkTable * int Conditon(tLinkTableNode * pNode); */ tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args); /* * get LinkTableHead */ tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable); /* * get next LinkTableNode */ tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode); #endif /* _LINK_TABLE_H_ */
6.linktable.c代码如下:
#include<stdio.h> #include<stdlib.h> #include"linktable.h" struct LinkTable { tLinkTableNode *pHead; tLinkTableNode *pTail; int SumOfNode; pthread_mutex_t mutex; }; /* * Create a LinkTable */ tLinkTable * CreateLinkTable() { tLinkTable * pLinkTable = (tLinkTable *)malloc(sizeof(tLinkTable)); if(pLinkTable == NULL) { return NULL; } pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->SumOfNode = 0; pthread_mutex_init(&(pLinkTable->mutex), NULL); return pLinkTable; } /* * Delete a LinkTable */ int DeleteLinkTable(tLinkTable *pLinkTable) { if(pLinkTable == NULL) { return FAILURE; } while(pLinkTable->pHead != NULL) { tLinkTableNode * p = pLinkTable->pHead; pthread_mutex_lock(&(pLinkTable->mutex)); pLinkTable->pHead = pLinkTable->pHead->pNext; pLinkTable->SumOfNode -= 1 ; pthread_mutex_unlock(&(pLinkTable->mutex)); free(p); } pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->SumOfNode = 0; pthread_mutex_destroy(&(pLinkTable->mutex)); free(pLinkTable); return SUCCESS; } /* * Add a LinkTableNode to LinkTable */ int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode) { if(pLinkTable == NULL || pNode == NULL) { return FAILURE; } pNode->pNext = NULL; pthread_mutex_lock(&(pLinkTable->mutex)); if(pLinkTable->pHead == NULL) { pLinkTable->pHead = pNode; } if(pLinkTable->pTail == NULL) { pLinkTable->pTail = pNode; } else { pLinkTable->pTail->pNext = pNode; pLinkTable->pTail = pNode; } pLinkTable->SumOfNode += 1 ; pthread_mutex_unlock(&(pLinkTable->mutex)); return SUCCESS; } /* * Delete a LinkTableNode from LinkTable */ int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode) { if(pLinkTable == NULL || pNode == NULL) { return FAILURE; } pthread_mutex_lock(&(pLinkTable->mutex)); if(pLinkTable->pHead == pNode) { pLinkTable->pHead = pLinkTable->pHead->pNext; pLinkTable->SumOfNode -= 1 ; if(pLinkTable->SumOfNode == 0) { pLinkTable->pTail = NULL; } pthread_mutex_unlock(&(pLinkTable->mutex)); return SUCCESS; } tLinkTableNode * pTempNode = pLinkTable->pHead; while(pTempNode != NULL) { if(pTempNode->pNext == pNode) { pTempNode->pNext = pTempNode->pNext->pNext; pLinkTable->SumOfNode -= 1 ; if(pLinkTable->SumOfNode == 0) { pLinkTable->pTail = NULL; } pthread_mutex_unlock(&(pLinkTable->mutex)); return SUCCESS; } pTempNode = pTempNode->pNext; } pthread_mutex_unlock(&(pLinkTable->mutex)); return FAILURE; } /* * Search a LinkTableNode from LinkTable * int Conditon(tLinkTableNode * pNode); */ tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args) { if(pLinkTable == NULL || Conditon == NULL) { return NULL; } tLinkTableNode * pNode = pLinkTable->pHead; while(pNode != NULL) { if(Conditon(pNode, args) == SUCCESS) { return pNode; } pNode = pNode->pNext; } return NULL; } /* * get LinkTableHead */ tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable) { if(pLinkTable == NULL) { return NULL; } return pLinkTable->pHead; } /* * get next LinkTableNode */ 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; }
7.使用make命令编译文件;
8.编译运行;
9.上传至github版本库。
实验总结
1.编译tese.c文件时会由于缺少框架或库的原因,报如下“ld: symbol(s) not found for architecture x86_64”的错;2.通过编写makefile文件,使用make命令编译文件会更加方便。
相关文章推荐
- 软件工程(C编码实践篇)”实验报告实验七:将menu设计为可重用的子系统
- 实验报告七:将menu设计为可重用的子系统
- 实验报告七:将menu设计为可重用的子系统
- “软件工程(C编码实践篇)”实验报告【实验四:用可重用的链表模块来实现命令行菜单小程序V2.5】
- 软件工程(C编码实践篇)”实验报告 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇)”实验报告 实验二:命令行菜单小程序V1.0
- “软件工程(C编码实践篇)”实验报告【实验三:内部模块化的命令行菜单小程序V2.0】
- “软件工程(C编码实践篇)”实验报告【实验一:写一个hello world小程序】
- 实验七:将menu设计为可重用的子系统
- [高级软件工程实验]将menu设计为可重用的子系统
- “软件工程(C编码实践篇)”实验报告(六)
- “软件工程(C编码实践篇)”实验报告(五)
- 高级软件工程实验7-----将menu设计为可重用的子系统
- “软件工程(C编码实践篇)”实验报告(四)
- “软件工程(C编码实践篇)”实验报告(三)
- “软件工程(C编码实践篇)”实验报告(二)
- “软件工程(C编码实践篇)”实验报告(一)
- 软件工程(C编码实践篇) 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- “软件工程(C编码实践篇)”实验报告【实验二:命令行菜单小程序V1.0】
- 实验7 将menu设计为可重用的子系统