实验4
来源:互联网 发布:微销宝是什么软件 编辑:程序博客网 时间:2024/05/18 11:46
火页凡 + 《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006
一. 实验过程
Clonegithub库:github.com/wangyufan/SE.git到实验环境
1.进入实验目录并创建实验一文件夹lab4
2.编写linktable.h,linktable.c文件,修改实验3中的menu.c文件,实验代码如下:
#define SUCCESS 0#define FAILURE (-1)typedef struct LinkTableNode{ struct LinkTableNode* pNext;}tLinkTableNode;typedef struct LinkTable{ tLinkTableNode *pHead; tLinkTableNode *pTail; int sumOfNode; pthread_mutex_t mutex;}tLinkTable;tLinkTable* CreateLinkTable();int DeleteLinkTable(tLinkTable* pLinkTable);int AddLinkTableNode(tLinkTable* pLinkTable, tLinkTableNode* pNode);int DelLinkTableNode(tLinkTable* pLinkTable, tLinkTableNode* pNode);tLinkTableNode* GetLinkTableHead(tLinkTable* pLinkTable);tLinkTableNode* GetNextLinkTableNode(tLinkTable* pLinkTable, tLinkTableNode* pNode);#include#include #include "linktable.h"tLinkTable* CreateLinkTable(){ tLinkTable* pLinkTable = (tLinkTable*)malloc(sizeof(tLinkTable)); if(pLinkTable == NULL) { return NULL; } pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->sumOfNode = 0; return pLinkTable;}int DeleteLinkTable(tLinkTable* pLinkTable){ if(pLinkTable == NULL) { return FAILURE; } while(pLinkTable->pHead != NULL) { tLinkTableNode* pNode = pLinkTable->pHead; pLinkTable->pHead = pLinkTable->pHead->pNext; free(pNode); } pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->sumOfNode = -1; free(pLinkTable); return SUCCESS;}int AddLinkTableNode(tLinkTable* pLinkTable, tLinkTableNode* pNode){ if (pLinkTable == NULL || pNode == NULL) { return FAILURE; } pNode->pNext = NULL; if (pLinkTable->pHead == NULL) { pLinkTable->pHead = pNode; } if (pLinkTable->pTail == NULL) { pLinkTable->pTail = pNode; } else { pLinkTable->pTail->pNext = pNode; pLinkTable->pTail = pNode; } pLinkTable->sumOfNode = pLinkTable->sumOfNode + 1; return SUCCESS;}int DelLinkTableNode(tLinkTable* pLinkTable, tLinkTableNode* pNode){ if (pLinkTable == NULL || pNode == NULL) { return FAILURE; } if (pLinkTable->pHead == pNode) { pLinkTable->pHead = pLinkTable->pHead->pNext; pLinkTable->sumOfNode = pLinkTable->sumOfNode - 1; if (pLinkTable->sumOfNode == 0) { pLinkTable->pTail == NULL; } return SUCCESS; } tLinkTableNode* p = pLinkTable->pHead; while (p != NULL) { if (p->pNext == pNode) { p->pNext = p->pNext->pNext; pLinkTable->sumOfNode = pLinkTable->sumOfNode - 1; if (pLinkTable->sumOfNode == 0) { pLinkTable->pTail = NULL; } return SUCCESS; } p = p->pNext; } return FAILURE;}tLinkTableNode* GetLinkTableHead(tLinkTable* pLinkTable){ if (pLinkTable == NULL || pLinkTable->pHead == NULL) { return NULL; } return pLinkTable->pHead;}tLinkTableNode* GetNextLinkTableNode(tLinkTable* pLinkTable, tLinkTableNode* pNode){ if (pLinkTable == NULL || pNode == NULL) { return NULL; } tLinkTableNode* p = pLinkTable->pHead; while (p != NULL) { if (p == pNode) { return p->pNext; } p = p->pNext; } return NULL;}#include #include #include #include "linktable.h"void help();void upper();void version();void lower();void add();void sub();void multi();void quit();#define CMD_MAX_LENGTH 128typedef struct Node{ tLinkTableNode* pNext; char* cmd; char* desc; void (*handler)();}tNode;tNode* FindCmd(tLinkTable* head, char* cmd){ tNode* pNode = (tNode*)GetLinkTableHead(head); while(pNode != NULL) { if(strcmp(pNode->cmd, cmd) == 0) { return pNode; } pNode = (tNode*)GetNextLinkTableNode(head, (tLinkTableNode*)pNode); } return NULL;}int ShowAllCmd(tLinkTable* head){ tNode* pNode = (tNode*) GetLinkTableHead(head); while(pNode != NULL) { printf("%10s ----- %s\n", pNode->cmd, pNode->desc); pNode = (tNode*)GetNextLinkTableNode(head, (tLinkTableNode*)pNode); } return 0;}typedef struct DataNode{ char* cmd; char* desc; void (*handler)(); struct DataNode *next;}tDataNode; tDataNode Head[] ={ {"help", "cmd tips.", help, &Head[1]}, {"version","show version of this menu.", version, &Head[2]}, {"quit", "exit cmd.", quit, &Head[3]}, {"upper", "change the case into uppercase Letters.", upper, &Head[4]}, {"lower", "change the case into lowercase Letters.", lower, &Head[5]}, {"sub", "subtraction of two numbers.", sub, &Head[6]}, {"add", "addition of two numbers.", add, &Head[7]}, {"multi", "multiplication of two numbers.", multi, NULL}};tLinkTable* InitMenuData(tDataNode* Head, int length){ tLinkTable* pLinkTable = CreateLinkTable(); int i; for(i=0; pLinkTable->sumOfNode < length; i++) { tNode* pNode = (tNode*)malloc(sizeof(tNode)); pNode->cmd = Head[i].cmd; pNode->desc = Head[i].desc; pNode->handler = Head[i].handler; AddLinkTableNode(pLinkTable, (tLinkTableNode*)pNode); } return pLinkTable;}int main(){ int i; tLinkTable* head = InitMenuData(Head, 8); char cmd[CMD_MAX_LENGTH]; while(1) { printf("menu cmd-> "); scanf("%s", cmd); tNode* p = FindCmd(head, cmd); if(p == NULL) { printf("error: Wrong command!\n"); } else { p->handler(); } } return 0;}void help(){ printf("+--------+---------------------------------+\n"); printf("+ help + cmd tips +\n"); printf("+ quit + exit cmd +\n"); printf("+ version+ show version +\n"); printf("+ upper + change the case into uppercase Letters +\n"); printf("+ lower + change the case into lowercase Letters +\n"); printf("+ sub + subtraction of two numbers +\n"); printf("+ add + addition of two numbers +\n"); printf("+ multi + multiplication of two numbers +\n"); printf("+--------+---------------------------------+\n");}void quit(){ exit(0);}void upper(){ int i; char arr[100]; printf("please input contents:"); scanf("%s", arr); for(i=0; arr[i]!='\0'; i++) { if(arr[i]>='A'&&arr[i]<='Z') arr[i]+=32; } printf("%s\n", arr);}void lower(){ int i; char arr[100]; printf("please input contents:"); scanf("%s", arr); for(i=0; arr[i]!='\0'; i++) { if(arr[i]>='a'&&arr[i]<='z') arr[i]-=32; } printf("%s\n", arr);}void version(){ printf("the version is 1.0.0\n");}void add(){ double num1,num2,count; printf("+-------*--------*--------*--------*-------+\n"); printf("please input two numbers:"); scanf("%lf %lf",&num1, &num2); char a; count = num1 + num2; a = '+'; printf("%lf %c %lf = %lf \n",num1, a, num2, count);}void sub(){ double num1,num2,count; printf("+-------*--------*--------*--------*-------+\n"); printf("please input two numbers:"); scanf("%lf %lf",&num1, &num2); char a; count = num1 - num2; a = '-'; printf("%lf %c %lf = %lf \n",num1, a, num2, count);}void multi(){ double num1,num2,count; printf("+-------*--------*--------*--------*-------+\n"); printf("please input two numbers:"); scanf("%lf %lf",&num1, &num2); char a; count = num1 * num2; a = '*'; printf("%lf %c %lf = %lf \n",num1, a, num2, count);}
3实验结果
实现的命令8个:
help帮助
version版本号
quit退出
upper将字符串中大写字母变小写
lower将字符串中小写字母变大写
add
sub
mult 分别计算两个数的加减乘
4.提交代码到版本库
二. 实验总结
1. 用可重用的链表模块来实现命令行菜单小程序,链表模块的接口设计足够通用
2.学习用Call-in函数方式遍历链表接口
3.学习DVT开发者验证模式
4.用for循环改进了视频中对于每一个命令都AddLinkTableNode一次的代码模式。。
5.解决了了实验过程中的bug,linktable.c忘了gcc编译..导致menu.c调用时找不到linktable.c里定义的方法
阅读全文
0 0
- 实验4
- 实验4
- 实验4
- 实验4
- 实验4
- 实验-4
- 实验4
- 实验4
- 实验4
- 第四章实验3.实验4
- 实验:C++实验4-项目6
- 实验:c++实验4-项目6
- 实验:C++实验4-项目6
- 实验:C++实验4-百钱百鸡问题
- 数据压缩原理实验4_实验报告
- 【实验报告】高软实验4
- 实验二线性表综合实验4
- 实验报告4 4
- rtklib使用kalman滤波进行高精度相对定位原理
- SwipyRefreshLayout 上拉刷新,下拉加载
- 2017年10月15日训练总结
- Ubuntu 14 安装scrapy
- MVP实现登录注册功能
- 实验4
- Detours的使用
- 枚举类型
- [OpenGL] shadow mapping(实时阴影映射)
- MarkDown语法学习
- Android相关简述题
- 函数指针
- Android之属性动画
- cocos2d-x js移植安卓 —— 填坑2 Animation.addSpriteFrame的问题