我是靠谱客的博主 欢呼摩托,最近开发中收集的这篇文章主要介绍C++ 提取代码中的函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

输入一段代码,输出这段代码中包含的所有函数

ASCII码表

#include<iostream>
#include<fstream>
#include<cstring>
#include<cmath>
using namespace std; 
 
int total;//行数 
//初始化数组为空 
string str[10000]="";//预处理的数据 
string str1[10000]="";//处理后数据 
string temp[1000]=""; 

void Readin()
{
	//读入 :过滤注释,只读入有括号的行 
	fstream in;
 	in.open("InFile.txt",ios::in);
 	if(!in)
 	{
  		cout<<"提示:打开文件失败。"<<endl;
 		return;
    }
    
    int i=1;//str[0]空置不用 
    int n=0;
    //逐行存入数组 
    string readline;
    while (getline(in, readline))
    {
    	int j=readline.length();
    	int flag=0;//没有括号 
    	//cout<<"当前行:"<<readline<<endl;
    	for(n=0;n<j;n++)
    	{	
			//过滤注释 
			if(readline[n]=='/'&&readline[n+1]=='/') 
			{
				//cout<<"过滤注释"<<endl;
				//system("pause");
				continue;
			}    
			//检索括号 
			if(readline[n]=='(') 
			{
				//cout<<"发现括号:"<<readline[n]<<endl; 
				flag=1; 
				//system("pause");
				break;
			}
		}
		if(flag==1)
		{
			//读入 
			str[i]=readline;
			i++;
			//cout<<"读入:"<<str[i]<<endl;	
		}
	} 
	total=i;
	//cout<<total<<endl;
	//system("pause"); 
	in.close();
	return;
}

void Process()//处理原始数据,处理后数据存入新数组 
{
	int i=1;//str[0]空置不用 
	//int extra=0;//存放一行多函数的行中,多出来的函数个数 
	//读取一行 
	while (i<total)
    {
    	int num=0;//包含函数数 
    	//str1[i]=str[i];
 		//cout<<"第"<<i<<"行处理前:"<<str[i]<<endl;  	
		//非字母字符识别
		int n=0; 
		int j=str[i].length();
		int startpos=0; 
		int endpos=0; 
		for(n=0;n<j;n++)
		{
			//cout<<"处理中:"<<"n:"<<n<<"值:"<<str[i][n]<<endl; 
			
			//判断注释
			if(str[i][n]=='/'&&str[i][n+1]=='/') 
			{
				//cout<<"发现注释"<<endl;
				break;
			}
			
			//过滤非字母或数字
			if((str[i][n]<'a'||str[i][n]>'z')&&(str[i][n]<'A'||str[i][n]>'Z')&&(str[i][n]<'0'||str[i][n]>'9')&&str[i][n]!='('&&str[i][n]!='_')//&&str[i][n]!='.'
			{
				startpos=n+1;
				//cout<<"startpos:"<<startpos<<endl;
			}
			//是括号 
			if(str[i][n]=='(')
			{
				endpos=n-1;
				//cout<<"endpos:"<<endpos<<endl;
				
				if(endpos>startpos)
				{
					num++;
					//cout<<"这是该行的第"<<num<<"个函数"<<endl;
					int len=endpos-startpos+1;
					str1[i]=str[i].substr(startpos,len)+" "+str1[i];
					//cout<<"处理后:"<<str1[i]<<endl;
					//初始化 
					startpos=n+1;
					endpos=0;
					//extra++; 
				}
				else
				{
					//cout<<"这个不是函数的括号,继续读 "<<endl;
					//这个不是函数的括号,继续读 
					startpos=n+1;
					continue;
				}
				//处理后 
				//cout<<"处理后:"<<str1[i]<<endl; 	
				//system("pause"); 
				//continue; 
				//break;
			}		
		}
		i++;  	
	} 
}

void Print()
{
	//写入文件 
	fstream out;
	out.open("temp.txt",fstream::out | ios_base::trunc);
	for(int i=1;i<=total;i++)
	{
		//if(str[i].length()!=0) cout<<"处理前"<<str[i]<<endl; 
		if(str1[i].length()!=0) 
		{
			int flag=0;//无空格 
			int pos=0;
			
			//cout<<"当前行:"<<str1[i]<<endl;
			//判断有无空格 
			for(int n=0;n<str1[i].length();n++)
			{
				//cout<<n<<endl;
				if(str1[i][n]==' ') 
				{
					//cout<<"有空格"<<"n:"<<n<<" pos:"<<pos<<endl; 
					//cout<<str1[i].substr(pos,n-pos)<<endl;
					out<<str1[i].substr(pos,n-pos)<<endl;
					pos=n+1;
					flag=1; 
				}
			} 
			//if(flag==0)
			//cout<<str1[i]<<endl; 
		} 
	}
	out.close();
}

void Print2()
{
	//写入文件 
	fstream out;
	out.open("temp.txt",fstream::out | ios_base::trunc);
	for(int i=1;i<=total;i++)
	{
		out<<temp[i]<<endl;
		cout<<temp[i]<<endl;
	}
	out.close();
}

int Check(string L[],string a)
{
	for(int i=1;i<1000;i++)
	{
		if(L[i]=="")break; 
		if(a==L[i])
		{
			//cout<<"有重复:"<<i<<endl;
			return i;//返回重复单词在数组中的位置 
		}
	}
	//cout<<"没有找到"<<endl;
	return 0;
}

