이산수학-공식의 합법성 판단

52629 단어 이산 수학실험
이것은 이산수학에서 매우 간단한 실험으로 입력된 공식에 대해 합법적인지 판단하기만 하면 된다. 먼저 비교적 복잡한 코드를 제시한다.
#include"stdio.h"
#include"string.h"
void rule1(char a[],int i)
{
	if((a[i]>='a')&&(a[i]<='z'))
	{
		a[i]='1';
	}
	else if(a[i]=='0')
	{
		a[i]='1';
	}
}
int rule2(char a[],int i)
{
	int n=strlen(a);
	int _result=0;
	if((i+1<n)&&(a[i]=='!')&&(a[i+1]=='1'))
	{
		a[i]='1';
		i++;
		while(a[i+1]!='\0')
		{
			a[i]=a[i+1];
			i++;
		}
		a[i]='\0';
		_result=1;
	}
	else if((i+2<n)&&(a[i]=='(')&&(a[i+1]=='1')&&(a[i+2]==')'))
	{
		a[i]='1';
		i++;
		while(a[i+2]!='\0')
		{
			a[i]=a[i+2];
			i++;
		}
		a[i]='\0';
		_result=1;
	}
	return _result;
}
int rule3Con(char a[],int i)
{
	int _result=0;
	int n=strlen(a);
	if((i+2<n)&&(a[i]=='1')&&(a[i+1]=='*')&&(a[i+2]=='1'))
	{
		a[i]='1';
		i++;
		while(a[i+2]!='\0')
		{
			a[i]=a[i+2];
			i++;
		}
		a[i]='\0';
		_result=1;
	}
	return _result;
}
int rule3BiCond(char a[],int i)
{
	int _result=0;
	int n=strlen(a);
	if((i+2<n)&&(a[i]=='1')&&(a[i+1]=='=')&&(a[i+2]=='1'))
	{
		a[i]='1';
		i++;
		while(a[i+2]!='\0')
		{
			a[i]=a[i+2];
			i++;
		}
		a[i]='\0';
		_result=1;
	}
	return _result;
}
int rule3Cond(char a[],int i)
{
	int _result=0;
	int n=strlen(a);
	if((i+2<n)&&(a[i]=='1')&&(a[i+1]=='-')&&(a[i+2]=='1'))
	{
		a[i]='1';
		i++;
		while(a[i+2]!='\0')
		{
			a[i]=a[i+2];
			i++;
		}
		a[i]='\0';
		_result=1;
	}
	return _result;
}
int rule3DisConj(char a[],int i)
{
	int _result=0;
	int n=strlen(a);
	if((i+2<n)&&(a[i]=='1')&&(a[i+1]=='+')&&(a[i+2]=='1'))
	{
		a[i]='1';
		i++;
		while(a[i+2]!='\0')
		{
			a[i]=a[i+2];
			i++;
		}
		a[i]='\0';
		_result=1;
	}
	return _result;
}
void rule3(char a[],int i)
{
	int n=strlen(a);
	if((i+2<n)&&(a[i]=='1')&&((a[i+1]=='+')||(a[i+1]=='*')||(a[i+1]=='-')||(a[i+1]=='='))&&(a[i+2]=='1'))
	{
		a[i]='1';
		i++;
		while(a[i+2]!='0')
		{
			a[i]=a[i+2];
			i++;
		}
		a[i]='\0';
	}
}
int main(int argc,char* argv[])
{
	char pstate[120],pstate0[120];
	int i=0,nold=0,nnew=0;	
	printf("     ( +, *, -, =,  !,01):
"
); gets(pstate0); fflush(stdin); nold=strlen(pstate0)+1; nnew=strlen(pstate0); for(i=0;i<nnew;i++) { pstate[i]=pstate0[i]; } pstate[i]='\0'; i=0; while(i<strlen(pstate)) { rule1(pstate,i); i++; } printf(" 1 :%s
"
,pstate); nold=strlen(pstate0)+1; nnew=strlen(pstate); while(nnew<nold) { nold=strlen(pstate); i=0; while(i<strlen(pstate)) { if(rule2(pstate,i)==0); { i++; } } printf(" 2 :%s
"
,pstate); i=0; while(i<strlen(pstate)) { if(rule3Con(pstate,i)==0) { i++; } } printf(" 3 :%s
"
,pstate); i=0; while(i<strlen(pstate)) { if(rule3BiCond(pstate,i)==0) { i++; } } printf(" 3 :%s
"
,pstate); i=0; while(i<strlen(pstate)) { if(rule3Cond(pstate,i)==0) { i++; } } printf(" 3 :%s
"
,pstate); i=0; while(i<strlen(pstate)) { if(rule3DisConj(pstate,i)==0) { i++; } } printf(" 3 :%s
"
,pstate); nnew=strlen(pstate); } if((pstate[0]=='1')&&(strlen(pstate)==1)) { printf("%s is valid
"
,pstate0); } else { printf("%s is invalid
"
,pstate0); } return 0; }

위의 코드는 비교적 복잡하지만 전체적으로 보면 차원이 비교적 명확하고 기본적인 함수가 하나의 기능에 대응한다. 사실 라이브러리 함수를 이용하면 우리는 이 문제를 쉽게 해결할 수 있다.Dell은 다음과 같은 코드를 단순화합니다.
  • 통합 처리 조건, 간소화 코드
  • find 함수를 이용하여 1±*=1처리를 간소화
  • replace 함수를 이용하여'1'
  • 을 없애다
    30줄 코드 해결, 너무 간단하지 않아!!!!!
    #include
    #include
    using namespace std;
    int main()
    {
    	string a ,b;
    	cin>>a;
    	b=a;
    	int n=a.length();
    	for(int i=0;i<n;i++)
    	{
    		if(a[i]>='a'&&a[i]<='z')a[i]='1';
    		if(a[i]=='-'||a[i]=='*'||a[i]=='=')a[i]='+';
    	}
        int m=0;
        while(a.find("!1")!=string::npos||a.find("1+1")!=string::npos||a.find("(1)")!=string::npos||a.find("(0)")!=string::npos)
        {
    	   if(a.find("!1")!=string::npos)
    	   a=a.replace(a.find("!1"),2,"1");
    	   if(a.find("1+1")!=string::npos)
    	   a = a.replace(a.find("1+1"),3 , "1");
    	   	if(a.find("(1)")!=string::npos)
    	   a = a.replace(a.find("(1)"),3 , "1");
    	   	if(a.find("(0)")!=string::npos)
    	   a = a.replace(a.find("(0)"),3 , "1");
    	   n=a.length();
    	   }
    	   if(n==1)cout<<b<<" is valid";
    	   else cout<<b<<" is invalid";
    }
    

    개선된 코드로 다중 처리를 잘 할 수 있습니다"!"()"의 문제와 함께 맨 앞의 복잡한 코드는 지원되지 않는 것 같습니다. (너무 오래 잊어버려서)

    좋은 웹페이지 즐겨찾기