UTNianos

Versión completa: [AYUDA] Sintaxis y Semantica
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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.
Tarde un rato pero lo logre.
Lo solucione, si a alguien le interesa dejo el código.

Ya pueden cerrar el th.

Gracias de todos modos.


#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;
char *p;

unsigned int transitionTable[7][4] = {
{1, 2, 6, 3},
{1, 3, 6, 4},
{3, 2, 6, 5},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{6, 6, 6, 3}
};

char buffer[10];
int cont=0;

int main(){
//Declarations
char character;
int acceptednum = 0, rejected = 0, acceptedchar = 0;
unsigned int state, viejostate, column;

FILE* file = fopen("text.txt","r");

//Statements

//buffer[0]=character;
//cont++;
state = INITIAL_STATE;
while(!feof(file)){
state = INITIAL_STATE; //blanqueo de estado
character = fgetc(file);
//cont=0;
while((!isEndState(state)) && (state != ERROR_STATE)){
column = getColumn(character);//tomo columna
viejostate=state;
state = transitionTable[state][column];//tomo estado
if ((column == COLUMN2)||(column == COLUMN1)){
buffer[cont]=character;
cont++;
character = fgetc(file);
}
}


if(isEndState(state)){ // pueden ser 4 y 3 y 5
if(state == 4){ // 4 son las aceptadas numericas
printf("\nAceptada numerica\n");
acceptednum++;
p = buffer;
while (*p != '\0'){
printf( "%c", *p ); /* Mostramos la letra actual */
p++;
}
cont=0;
buffer[0] = '\0';
printf( "\n", *p );
}
else if(state == 5){ // 5 son las aceptadas char
printf("\nAceptada caracter\n");
acceptedchar++;
buffer[cont]='\0';
p = buffer;
while (*p != '\0'){
printf( "%c", *p ); /* Mostramos la letra actual */
p++;
}
cont=0;
buffer[0] = '\0';
printf( "\n", *p );
}
else // solo pueden ser 3 y son rechazadas
{
printf("Rechazada\n"); //rechazo la cadena en error sin pasar por el estado final
buffer[cont]='\0';
p = buffer;
while (*p != '\0'){
printf( "%c", *p ); /* Mostramos la letra actual */
p++;
}
cont=0;
buffer[0] = '\0';
printf( "\n", *p );
rejected++;
}
}
//else if (state == ERROR_STATE){ //ESTA EN EOF
//termino
//}

}

printf("El total de cadenas numericas aceptadas es: %d", acceptednum);
printf("\n El total de cadenas de caracteres aceptadas es: %d", acceptedchar);
printf("\n El 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
}


URLs de referencia