void Readin2()
{
	fstream in;
 	in.open("temp.txt",ios::in);
 	if(!in)
 	{
  		cout<<"提示:打开文件失败。"<<endl;
 		return;
    }
    
    int i=1;//str[0]空置不用 
    int n=0;
    //逐行存入数组 
    string readline;
    while (getline(in, readline))
    { 
    	if(Check(temp,readline)==0)
    	{
    		temp[i]=readline;
    		i++;
		}
	}
	total=i;
	in.close();
	return;
}

int main()
{
	Readin();
	Process();
	Print();
	Readin2();
	Print2();
	return 0;
}

输入

输出

示例一

IMPLEMENT_DYNCREATE
BEGIN_MESSAGE_MAP
ON_COMMAND
ON_WM_TIMER
END_MESSAGE_MAP
CMyCloth20071121View
InitialParticleSys
InitialSpringSys
PreCreateWindow
OnDraw
GetDocument
ASSERT_VALID
RenderSence
StartRender
OnPreparePrinting
DoPreparePrinting
OnBeginPrinting
OnEndPrinting
AssertValid
Dump
RUNTIME_CLASS
IsKindOf
ASSERT
DrawBackground
IsChangedFixState
if
InitialParticle
ComputeForce
CollisionHandle
ContactionHandle
EulerMethod
TextureCloth
DrawVertexes
DrawSprings
OnOperationRunning
SetTimer
OnTimer
Invalidate
OnOperationClothproperty
bDarwVertex
bDarwSpring
bDrawShearSprings
bDarwFlexionSprings
bUsingShearSpring
bUsingFlexionSpring
bFixed
DoModal
OnOperationResetcloth
ResetProperty

示例二

IMPLEMENT_DYNCREATE
CGLView
m_dAspectRatio
m_rotFi
m_rotTheta
m_rotFiR
m_rotThetaR
m_fScale
m_bRenderAxis
m_bRenderDebugInfo
m_bRenderStatInfo
m_bRenderHelpInfo
m_bWireFrame
m_bCullFace
if
BEGIN_MESSAGE_MAP
ON_WM_CREATE
ON_WM_SIZE
ON_WM_ERASEBKGND
ON_WM_LBUTTONDOWN
ON_WM_LBUTTONUP
ON_WM_MOUSEMOVE
ON_WM_MOUSEWHEEL
END_MESSAGE_MAP
OnDraw
RenderSence
AssertValid
Dump
PreCreateWindow
OnCreate
CClientDC
_SetupPixelFormat
GetSafeHdc
GetPixelFormat
sizeof
DescribePixelFormat
wglCreateContext
wglMakeCurrent
SetupRC
ASSERT
ChoosePixelFormat
_T
AfxMessageBox
SetPixelFormat
DestroyWindow
wglDeleteContext
OnSize
GLSize
Invalidate
OnEraseBkgnd
glEnable
glCullFace
glClearColor
glClearDepth
glPolygonMode
glDisable
glViewport
glMatrixMode
glLoadIdentity
gluPerspective
gluLookAt
glClear
glTranslatef
glRotatef
glScalef
glColor3f
glutWireCube
glBegin
glVertex3f
glEnd
glFinish
SwapBuffers
DrawBackground
StartRender
glFlush
OnLButtonDown
OnLButtonUp
OnMouseMove
while
OnMouseWheel

示例三

CPhyEnv
for
SetProperty
InitCollisionPlane
if
free
setVector
InitialParticleSys
sizeof
malloc
IsFixed
InitialParticle
InitialSpringSys
InitialStructuralSpring
InitialShearSpring
InitialFlexionSpring
DrawVertexes
glPointSize
glColor3f
glBegin
glVertex3f
glEnd
DrawSprings
glLineWidth
ComputeSpringsForce
VectorLength
ComputeForce
ApplyWind
UpdateStates
AdjustSpringLength
EulerMethod
MidPointMethod
VectorDif
OneVectorLength
DotMultiply
Normalize
ResetProperty
IsChangedFixState
CollisionDetect
ScaleVector
CollisionHandle
VectorAdd
while
ContactionDetect
ContactionHandle
LoadBMP
fopen
fclose
auxDIBImageLoad
LoadGLTextures
memset
glGenTextures
glBindTexture
glTexImage2D
glTexParameteri
TextureCloth
glEnable
glTexCoord2f
glDisable
sin
fabs

总结:

⚪去重

原本使用了一种去重算法:

遍历数组,从第一个1元素开始,依次与其后所有的元素中比较,如果相等,就把之后所有元素向前移动一位。

这种方法过于愚蠢了,用了三个for循环,时间复杂度是O(n^3),在单个数组中通过移位覆盖去重,时间复杂度太高了。

后来发现有一种可行的算法,用空间换时间:

再建一个数组。从第一个数组拿一个元素,遍历第二个数组, 如果第二个数组中不存在这个元素,则将该元素放入第二个数组,这样就达到了去重的目的。

用了两个for循环,这样的时间复杂度是O(n^2)。

⚪最初一行只能分析出第一个函数,后来通过更新startpos和endpos的方式,能够识别多个函数并存放在一个字符数组元素中,后续再展开为多个元素。

附:

在学习新的代码时,先用上面的脚本提取函数,再用下面这个脚本快速查询该函数,提高学习效率

批处理 快捷键搜索剪切板内容

最后

以上就是欢呼摩托为你收集整理的C++ 提取代码中的函数的全部内容,希望文章能够帮你解决C++ 提取代码中的函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部