ccf-20170303--Markdown
我的想法如下图:
代码和题目如下:
问题描述
试题编号: | 201703-3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
试题名称: | Markdown | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
时间限制: | 1.0s | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
内存限制: | 256.0MB | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
问题描述: |
问题描述
Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的:
这些用 Markdown 写成的文本,尽管本身是纯文本格式,然而读者可以很容易地看出它的文档结构。同时,还有很多工具可以自动把 Markdown 文本转换成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面这段文本通过转化得到的 HTML 代码如下所示: 本题要求由你来编写一个 Markdown 的转换工具,完成 Markdown 文本到 HTML 代码的转换工作。简化起见,本题定义的 Markdown 语法规则和转换规则描述如下: ●区块:区块是文档的顶级结构。本题的 Markdown 语法有 3 种区块格式。在输入中,相邻两个区块之间用一个或多个空行分隔。输出时删除所有分隔区块的空行。 ○段落:一般情况下,连续多行输入构成一个段落。段落的转换规则是在段落的第一行行首插入 `<p>`,在最后一行行末插入 `</p>`。 ○标题:每个标题区块只有一行,由若干个 `#` 开头,接着一个或多个空格,然后是标题内容,直到行末。`#` 的个数决定了标题的等级。转换时,`# Heading` 转换为 `<h1>Heading</h1>`,`## Heading` 转换为 `<h2>Heading</h2>`,以此类推。标题等级最深为 6。 ○无序列表:无序列表由若干行组成,每行由 `*` 开头,接着一个或多个空格,然后是列表项目的文字,直到行末。转换时,在最开始插入一行 `<ul>`,最后插入一行 `</ul>`;对于每行,`* Item` 转换为 `<li>Item</li>`。本题中的无序列表只有一层,不会出现缩进的情况。 ●行内:对于区块中的内容,有以下两种行内结构。 ○强调:`_Text_` 转换为 `<em>Text</em>`。强调不会出现嵌套,每行中 `_` 的个数一定是偶数,且不会连续相邻。注意 `_Text_` 的前后不一定是空格字符。 ○超级链接:`[Text](Link)` 转换为 `<a href="Link">Text</a>`。超级链接和强调可以相互嵌套,但每种格式不会超过一层。 输入格式
输入由若干行组成,表示一个用本题规定的 Markdown 语法撰写的文档。
输出格式
输出由若干行组成,表示输入的 Markdown 文档转换成产生的 HTML 代码。
样例输入
# Hello
Hello, world! 样例输出
<h1>Hello</h1>
<p>Hello, world!</p> 评测用例规模与约定
本题的测试点满足以下条件:
●本题每个测试点的输入数据所包含的行数都不超过100,每行字符的个数(包括行末换行符)都不超过100。 ●除了换行符之外,所有字符都是 ASCII 码 32 至 126 的可打印字符。 ●每行行首和行末都不会出现空格字符。 ●输入数据除了 Markdown 语法所需,内容中不会出现 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 这些字符。 ●所有测试点均符合题目所规定的 Markdown 语法,你的程序不需要考虑语法错误的情况。 每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。
提示
由于本题要将输入数据当做一个文本文件来处理,要逐行读取直到文件结束,C/C++、Java 语言的用户可以参考以下代码片段来读取输入内容。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | #include<bits/stdc++.h> using namespace std; string Int_to_String( int n){ stringstream ss; ss<<n; return ss.str(); } void Operator_Spec(string & s){ int flagEm=0; int index; while ((index=s.find( '_' ))!=string::npos){ if (flagEm==0){ s.replace(index,1, "<em>" ); flagEm=1; } else { s.replace(index,1, "</em>" ); flagEm=0; } } while (s.find( "[" )!=string::npos&&s.find( "]" )!=string::npos&&s.find( "(" )!=string::npos&&s.find( ")" )!=string::npos){ string text= "" ,link= "" ; text=s.substr(s.find( "[" )+1,s.find( "]" )-s.find( "[" )-1); link=s.substr(s.find( "(" )+1,s.find( ")" )-s.find( "(" )-1); //<a href="Link">Text</a> string href= "<a href=\"" +link+ "\">" +text+ "</a>" ; s.replace(s.find( "[" ),s.find( ")" )-s.find( "[" )+1,href); } } int main(){ string temps= "" ; int flagUl=0; //标记是否出现ul例如列表 int flagP=0; //用于标记p段落 string result= "" ; string Total_Result= "" ; while (getline(cin,temps)){ if (temps!= "" ){ if (temps[0]== '#' ){ int headerCount=0; int i=0; while (temps[i]== '#' ){ i++; } headerCount=i; result= "<h" +Int_to_String(headerCount)+ ">" ; while (temps[i]== ' ' ){ i++; } result=result+temps.substr(i,temps.length()-i); result+= "</h" +Int_to_String(headerCount)+ ">" ; } else if (temps[0]== '*' ){ if (flagUl==0){ result+= "<ul>\n" ; flagUl=1; } int i=1; while (temps[i]== ' ' ){ i++; } result=result+ "<li>" +temps.substr(i,temps.length()-i)+ "</li>" + "\n" ; } else { //cout<<"flagP:"<<flagP<<endl; if (flagP==0){ result+= "<p>" ; flagP=1; } result+=temps+ "\n" ; } } else { if (flagUl==0&&flagP==0){ Operator_Spec(result); //Total_Result+=result; cout<<result<<endl; result= "" ; } else { if (flagUl==1){ Operator_Spec(result); //Total_Result=Total_Result+result+"</ul>"; cout<<result<< "</ul>" <<endl; flagUl=0; result= "" ; } if (flagP==1){ result=result.substr(0,result.length()-1); Operator_Spec(result); //Total_Result=Total_Result+result+"</p>"; cout<<result+ "</p>" <<endl; flagP=0; result= "" ; } } } // temps=""; } if (temps!= "" ){ //最后还会遗留一个区块,不能忽略这种情况 if (temps[0]== '#' ){ int headerCount=0; int i=0; while (temps[i]== '#' ){ i++; } headerCount=i; result= "<h" +Int_to_String(headerCount)+ ">" ; while (temps[i]== ' ' ){ i++; } result=result+temps.substr(i,temps.length()-i); result+= "</h" +Int_to_String(headerCount)+ ">" ; } else if (temps[0]== '*' ){ if (flagUl==0){ result+= "<ul>\n" ; flagUl=1; } int i=1; while (temps[i]== ' ' ){ i++; } result=result+ "<li>" +temps.substr(i,temps.length()-i)+ "</li>" + "\n" ; } else { //cout<<"flagP:"<<flagP<<endl; if (flagP==0){ result+= "<p>" ; flagP=1; } result+=temps+ "\n" ; } } else { if (flagUl==0&&flagP==0){ Operator_Spec(result); //Total_Result+=result; cout<<result<<endl; result= "" ; } else { if (flagUl==1){ Operator_Spec(result); //Total_Result=Total_Result+result+"</ul>"; cout<<result<< "</ul>" <<endl; flagUl=0; result= "" ; } if (flagP==1){ result=result.substr(0,result.length()-1); Operator_Spec(result); //Total_Result=Total_Result+result+"</p>"; cout<<result+ "</p>" <<endl; flagP=0; result= "" ; } } } //cin.get(); //cout<<Total_Result<<endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2016-03-07 利用链表来实现对员工信息的存储,排序,删除,插入