이산수학-공식의 합법성 판단
#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은 다음과 같은 코드를 단순화합니다.
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";
}
개선된 코드로 다중 처리를 잘 할 수 있습니다"!"()"의 문제와 함께 맨 앞의 복잡한 코드는 지원되지 않는 것 같습니다. (너무 오래 잊어버려서)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[이산 수학] 구 - 구조 문법 (Phrase-Structure Grammars) / 언어 L(G) / 문법의 유형 (Types of Grammars)G = (V,T,S,P) - w ⇒ z 로 표현할 수 있다. 만약 다음과 같이 유도할 수 있다면, ∗은 W1 에서 Wn을 유도하기까지 0 ~ n 단계를 거칠 수 있음을 의미한다. 문법 G = (V,T,S,P)으로 생...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.