实验数据结构——KMP算法Test.ming
翻译计划
小明初学者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;
}
參考代码:
- #include <iostream>
- #include <string>
- #include <fstream>
- #define max_size 30
- #define MaxNum 9
- using namespace std;
- string Ming[MaxNum]={
- "chengxu1",//
- "kaishi",
- "jieshu",
- "xunhuan",
- "shuru",
- "shuchu",
- "ruguo",
- "zhengxing",
- "shixing"
- };
- string Cpp[MaxNum]={
- "#include <iostream>\n#include <string>\nusing namespace std;\nvoid main()",
- "{",
- "}",
- "while(",
- "cin>>",
- "cout<<",
- "if(",
- "int",
- "float"
- };
- void GetNextval(string &line,int nextval[])//对模式串求next[]值
- {
- int j=0,k=-1;
- nextval[0]=-1;
- while(j<line.length())
- {
- if(k==-1 || line[j]==line[k])//k为-1或字符相等时
- {
- j++;
- k++;
- if(line[j]!=line[k])
- nextval[j]=k;
- else
- nextval[j]=nextval[k];
- }
- else k=nextval[k];
- }
- }
- int KMP(string &substr,string &line)//kmp算法实现
- {
- int sl=substr.length();
- int ll=line.length();
- int nextval[max_size],i=0,j=0;
- GetNextval(line,nextval);
- while(i< sl&& j<ll)
- {
- if(j==-1 || substr[i]==line[j])
- {
- i++;
- j++;
- }
- else
- {
- j=nextval[j];
- }
- sl=substr.length();
- ll=line.length();
- }
- if(j>=line.length())
- return (i-line.length());//返回匹配模式串的首字符下标
- else return -1;//返回不匹配标志
- }
- void Read(FILE *pf)
- {
- FILE *pf2 = fopen("test.txt", "w");
- if(pf2 == NULL) {
- printf("文件写入失败!\n");
- fclose(pf);
- exit(0);
- }
- char ch;
- while(!feof(pf)) {
- ch = fgetc(pf);
- putchar(ch);
- fputc(ch, pf2);
- }
- fclose(pf2);
- fclose(pf);
- cout<<"文件已成功写入!
- "<<endl;
- }
- int main()
- {
- ifstream in("test.ming");
- string line;
- int next[max_size];
- ofstream output("test.cpp");//
- while(getline(in,line))//传參:文件。每一行
- {
- bool fenhao;
- if(line[line.length()-1]==';')
- fenhao=true;
- else fenhao=false;
- bool go=false;
- for(int m=0;m<9;m++)
- {
- int i;
- int x=KMP(line,Ming[m]);
- if(x!=-1)
- {
- go=true;
- if(m==0||m==1)//chengxu1
- {
- for(i=0;i<x;i++)//kongge
- {
- output<<line[i];
- }
- output<<Cpp[m];
- }
- /*else if(m==1)//kaishi
- {
- output<<Cpp[1];
- }*/
- else if(m==3)//xunhuan
- {
- for(i=0;i<x;i++)//kongge
- {
- output<<line[i];
- }
- output<<Cpp[3];
- for(i=x+7;i<line.length();i++)
- {
- output<<line[i];
- }
- output<<")";
- }
- else if(m==2)//jieshu
- {
- for(i=0;i<x;i++)
- {
- output<<line[i];
- }
- output<<Cpp[2];
- }
- else if(m==4)//shuru
- {
- for(i=0;i<x;i++)//kongge
- {
- output<<line[i];
- }
- output<<Cpp[4];
- for(i=x+5;i<line.length();i++)
- {
- if(line[i]==',') output<<">>";
- else if(line[i]==';') break;
- else output<<line[i];
- }
- }
- else if(m==5)//shuchu
- {
- for(i=0;i<x;i++)//kongge
- {
- output<<line[i];
- }
- output<<Cpp[5];
- for(int i=x+6;i<line.length();i++)
- {
- if(line[i]==',') output<<"<<";
- else if(line[i]==';') break;
- else output<<line[i];
- }
- }
- else if(m==6)//ruguo
- {
- for(i=0;i<x;i++)
- {
- output<<line[i];
- }
- output<<Cpp[6];
- for(i=x+5;i<line.length();i++)
- {
- output<<line[i];
- }
- output<<")";
- }
- else if(m==7)//zhengxing
- {
- for(i=0;i<x-4;i++)//kongge
- {
- output<<line[i];
- }
- output<<Cpp[7];
- for(i=0;i<x;i++)
- {
- output<<line[i];
- }
- }
- else if(m==8)//shixing
- {
- for(i=0;i<x-4;i++)//kongge
- {
- output<<line[i];
- }
- output<<Cpp[8];
- for(i=0;i<x;i++)
- {
- output<<line[i];
- }
- }
- else cout<<"文件读取错误。"<<endl;
- }
- }
- if(!go) output<<line;
- if(fenhao&&go) output<<";";
- output<<endl;
- }
- in.close();
- FILE *pf= fopen("test.cpp", "r");
- Read(pf);
- return 0;
- }
版权声明:本文博主原创文章,博客,未经同意不得转载。
实验数据结构——KMP算法Test.ming的更多相关文章
- 数据结构--KMP算法总结
数据结构—KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会, ...
- 数据结构——KMP算法
算法介绍 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法).KMP算法的核心是利用 ...
- 数据结构-kmp算法
定义 改进字符串的匹配算法 关键:通过实现一个包含了模式串的局部匹配信息的next()函数,利用匹配失败的信息,减少匹配次数. 1.BF算法 暴力匹配 给定 文本串S "BBC ABCDAB ...
- <数据结构>KMP算法
next数组 定义 严格定义:next[i]表示使子串s[0...k] == s[i-k...i]的最大的k(前后缀可以重叠,但不能是s[0..i]本身) 含义:最长相等前后缀的下标,没有则赋-1 图 ...
- 大话数据结构——KMP算法(还存在问题)
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html /*#include& ...
- 数据结构KMP算法中手算next数组
总结一下今天的收获(以王道数据结构书上的为例子,虽然我没看它上面的...):其中竖着的一列值是模式串前缀和后缀最长公共前缀. 最后求得的结果符合书上的结果,如果是以-1开头的话就不需要再加1,如果是以 ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 数据结构与算法--KMP算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- 【数据结构】KMP算法
我还是不太懂... 转2篇大神的解释 1>https://www.cnblogs.com/yjiyjige/p/3263858.html 2>https://blog.csd ...
随机推荐
- java 状态模式 解说演示样例代码
package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...
- cocos2D(四)---- CCSprite
在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵.精灵也称为游戏对象,它能够用来表示游戏中的不论什么物体,比方敌人.子弹.甚至是一个背景图片.一段文字.CCSprite能够说是在co ...
- JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突
文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 ...
- Android设计模式(二)--策略模式
1.定义: The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inter ...
- PHP 报告分拣和生产理念
原则排序报告 见一宝.一只猫的排序,我想照猫画虎,鼓捣自己一个. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VqaWFuZ3dlaTU2Nw==/f ...
- 通过Camera进行拍照
Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...
- poj2378(树的dfs)
题目链接:http://poj.org/problem?id=2378 题意:给一个树状图,有n个点.求出,去掉哪个点,使得剩下的每个连通子图中点的数量不超过n/2. 分析:num[u]表示以u为根节 ...
- Spring 类构造器初始化实例
构造方法类Bean1 package com.hao947.bean; public class Bean1 { public Bean1() { System.out.println("b ...
- AlarmManager的学习与实现
综述 这个类提供了一种使用系统提供的alarm服务.这个服务同意用户安排他们的应用程序在将来的某一个时间点执行.当设置的alarm响起,那么之前系统为这个alarm注冊的Intent就会自己主 ...
- Android自己定义控件实战——仿淘宝商品浏览界面
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38656929 用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个Scr ...