请教一个算法问题,哪位大神给个思路

lp110117 2014-04-29 05:45:27
问题描述:根据c++源代码,生成相应的流程图。谁能给个思路?假设我已经分析完所有词法要素存储在一个list中。
int main()
{
int a = 0;
int b = 0;
if (a == 0)
{
fun1();
if (b == 0)
{
fun2();
}
}
else
{
fun3();
}
fun4();
return 0;
}

要转成这样的图:
...全文
341 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lp110117 2014-05-13
  • 打赏
  • 举报
回复
结贴,只考虑分支和函数调用情况,代码共有顺序,分支,循环三种情形,将循环作为分支情况处理,数据结构采用图,首先对入口函数做顺序处理,形成的图会是线性的,图中结点包含分支结点和函数调用结点,对未分析的分支结点进行处理,对未分析的函数调用结点进行处理,最后形成完整的执行流程图。
赵4老师 2014-05-06
  • 打赏
  • 举报
回复
试试将以下代码生成对应的流程图:
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int i;
int L;
void main(int argc,char **argv) {
    if (argc<2) {
        printf("%s 要排列的字符串\n",argv[0]);
        return;
    }
    L=strlen(argv[1]);
    vector<char> P(L);
    vector<char>::iterator b,e,it;
    b=P.begin();
    e=P.end();
    for (i=0;i<L;i++) P[i]=argv[1][i];
    sort(b,e);
    i=0;
    do {
        printf("%10d: ",++i);
        for(it=b;it!=e;it++) printf("%c",*it);
        printf("\n");
    } while (next_permutation(b,e));
    printf("The total: %d",i);
}
星点点 2014-05-05
  • 打赏
  • 举报
回复
过来学习下,6L厉害
zilaishuichina 2014-05-05
  • 打赏
  • 举报
回复
代码流程总共就三种 顺序 分支 循环 先解析的是main 得出来 三段,就是三部分 在解析a == 0 得到2个分支 true分支 得到两段 else分支得到一段 再解析true分支的b == 0,得到一段
lp110117 2014-05-05
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
楼主试试将以下代码生成对应的流程图:
#pragma comment(linker,"/SECTION:.text,RW")
#include <stdio.h>
#ifdef _DEBUG
#define OFFSET 0x0C
#else
#define OFFSET 0x01
#endif
int *p;
int p2() {
    int a;

    a=2;
    return a;
}
int main() {
    p=(int *)((char *)p2+OFFSET);
    printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
    *p=3;
    printf("p2()==%d\n",p2());
    return 0;
}
//p2==0x00401000,p==0x0040100c,*p==2
//p2()==3
//
大神,我只研究例子中的情况,你这种情况静态解析可能完成不了
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
楼主试试将以下代码生成对应的流程图:
#pragma comment(linker,"/SECTION:.text,RW")
#include <stdio.h>
#ifdef _DEBUG
#define OFFSET 0x0C
#else
#define OFFSET 0x01
#endif
int *p;
int p2() {
    int a;

    a=2;
    return a;
}
int main() {
    p=(int *)((char *)p2+OFFSET);
    printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
    *p=3;
    printf("p2()==%d\n",p2());
    return 0;
}
//p2==0x00401000,p==0x0040100c,*p==2
//p2()==3
//
lp110117 2014-05-04
  • 打赏
  • 举报
回复
顶一下,还有大神赐教吗
lp110117 2014-05-04
  • 打赏
  • 举报
回复
引用 8 楼 q745401990 的回复:
你将所有的要素看成是一个个的节点,然后对其深度搜索一遍,并记录每个要素的性质,做出一定的判断
多谢赐教
一起来玩玩呗 2014-05-01
  • 打赏
  • 举报
回复
你将所有的要素看成是一个个的节点,然后对其深度搜索一遍,并记录每个要素的性质,做出一定的判断
lp110117 2014-04-30
  • 打赏
  • 举报
回复
引用 6 楼 neustar1 的回复:
int main() { int a = 0; int b = 0; if (a == 0) { fun1(); if (b == 0) { fun2(); } } else { fun3(); } fun4(); return 0; } 抛开词法和语法分析器,就简单点以上面这个为例子。 1)一条if语句作为一个树节点,包含一颗子树。表达式语句也是树节点。 2)每棵子树内部,被分割成多部分,可以认为是一个节点,后一节点是前一节点的子节点。 可以使用递归算法解决 解析步骤: 1) main相当于最大的树,它内部被分割多个节点。 main->int a, b->if(a==0)else>fun4 这里解析出四个节点 2)上述四个节点只有if包含子树,对if(a==0)else解析 if(a==0)else fun1 fun3 if(b==0) fun2 3)将if子树替换到1中,就形成了图 main | int a, b | if(a==0)else fun1 fun3 if(b==0) | fun2 | | fun4 应该能理解吧,理解了结贴给分,别玩消失。
那实际上这里就没有树的概念了,fun4会是n个结点的共同后继,这样看来你的想法和我是一致的,首先是main->if else->fun4,再递归细化if else结点
__cc__ 2014-04-30
  • 打赏
  • 举报
回复
int main() { int a = 0; int b = 0; if (a == 0) { fun1(); if (b == 0) { fun2(); } } else { fun3(); } fun4(); return 0; } 抛开词法和语法分析器,就简单点以上面这个为例子。 1)一条if语句作为一个树节点,包含一颗子树。表达式语句也是树节点。 2)每棵子树内部,被分割成多部分,可以认为是一个节点,后一节点是前一节点的子节点。 可以使用递归算法解决 解析步骤: 1) main相当于最大的树,它内部被分割多个节点。 main->int a, b->if(a==0)else>fun4 这里解析出四个节点 2)上述四个节点只有if包含子树,对if(a==0)else解析 if(a==0)else fun1 fun3 if(b==0) fun2 3)将if子树替换到1中,就形成了图 main | int a, b | if(a==0)else fun1 fun3 if(b==0) | fun2 | | fun4 应该能理解吧,理解了结贴给分,别玩消失。
lp110117 2014-04-30
  • 打赏
  • 举报
回复
引用 4 楼 neustar1 的回复:
你词法元素都在list中,分析过程应该会生成一个树吧,树其实就是图,根据树创建图喽
能否说详细点儿,生成一棵什么样的树,能否对着我发的那段代码详细说一下
__cc__ 2014-04-30
  • 打赏
  • 举报
回复
你词法元素都在list中,分析过程应该会生成一个树吧,树其实就是图,根据树创建图喽
lp110117 2014-04-30
  • 打赏
  • 举报
回复
顶一下,哪位大神帮分析一下
lp110117 2014-04-30
  • 打赏
  • 举报
回复
引用 1 楼 bityoungs 的回复:
楼主的思路是要根据一个图的遍历结果来恢复成一个图 出来。 LZ顺着这个思路 看看是不是能有点结果
我考虑这个数据结构是一张图,只是这个图的构造过程很费劲
bityoungs 2014-04-29
  • 打赏
  • 举报
回复
楼主的思路是要根据一个图的遍历结果来恢复成一个图 出来。 LZ顺着这个思路 看看是不是能有点结果

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