📄 gene.cpp
字号:
// Gene.cpp: implementation of the Gene class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Gene.h"
#include <string.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Gene::Gene()
{
}
Gene::~Gene()
{
}
Gene::Gene(const char s[],int &p)
{
strcpy(str,s);
Dclength=p;
cout<<"Initi:"<<str<<endl;
outlength=0;
aresult=0.0;
nodepoint=0;
begin=0;
}
void Gene::Insert()
{
btree *p;
btree *queue[34];
int front,rear;
head.data=str[0];
head.left=NULL;head.middle=NULL;head.right=NULL;
cout<<"Layer:"<<head.data;
front=-1;
rear=0;
queue[rear]=&head;
nodepoint=0;
while(front!=rear)
{
front++;
p=queue[front];
if(p->data=='I'){
node[nodepoint].data=str[rear+1];
node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
p->left=&node[nodepoint];
queue[rear+1]=p->left;
cout<<node[nodepoint].data;
nodepoint++;
node[nodepoint].data=str[rear+2];
node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
p->middle=&node[nodepoint];
queue[rear+2]=p->middle;
cout<<node[nodepoint].data;
nodepoint++;
node[nodepoint].data=str[rear+3];
node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
p->right=&node[nodepoint];
queue[rear+3]=p->right;
cout<<node[nodepoint].data;
nodepoint++;
rear+=3;
}
else if(p->data=='+'||p->data=='-'||p->data=='*'||p->data=='/')
{
node[nodepoint].data=str[rear+1];
node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
p->left=&node[nodepoint];
queue[rear+1]=p->left;
cout<<node[nodepoint].data;
nodepoint++;
node[nodepoint].data=str[rear+2];
node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
p->middle=NULL;
p->right=&node[nodepoint];
queue[rear+2]=p->right;
cout<<node[nodepoint].data;
nodepoint++;
rear+=2;
}
else if(p->data=='L'||p->data=='E'||p->data=='Q'||p->data=='~'||p->data=='S'||p->data=='C'||p->data=='T')
{
node[nodepoint].data=str[rear+1];
node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
p->left=&node[nodepoint];p->middle=NULL;p->right=NULL;
queue[rear+1]=p->left;
cout<<node[nodepoint].data;
nodepoint++;
rear+=1;
}
else {p->left=NULL;p->middle=NULL;p->right=NULL;}
}
cout<<endl;
headpoint=&head;
}
void Gene::Postorder(const btree *headpoint)
{
if(headpoint!=NULL){
if(headpoint->left!=NULL)Postorder(headpoint->left);
if(headpoint->middle!=NULL)Postorder(headpoint->middle);
if(headpoint->right!=NULL)Postorder(headpoint->right);
//cout<<headpoint->data;
output[outlength++]=headpoint->data;
}
else return;
}
void Gene::Result(const double Dc[],const double *tenvary)
{
double temp;
char string[35];
double number[34];
int i,flag,position,begin; //begin为Dc[]的下标指针
output[outlength]='\0';
cout<<"posto:"<<output<<endl;
flag=0;
position=0;
begin=0;
while(output[position]!='\0'&&output[position]!='\n'&&position<outlength){
string[flag]=output[position];
if(string[flag]=='a'||string[flag]=='b'||string[flag]=='c'||string[flag]=='d'||string[flag]=='e'||string[flag]=='f')
{
if(string[flag]=='a'){
number[flag]=tenvary[0];
flag++;
position++;
}
else if(string[flag]=='b'){
number[flag]=tenvary[1];
flag++;
position++;
}
else if(string[flag]=='c'){
number[flag]=tenvary[2];
flag++;
position++;
}
else if(string[flag]=='d'){
number[flag]=tenvary[3];
flag++;
position++;
}
else if(string[flag]=='e'){
number[flag]=tenvary[4];
flag++;
position++;
}
else if(string[flag]=='f'){
number[flag]=tenvary[5];
flag++;
position++;
}
}
else if(string[flag]=='?')
{
if(begin<23)number[flag]=Dc[begin++];
else{
number[flag]=Dc[0];
//cout<<"error!!"<<endl;
}
flag++;
position++;
}
else if(string[flag]=='I')
{
if(number[flag-3]>0)temp=number[flag-2];
else temp=number[flag-1];
flag-=3;
number[flag]=temp;
flag++;
position++;
}
else if(string[flag]=='L'||string[flag]=='E'||string[flag]=='Q'||string[flag]=='~'||string[flag]=='S'||string[flag]=='C'||string[flag]=='T')
{
if(string[flag]=='L'){
if(number[flag-1]>0)temp=logl(number[flag-1]);
else temp=logl(-number[flag-1]);
}
else if(string[flag]=='E'){
if(number[flag-1]<354)temp=expl(number[flag-1]);
else temp=-1.0;
}
else if(string[flag]=='Q'){
if(number[flag-1]>=0)temp=sqrtl(number[flag-1]);
else temp=sqrtl(-number[flag-1]);
}
else if(string[flag]=='~'){
if(number[flag-1]<154)temp=powl(10,(number[flag-1]));
else temp=-1.0;
}
else if(string[flag]=='S')temp=sinl(number[flag-1]);
else if(string[flag]=='C')temp=cosl(number[flag-1]);
else temp=tanl(number[flag-1]); //tan
flag-=1;
number[flag]=temp;
flag++;
position++;
}
else
{
i=flag;
switch(output[position])
{
case '+':
{
if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
{temp=(number[i-2])+(number[i-1]);break;}
else {temp=-1.0;break;}
}
case '-':
{
if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
{temp=(number[i-2])-(number[i-1]);break;}
else {temp=-1.0;break;}
}
case '*':
{
if(number[i-2]<(9.0e+151)&&number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151))
{temp=(number[i-2])*(number[i-1]);break;}
else {temp=-1.0;break;}
}
case '/':
{
if(number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151)&&number[i-1]!=0&&number[i-2]<(9.0e+151))
{temp=(number[i-2])/(number[i-1]);break;}
else {temp=-1.0;break;}
}
default :break;
}
flag-=2;
number[flag]=temp;
flag++;
position++;
}
}
if(number[flag-1]<(4.0e+100)&&number[flag-1]>(-4.0e+100)&&flag>0)aresult=number[flag-1];
else aresult=-1.0;
}
double & Gene::Displayresult()
{
return aresult;
}
void Gene::Setbegin()
{
begin=0;
}
void Gene::Ofdd(const btree *head,ofstream &of,const double Dc[])
{
if(head!=NULL)
{
if(head->data=='I'){
of<<"(if(";
Ofdd(head->left,of,Dc);
of<<")>0,then ";
Ofdd(head->middle,of,Dc);
of<<",else ";
Ofdd(head->right,of,Dc);
of<<")";
}
else if(head->data=='E'||head->data=='~'||head->data=='S'||head->data=='C'||head->data=='T')
{
switch(head->data)
{
case 'E':of<<"exp";break;
case '~':of<<"10.^";break;
case 'S':of<<"sin";break;
case 'C':of<<"cos";break;
case 'T':of<<"tan";break;
default:break;
}
of<<"(";
Ofdd(head->left,of,Dc);
of<<")";
}
else if(head->data=='L'||head->data=='Q')
{
switch(head->data)
{
case 'L':of<<"log";break;
case 'Q':of<<"sqrt";break;
default:break;
}
of<<"(abs(";
Ofdd(head->left,of,Dc);
of<<"))";
}
else if(head->data=='+'||head->data=='-'||head->data=='*'||head->data=='/')
{
of<<"(";
Ofdd(head->left,of,Dc);
if(head->data=='*'||head->data=='/')of<<"."<<head->data;
else of<<head->data;
Ofdd(head->right,of,Dc);
of<<")";
}
else if(head->data=='?')
{
if(begin<23)
{
if(Dc[begin]<0)of<<"("<<Dc[begin]<<")";
else of<<Dc[begin];
begin++;
}
else {
begin=0;
if(Dc[begin]<0)of<<"("<<Dc[begin]<<")";
else of<<Dc[begin];
begin++;
}
}
else
of<<head->data;
}
else return;
}
int & Gene::Genejudge(const double Dc[],const double *tenvary)
{
double temp;
char string[35]; //maxnode+1
double number[34]; //maxnode
int i,flag,position,begin;
output[outlength]='\0';
//cout<<output<<endl;
flag=0;
position=0;
begin=0;
while(output[position]!='\0'&&output[position]!='\n'&&position<outlength)
{
string[flag]=output[position];
if(string[flag]=='a'||string[flag]=='b'||string[flag]=='c'||string[flag]=='d'||string[flag]=='e'||string[flag]=='f')
{
if(string[flag]=='a'){
number[flag]=tenvary[0];
flag++;
position++;
}
else if(string[flag]=='b'){
number[flag]=tenvary[1];
flag++;
position++;
}
else if(string[flag]=='c'){
number[flag]=tenvary[2];
flag++;
position++;
}
else if(string[flag]=='d'){
number[flag]=tenvary[3];
flag++;
position++;
}
else if(string[flag]=='e'){
number[flag]=tenvary[4];
flag++;
position++;
}
else if(string[flag]=='f')
{
number[flag]=tenvary[5];
flag++;
position++;
}
}
else if(string[flag]=='?')
{
if(begin<23)number[flag]=Dc[begin++];
else number[flag]=Dc[0];
flag++;
position++;
}
else if(string[flag]=='I')
{
if(number[flag-3]>0)temp=number[flag-2];
else temp=number[flag-1];
flag-=3;
number[flag]=temp;
flag++;
position++;
}
else if(string[flag]=='L'||string[flag]=='E'||string[flag]=='Q'||string[flag]=='~'||string[flag]=='S'||string[flag]=='C'||string[flag]=='T')
{
if(string[flag]=='L'){
if(number[flag-1]>0)temp=logl(number[flag-1]);
else temp=logl(-number[flag-1]);
}
else if(string[flag]=='E'){
if(number[flag-1]<354)temp=expl(number[flag-1]);
else {legal=0;break;}
}
else if(string[flag]=='Q'){
if(number[flag-1]>=0)temp=sqrtl(number[flag-1]);
else temp=sqrtl(-number[flag-1]);
}
else if(string[flag]=='~'){
if(number[flag-1]<154)temp=powl(10,(number[flag-1]));
else {legal=0;break;}
}
else if(string[flag]=='S')temp=sinl(number[flag-1]);
else if(string[flag]=='C')temp=cosl(number[flag-1]);
else temp=tanl(number[flag-1]);
flag-=1;
number[flag]=temp;
flag++;
position++;
}
else
{
i=flag;
if(string[flag]=='+')
{
if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
temp=(number[i-2])+(number[i-1]);
else {legal=0;break;}
}
else if(string[flag]=='-')
{
if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
temp=(number[i-2])-(number[i-1]);
else {legal=0;break;}
}
else if(string[flag]=='*')
{
if(number[i-2]<(9.0e+151)&&number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151))
temp=(number[i-2])*(number[i-1]);
else {legal=0;break;}
}
else //if(string[flag]=='/')
{
if(number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151)&&number[i-1]!=0&&number[i-2]<(9.0e+151))
temp=(number[i-2])/(number[i-1]);
else {legal=0;break;}
}
flag-=2;
number[flag]=temp;
flag++;
position++;
}
}
return legal;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -