zoukankan      html  css  js  c++  java
  • c语言夜未眠2——实现撤销和重做

    撤销和重做

    一般来说,编辑操作的软件都有撤销和重做的功能。

    首先要明白,这究竟是怎样的一个功能。那word来说把,我们连续输入三个字,然后可以撤销3次,再可以重做3次,在未输入之前,是不能撤销和重做的。然后你输入了,这时可以撤销了,但仍然不能重做。也就是说,只有你撤销后才可以重做。但是不是你撤销多少次就可以重做多少次呢,这要看是不是紧接着做完撤销就重做。例如,当你撤销三个字之后,你紧接着输入一个字,此时并不能进行重做操作。不会因为你之前撤销过三次就可以重做三次,事实上,当你撤销三次后,确实可以重做三次,但一定是紧接着进行的,而且重做的次数是当前撤销的次数,和之前的撤销次数没有任何关系。在不考虑撤销次数限制的情况下,当前有多少文字就可以撤销多少次。重做和输入都可以增加撤销数,而只有撤销可以增加重做数。但输入时,重做数为0。

    Ok,明白以上特点后,就可以来实现撤销和重做了。可以看到,后输入的将先撤销,后撤销的将先重做。数据结构就是栈。因此我们可以创建一个最多可以连续撤销100次的栈,名为record[100]。Top为栈顶指针。初始值为-1。接下来就是定义两个变量,分别为undoNum,redoNum。分别表示可撤销次数和重做次数。

    接下来就是写三个重要的函数,分别为AddRecord(),Undo(),Redo();

    当我们添加内容时,同时也向栈中添加,调用AddRecord函数,栈顶指针,undoNum都增加。

    top = (top >= 99)? 0: ++top;

    undoNum = (undoNum >=100) ? 100:++undoNum;

    因为一旦有输入,就不可以重做了,因此, 我们可以在这里让redoNum = 0;

    当undo时,栈顶指针下移,可撤销次数减少。同时重做次数增加。

    Redo时,undoNum次数又增加,但有一点要注意,如果redoNum= 0写在了AddRecord()里,那么redo时不要调用该函数,否则你不管撤销多少次,你只能重做一次。

    一个简单的撤销和重做就这样实现了。我现在也是一个初学编程的人。欢迎大家来交流。


    我的blog:http://blog.csdn.net/booirror 

    我的邮箱:booirror@163.com


  • 相关阅读:
    Team--时代团队第一次团队项目---基于大作业的思考
    敏捷软件开发
    求一个二维数组的最大子矩阵
    电梯调度分析(二)
    一个简单算法的设计(一个数组中连续区间和的最大值)
    电梯调度算法(-)
    "top k"问题的深入探讨
    js中判断对象是否为空的方法
    Spring Security 3.x 完整入门教程
    Filter 过滤器
  • 原文地址:https://www.cnblogs.com/booirror/p/3604326.html
Copyright © 2011-2022 走看看