软件工程(C编码实践篇) 第二次作业实验报告

网易云课堂昵称:sa17225159
《软件工程(C编码实践篇)》MOOC课程作业 http://mooc.study.163.com/course/USTC-1000002006

实验二:命令行菜单小程序V1.0

实验要求

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 命令
quitexit 命令用于退出程序。当用户输入quitexit 后,由 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%的程序代码,都是对各种已经发生和可能发生的错误的处理。如果错误会发生,那就让程序死的地方离错误产生的地方越近越好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值