您的位置:首页 > 其它

“软件工程(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命令编译文件会更加方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