Hola, como están?
Estoy terminando un TP de sintaxis que quede adeudando indefinidamente y llego la hora de entregarlo.
Quería ver si alguien me podía dar una pauta de por donde estoy metiendo la pata, si bien compila, tengo errores de logica y este no funciona como debiese.
El enunciado pide que :
Definimos una palabra como una sucesión no vacía de letras. Número como una sucesión no vacía de dígitos. Rechazo es toda cadena que contenga mezcla de letras y números. Cualquier carácter que no sea ni una letra ni un número es un separador.Se pide mostrar que se reconoce y contar los totales.
Ejemplo de salida:
Reconocida la palabra: aabcZe
Reconocido el número: 568
Rechazada la cadena: 23dhs4s
Rechazada la cadena: am56
Cantidad total de palabras: 1
Cantidad total de números: 1
Cantidad total de de rechazos: 2
--------------------------------------------------------------------------------------------
Mi problema definitivamente esta en mostrar la palabra o aceptarla pero no pedo entender que esta pasando.
--------------------------------------------------------------------------------------------
#include<stdio.h>
#include<ctype.h>
#define EXIT_SUCCESS 0
#define INITIAL_STATE 0
#define ERROR_STATE 6
enum {COLUMN1,COLUMN2,COLUMN3,COLUMN4};
//Headers
int isEndState(int state);
int isOther(char character);
unsigned int getColumn(char character);
int i;
unsigned int transitionTable[7][4] = {
{1, 2, 6, 3},
{1, 6, 6, 4},
{6, 2, 6, 5},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{6, 6, 6, 3}
};
char buffer[10];
int cont;
int main(){
//Declarations
char character;
int acceptednum = 0, rejected = 0, acceptedchar = 0;
unsigned int state, column;
FILE* file = fopen("text.txt","r");
//Statements
character = fgetc(file);
buffer[0]=character;
cont++;
state = INITIAL_STATE;
while(!feof(file)){
state = INITIAL_STATE; //blanqueo de estado
cont=0;
while(!isEndState(state) && (state != ERROR_STATE)){
column = getColumn(character);//tomo columna
state = transitionTable[state][column];//tomo estado
if (column != COLUMN3){
character = fgetc(file);
buffer[cont]=character;
cont++;
}
}
if(isEndState(state)){ // pueden ser 4 y 3 y 5
if(state == 4){ // 4 son las aceptadas numericas
printf("\nAceptada numerica");
acceptednum++;
buffer[cont]='\0';
for(i=0;i==cont;i++){
printf("%d\n",buffer[cont]);
}
}
else if(state == 5){ // 5 son las aceptadas char
printf("\nAceptada caracter");
acceptedchar++;
buffer[cont]='\0';
for(i=0;i==cont;i++){
printf("%d\n",buffer[cont]);
}
}
else // solo pueden ser 3 y son rechazadas
{
rejected++;
}
}
else if (state == ERROR_STATE){ //en estado 6 espero un c.especial y blanqueo el estado
while((!isOther(character)) && (column != COLUMN3) && (!isEndState(character) ) ){
character = fgetc(file);
buffer[cont]=character;
cont++;
}
printf("\nRechazada"); //rechazo la cadena en error sin pasar por el estado final
buffer[cont]='\0';
for(i=0;i==cont;i++){
printf("%d\n",buffer[cont]);
}
rejected++;
}
}
printf("\nEl total de cadenas numericas aceptadas es: %d", acceptednum);
printf("\nEl total de cadenas de caracteres aceptadas es: %d", acceptedchar);
printf("\nEl total de cadenas rechazadas es: %d", rejected);
fclose(file);
scanf("%");
return EXIT_SUCCESS;
}
//Functions
int isEndState(int state){
return state == 3 || state == 4 || state == 5;
}
int isOther(char character){ //cualquiera que no sea letra ni numero
return !(isdigit(character) || isalpha(character));
}
unsigned int getColumn(char character){
if(isdigit(character))
return COLUMN1; //numero
else if(isalpha(character))
return COLUMN2;//letra
else if(character = EOF)
return COLUMN3;//eof
else
return COLUMN4;//c.especial
}
Desde ya, Gracias.