您的位置:首页 > 编程语言 > C语言/C++

查找函数的调用关系

2016-06-07 11:01 316 查看
// mytest.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>   

#include <fcntl.h>

#include <iostream>

#include <fstream>

#include <string>

#include <vector>

#include <algorithm>

#include <list>

#include <map>

using namespace std;

#define MAINFUNID 0

typedef map<int, vector<int>> MAP_INT_VEC;

typedef list<vector<int>> LIST_VEC;

void PrintVector(vector<int> &vecFuncNodeId)

{

    vector<int>::iterator it;

    for (it = vecFuncNodeId.begin(); it != vecFuncNodeId.end(); it++ )

    {

        cout<<*it<<" ";

    }

    cout<<endl<<endl;

}

//解析函数ID

void GetFuncNodeIdByLine(string strline, vector<int> &vecFuncNodeId)

{

    int uiFuncNodeId = 0;

    string strfunid;

    while( strline.find(' ') != string::npos)

    {

        strfunid = strline.substr(0, strline.find(' '));

        uiFuncNodeId = atoi(strfunid.c_str());

        #if 0

        //cout<<"int fun id: " << uiFuncNodeId<<endl;

        if (uiFuncNodeId == 0)

        {

            vecFuncNodeId.insert(vecFuncNodeId.begin(),uiFuncNodeId);

        }

        else

        {

            vecFuncNodeId.push_back(uiFuncNodeId);

        }

        #endif

       

        vecFuncNodeId.push_back(uiFuncNodeId);

       

        strline = strline.substr(strline.find(' ')+1);

        //cout<<"strline:"<<strline<<endl; 

    }

    //cout<<"strline: "<<strline<<endl;

    //题目保证了每行末尾没有空格

    uiFuncNodeId = atoi(strline.c_str());

    //cout<<"int fun id: " << uiFuncNodeId<<endl;

    vecFuncNodeId.push_back(uiFuncNodeId);

}

//被调函数是主函数,删除该元素

void DeleteElemOfVec(vector<int> &vecFunId, int elem)

{

    vector<int>::iterator iter = vecFunId.begin();

    for (iter = vecFunId.begin(); iter != vecFunId.end();)

    {

        if(*iter == elem)

        {

            iter  = vecFunId.erase(iter);

        }

        else

        {

            iter++;

        }

        if(iter == vecFunId.end()) //要控制迭代器不能超过整个容器

        { 

            break;

        } 

    }  

}

//去除相邻的重复元素去除相邻的重复元素

void DistinctVector(vector<int> &vec)

{

    vector<int>::iterator itNewEnd;

    itNewEnd = unique(vec.begin(), vec.end());

    vec.erase(itNewEnd, vec.end());

}

//合并两个vector容器

void CombineVector(vector<int> &vec1, vector<int> &vec2, vector<int> &vec3)

{  

    if (!vec1.empty())

    {

        //从vec3的首地址插入vec1 首尾间元素

        vec3.insert(vec3.begin(), vec1.begin(), vec1.end());

    }

    if (!vec2.empty())

    {

        //从vec3的尾地址插入vec2首尾间元素

        vec3.insert(vec3.end(), vec2.begin(), vec2.end());

    }

    //vec3默认升序排序

    sort(vec3.begin(), vec3.end());

    //去掉vec3中的相邻的重复元素

    DistinctVector(vec3);

}

//获取该函数的调用关系

void GetFuncCallRelation(string strline, MAP_INT_VEC &mapFunCallRelate)

{

    int uiFuncCallId = 0;

    vector<int> vecFuncNodeId;

    vector<int> vecFuncBeCalledNodeId;

    GetFuncNodeIdByLine(strline, vecFuncNodeId);

    PrintVector(vecFuncNodeId);

    if (!vecFuncNodeId.empty())

    {

        //获取调用函数

        uiFuncCallId = vecFuncNodeId[0];

        #if 0

        //去除相邻的重复元素去除相邻的重复元素

         vector<int>::iterator itNewEnd;

         itNewEnd = unique(vecFuncNodeId.begin(), vecFuncNodeId.end());

         vecFuncNodeId.erase(itNewEnd, vecFuncNodeId.end());

         PrintVector(vecFuncNodeId);

         #endif

        

         for (vector<int>::iterator it= vecFuncNodeId.begin() + 1; it != vecFuncNodeId.end(); it++)

         {

            //cout << *it<<endl;

            vecFuncBeCalledNodeId.push_back(*it);      

         }

         //vector 默认是按升序排列,即从小到大

         sort(vecFuncBeCalledNodeId.begin(), vecFuncBeCalledNodeId.end());

         //删除被调函数容器中的主函数ID

         DeleteElemOfVec(vecFuncBeCalledNodeId, MAINFUNID);

         //去除相邻的重复元素去除相邻的重复元素

         DistinctVector(vecFuncBeCalledNodeId);

         PrintVector(vecFuncBeCalledNodeId);

    }

    //判断调用函数在map容器中是否存在,如存在,合并被调函数

    MAP_INT_VEC::iterator it = mapFunCallRelate.find(uiFuncCallId);

    if (it == mapFunCallRelate.end())

    {

        mapFunCallRelate[uiFuncCallId] = vecFuncBeCalledNodeId;

    }

    else

    {

        vector<int> vecCombineElem;

        CombineVector(mapFunCallRelate[uiFuncCallId] ,vecFuncBeCalledNodeId, vecCombineElem);

        mapFunCallRelate[uiFuncCallId] = vecCombineElem;

    }

   

    //PrintVector(vecFuncCallRelation);

}

