赞
踩
网易云课堂昵称:sa17225159
《软件工程(C编码实践篇)》MOOC课程作业 http://mooc.study.163.com/course/USTC-1000002006
1、代码风格规范:
代码风格的原则:简明、易读、无二义性;
缩进、命名、注释等代码编排的风格规范;
《 构建之法》4.1代码规范
高质量C++/C编程指南(林锐)2、具体要求(参照视频中的具体实验过程):
实现一个命令行的菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,实现的命令个数不少于8个;
类似ftp的help目录或者bash的help目录;
程序循环、接收用户的命令,如help、others等命令;
可以广泛通用的命令行菜单子系统组件,可方便地定制而嵌入到其他系统;
本次实验完成一个简单的命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,待实现的命令有(| 表示两个等效的命令):
1. help 【帮助命令,用于输出所有的命令及其说明】
2. time 【显示时间命令,用于显示当前系统的时间】
3. pwd 【显示路径信息,用于显示当前程序所在的系统路径】
4. add | + 【加法命令,用于两个整数的加法运算】
5. sub | - 【减法命令,用于两个整数的减法运算】
6. mul | * 【乘法命令,用于两个整数的乘法运算】
7. div | / 【除法命令,用于两个整数的除法运算】
8. quit | exit 【退出命令行程序】
1.建立远程仓库,并下载到本地,远程仓库地址:https://github.com/libaoquan95/seClass_lab2.git
git clone https://github.com/libaoquan95/seClass_lab2.git
2.创建 menu.c 源文件
vim menu.c
3.建立程序主体架构(main 函数)
main 函数使用循环一直接受用户输入的命令并调用相关函数处理命令,直至用户输入 quit 或 exit 命令退出程序。
#include <stdio.h>
int main ()
{
// store menu's commands
char cmd[256];
// processing commands
while(1)
{
// input a command
printf("$menu > ");
scanf("%s", cmd);
if(strcmp(cmd, "help") == 0) // help command
{
PrintCommand();
}
else if(strcmp(cmd, "time") == 0) // time command
{
PrintSystemTime();
}
else if(strcmp(cmd, "pwd") == 0) // pwd command
{
PrintCurrentWorkingDirectory();
}
else if(strcmp(cmd, "add") == 0 || strcmp(cmd, "+") == 0) // add command
{
printf("summarize is: %d\n", CalculateTwoNumber(0));
}
else if(strcmp(cmd, "sub") == 0 || strcmp(cmd, "-") == 0) // sub command
{
printf("subtractions is: %d\n", CalculateTwoNumber(1));
}
else if(strcmp(cmd, "mul") == 0 || strcmp(cmd, "*") == 0) // mul command
{
printf("multiplication is: %d\n", CalculateTwoNumber(2));
}
else if(strcmp(cmd, "div") == 0 || strcmp(cmd, "/") == 0) // div command
{
printf("division is: %d\n", CalculateTwoNumber(3));
}
else if(strcmp(cmd, "quit") == 0 || strcmp(cmd, "exit") == 0) // quit command
{
exit(0);
}
else // command is a error
{
printf("ERROR: This is not a command, you can input 'help' to find command\n");
}
}
return 0;
}
4.help 命令
help
命令用于打印程序所有的命令即命令的解释说明。当用户输入 help
后,由 main 函数判断命令并调用 PrintCommand 函数执行命令。
/**
* print all command and it's information
* @param none
* @return none
*/
void PrintCommand()
{
printf("-------------------------------------------------------------------\n");
printf("\t\t help: Print all command of menu\n");
printf("\t\t time: Show system time\n");
printf("\t\t pwd: Show current working directory\n");
printf("\t\t add|+: Calculate the summarize of the two integer numbers\n");
printf("\t\t sub|-: Calculate the subtractions of the two integer numbers\n");
printf("\t\t mul|*: Calculate the multiplication of the two integer numbers\n");
printf("\t\t div|/: Calculate the division of the two integer numbers\n");
printf("\t\t quit|exit: Exit menu program\n");
printf("-------------------------------------------------------------------\n");
}
程序截图:
5.time 命令
time
命令用于打印当前系统时间。当用户输入 time
后,由 main 函数判断命令并调用 PrintSystemTime 函数执行命令。
/**
* print current time
* @param none
* @return none
*/
void PrintSystemTime()
{
struct tm *ptr;
time_t it;
it = time(NULL);
ptr = localtime(&it);
printf("%4d年%02d月%02d日 %d:%d:%d\n", ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday,
ptr->tm_hour, ptr->tm_min,ptr->tm_sec);
}
程序截图:
6.pwd 命令
pwd
命令用于打印当前程序所在的系统路径。当用户输入 pwd
后,由 main 函数判断命令并调用 PrintCurrentWorkingDirectory 函数执行命令。
/**
* print current working directory path
* @param none
* @return none
*/
void PrintCurrentWorkingDirectory()
{
char buf[256];
getcwd(buf, sizeof(buf));
printf("当前路径: %s\n", buf);
}
程序截图:
7.add | + 命令 & sub | - 命令 & mul | * 命令 & div | / 命令
add
或 +
命令用于计算两个整数的和。当用户输入 add
或 +
后,由 main 函数判断命令并调用 CalculateTwoNumber函数,传入参数 0 后,执行命令。
sub
或 -
命令用于计算两个整数的和。当用户输入 sub
或 -
后,由 main 函数判断命令并调用 CalculateTwoNumber函数,传入参数 1 后,执行命令。
mul
或 *
命令用于计算两个整数的和。当用户输入 mul
或 *
后,由 main 函数判断命令并调用 CalculateTwoNumber函数,传入参数 2 后,执行命令。
div
或 /
命令用于计算两个整数的和。当用户输入 div
或 /
后,由 main 函数判断命令并调用 CalculateTwoNumber函数,传入参数 3 后,执行命令。
/**
* calculate two interage numbers
* @param operator: 0 is add, 1 is sub, 2 is mul, 3 is div
* @return calculate result
*/
int CalculateTwoNumber(int operator)
{
int num1 = 0, num2 = 0, num3 = 0;
printf("input number1:");
scanf("%d", &num1);
printf("input number2:");
scanf("%d", &num2);
switch(operator)
{
case 0:
num3 = num1 + num2;
break;
case 1:
num3 = num1 - num2;
break;
case 2:
num3 = num1 * num2;
break;
case 3:
if(num2 != 0)
{
num3 = num1 / num2;
}
else
{
printf("ERROR: don't division 0\n");
}
break;
default:
printf("ERROR: undefined operator\n");
break;
}
return num3;
}
程序截图:
8.quit | exit 命令
quit
或 exit
命令用于退出程序。当用户输入quit
或 exit
后,由 main 函数判断命令并调用 exit 函数执行命令。
9.输入了错误命令
10.上传代码至远程仓库
git add *
git status
git commit -m"a menu program"
git push -u origin master
远程仓库地址:https://github.com/libaoquan95/seClass_lab2.git
代码风格规范
代码风格的原则是:简明,易读,无二义性。
缩进: 4个空格比Tab键好。不用 Tab键的理由是Tab键在不同的情况下会显示不同的长度。4个空格的距离从可读性来说正好。
行宽: 行宽必须限制,但是以前有些文档规定的80字符行宽太小了(以前的计算机/打字机显示行宽为80字符),现在时代不同了,可为100字符。
括号: 在复杂的条件表达式中,用括号清楚地表示逻辑优先级。
断行与空白的{ }行: 程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{ }之内的代码块在‘{’右边4个空格处左对齐。
分行: 不要把多行语句放在一行上,更严格地说,不要把不同的变量定义在一行上。
命名:匈牙利命名,也可以用下划线用来分隔变量名字中的作用域标注和变量的语义。
注释和版权信息:不要注释程序是怎么工作的(How),注释是用来解释程序做什么(What),为什么这样做(Why),以及要特别注意的地方的。复杂的注释应该放在函数头。注释也要随着程序的修改而不断更新。另外,注释(包括所有源代码)应只用ASCII字符,不要用中文或其他特殊字符,它们会极大地影响程序的可移植性。每个源文件头应有版权描述等信息。
空格: 代码行内要适当多留空格,如操作符前后、参数之间等。
代码设计规范
代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C、C++、Java、C#),但是也有通用的原则。
函数: 现代程序设计语言中的绝大部分功能,都在程序的函数(Function, Method)中实现,关于函数最重要的原则是:只做一件事,但是要做好。
goto: 函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。
错误处理: 80%的程序代码,都是对各种已经发生和可能发生的错误的处理。如果错误会发生,那就让程序死的地方离错误产生的地方越近越好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。