AC追求者 2024-02-07 15:12 采纳率: 0%
浏览 5

我·又回来了·!这次是来问问题的嘿嘿

我·又回来了·!这次是来问问题的嘿嘿·想知道c++怎么做

4.文档编辑(editor.cpp)
【问题描述】
让小明头痛的工作来了,现在有一篇字符文档,小明必须按照指令对它完成编辑工作;
当然,小明是通过控制光标来完成输入,删除,插入等;光标(不占字符)在文档的任意两
个连续字符之间,或者最前面(是指光标在第一个字符的左边);如果一开始,光标在文档
的最末尾(既最后一个字符的右边第一个位置),那么,通过一串指令,你能帮助小明处理
并得到最后编辑好的文档吗?
指令如下:
L:将光标左移一个字符(如果它在开头,则什么都不用做)
D:将光标右移一个字符(如果它在末尾,则什么都不用做)
B:删除它(光标)左边的一个字符(如果它在开头,则什么都不用做)
P$:在光标处插入字符$($可以是任意一个小写的英文字母),完成后光标在插入字的
3
右边;
【输入格式】
输入文件名为 editor.in。
输入文件有 n+2 行。
第一行:一篇文章,只包含小写的英文字母,并且长度不超过 100000;
下面一行是整数 n:表示编辑操作的次数;
以下 n 行:表示每一步的编辑操作;
【输出格式】
输出文件名为 editor.out。
输出文件为一个字符串,表示完成了所有的编辑操作后的文档。
【输入输出样例 1】
editor. in
dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z
editor.out
yxz
【输入输出样例 2】
editor. in
awffjzhmko
20
L
L
L
L
L
L
L
L
L
D
D
P x
P i
4
D
P c
P f
P o
P f
P q
P e
editor.out
awfxifcfofqejzhmko
【数据说明】
对于 100% 的数据,1<=n<=500000。

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-07 15:13
    关注

    引自免费微信小程序:皆我百晓生

    为了帮助你解决这个问题,我将提供一个C++程序的框架来实现这个文档编辑器的功能。由于篇幅较长,请允许我分段展示代码,并解释每个部分的作用。

    #include <iostream>
    #include <string>
    
    // 文档类用于存储文档内容和光标位置
    class Document {
    public:
        std::string content;
        int cursor;
    
        Document(const std::string& initial_content) : content(initial_content), cursor(content.size()) {}
    
        // 根据指令执行操作
        void applyOperation(char op, char insert_char = '\0') {
            switch (op) {
                case 'L':
                    moveLeft();
                    break;
                case 'D':
                    moveRight();
                    break;
                case 'B':
                    deleteCharLeft();
                    break;
                case 'P':  // 假设输入格式是"P "后跟插入字符
                    insertChar(insert_char);
                    break;
                default:
                    break;  // 忽略无效指令
            }
        }
    
    private:
        void moveLeft() {
            if (cursor > 0) {
                --cursor;
            }
        }
    
        void moveRight() {
            if (cursor < content.size()) {
                ++cursor;
            }
        }
    
        void deleteCharLeft() {
            if (cursor > 0) {
                content.erase(cursor - 1, 1);
            }
        }
    
        void insertChar(char ch) {
            content.insert(cursor, 1, ch);
            ++cursor;
        }
    };
    
    int main() {
        std::string input_document;
        std::cin >> input_document;
    
        int n_operations;
        std::cin >> n_operations;
    
        Document doc(input_document);
    
        for (int i = 0; i < n_operations; ++i) {
            char op;
            std::cin >> op;
    
            // 对于插入操作,读取要插入的字符
            if (op == 'P') {
                char insert_char;
                std::cin >> insert_char >> std::ws;  // 吃掉空白符
                doc.applyOperation(op, insert_char);
            } else {
                doc.applyOperation(op);
            }
        }
    
        std::cout << doc.content << std::endl;
    
        return 0;
    }
    

    注意:上述代码并未处理输入文件(editor.in)和输出文件(editor.out),而是直接从标准输入读取数据并输出到标准输出。在实际使用时,你需要根据题目要求调整IO方式,例如通过fstream处理文件读写。

    另外,在处理P x这类插入指令时,需要确保正确读取插入的字符。这里假设输入格式是P 后跟一个空格和一个字符,所以代码中用std::ws来吃掉多余的空白符。如果输入格式有所不同,请相应地修改这部分逻辑。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月7日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据