//从txt 文件中读取数据

void ReadDataByFileToFunCallRelate(string tmpstr, MAP_INT_VEC &mapFunCallRelate)

{

    int line = 1;

    vector<int> vecFuctId;

    //vector<int> vecFuctCallRelation;

   

    //char str[100];

    ifstream infile("D://VisualStudio2010/Projects/mytest/mytest/input.txt");

    cout<<"Read from file:" << endl;

    if (! infile.is_open())

    {

        cout<<"Error opening file";

        exit(1);

    }

    while(!infile.eof())

    {

        getline(infile, tmpstr);

        //cout <<line<<": "<<tmpstr.c_str()<<endl;

        line++;

        //GetFuncNodeIdByLine(tmpstr, vecFuctId);

        GetFuncCallRelation(tmpstr,mapFunCallRelate);

    }

    infile.close();

    //PrintVector(vecFuctId);

}

int  FindFunCallRelation(MAP_INT_VEC &mapFunCallRelate, vector<int> &vecFunRelate)

{

    //LIST_VEC ListBeCalledFunVec;

    int FunCallNodeId = 0;

    int FunNodeId = 0;

    list<int> listFunNodeId;

    vector<int> vecBeCalledId;

    if (!mapFunCallRelate.empty())

    {

        //将map容器的的key存在list容器中

        MAP_INT_VEC::iterator iter;

        for (iter = mapFunCallRelate.begin(); iter != mapFunCallRelate.end(); iter++)

        {

            FunCallNodeId = iter->first;

            cout << "callnodeid: "<<FunCallNodeId<<endl;

            vecBeCalledId = iter->second;

            for (int i = 0; i < vecBeCalledId.size(); i++)

            {

                cout << vecBeCalledId[i] << " ";

            }

            cout<<endl;

       

            listFunNodeId.push_back(FunCallNodeId);

        }

       

        FunNodeId = listFunNodeId.front();

        vecFunRelate.push_back(FunNodeId);

        //map key默认从小到大排序,第一个元素的key不为主函数,则该关系中午主函数

        if (FunNodeId != MAINFUNID)

        {          

            return -1;

        }

       

        cout<<endl<<"FunNodeId: ";

        for (list<int>::iterator iter = listFunNodeId.begin(); iter != listFunNodeId.end(); )

        {  

            FunNodeId = listFunNodeId.front();

            listFunNodeId.remove(*iter++);

            //cout<<FunNodeId<<" ";

#if 1

            if (mapFunCallRelate.find(FunNodeId) != mapFunCallRelate.end())

            {              

                for(int i = 0 ; i < mapFunCallRelate[FunNodeId].size(); i++)

                {

                    if (find(listFunNodeId.begin(), listFunNodeId.end(), mapFunCallRelate[FunNodeId][i]) != listFunNodeId.end())

                    {

                        cout << mapFunCallRelate[FunNodeId][i] << " ";

                       

                        vecFunRelate.push_back(
ac56
mapFunCallRelate[FunNodeId][i]);

                    }

                    else

                    {

                        continue;

                    }

                }

            }

            else

            {

                continue;

            }

#endif

        }

        cout<<endl;

    }

   

    return 0;

}

char* szOutputFileName = "D://VisualStudio2010/Projects/mytest/mytest/output.txt";

void WriteDataToFile(vector<int> &vecData)

{

    ofstream outputfile(szOutputFileName);

    if (outputfile.is_open())

    {

        cout<<"Function call relation:  "<<endl;

        for (int i = 0 ; i < vecData.size(); i++)

        {

            outputfile<<vecData[i]<<endl;

        }

        outputfile.close();

    }

}

int _tmain(int argc, _TCHAR* argv[])

