tmp

发布时间 2023-11-04 23:19:02作者: Light-Chaser

// 修改后的代码示例
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;

// 定义一个结构体,表示思维导图的一个节点
struct Node {
string content; // 节点的内容
vector<Node*> children; // 节点的子节点
Node(string c) : content(c) {} // 构造函数,初始化内容
};

// 定义一个辅助函数,根据思维导图的节点,当前层数和最大层数生成HTML字符串
string generateHTMLHelper(Node* node, int level, int maxLevel) {
if (node == NULL) return ""; // 如果节点为空,返回空字符串
string html = ""; // 定义一个字符串,用于存储HTML字符串
int fontSize = 25 + (maxLevel - level) * 5; // 根据层数和最大层数计算字号
html += "<h" + to_string(level + 1) + " style=\"font-size: " + to_string(fontSize) + "px;\">"; // 根据层数生成标题标签,并设置字号
for (int i = 0; i < level; i++) { // 根据层数生成缩进
html += "&nbsp;&nbsp;&nbsp;&nbsp;"; // 每一层缩进四个空格
}
html += node->content + "</h" + to_string(level + 1) + ">\n"; // 添加节点的内容和结束标签
for (int i = 0; i < node->children.size(); i++) { // 遍历节点的子节点
Node* child = node->children[i]; // 获取第i个子节点
html += generateHTMLHelper(child, level + 1, max(maxLevel, level + 1)); // 递归调用辅助函数,根据子节点,层数加一,和更新后的最大层数生成HTML字符串
}
return html; // 返回HTML字符串
}

// 定义一个函数,根据输入的字符串创建一个思维导图
Node* createMindMap(string input) {
Node* root = new Node("思维导图"); // 创建根节点
stack<Node*> st; // 创建一个栈,用于存储当前的父节点
st.push(root); // 将根节点入栈
int i = 0; // 用于遍历输入字符串的索引
while (i < input.size()) {
if (input[i] == '{') { // 如果遇到左大括号,表示开始一个新的子节点
i++; // 索引后移
string content = ""; // 用于存储子节点的内容
while (i < input.size() && input[i] != '{' && input[i] != '}' && input[i] != '\\') { // 遍历直到遇到左大括号,右大括号,反斜杠或字符串结束
content += input[i]; // 将字符加入到内容中
i++; // 索引后移
}
Node* child = new Node(content); // 创建一个新的子节点
st.top()->children.push_back(child); // 将子节点加入到当前父节点的子节点列表中
st.push(child); // 将子节点入栈,作为新的父节点
i--; // 索引后退,以便下一次循环处理
} else if (input[i] == '}') { // 如果遇到右大括号,表示结束一个子节点
st.pop(); // 将栈顶的父节点出栈
} else if (input[i] == '\\') { // 如果遇到反斜杠,表示同一层有多个子节点
st.pop(); // 将栈顶的父节点出栈
i++; // 索引后移
string content = ""; // 用于存储子节点的内容
while (i < input.size() && input[i] != '{' && input[i] != '}' && input[i] != '\\') { // 遍历直到遇到左大括号,右大括号,反斜杠或字符串结束
content += input[i]; // 将字符加入到内容中
i++; // 索引后移
}
Node* child = new Node(content); // 创建一个新的子节点
st.top()->children.push_back(child); // 将子节点加入到当前父节点的子节点列表中
st.push(child); // 将子节点入栈,作为新的父节点
i--; // 索引后退,以便下一次循环处理
}
i++; // 索引后移
}
return root; // 返回根节点
}

// 定义一个函数,根据思维导图的根节点,生成一个HTML格式的字符串
string generateHTML(Node* root) {
string html = "<!DOCTYPE html>\n"; // HTML文档声明
html += "<html>\n"; // HTML标签开始
html += "<head>\n"; // 头部标签开始
html += "<style>\n"; // 样式标签开始
html += "body {font-family: 华文楷体;}\n"; // 设置正文的字体为华文楷体
html += "</style>\n"; // 样式标签结束
html += "</head>\n"; // 头部标签结束
html += "<body>\n"; // 正文标签开始
html += generateHTMLHelper(root, 0, 0); // 调用辅助函数,根据根节点,当前层数和最大层数生成HTML字符串
html += "</body>\n"; // 正文标签结束
html += "</html>\n"; // HTML标签结束
return html; // 返回HTML字符串
}

 

// 定义一个函数,将HTML字符串写入到文件中
void writeToFile(string html, string filename) {
ofstream fout(filename); // 创建一个输出文件流,打开文件
if (fout.is_open()) { // 如果文件打开成功
fout << html; // 将HTML字符串写入到文件中
fout.close(); // 关闭文件
} else { // 如果文件打开失败
cout << "无法打开文件" << filename << endl; // 输出错误信息
}
}
// 主函数
int main() {
// 输入规则:每一级结构中间用大括号连接,例如{一级结构{二级结构{三级结构}}}
// 输入样例:{C++{基本语法{变量,常量,运算符,表达式,语句,函数}}{面向对象{类,对象,继承,多态,封装,抽象}}{标准库{输入输出,字符串,容器,算法,迭代器}}}
string input; // 定义一个字符串,用于存储输入
cout << "请输入思维导图的内容,按照输入规则格式化:" << endl; // 输出提示信息
getline(cin, input); // 从标准输入读取一行字符串,赋值给input
Node* root = createMindMap(input); // 调用函数,根据输入创建一个思维导图
string html = generateHTML(root); // 调用函数,根据思维导图生成一个HTML字符串
string filename = "mindmap.html"; // 定义一个字符串,表示文件名
writeToFile(html, filename); // 调用函数,将HTML字符串写入到文件中
cout << "思维导图已保存为" << filename << "文件,您可以用浏览器打开查看。" << endl; // 输出提示信息
system("pause");
system("start mindmap.html");
return 0; // 返回0,表示程序正常结束
}