软件工程课程实验报告:实验三

实验三:内部模块化的命令行菜单小程序V2.0

咖啡机《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006

在版本库根目录下新创建一个目录lab3完成实验。


一、实验要求
  • 注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑和菜单数据存储
  • 要求:
    a. 遵守代码风格规范,参考借鉴代码设计规范的一些方法;
    b. 代码的业务逻辑和数据存储使用不同的源文件实现,即应该有2个.c和一个.h作为接口文件。
  • 及时提交代码以防丢失
二、实验过程
1. 创建lab3文件夹

lab3

2. 编写程序
  • linklist.h
//定义菜单项数据结构
typedef struct DataNode
{
    char* cmd;
    char* desc;
    void (*handler)();
    struct DataNode *next;
}  tDataNode;
//在菜单列表*head中寻找与cmd相符的菜单项
tDataNode* FindCmd(tDataNode *head, char *cmd);
//显示所有菜单项
int ShowAllCmd(tDataNode *head);
  • linklist.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "linklist.h"

tDataNode* FindCmd(tDataNode *head, char *cmd)
{
    if(head == NULL || cmd == NULL)
    {
        return NULL;
    }
    tDataNode *p = head;
    while(p != NULL)
    {
        if(strcmp(p->cmd, cmd) == 0)
        {
            return p;
        }
        p = p->next;
    }
    return NULL;
}

int ShowAllCmd(tDataNode *head)
{
    tDataNode *p = head;
    while(p != NULL)
    {
        printf("%s  -  %s\n", p->cmd, p->desc);
        p = p->next;
    }
    return 0;
}
  • menu.c
    主程序如下:
int main ()
{
    char cmd[CMD_MAX_LEN];
    info();
    printf("Plesea input a command:\n");

    while (1)
    {
        printf(">>>");
        scanf("%s", cmd);
        tDataNode *p = FindCmd(head, cmd);
        if (p == NULL)
        {
            printf("Error: Wrong command!\n");
            printf("Type 'info' for available commands.\n");
        }
        printf("%s - %s\n", p->cmd, p->desc);
        if(p->handler != NULL)
        {
            p->handler();
        }
    }
    return 0;
}

数据模块分离:

#define CMD_MAX_LEN 128
#define DESC_LEN 1024
#define CMD_NUM 20

static tDataNode head[] =
{
    {"info", "Command Informations", info, &head[1]},
    {"plus", "result of a + b", plus, &head[2]},
    {"minus", "result of a - b", minus, &head[3]},
    {"multiply", "result of a * b", multiply, &head[4]},
    {"divide", "result of a / b", divide, &head[5]},
    {"power", "result of a ^ b", power, &head[6]},
    {"square", "result of square root of a", square, &head[7]},
    {"factorial", "result of a!", factorial, &head[8]},
    {"absolute", "result of |a|", absolute, &head[9]},
    {"quit", "end this program", quit, NULL},
};

菜单命令包括以下9种:
- 介绍命令信息info()
- 加法运算plus()
- 减法运算minus()
- 乘法运算multiply()
- 除法运算divide()
- 幂运算power()
- 平方根运算square()
- 阶乘运算factorial()
- 绝对值运算absolute()
- 退出quit()
限制于报告篇幅,以上命令的具体实现代码就不在文中贴出,烦请移步github工程中查看。

https://github.com/973301529/se/tree/master/lab3

3. 编译执行
  • 初始运行情况,info()介绍可用指令的相关信息
    这里写图片描述
  • 检测minus()、divide()、absolute()、quit()等指令的运行情况
    这里写图片描述
4. 将代码同步到github

这里写图片描述

三、实验总结

本次实验在上次实验的基础上更进一步,实现了代码的模块化,将代码的业务逻辑和数据存储分离。模块化有利于代码的修改、阅读,以后要将模块化的思想应用到实际的工作中去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 信号与系统是一门工程学科,研究信号的产生、传输、变换和处理的规律和方法。而MATLAB是一种强大的数学计算软件,广泛应用于信号与系统的分析和处理中。 清华大学的信号与系统的MATLAB综合实验课程旨在通过实际操作来深入理解信号与系统的相关知识。通过实验,学生可以学习如何使用MATLAB进行信号的产生、变换、滤波、频谱分析等操作。 在这门课程中,学生将学习如何使用MATLAB的函数和工具箱来处理各种类型的信号,例如连续时间信号和离散时间信号。学生将使用MATLAB来绘制信号的波形图、频谱图,并进行信号的数字滤波和系统的频率响应分析等。 此外,学生还将学习如何使用MATLAB进行系统的时域和频域分析,包括系统的单位脉冲响应、零极点分布、频率响应等。通过实验,学生可以加深对信号与系统的理论知识的理解,并提高MATLAB的应用能力。 综上所述,清华大学的信号与系统的MATLAB综合实验课程旨在通过实际操作来加深学生对信号与系统的理解和应用能力。通过该课程的学习,学生可以掌握MATLAB在信号与系统领域的应用技巧,为将来的工程实践打下坚实的基础。 ### 回答2: 信号与系统是电子信息类专业中的一门重要课程,主要研究信号的特性、信号的处理与分析方法以及系统的性质与特征等内容。清华大学在信号与系统课程中,通过实验项目的方式,帮助学生更好地理解并应用所学知识。 在这个综合实验中,学生将使用MATLAB软件进行实验。MATLAB是一种简单、灵活、强大的数学计算与数据可视化工具,被广泛应用于科学与工程领域。通过使用MATLAB,学生可以轻松实现信号与系统相关的各种计算和模拟。 在实验中,学生可能会接触到一些常见的信号处理和系统模型,例如滤波器设计、频谱分析、线性时不变系统等。他们需要运用所学的知识,结合MATLAB的编程功能,对这些信号和系统进行建模、分析和仿真。通过实际操作,学生将能够加深对信号与系统理论的理解,并且掌握解决实际问题的能力。 在完成实验的过程中,学生将面临一系列挑战和问题,需要动手解决。他们需要分析问题,并运用MATLAB编程知识解决实际情况。这将帮助他们提高问题解决能力、动手能力和团队合作能力。 实验后,学生将在实验报告中总结实验结果,并对实验中遇到的问题进行分析和讨论。这有助于学生对所学内容的巩固,并激发他们进一步探索信号与系统领域的兴趣。 综上所述,信号与系统的MATLAB综合实验对学生的信号与系统理论知识应用能力、编程能力和团队合作能力有着积极的促进作用。它为学生提供了一个锻炼和应用所学知识的机会,使他们能够更好地理解和掌握信号与系统的相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值