IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> BUAA函数调用关系 -> 正文阅读

[C++知识库]BUAA函数调用关系

【问题描述】

给定某能正常运行结束的用户函数调用栈信息(当一个函数被调用时将入栈,当调用返回时,将出栈)。编写程序,对函数调用栈信息进行分析,依据函数入栈和出栈信息,分析函数调用关系,即一个函数调用了哪些不同函数。并按运行时调用序输出调用关系。

说明:

1、 在一个函数中,同一函数有可能被调用多次,输出调用关系时只输出一次;若一个函数没有调用其它函数,则不输出调用关系;

2、函数运行时调用序是指函数在调用栈中的出现序。

3、程序中不存在递归调用。函数名符合C语言标识符的规定,函数名长度不超过20,每个函数最多调用不超过10个不同函数,程序中用户定义的函数个数不超过100。

算法提示:当一个函数入栈时,它就是当前栈顶函数调用的一个函数。

【输入形式】

假设用8表示函数入栈操作;用0表示当前函数出栈。当操作为8(入栈)时,输入形式为:

<操作> <函数名>

当操作为0(出栈)时,输入形式为:

<操作>

所有入栈操作和出栈操作都是从标准输入分行输入,假设调用栈中函数个数最多不超过200。开始时,调用栈为空,当调用栈再次为空时,输入结束。

【输出形式】

按运行时调用先后顺序输出函数调用关系到标准输出,每行为一个函数的调用关系信息,包括:函数名及被调用函数,函数与被调用函数间用一个英文冒号“:”分隔,被调用函数间用一个英文逗号“,”分隔,最后一个函数名后跟一个回车。若一个函数没有调用其它函数,则不输出。

【样例输入】

8 main

8 input

0

8 mysqrt

0

8 findA

0

8 findB

8 area

8 mysin

0

8 mycos

0

8 mysqrt

0

0

0

8 findC

8 area

8 mysin

0

0

8 mysqrt

8 max

0

0

0

8 output

0

0

【样例输出】

main:input,mysqrt,findA,findB,findC,ouput

mysqrt:max

findB:area

area:mysin,mycos,mysqrt

findC:area,mysqrt

【样例说明】

按照运行时调用函数的先后顺序,依次输出了main、mysqrt、findB、area和findC的函数调用关系。其中main函数调用了6个函数,按照运行时调用序依次输出。注意:mysqrt函数先于findB等函数出现在栈中,虽然mysqrt调用max较晚,但要先输出其调用关系。

【评分标准】

该题要求对函数调用栈信息进行分析,提交程序名为stack.c

方法一

#include <stdio.h>
#include <string.h>

struct func{
	char name[21];
	char cf[10][21];
	int n;
}; 

int main()
{
	int i,j,k,m,top;
	char st[200][21],fun[21];
	struct func fs[100];
	
	m=0;
	top=-1;
	do{
		scanf("%d",&k);
		if(k==8)
		{
			scanf("%s",fun);
			for(i=0;i<m;i++)
				if(strcmp(fs[i].name,fun)==0)
					break;			
			if(i==m)
			{
				strcpy(fs[m].name,fun);
				fs[m++].n=0;
			}						
			if(top>=0)
			{
				for(i=0;i<m;i++)
					if(strcmp(fs[i].name,st[top])==0)
						break;
				for(j=0;j<fs[i].n;j++)
					if(strcmp(fs[i].cf[j],fun)==0)
						break;
				if(j==fs[i].n)
				{
					strcpy(fs[i].cf[j],fun);
					fs[i].n++;
				}
			}
			strcpy(st[++top],fun);
		}
		else
			top--;
	}while(top>-1);
	for(i=0;i<m;i++)
		if(fs[i].n>0)
		{
			printf("%s:",fs[i].name);
			for(j=0;j<fs[i].n-1;j++)
				printf("%s,",fs[i].cf[j]);
			printf("%s\n",fs[i].cf[j]);
		}
	return 0;
}

方法二

# include <stdio.h>
# include <string.h> 
# include <ctype.h>
# include <stdlib.h> 

