翻译计划

    小明初学者C++,它确定了四个算术、关系运算符、逻辑运算、颂值操作、输入输出、使用简单的选择和循环结构。但他的英语不是很好,记住太多的保留字,他利用汉语拼音的保留字,小屋C++,发明了一种表达自己思想的算法描写叙述规则。

    规则非常easy:他将開始程序头部以一个拼音名字标记,C++程序中的"{,}"用拼音“kaishi,jieshu”直观表示。选择和循环仅仅採用一种单一的结构,且保留字也分别用相应的拼音表示,只是在表示选择或循环条件时他去掉了多余的小括号;输入输出也用拼音表示。数据类型仅仅保留了整型(int)和实型(float),并用拼音表示,且按他的习惯变量在前,类型在后。

如今小明想请熟悉C++的你帮他写一个程序,将用他设计的算法描写叙述规则写成的算法。翻译成C++源代码。输入文件扩展名为.ming。输出文件扩展名为.cpp,例如以下例:

小明算法(test.ming):

chengxu1

kaishi

   i,j zhengxing;

   k   shixing;

   i=1;j=0;

   shuru k;  

   xunhuan i<10

   kaishi

      j=j+i;

      i++;

   jieshu

   ruguo j>10

   kaishi

     k=j*1.0/i;    

   jieshu  

   shuchu k,j;

jieshu

翻译成的C++源代码(test.cpp):

#include <iostream>

using namespace std;

int main()

{

    int i,j;

    float k;

    i=1;j=0;

    cin>>k;

    while( i<10)

    {

       j=j+i;

       i++;

    }

   if(j>10)

     k=j*1.0/i;

   cout<<k<<j;

    return 0;

}

