分类: 项目管理
2017-05-07 18:49:40
【郭昌明SA16225079+】
$ cd shiyanlou_cs122 $ mkdir lab3 $ cd lab3
此步骤与实验二的vim设置步骤相同,不再赘述。
menu.c
#include #include #include "linklist.h" void help(); void pwd(); void ls(); void ps(); void date(); void author(); void code(); void quit(); #define CMD_MAX_LEN 128 #define DESC_LEN 1024 #define CMD_NUM 10 static tDataNode head[] =
{
{"help", "Show the help information.", help, &head[1]},
{"pwd", "Print working directory.", pwd, &head[2]},
{"ls", "List the file.", ls, &head[3]},
{"ps", "List the Process.", ps, &head[4]},
{"date", "Show the current date.", date, &head[5]},
{"author", "Show the author information.", author, &head[6]},
{"code", "Print the code.", code, &head[7]},
{"quit", "Quit from the menu.", quit, NULL}
}; int main() { while(1)
{ char cmd[CMD_MAX_LEN]; printf("*******************\n"); printf("Snowball's MENU:\n"); printf("Please input a comand:\n"); scanf("%s", cmd);
tDataNode *p = FindCmd(head,cmd); if(p == NULL)
{ printf("WRONG COMMAND!\n"); continue;
} printf("%s - %s\n",p->cmd, p->desc); if(p->handler != NULL)
{
p->handler();
}
} return 0;
} void help() {
ShowAllCmd(head);
} void pwd() {
system("pwd");
} void ls() {
system("ls");
} void ps() {
system("ps");
} void date() {
system("date");
} void author() { printf("The code is written by Snowball Wang.\nCopyright Reserved.\n");
} void code() { char c;
FILE *fp = NULL;
fp = fopen("menu.c","r"); if(fp == NULL)
{ printf("Error: menu.c does not exist at all!");
} while(fscanf(fp,"%c",&c) != EOF)
{ printf("%c",c);
}
fclose(fp);
fp = NULL;
} void quit() { exit(0);
}
linklist.h
typedef struct DataNode
{ char* cmd; char* desc; void (*handler)(); struct DataNode* next;
}tDataNode; tDataNode* FindCmd(tDataNode *head, char* cmd); int ShowAllCmd(tDataNode* head);
linklist.c
#include #include #include "linklist.h" tDataNode* FindCmd(tDataNode* head, char* cmd) {
tDataNode *p = head; if(head == NULL ||cmd == NULL)
{ return NULL;
} while(p != NULL)
{ if(strcmp(p->cmd, cmd) == 0)
{ return p;
}
p = p->next;
} return NULL;
} int ShowAllCmd(tDataNode* head) { printf("---------------------\n"); printf("Menu List:\n");
tDataNode *p = head; while(p != NULL)
{ printf("%s - %s\n", p->cmd, p->desc);
p = p->next;
} return 0;
}
程序编写思想阐述 : 通过链接,实现对命令小程序的命令设计的模块化,如果需要在命令行小程序中继续添加命令,则只需修改链表,添加新的结点即可。删除命令反之亦然。由此,命令行小程序的扩展性得到了显著提高,这也是模块化思想的好处。
关于模块化(Modularity)的学习和理解,参照,总结如下:
代码设计中的一些常见方法:
- 1.KISS原则(keep it simple&stupid) 一个函数或者方法只做一件事
- 2.Using design to frame the code 设计与实现要保持一致
- 3.Including pseudocode: 包含伪代码
- 4.不要和陌生人说话原则
- 5.合理利用Control structures、Data structures来简化代码 通过总结代码中的各类数据的规律,来定义合适的数据结构
- 6.一定要有错误处理 20/80定律 前80%的代码只花了20%的时间,而剩下的20%的代码则花了其余的80%的时间,这80%的时间绝大部分是在进行错误处理
牢记一点:代码风格规范是程序员的基本素养!
解决方案:
$ git push http://git.shiyanlou.com/[用户名]/shiyanlou_cs[课程名].git
我出错的原因就在于没有在对应的链接后面加上.git,导致无法解析链接。