typedef struct
{
        char name[101];
}str;

typedef struct
{
        str fun[101];
        int top;
}SqStack;

typedef struct
{
		char name[101];
        str fun[11];
        int funlen;
}funlist;


int Push(SqStack *S,char *e)
{
        S->top++;			
        strcpy(S->fun[S->top].name,e);
        return 1;
}

int Pop(SqStack *S,char *e)
{ 
        if(S->top==-1)
            return 0;
        strcpy(e,S->fun[S->top].name);
		S->top--;			
        return 1;
}

int main()
{
	SqStack *F;
	F = (SqStack*)malloc(sizeof(SqStack));
	funlist L[101];
	int ind, listlen = 0,i,j,flag = 1;
	char name[101],topn[101];
	F->top = -1;
	scanf("%d %s",&ind,name);
	Push(F,name);
	strcpy(L[listlen].name, name);
	L[listlen].funlen = 0;
	listlen++;
	
	while(F->top!=-1)
	{
		scanf("%d",&ind);
		if(ind==8)
		{
			flag = 1;
			scanf("%s",name);
			strcpy(topn, F->fun[F->top].name);
			for(i=0;i<listlen;i++)
			{
				if(strcmp(topn,L[i].name)==0)
				{
					for(j=0;j<L[i].funlen;j++)
					{
						if(strcmp(L[i].fun[j].name,name)==0)
						{
							flag = 0;
							break;
						}
					}
					if(flag==1)
					{
						strcpy(L[i].fun[L[i].funlen].name,name);
						L[i].funlen++;
					}	
				}
			}
			Push(F,name);
			flag = 1;
			for(i=0;i<listlen;i++)
			{
				if(strcmp(L[i].name,name)==0)
				{
					flag = 0;
					break;
				}
			}
			if(flag==1)
			{
				strcpy(L[listlen].name, name);
				L[listlen].funlen = 0;
				listlen++;
			}
		}
		else if(ind==0)
		{
			Pop(F,name);
		}
	}
	
	for(i=0;i<listlen;i++)
	{
		if(L[i].funlen > 0)
		{
			printf("%s:",L[i].name);
			for(j=0;j<L[i].funlen-1;j++)
			{
				printf("%s,",L[i].fun[j].name);
			}
			printf("%s\n",L[i].fun[j].name);
		}
	}
}

方法三

#include <stdio.h>
#include <string.h>

int main()
{
    int operation;
    char func[105][25] = {};
    int funci = 1;
    int stack[205] = {}, stacki = 0;
    int ans[105][15] = {};

    while (scanf("%d", &operation) != EOF)
    {
        if (operation == 0)
        {
            --stacki;
        }
        else if (operation == 8)
        {
            char f[25] = {};
            scanf("%s", f);
            int index = 0;
            for (int i = 1; i < funci; i++)
            {
                if (strcmp(func[i], f) == 0)
                {
                    index = i;
                    break;
                }
            }
            if (index == 0)
            {
                index = funci;
                for (int j = 0; f[j] != '\0'; j++)
                    func[index][j] = f[j];
                funci++;
            }

            int top = stack[stacki-1], ys = 0, a = 0;
            for (int i = 0; i < 15; i++)
            {
                if (ans[top][i] == index)
                {
                    ys = 1;
                    break;
                }
                if (ans[top][i] == 0)
                {
                    ys = 2;
                    a = i;
                    break;
                }
            }
            if (ys == 2)
            {
                ans[top][a] = index;
            }

            stack[stacki++] = index;
        }
    }

    for (int i = 1; i < funci; i++)
    {
        if (ans[i][0] != 0)
        {
            printf("%s:", func[i]);
            for (int j = 0; ans[i][j] != 0; j++)
            {
                int tmp = ans[i][j];
                printf("%s", func[tmp]);
                if (ans[i][j+1] != 0)
                    printf(",");
                else
                    printf("\n");
            }
        }
    }
    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 10:41:58  更:2022-04-23 10:42:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:13:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码