2024.11.15(周五)

news/2024/11/18 8:07:30/文章来源:https://www.cnblogs.com/Sunyiran/p/18551574

某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。

实验要求:

1. 提交类图;

2. 提交源代码;

3. 注意编程规范。

 

 

1、类图

 

 

2、源代码

#include<iostream>

#include<stack>

using namespace std;

int num=0;

class AbstractCommand {

public:

    virtual int execute(int value)=0;

    virtual int undo()=0;

    virtual int redo()=0;

};

class Adder {

 

public:

    int add(int value) {

        num+=value;

        return num;

    }

};

class AddCommand :public AbstractCommand {

private:

    Adder *adder;

    stack<int> unStack;

    stack<int> reStack;

public:

    int undo() {

        //adder= new Adder();

        int i=0;

        if (unStack.empty()) {

            i=-1;

        }else{

            int pop = unStack.top();

            reStack.push(pop);

            unStack.pop();

            if(!unStack.empty()){//判断弹出数据后是否为空,如果为空,说明已撤回到最原始状态

                i=unStack.top();

            }

        }

 

        return i;

    }

    int redo() {

        //adder= new Adder();

         int i=0;

         if (reStack.empty()) {

             i=-1;

         }else{//撤回时只要可以可以撤回,则返回栈一定有数据

            // reStack.pop();

 

             int pop = reStack.top();

             reStack.pop();

             unStack.push(pop);

             i=pop;

 

         }

         return i;

     }

     int execute(int value) {

 

         int v = 0;

         if (unStack.empty()) {// 说明还没有数据

             v = adder->add(value);

             unStack.push(v);

         } else {// 需要更新两个栈中的内容,并计算结果,其中返回栈应该更新,重复栈应该清空

             v = adder->add(value);

             unStack.push(v);

             if (!reStack.empty()) {

                 for (int i = 0; i < reStack.size(); i++) {

                    // reStack.top();

                     //reStack.pop();

                 }

             }

         }

         return v;

     }

};

class CalculatorForm {

private:

    AbstractCommand *command;

public:

    void setCommand(AbstractCommand *command) {

        this->command =command;

    }

    void compute(int value) {

        command->execute(value);

    }

    void undo() {

        int i = command->undo();

        if(i==-1){

            cout<<"缓存中已不存在数据"<<endl;

        }else{

            cout<<"执行成功,运算结果是:"<<i<<endl;

        }

    }

    void redo() {

        int i = command->redo();

        if(i==-1){

            cout<<"已恢复至最新数据"<<endl;

        }

        else{

            cout<<"执行成功,运算结果是:"<<i<<endl;

        }

    }

};

int main(){

    CalculatorForm *form = new CalculatorForm();

    AddCommand *command = new AddCommand();

    form->setCommand(command);

    //计算

    cout<<"------计算过程------"<<endl;

    form->compute(1);

    form->compute(2);

    form->compute(3);

    form->compute(4);

    //多次撤回

    cout<<"------撤回过程------"<<endl;

    form->undo();

    form->undo();

    form->undo();

    form->undo();

    form->undo();

    //多次恢复

    cout<<"------恢复过程------"<<endl;

    form->redo();

    form->redo();

    form->redo();

    form->redo();

    form->redo();

    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835983.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

2024.11.13(周三)

婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。 实验要求: 1. 提交类图; 2. 提交源代码; 3. 注意编程规范。1、类图2、源代码 #include <iostr…

读数据质量管理:数据可靠性与数据质量问题解决之道07异常检测

异常检测1. 监控和异常检测 1.1. 在数据方面,所有明面上的测试和数据质量检查都不能完全保护你免受数据宕机的影响1.1.1. 宕机可能由于各种原因而出现在管道内部和外部的各个阶段1.1.2. 这些原因通常与数据本身无关1.2. 要了解数据何时中断,最好的做法是依靠数据监控,特别是…

2024.11.18 鲜花

浅谈多线程浅谈多线程打上花火 あの日(ひ)见渡(みわた)した渚(なぎさ)を 那天所眺望的海岸 a no hi mi wa ta shi ta na gi sa wo 今(いま)も思(おも)い出(だ)すんだ 直至今日仍能想起 i ma mo o mo i da su n da 砂(すな)の上(うえ)に刻(きざ)んだ言叶(ことば) 在沙滩上刻下的…

Rocky9.3安装snipe-it

全新安装最小化rocky 使用root用户登入系统,避免之后麻烦 安装几个工具yum -y install net-tools wget vim gcc按照官方文档要求安装必须的软件我们首先安装一下php,因为现在仓库中的php版本不满足8.1以上的要求,所以我们到php官网下载8.3.13使用wget下载到根目录下的tmp好了…

【圆圆的日语教室】日语入门第2课-平假名的书写+了解日本

第二课 相似的假名平假名的书写あ (a) 的书写第二笔不要太直,它是从草书演变过来的,特点是圆润有弧度 第三笔要交叉 长得像“安”い (i) 的书写第一笔要勾上去う (u) 的书写第一笔:点第二笔:起笔不要太平,先往上走再往下拐。联想记忆:u住耳朵え (e) 的书写联想:e,见到一…

Scrum 冲刺博客-day3

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 Scrum 冲刺博客-day3团队成员 梁志聪 李永杰 曾繁曦一、会议照片二、工作情况成员 昨天已完成工作 今日计划工作梁志聪 编写主菜单,人物移动相关代码 设计障碍物,实现人物碰撞李永杰 构思大…

基于RDK X5的智慧交通监控系统

本Blogs同步发表至CSDN:https://blog.csdn.net/xiongqi123123/article/details/143840675?sharetype=blogdetail&sharerId=143840675&sharerefer=PC&sharesource=xiongqi123123&spm=1011.2480.3001.8118 一、项目背景在当前高等教育普及化、大学持续扩招的宏…

【ai+模型】五大主流开源大模型RAG评估框架详解

RAG 评估的挑战 增强检索生成技术(Retrieval Augmented Generation,简称 RAG)目前正成为增强大语言模型(LLM)性能的核心手段。该技术通过将外部知识库融入LLM,大幅提升了大模型的精确度和对上下文的感知力。然而,对 RAG 系统性能的评测颇具挑战,这促使了一系列开源 RAG…

【待发】CyberEdge:简洁而强大的互联网资产测绘工具

免责声明 利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,创作者及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介: CyberEdge是一款精心设计的互联网资产测绘工具,为网络安全专业人士提供精准、高效的扫描体验。 核心特性: 全…

Spring Security 认证授权(黑马讲义)

1.基本概念 1.1.什么是认证 用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。 1.2.什么是授…

SkyWalking 安装部署操作指引

环境 CentOS-7-x86_64-DVD-2009.iso https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso apache-skywalking-apm-10.0.1.tar.gz https://dlcdn.apache.org/skywalking/10.0.1/apache-skywalking-apm-10.0.1.tar.gz jdk-11.0.23_linux-x64_bin.tar.…