Exemplo 4

 

/* exemplo de pergunta do banco de dados PLN "noise-disposal" */
#include "stdio.h"

#define MAX 100

#define NOISE 0
#define COMMAND 1
#define NAME 2
#define MODIFIER 3
#define OPERATOR 4
#define TERM 5

/* estrutura do banco de dados das palavras (wdb) */
struct word {
char word[20];
char type;
};
struct word wdb[MAX]; /* matriz da estrutura do db */

/* estrutura do banco de dados de estoque */
struct companies {
char name[20];
float price;
};
struct companies stock[MAX]; /* matriz das estruturas do banco de dados */
int db_pos=0; /* numero de entradas no wdb */
int stock_pos=0; /*numero de entradas no db do estoque */

char s[80]; /* contem a sentenca */
char *t_pos=0; /* pontos na sentenca */
char token[80]; /* contem a palavra */

float get_quant( ), find_price( ), find_name( );

/* coloca as palavras no banco de dados */
assert_wdb(word,type){
char *word;
int type;

if (db_pos,MAX) {
strcpy(wdb[db_pos].word, word);
wdb[db_pos].type=type;
db_pos++;
}
else printf("O banco de dados esta cheio.\n");
}
setup ( )
{
assert_wdb("xyz",NAME);
assert_wdb("ucl",NAME);
assert_wdb("abc",NAME);
assert_wdb("show",COMMAND);
assert_wdb("is",COMMAND);
assert_wdb("all",MODIFIER);
assert_wdb("one",MODIFIER);
assert_wdb(">",OPERATOR);
assert_wdb("<",OPERATOR);
assert_wdb("=",OPERATOR);
assert_wdb(".", TERM);
assert_wdb("?",TERM);
assert_stock("ucl",123.00);
assert_stock("abc",35.75);
assert_stock("xyz",100.0);


/* coloca as companhias no banco de dados */
assert_stock(name, price)
char *name;
float price;
{
if (stock_pos<MAX) {
strcpy(stock[stock_pos].name, name);
stock[stock_pos].price=price;
stock_pos++;
}
else printf("O banco de dados de estoque esta cheio.\n");
}
/* analisador da maquina de estado */
parse ( )
{
char com[80], mod[80], name[80], op;
float quant;

if (!get_com(com)) return 0;
get_mod (mod);
get_name(name);
op=get_op( );
quant=get_quant( );
perform (com, mod, name, op, quant);
return 1;
}

/* obtem o sucesso */
get_com(s)
char *s;
{
get_noise( );
get_token( );
if (find_type(token)!=COMMAND) {
strcpy(s," ");
return 0;
}
strcpu(s,token);
return 1;
}

/* obtem um modificador ou padrao p/ "all" */
get_mod(s)
char *s;
{
get_noise( );
get_token( );
if (find_type(token) != MODIFIER) {
strcpy(s, "all");
put_back( );
return;
}
strcpy(s,token);
}

/* obtem o comando */
get_name(s)
char *s;
{
get_noise( );
get_token( );
if(find_type(token)!=NAME) {
strcpy(s," ");
put_back( );
return;
}
strcpy(s,token);
}
get_op ( )
{
get_noise( );
get_token( );
if(find_type(token)==OPERATOR)
return *token;
else return 0;
}

float get_quant ( )
{
float t;
get_token( );
if (*token!='.')
sscanf(token, '%f', &t);
return t;
}
get_noise( )
{
do {
get_token( );
}while (!find_type(token));
put_back( );
}
perform(com,mod,name,op,quant)
char *com, *mod, *name, op;
float quant;
{
if (!strcmp("show", com)){
if (*name) printf("%f\n", fins_price(name));
else search (mod, op, quant);
}
else {
switch(op) {
case '=':
if(quant==find_price(name))
printf(" sim\n");
else printf(" não\n");
break;
case '<':
if(find_price(name)<quant)
printf(" sim\n");
else printf (" não\n");
break;
case '>':
if(find_price(name)>quant)
printf(" sim\n");
else printf (" não\n");
break;
}
}
}
search(mod, op, quant)
char *mod, op;
float quant;
{
char name [80];
float price;

find_name(" ", quant, op, 1);
if(!strcmp(mod, "all")) {
while(price=find_name(name, quant, op, 0) !=0) {
printf("%s", name);
printf(" %f\n", price);
}
}
else {
price=find_name(name, quant, op,0);
printf("%s", name);
printf(" %f\n", price);
}
}
/* retorna o ultimo "token" p/ a entrada */
put_back ( )
{
int t;
for (t=0; t<strlen(token); t++) t_pos--);
}
terminator( )
{
get_token( );
return (find_type(token) ==TERM);
}
/* atraves do nome encontra-se o preco */
float find_price (name)
char *name;
{
int t;
for(t=0; t<stock_pos; t++) {
if(!strcmp(name, stock[t].name))
return stock[t].price;
}
return -1.0;
}

/* atraves do preco e da variavel op encontra-se o nome */
float find_name(name, price, op, restart)
char *name, op, restart;
float price;
{
static int t;
if (restart) {
t=0;
return;
}
do {
switch (op) {
case '=':
if(stock[t].price==price) {
strcpy(name.stock[t].name);
t++;
return stock[t-1].price;
}
break;
case '<':
if(stock[t].price<price) {
strcpy(name, stock[t].name);
t++;
return stock[t-1].price;
}
case '>':
if (stock[t].price>price) {
strcpy(name, stock[t].name);
t++;
return stock[t-1].price;
}
break;
case '\0':
strcpy(name, stock[t].name);
t++;
return stock[t-1].price;
}
t++;
}while (t<stock_pos);
return 0;
}

/* acha o tipo dando a palavra */
find_type(word)
char *word;
{
int t;
for (t=0; t<db_pos; t++)
if(!strcmp(word, wdb, wdb[t].word))
return wdb[t].type;
return 0;
}
get_token( )
{
char *p;
p=token;
/* pula espacos */
while (*t_pos==' ') t_pos++;
if(*t_pos=='.') {
*p++='.';
*p='\0';
return;
}

/* le uma palavra ate um espaco ou ponto */
while (*t_pos !=' ' && *t_pos!='.') {
*p=*t_pos++;
p++;
}
*p='\0';
main ( )
{
setup( );
printf("Entre com a pergunta:");
gets(s);
printf("/n");
t_pos=s;
if (!parse( )) printf("A pergunta nao foi entendida. \n");
}
}

VOLTAR