{

    string linestr;

    vector<int> vecFunRelate;

    MAP_INT_VEC mapFunCallRelate;

    ReadDataByFileToFunCallRelate(linestr, mapFunCallRelate);  

    FindFunCallRelation(mapFunCallRelate, vecFunRelate);

    PrintVector(vecFunRelate);

    WriteDataToFile(vecFunRelate);

    return 0;

}

 

 

int  FindFunCallRelation(MAP_INT_VEC &mapFunCallRelate, vector<vector<int>> &vecFunRelate)

{

 int iFunCallNodeId = 0;

 int FunNodeId = 0;

 int index = 0;

 list<int> listCallFunNodeId;

 vector<int> vecBeCalledId;

 vector<int> vecMainCallingId;

 

 if (!mapFunCallRelate.empty())

 {

  //将map容器的的key存在list容器中

  //map的首key存于vertor容器,key默认从小到大排序,第一个元素的key不为主函数,则该关系中午主函数

  MAP_INT_VEC::iterator itLocate = mapFunCallRelate.find(MAINFUNID);

  if (itLocate != mapFunCallRelate.end())

  {

   vecMainCallingId.push_back(MAINFUNID);

   vecFunRelate.push_back(vecMainCallingId);

   listCallFunNodeId.push_back(MAINFUNID);   

  }

  else

  {

   return -1;  

  }

  cout << "--------------------------------------------------------------------------"<<endl;

  MAP_INT_VEC::iterator iter;

  for (iter = mapFunCallRelate.begin(); iter != mapFunCallRelate.end(); iter++)

  {

   

   iFunCallNodeId = iter->first;

   cout << "callnodeid: "<<iFunCallNodeId<<endl;

   vecBeCalledId = iter->second;

   for (int i = 0; i < vecBeCalledId.size(); i++)

   {

    cout << vecBeCalledId[i] << " ";

   }

   cout<<endl;

  

   //listCallFunNodeId.push_back(iFunCallNodeId);

  }

  cout << "--------------------------------------------------------------------------"<<endl; 

  

  //MAP_INT_VEC::iterator iter;

  for (iter = mapFunCallRelate.begin(); iter != mapFunCallRelate.end(); iter++)

  {

   vector<int> vecCallingId;

   iFunCallNodeId = iter->first;

   cout <<"first value - "<<iFunCallNodeId <<" ;";

   vecBeCalledId = iter->second;

   for (int i = 0; i < vecBeCalledId.size(); i++)

   { 

    //cout << i << " ";  

    if (mapFunCallRelate.find(vecBeCalledId[i]) != mapFunCallRelate.end() && find(listCallFunNodeId.begin(), listCallFunNodeId.end(), vecBeCalledId[i]) == listCallFunNodeId.end())

    {

     cout << vecBeCalledId[i] << " ";

     vecCallingId.push_back(vecBeCalledId[i]);

     listCallFunNodeId.push_back(vecBeCalledId[i]);

    }

    else

    {

     continue;

    }

    

   }

   vecFunRelate.push_back(vecCallingId);

   cout<<endl;

  }

  cout << "--------------------------------------------------------------------------"<<endl; 

  cout<<"output result: "<<endl;

  for (list<int>::iterator iter = listCallFunNodeId.begin(); iter != listCallFunNodeId.end(); iter++)

  {

   cout<<*iter<<" ";

  }

  cout<<endl;

 }

 else

 {

  return -1;

 }

 

 return 0;

}

char* szOutputFileName = "D://VisualStudio2010/Projects/mytest/mytest/output.txt";

void WriteDataToFile(vector<vector<int>> &vecData)

{

 ofstream outputfile(szOutputFileName);

 if (outputfile.is_open())

 {

  cout<<"Function call relation:  "<<endl;

  for (int i = 0 ; i < vecData.size(); i++)

  {

   for (int j = 0; j < vecData[i].size(); j++)

   {

    outputfile<<vecData[i][j]<<" ";

    cout<<vecData[i][j]<<" ";

   }

   cout<<endl;

   outputfile<<endl;

  }

  outputfile.close();

 }

}

int _tmain(int argc, _TCHAR* argv[])

{

 int ret;

 string linestr;

 vector<int> vecFunRelate;

 vector<vector<int>> vecOutputFunRelate;

 MAP_INT_VEC mapFunCallRelate;

 ReadDataByFileToFunCallRelate(linestr, mapFunCallRelate); 

 ret = FindFunCallRelation(mapFunCallRelate, vecOutputFunRelate);

 if (ret == 0)

 {

  WriteDataToFile(vecOutputFunRelate);   

 }

 

 PrintVector(vecFunRelate);

   

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ string vector m