实验数据结构——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;
}

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

时间: 2024-10-20 00:44:27

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

数据结构--KMP算法总结

数据结构—KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会,后边next数组会在介绍) 上图T为主链,P为模板链,要求P在T中是否出现,出现就返回位置. 朴素算法会顺序遍历,比较第一次的时候p[0]处失配,然后向后移动继续匹配.数据量大的时候这么做肯定是不可行的.所以这里就会有KMP算法!在一次失配之后,KMP算法认为这里已经失配了,就不能在比较一遍了,而是

数据结构——KMP算法

算法介绍 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息.KMP算法的时间复杂度O(m+n). next数组 我们记主串为字符串S,模式串为字符串P. 我们用next[j]表示以字符Pj结尾的子串的长度相等的前

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

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html /*#include<iostream> #include <string> using namespace std; int count_same_char(string T,int j); void get_next(string T,int *next) { int j=1; next[1]=0; f

数据结构实验——KMP算法之Test.ming

翻译程序 小明初学C++,已明白了四则运算.关系运算.逻辑运算.赋值运算.输入输出.简单选择和循环结构的用法,但他的英语不太好,记不住太多的保留字,于是他利用汉语拼音做保留字,山寨C++,发明了一种表达自己思想的算法描述规则. 规则很简单:他将开始程序头部以一个拼音名字标记,C++程序中的"{,}"用拼音"kaishi,jieshu"直观表示:选择和循环只采用一种单一的结构,且保留字也分别用对应的拼音表示,不过在表示选择或循环条件时他去掉了多余的小括号:输入输出也用

数据结构与算法 第四次实验报告 图

数据结构与算法 第四次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1     中国石油大学(北京)计算机科学与技术系 1.图的定义,文件为"Graph.h" #ifndef GRAPH_H//定义头文件 #define GRAPH_H #include<string>//引入标准库中的头文件 using namespace std; const int MaxSize=12; struct ArcNode//定义边表结点 { int adjvex;/

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

【数据结构&amp;&amp;算法系列】KMP算法介绍及实现(c++ &amp;&amp; java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

数据结构与算法JavaScript (五) 串(经典KMP算法)

数据结构与算法JavaScript (五) 串(经典KMP算法) KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上蛋疼的KMP是讲解很多,基本都是走的高大上路线看的你也是一头雾水,我试

kmp算法--求字符串子串--《数据结构》严蔚敏

// exam1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void get_next(int* &next,char* s) { int j=0; int i=1; int len=strlen(s); next=(int*)malloc(len*sizeof(int)); memset(next,0,len*sizeof(int));