2020牛客寒假算法基础集训营5.C——C语言IDE【超级大模拟】

题目传送门


题目描述

牛牛战队有一门课程叫做软件工程综合实践,这门课要求大家写一个简单的C语言的IDE。牛牛战队已经十分熟悉gcc的相关命令,也知道gdb的调试命令,再借助QT自带的代码亮壳文字框,就很快的把主要功能完成了。现在他们想多做一些创新功能,来获得更高的分数。

他们想到,在很多编译器中,都有查看现在所有函数的功能,如下图所示:
2020牛客寒假算法基础集训营5.C——C语言IDE【超级大模拟】_第1张图片
在这个框的左侧,列出了所有的函数和参数列表。现在牛牛战队的成员也想实现这个功能,请你帮帮他吧。


输入描述:

输入将给出一个在C99标准下可以正常编译运行的C语言代码,同时此份代码具有以下约束:

  • 除引用头文件外,没有其他的编译预处理部分,如:#if,#ifdef,#ifndef,#else,#elif,#endif,#define,#undef,#error,#pragma,_Pragma,#line等。
  • 所有的函数的参数与返回值内不会出现任何形式的数组类型,如:char a[]等,如果有指针,保证指针的一定紧跟在类型名后,如char*,long long*等。保证不会出现函数指针。
  • 由单引号修饰的字符不可能是{,},(,),'或"。
  • 由双引号修饰的字符串内一定不包含{,},(,),‘或",也不包含’/’,’/’,’//'的子串。
  • 不会出现函数内嵌套函数的情况。
  • 不会在/* /内出现/ */的嵌套结构。
  • 不会把一句代码拆成两行写。
  • main函数的返回值一定是int类型。当一个函数没有返回值时,一定有前置void标识。
  • 程序内不会出现const标识符。
    输入数据大小保证小于10KB。

输出描述:

按照以下的格式一行输出一个代码中出现的函数,你可以以任意顺序输出各个函数,每个函数仅可被输出一次。

返回类型名(包括void) 函数名(参数1类型,…,参数n类型)
类型里如有空格,每处最多保留一个空格。


输入

#include 

int plus(int a, int b)
{
	return a + b;
}
int main()
{
	int a,b;
	scanf("%d%d", &a, &b);
	printf("%d\n", plus(a, b)); 
	return 0;
}

输出

int plus(int,int)
int main()


题解

  • emmm,模拟就完了

AC-Code

#include

bool P, O, U, S, e;
char s[1 << 17], T[1 << 17], A[1 << 17], c;
int B, C, M, L, N, i, I;
int main() {
	while (~(c = getchar()))	s[N++] = c;
	for (i = 0; i < N; ++i) {
		if (P) {
			if (s[i] == '\n')	P = O = 0;
		}
		else if (O) {
			if (s[i] == '\n')	O = 0;
		}
		else if (U) {
			if (s[i] == '*' && s[i + 1] == '/') {
				U = 0; ++i;
			}
		}
		else if (L) {
			if (s[i] == '{')++L;
			if (s[i] == '}')--L;
		}
		else {
			if (s[i] == '#')P = 1;
			else if (s[i] == '/' && s[i + 1] == '/')	O = 1, ++i;
			else if (s[i] == '/' && s[i + 1] == '*')	U = 1, ++i;
			else if (s[i] == '{')	++L;
			else	T[B++] = s[i];
			if (s[i] == '{') {
				for (S = I = 0; I < B; ++I) {
					if (S) {
						if (T[I] == ')')	S = 0;
						A[C++] = T[I];
						if ((isspace(A[C - 2]) || A[C - 2] == ',' || A[C - 2] == '(') && isspace(A[C - 1]))	--C;
						if (T[I] == ',' || T[I] == ')') {
							e = 0;
							while (A[C - 1] != '(' && !(e && isspace(A[C - 1]))) {
								if (isalpha(A[C - 1]))e = 1; A[C - 1] = 0, --C;
							}
							if (isspace(A[C - 1]))	--C;
							A[C++] = T[I];
						}
					}
					else {
						A[C++] = T[I];
						if (isspace(A[C - 1]) && isspace(A[C - 2]))	--C;
						if (C == 1 && isspace(A[0]))	--C;
						if (T[I] == '(') {
							while (isspace(A[C - 2]))	A[C - 2] = A[C - 1], --C;
							S = 1;
						}
					}
				}
				while (isspace(A[C - 1]))	A[--C] = 0;
				if (strlen(A) > 4 && strchr(A, '(') != NULL)	puts(A);
				C = 0, memset(A, 0, 64);
			}
			if (s[i] == '{' || s[i] == ';')		B = 0, memset(T, 0, 64);

		}
	}
}

你可能感兴趣的:(构造,模拟,2020牛客寒假集训营5)