/* Including Files */
# include<iostream.h>
# include<conio.h>
# include<string.h>
# include<time.h>
# include<math.h>
# include<stdlib.h>
# include<dos.h>
# include<stdio.h>
# include<fstream.h>
/* Defining Costants*/
// Max. length in characters of any automated reply ( Keyword only)
# define MAX_RESP_LEN 65
// Max. number of responses for any keyword
# define MAX_RESP_NO 20
// Max. number of keywords
# define MAX_KEY 13
// Max. number of Transpositions
# define TRANSPOSE 12
// Max. Size Of User Input
# define MAX_USER_INPUT 100
// Max. Length of Keyword
# define MAX_KWD_LEN 20
// Delay involved in typing (in ms)
# define DELAY 20
/* Defining Global Variables */
// for getting the user name
char user[30];
// for word transpositions
char wordin[TRANSPOSE][MAX_RESP_LEN];
char wordout[TRANSPOSE][MAX_RESP_LEN];
int RanNum(int max);
void initialize_global();
class progstr
{
public:
char userip[MAX_USER_INPUT];
char keyword[30];
int keyfound;
int keyno;
int nullip;
// constructor
progstr()
{
keyno=-1;
nullip=0;
}
}ip;
class resp
{
int tot_resp;
int last_resp;
char replys[MAX_RESP_NO][MAX_RESP_LEN];
char word[MAX_KWD_LEN];
public:
// constructor
resp()
{
tot_resp=0;
last_resp=-1;
}
int getcount()
{
return last_resp;
}
void addword(char str[MAX_KWD_LEN])
{
strcpy(word,str);
}
char * getword()
{
return word;
}
void addresp(char str[MAX_RESP_LEN])
{
strcpy(replys[++last_resp],str);
}
void display_resp(int num);
void quit_display_resp(int num);
};
void display_logo()
{
cout<<" EEEEEEEE L IIIIIII ZZZZZZZ AAA "<<endl;
delay(DELAY);
cout<<" E L I Z A A "<<endl;
delay(DELAY);
cout<<" E L I Z A A "<<endl;
delay(DELAY);
cout<<" EEEEE L I Z A A "<<endl;
delay(DELAY);
cout<<" E L I Z AAAAAAA "<<endl;
delay(DELAY);
cout<<" E L I Z A A "<<endl;
delay(DELAY);
cout<<" EEEEEEEE LLLLLLLL IIIIIII ZZZZZZ A A "<<endl;
}
void display_line()
{
int width=80;
int i=0;
int x=wherex();
int y=wherey()+1;
x=40;
for(int k=0;k<40;k++)
{
delay(DELAY);
gotoxy(x+k,y);
cout<<(char)240;
gotoxy(x-k,y);
delay(DELAY);
cout<<(char)240;
}
cout<<"\n";
}
void resp :: display_resp(int num)
{
cout<<"ELIZA > ";
for(int i=0;i<strlen(replys[num]);i++)
{
// for deliberate typing errors
if(RanNum(6)==0)
{ char c=RanNum(100);
if(c=='\n' || c=='\b' || c==13)
cout<<"w";
else
cout<<c;
delay(RanNum(DELAY));
cout<<"\b";
}
if(replys[num][i]=='*')
{
char * s1=ip.userip+strlen(ip.keyword);
short int flag=0;
for(int m=0;m<TRANSPOSE;m++)
{
char * s2=wordin[m];
char *ptr=NULL;
ptr=strstr(s1,s2);
if(ptr!=NULL)
{
// transposition word found in the
// user input
flag=1;
// printing text before wordin[m]
int times=ptr-s1;
for(int i=0;i<times;i++)
{
delay(DELAY);
cout<<ip.userip[strlen(ip.keyword)+i];
}
// printing the wordout
cout<<wordout[m];
// printing the left overs
char c;
c=*(ptr+strlen(wordin[m]));
int t=0;
while(c!='\0')
{
cout<<*(ptr+strlen(wordin[m])+t);
t++;
c=*(ptr+strlen(wordin[m])+t);
}
}
} // end of for
// if flag is still zero , this means no transpose.
if(0==flag)
{
char c;
c=*(s1+strlen(ip.keyword));
int t=0;
while(c!='\0')
{
cout<<*(s1+t);
t++;
c=*(s1+t);
}
} // end of if
break;
}
else
{
cout<<replys[num][i];
delay(RanNum(DELAY));
}
} // end of for
cout<<"\n"<<user<<" > ";
}
void resp :: quit_display_resp(int num)
{
cout<<"ELIZA > ";
for(int i=0;i<strlen(replys[num]);i++)
{
// for deliberate typing errors
if(RanNum(6)==0)
{ char c=RanNum(100);
if(c=='\n' || c=='\b' || c==13)
cout<<"w";
else
cout<<c;
delay(RanNum(DELAY));
cout<<"\b";
}
cout<<replys[num][i];
delay(RanNum(DELAY));
} // end of for
}
resp keys[MAX_KEY];
int RanNum(int max)
{
randomize();
return rand() % max;
}
void find_keyword()
{
int len=0;
int lenkey=0;
int key_no=0;
char teststr[50];
while((ip.keyfound==0) &&(key_no!=MAX_KEY))
{
// getting the length of the keyword
lenkey=strlen(keys[key_no].getword());
char *ptr=NULL;
ptr=strstr(ip.userip,keys[key_no].getword());
if (ptr!=NULL)
{
// keyword found !
ip.keyfound=1;
ip.keyno=key_no;
strcpy(ip.keyword,keys[key_no].getword());
break;
}
/*//////////////////////////////////////////
for(int i=0;i<lenkey;i++)
{
teststr[i]=ip.userip[i];
}
teststr[i]='\0';
if (strcmp(teststr,keys[key_no].getword())==0)
{
ip.keyfound=1;
ip.keyno=key_no;
strcpy(ip.keyword,keys[key_no].getword());
}
//////////////////////////////////////////*/
key_no++;
}
}
void read_from_file()
{
ifstream fin;
int index=-1;
fin.open("eliza.dat");
char line[MAX_RESP_LEN];
while(fin)
{
fin.getline(line,MAX_RESP_LEN);
char *ptr=NULL;
ptr=strstr("@KWD@",line);
if(strlen(line)<1)
{
break;
}
else if(ptr!=NULL)
{
// the next line is a keyword
fin.getline(line,MAX_RESP_LEN);
keys[++index].addword(line);
}
else
{
// it is a response
keys[index].addresp(line);
}
} // end of while
} // end of function
void main()
{
clrscr();
display_line();
display_logo();
display_line();
// for initializing the global variables
initialize_global();
// for no response by the user.
resp null_resp;
null_resp.addresp("HUH ?");
null_resp.addresp("WHAT ?");
null_resp.addresp("COME AGAIN ?");
null_resp.addresp("HOW I AM SUPPOSED TO TALK IF YOU DON'T SAY ANYTHING ?");
// upon logging in
resp signon;
signon.addresp("HI, I'M ELIZA. WHAT DO YOU WANT TO TALK ABOUT ?");
signon.addresp("SO HOW ARE YOU DOING TODAY ?");
signon.addresp("HELLO, WHAT'S UP TODAY ?");
// when no key found
resp no_key;
no_key.addresp("PLEASE GO ON...");
no_key.addresp("WHAT DOES THAT SUGGEST TO YOU ?");
no_key.addresp("I SEE");
no_key.addresp("I'M NOT SURE I KNOW WHAT YOU ARE TALKING ABOUT ");
no_key.addresp("WHAT'S THAT SUPPOSED TO MEAN ?");
no_key.addresp("CAN YOU CLARIFY THAT A BIT ?");
no_key.addresp("THAT'S INTERESTING...");
no_key.addresp("AND ????");
resp bye;
bye.addresp("GOOD BYE, HAVE A NICE DAY...");
bye.addresp("BYE, HOPE TO SEE YOU SOON...");
bye.addresp("BYE AND KEEP IN TOUCH...");
// reading data from dictionary
read_from_file();
// STARTING CONVERSATION WITH THE USER
// welcoming the user
cout<<"ELIZA > (PLEASE TYPE IN ALL CAPS) WHAT'S YOUR NAME DEAR ?\n";
cin>>user;
signon.display_resp(RanNum(signon.getcount()));
fflush(stdin);
gets(ip.userip);
strcpy(ip.userip,strupr(ip.userip));
while(strcmp(ip.userip,"BYE")!=0)
{
find_keyword();
if(strlen(ip.userip)<1)
{
null_resp.display_resp(RanNum(null_resp.getcount()));
}
else if(ip.keyfound==1)
{
keys[ip.keyno].display_resp(RanNum(keys[ip.keyno].getcount()));
}
else
{
no_key.display_resp(RanNum(no_key.getcount()));
}
// again returning to normal values of the data items
strcpy(ip.userip," ");
ip.keyno=-1;
ip.keyfound=0;
fflush(stdin);
gets(ip.userip);
strcpy(ip.userip,strupr(ip.userip));
} // end of while
bye.quit_display_resp(RanNum(null_resp.getcount()));
cout<<endl;
display_line();
cout<<"\t\t\tIMPORTANT\n\nPlease note that the current functionality and \
features of this program are very limited and they are just for \
accompanying the article that I posted on Planet Source Code. If you want \
to make this program more intelligent, make entries in Eliza.Dat file. \
\n You can also increase the string manipulation power of the program, \
like considering multiple lines from the user, etc. I had written this code in 1 1/2 hr. \
just to make it more easier for the readers of my article about what is \
happening.\n\n HOW SMART YOU MAKE YOUR ELIZA DEPENDS ON HOW FAR YOU EXTEND \
THIS PROGRAM. THERE IS PRACTICALLY NO LIMIT ! \n\n\n\
THIS CODE IS THE MINIMAL WORKING SKELETON !!\n\n";
display_line();
getch();
}
void initialize_global()
{
strcpy(wordin[0],"ARE");
strcpy(wordout[0],"AM");
strcpy(wordin[1],"AM");
strcpy(wordout[1],"ARE");
strcpy(wordin[2],"WERE");
strcpy(wordout[2],"WAS");
strcpy(wordin[3],"WAS");
strcpy(wordout[3],"WERE");
strcpy(wordin[4],"YOU");
strcpy(wordout[4],"ME");
strcpy(wordin[5]," I ");
strcpy(wordout[5],"YOU");
strcpy(wordin[6],"YOUR");
strcpy(wordout[6],"MY");
strcpy(wordin[7],"MY");
strcpy(wordout[7],"YOUR");
strcpy(wordin[8],"I'VE");
strcpy(wordout[8],"YOU'VE");
strcpy(wordin[9],"YOU'VE");
strcpy(wordout[9],"I'VE");
strcpy(wordin[10],"I'M");
strcpy(wordout[10],"YOU'RE");
strcpy(wordin[11],"YOU'RE");
strcpy(wordout[11],"I'M");
strcpy(wordin[12],"ME");
strcpy(wordout[12],"YOU");
strcpy(wordin[13],"YOU");
strcpy(wordout[13],"ME");
}
¤ Dauer der Verarbeitung: 0.30 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|