參考代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #define max_size 30
  5. #define MaxNum 9
  6.  
  7. using namespace std;
  8.  
  9. string Ming[MaxNum]={
  10. "chengxu1",//
  11. "kaishi",
  12. "jieshu",
  13. "xunhuan",
  14. "shuru",
  15. "shuchu",
  16. "ruguo",
  17. "zhengxing",
  18. "shixing"
  19. };
  20. string Cpp[MaxNum]={
  21. "#include <iostream>\n#include <string>\nusing namespace std;\nvoid main()",
  22. "{",
  23. "}",
  24. "while(",
  25. "cin>>",
  26. "cout<<",
  27. "if(",
  28. "int",
  29. "float"
  30. };
  31.  
  32. void GetNextval(string &line,int nextval[])//对模式串求next[]值
  33. {
  34. int j=0,k=-1;
  35. nextval[0]=-1;
  36. while(j<line.length())
  37. {
  38. if(k==-1 || line[j]==line[k])//k为-1或字符相等时
  39. {
  40. j++;
  41. k++;
  42. if(line[j]!=line[k])
  43. nextval[j]=k;
  44. else
  45. nextval[j]=nextval[k];
  46. }
  47. else k=nextval[k];
  48. }
  49. }
  50.  
  51. int KMP(string &substr,string &line)//kmp算法实现
  52. {
  53. int sl=substr.length();
  54. int ll=line.length();
  55. int nextval[max_size],i=0,j=0;
  56. GetNextval(line,nextval);
  57. while(i< sl&& j<ll)
  58. {
  59. if(j==-1 || substr[i]==line[j])
  60. {
  61. i++;
  62. j++;
  63. }
  64. else
  65. {
  66. j=nextval[j];
  67. }
  68. sl=substr.length();
  69. ll=line.length();
  70. }
  71. if(j>=line.length())
  72. return (i-line.length());//返回匹配模式串的首字符下标
  73. else return -1;//返回不匹配标志
  74. }
  75. void Read(FILE *pf)
  76. {
  77.  
  78. FILE *pf2 = fopen("test.txt", "w");
  79. if(pf2 == NULL) {
  80. printf("文件写入失败!\n");
  81. fclose(pf);
  82. exit(0);
  83. }
  84.  
  85. char ch;
  86. while(!feof(pf)) {
  87. ch = fgetc(pf);
  88. putchar(ch);
  89. fputc(ch, pf2);
  90. }
  91.  
  92. fclose(pf2);
  93. fclose(pf);
  94.  
  95. cout<<"文件已成功写入!
  96.  
  97. "<<endl;
  98.  
  99. }
  100.  
  101. int main()
  102. {
  103. ifstream in("test.ming");
  104. string line;
  105. int next[max_size];
  106. ofstream output("test.cpp");//
  107. while(getline(in,line))//传參:文件。每一行
  108. {
  109.  
  110. bool fenhao;
  111. if(line[line.length()-1]==';')
  112. fenhao=true;
  113. else fenhao=false;
  114. bool go=false;
  115. for(int m=0;m<9;m++)
  116. {
  117. int i;
  118. int x=KMP(line,Ming[m]);
  119. if(x!=-1)
  120. {
  121. go=true;
  122. if(m==0||m==1)//chengxu1
  123. {
  124. for(i=0;i<x;i++)//kongge
  125. {
  126. output<<line[i];
  127. }
  128. output<<Cpp[m];
  129.  
  130. }
  131. /*else if(m==1)//kaishi
  132. {
  133. output<<Cpp[1];
  134.  
  135. }*/
  136. else if(m==3)//xunhuan
  137. {
  138. for(i=0;i<x;i++)//kongge
  139. {
  140. output<<line[i];
  141. }
  142. output<<Cpp[3];
  143. for(i=x+7;i<line.length();i++)
  144. {
  145. output<<line[i];
  146. }
  147. output<<")";
  148.  
  149. }
  150. else if(m==2)//jieshu
  151. {
  152. for(i=0;i<x;i++)
  153. {
  154. output<<line[i];
  155. }
  156. output<<Cpp[2];
  157.  
  158. }
  159. else if(m==4)//shuru
  160. {
  161. for(i=0;i<x;i++)//kongge
  162. {
  163. output<<line[i];
  164. }
  165. output<<Cpp[4];
  166. for(i=x+5;i<line.length();i++)
  167. {
  168. if(line[i]==',') output<<">>";
  169. else if(line[i]==';') break;
  170. else output<<line[i];
  171. }
  172.  
  173. }
  174. else if(m==5)//shuchu
  175. {
  176. for(i=0;i<x;i++)//kongge
  177. {
  178. output<<line[i];
  179. }
  180. output<<Cpp[5];
  181. for(int i=x+6;i<line.length();i++)
  182. {
  183. if(line[i]==',') output<<"<<";
  184. else if(line[i]==';') break;
  185. else output<<line[i];
  186.  
  187. }
  188.  
  189. }
  190. else if(m==6)//ruguo
  191. {
  192. for(i=0;i<x;i++)
  193. {
  194. output<<line[i];
  195. }
  196. output<<Cpp[6];
  197. for(i=x+5;i<line.length();i++)
  198. {
  199. output<<line[i];
  200. }
  201. output<<")";
  202. }
  203. else if(m==7)//zhengxing
  204. {
  205. for(i=0;i<x-4;i++)//kongge
  206. {
  207. output<<line[i];
  208. }
  209. output<<Cpp[7];
  210. for(i=0;i<x;i++)
  211. {
  212. output<<line[i];
  213. }
  214.  
  215. }
  216. else if(m==8)//shixing
  217. {
  218. for(i=0;i<x-4;i++)//kongge
  219. {
  220. output<<line[i];
  221. }
  222. output<<Cpp[8];
  223. for(i=0;i<x;i++)
  224. {
  225. output<<line[i];
  226. }
  227.  
  228. }
  229. else cout<<"文件读取错误。"<<endl;
  230. }
  231. }
  232. if(!go) output<<line;
  233. if(fenhao&&go) output<<";";
  234. output<<endl;
  235. }
  236. in.close();
  237. FILE *pf= fopen("test.cpp", "r");
  238. Read(pf);
  239. return 0;
  240. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

实验数据结构——KMP算法Test.ming的更多相关文章

  1. 数据结构--KMP算法总结

    数据结构—KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会, ...

  2. 数据结构——KMP算法

    算法介绍 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法).KMP算法的核心是利用 ...

  3. 数据结构-kmp算法

    定义 改进字符串的匹配算法 关键:通过实现一个包含了模式串的局部匹配信息的next()函数,利用匹配失败的信息,减少匹配次数. 1.BF算法 暴力匹配 给定 文本串S "BBC ABCDAB ...

  4. <数据结构>KMP算法

    next数组 定义 严格定义:next[i]表示使子串s[0...k] == s[i-k...i]的最大的k(前后缀可以重叠,但不能是s[0..i]本身) 含义:最长相等前后缀的下标,没有则赋-1 图 ...

  5. 大话数据结构——KMP算法(还存在问题)

    http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html /*#include& ...

  6. 数据结构KMP算法中手算next数组

    总结一下今天的收获(以王道数据结构书上的为例子,虽然我没看它上面的...):其中竖着的一列值是模式串前缀和后缀最长公共前缀. 最后求得的结果符合书上的结果,如果是以-1开头的话就不需要再加1,如果是以 ...

  7. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  8. 数据结构与算法--KMP算法查找子字符串

    数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...

  9. 【数据结构】KMP算法

    我还是不太懂... 转2篇大神的解释    1>https://www.cnblogs.com/yjiyjige/p/3263858.html     2>https://blog.csd ...

随机推荐

  1. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  2. cocos2D(四)---- CCSprite

    在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵.精灵也称为游戏对象,它能够用来表示游戏中的不论什么物体,比方敌人.子弹.甚至是一个背景图片.一段文字.CCSprite能够说是在co ...

  3. JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突

    文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 ...

  4. Android设计模式(二)--策略模式

    1.定义: The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inter ...

  5. PHP 报告分拣和生产理念

    原则排序报告 见一宝.一只猫的排序,我想照猫画虎,鼓捣自己一个. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VqaWFuZ3dlaTU2Nw==/f ...

  6. 通过Camera进行拍照

    Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...

  7. poj2378(树的dfs)

    题目链接:http://poj.org/problem?id=2378 题意:给一个树状图,有n个点.求出,去掉哪个点,使得剩下的每个连通子图中点的数量不超过n/2. 分析:num[u]表示以u为根节 ...

  8. Spring 类构造器初始化实例

    构造方法类Bean1 package com.hao947.bean; public class Bean1 { public Bean1() { System.out.println("b ...

  9. AlarmManager的学习与实现

    综述     这个类提供了一种使用系统提供的alarm服务.这个服务同意用户安排他们的应用程序在将来的某一个时间点执行.当设置的alarm响起,那么之前系统为这个alarm注冊的Intent就会自己主 ...

  10. Android自己定义控件实战——仿淘宝商品浏览界面

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38656929 用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个Scr ...