17
Facultad de Ciencias Empresariales Departamento de Sistemas Informáticos Ingeniería Civil Informática Tarea N° 3: Programación de un AFD Asignatura : Fundamentos de Cs De la Computación Profesora : Sra. Brunny A. Troncoso Pantoja Alumnos : Joel S. Torres Carrasco Cristian M. Vallejos Vega Fecha : Miércoles 3 de Noviembre de 2010

Tr3 Torres Vallejos FCC

Embed Size (px)

Citation preview

Page 1: Tr3 Torres Vallejos FCC

Facultad de Ciencias Empresariales

Departamento de Sistemas Informáticos

Ingeniería Civil Informática

Tarea N° 3:

Programación de un

AFD

Asignatura : Fundamentos de Cs De la Computación

Profesora : Sra. Brunny A. Troncoso Pantoja

Alumnos : Joel S. Torres Carrasco

Cristian M. Vallejos Vega

Fecha : Miércoles 3 de Noviembre de 2010

Page 2: Tr3 Torres Vallejos FCC

Enunciado:

Escribir un programa en C que permita ingresar una cadena binaria cualquiera, y a través de la

implementación de un AFD que reconozca números binarios múltiplos de 5, determine si éste

es o no un múltiplo de 5 y lo indique.

Los números a reconocer estarán acotados al intervalo [1, 100] y además, se considerará que el

tamaño de la cadena es un byte, donde los 4 primeros bits identifican la decena y los cuatro

últimos bits identifican a la unidad.

Solución:

En primer lugar, se hace necesario identificar que cadenas son las que debe reconocer el AFD,

así se sabe que los números múltiplos de 5 que se encierran en el intervalo señalado en el

enunciado son: {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100}.

Ahora el enunciado señala que estos números deben ser ingresados y reconocidos de forma

binaria, siguiendo un formato especial para “facilitar” la solución, donde en una cadena de 8

bits, los 4 primeros bits corresponden a la decena y los últimos 4 bits corresponden a la unidad,

esto es:

Si 0001 = 1 y 1001 = 9, entonces al unirlos se formará el 19 de la forma 00011001 (sólo por

concatenación y no por el valor verdadero en binario).

Además, se sabe por regla matemática que todo número múltiplo de 5 debe terminar

necesariamente en 0 o en 5, por lo que el AFD debe reconocer sólo las combinaciones de

cadenas que terminen en 0000 (cero) o 0101 (cinco).

Podría parecer que esta es la única restricción para nuestro AFD, pero aún nos queda validar las

condiciones del intervalo, así, los primeros 4 bits deberán estar entre 0 y 10, reconociéndose el

siguiente conjunto de cadenas: {0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010}.

De forma tabular y esquemática, se tiene:

Decenas Unidades

0= 0000 0= 0000 1= 0001 2= 0010 3= 0011 4= 0100 5= 0101 6= 0110 5= 0101 7= 0111 8= 1000 9= 1001 10= 1010

Page 3: Tr3 Torres Vallejos FCC

Además se tiene dos casos especiales, donde 0= 0000 puede combinarse sólo con 5= 0101 y

10 = 1010 sólo puede combinarse con 0= 0000 (por condición de intervalo).

Así, el conjunto de cadenas a reconocer finalmente por nuestro AFD es: {00000101, 00010000,

00010101, 00100000, 00100101, 00110000, 00110101, 01000000, 01000101, 01010000,

01010101, 01100000, 01100101,01110000, 01110101, 10000000, 10000101, 10010000, 10010101,

10100000}.

Reconocido ya el conjunto de strings a validar se procede a hacer el dibujo de la máquina:

Page 4: Tr3 Torres Vallejos FCC

Luego, se procede a definir formalmente el AFD:

M=(, Q, q0, F, )

={0,1}

Q={q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20,

q21, q22, q23, q24}

q0

F= {q14}

=

Estados 0 1

q0 q1 q7

q1 q2 q3

q2 q4 q5

q3 q5 q5

q4 q11 q6

q5 q6 q6

q6 q20 q24

q7 q8 q24

q8 q5 q9

q9 q10 q24

q10 q17 q24

q11 q21 q24

q12 q13 q24

q13 (q14) q24

(q14) q24 q24

q15 q16 q24

q16 q24 q14

q17 q18 q24

q18 q19 q24

q19 (q14) q24

q20 q12 q15

q21 q24 q22

q22 q23 q24

q23 q24 q14

q24 q24 q24

Page 5: Tr3 Torres Vallejos FCC

Ahora se presenta la solución del AFD programado en C, con sus respectivos comentarios. La

lógica de la solución se basa en el uso de funciones, una para cada estado y el uso de una palabra

recorrida letra a letra a través de un puntero. Se adjunta código fuente para ser ejecutado y probado.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void estadoq0 (char a);

void estadoq1 (char a);

void estadoq2 (char a);

void estadoq3 (char a);

void estadoq4 (char a);

void estadoq5 (char a);

void estadoq6 (char a);

void estadoq7 (char a);

void estadoq8 (char a);

void estadoq9 (char a);

void estadoq10 (char a);

void estadoq11 (char a);

void estadoq12 (char a);

void estadoq13 (char a);

void estadoq14 (char a);

void estadoq15 (char a);

void estadoq16 (char a);

void estadoq17 (char a);

void estadoq18 (char a);

Page 6: Tr3 Torres Vallejos FCC

void estadoq19 (char a);

void estadoq20 (char a);

void estadoq21 (char a);

void estadoq22 (char a);

void estadoq23 (char a);

void estadoq24 (char a);

void errorAlfabeto ();

void errorNoMultiplo();

int car; // indice que indica la letra q se esta leyendo

char *str; // palabra a leer

void errorAlfabeto ()//Impresion de mensaje de error por ingresar un caracter no existente dentro del

alfabeto

{

printf ("\n\tValidacion Incorrecta: String No Reconocido, \n\tse utilizo un caracter no existente

en el alfabeto\n");

}

void errorNoMultiplo()//Impresion de mensaje de error por no ser string multiplo de 5 en el

intervalo dado

{

printf ("\n\tValidacion Incorrecta: String No Reconocido, \n\tel numero binario no es multiplo de

5 en [1, 100]\n");

}

void estadoq0 (char a) //estado inicial

{

Page 7: Tr3 Torres Vallejos FCC

if (a == '0')

estadoq1 (*(str + ++car)); // si en q0 el caracter leido es 0, pasa a q1 con el siguiente

caracter

else {if (a == '1')

estadoq7 (*(str + ++car));//si en q0 el caracter leido es 1, pasa a q7 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq1 (char a)

{

if (a == '0')

estadoq2 (*(str + ++car)); // si en q1 el caracter leido es 0, pasa a q2 con el siguiente

caracter

else {if (a == '1')

estadoq3 (*(str + ++car)); // si en q1 el caracter leido es 1, pasa a q3 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq2 (char a)

{

if (a == '0')

estadoq4 (*(str + ++car)); // si en q2 el caracter leido es 0, pasa a q4 con el siguiente

caracter

else {if (a == '1')

Page 8: Tr3 Torres Vallejos FCC

estadoq5 (*(str + ++car)); // si en q2 el caracter leido es 1, pasa a q5 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq3 (char a)

{

if (a == '0' || a == '1')

estadoq5 (*(str + ++car)); // si en q3 el caracter leido es 0 o 1, pasa a q5 con el

siguiente caracter

else

errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de impresion de

error por caracter no existente en el alfabeto

}

void estadoq4 (char a)

{

if (a == '0')

estadoq11 (*(str + ++car)); // si en q4 el caracter leido es 0, pasa a q11 con el

siguiente caracter

else {if (a == '1')

estadoq6 (*(str + ++car)); // si en q4 el caracter leido es 1, pasa a q6 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq5 (char a)

Page 9: Tr3 Torres Vallejos FCC

{

if (a == '0' || a == '1')

estadoq6 (*(str + ++car)); // si en q5 el caracter leido es 0 o 1, pasa a q6 con el

siguiente caracter

else

errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de impresion de

error por caracter no existente en el alfabeto

}

void estadoq6 (char a)

{

if (a == '0')

estadoq20 (*(str + ++car)); // si en q6 el caracter leido es 0, pasa a q20 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q6 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq7 (char a)

{

if (a == '0')

estadoq8 (*(str + ++car)); // si en q7 el caracter leido es 0, pasa a q8 con el siguiente

caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q7 el caracter leido es 1, pasa a q24 con el siguiente

caracter

Page 10: Tr3 Torres Vallejos FCC

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq8 (char a)

{

if (a == '0')

estadoq5 (*(str + ++car)); // si en q8 el caracter leido es 0, pasa a q5 con el siguiente

caracter

else {if (a == '1')

estadoq9 (*(str + ++car)); // si en q8 el caracter leido es 1, pasa a q9 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq9 (char a)

{

if (a == '0')

estadoq10 (*(str + ++car)); // si en q9 el caracter leido es 0, pasa a q10 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q9 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq10 (char a)

Page 11: Tr3 Torres Vallejos FCC

{

if (a == '0')

estadoq17 (*(str + ++car)); // si en q10 el caracter leido es 0, pasa a q17 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q10 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq11 (char a)

{

if (a == '0')

estadoq21 (*(str + ++car)); // si en q11 el caracter leido es 0, pasa a q21 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q11 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq12 (char a)

{

if (a == '0')

estadoq13 (*(str + ++car)); // si en q12 el caracter leido es 0, pasa a q13 con el

siguiente caracter

else {if (a == '1')

Page 12: Tr3 Torres Vallejos FCC

estadoq24 (*(str + ++car)); // si en q12 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq13 (char a)

{

if (a == '0')

estadoq14 (*(str + ++car)); // si en q13 el caracter leido es 0, pasa a q14 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q13 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq14 (char a) // Estado final

{

printf ("\n\tValidacion Correcta: String Reconocido, \n\tel numero binario ingresado es multiplo

de 5\n");

//No es necesario validar que se encuentre en el ultimo caracter ya que el main restringe el

ingreso de strings solo a los que contengan 8 caracterres

//Por lo mismo no se invoca a q24, ya que no habran mas caracteres por leer

}

void estadoq15 (char a)

{

if (a == '0')

Page 13: Tr3 Torres Vallejos FCC

estadoq16 (*(str + ++car)); // si en q15 el caracter leido es 0, pasa a q16 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q15 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq16 (char a)

{

if (a == '0')

estadoq24 (*(str + ++car)); // si en q16 el caracter leido es 0, pasa a q24 con el

siguiente caracter

else {if (a == '1')

estadoq14 (*(str + ++car)); // si en q14 el caracter leido es 1, pasa a q14 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq17 (char a)

{

if (a == '0')

estadoq18 (*(str + ++car)); // si en q17 el caracter leido es 0, pasa a q18 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q17 el caracter leido es 1, pasa a q24 con el siguiente

caracter

Page 14: Tr3 Torres Vallejos FCC

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq18 (char a)

{

if (a == '0')

estadoq19 (*(str + ++car)); // si en q18 el caracter leido es 0, pasa a q19 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q18 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq19 (char a)

{

if (a == '0')

estadoq14 (*(str + ++car)); // si en q19 el caracter leido es 0, pasa a q14 con el

siguiente caracter

else {if (a == '1')

estadoq24 (*(str + ++car)); // si en q19 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq20 (char a)

Page 15: Tr3 Torres Vallejos FCC

{

if (a == '0')

estadoq12 (*(str + ++car)); // si en q20 el caracter leido es 0, pasa a q12 con el

siguiente caracter

else {if (a == '1')

estadoq15 (*(str + ++car)); // si en q20 el caracter leido es 1, pasa a q15 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq21 (char a)

{

if (a == '0')

estadoq24 (*(str + ++car)); // si en q21 el caracter leido es 0, pasa a q24 con el

siguiente caracter

else {if (a == '1')

estadoq22 (*(str + ++car)); // si en q21 el caracter leido es 1, pasa a q22 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq22 (char a)

{

if (a == '0')

estadoq23 (*(str + ++car)); // si en q22 el caracter leido es 0, pasa a q23 con el

siguiente caracter

else {if (a == '1')

Page 16: Tr3 Torres Vallejos FCC

estadoq24 (*(str + ++car)); // si en q22 el caracter leido es 1, pasa a q24 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq23 (char a)

{

if (a == '0')

estadoq24 (*(str + ++car)); // si en q23 el caracter leido es 0, pasa a q24 con el

siguiente caracter

else {if (a == '1')

estadoq14 (*(str + ++car)); // si en q23 el caracter leido es 1, pasa a q14 con el siguiente

caracter

else errorAlfabeto();//si se lee otro caracter diferente de 1 o 0 se llama funcion de

impresion de error por caracter no existente en el alfabeto

}

}

void estadoq24 (char a)// estado Basurero

{

//Llegando a este estado, el string ya no esta reconocido, por tanto se llama al mensaje

correspondiente

errorNoMultiplo();

}

int main ()

{

int op=1;

Page 17: Tr3 Torres Vallejos FCC

printf("\n\tAFD para reconocer si un numero binario ingresado es multiplo de 5\n\n\tAlfabeto

{0,1}\n\n\t");

system ("pause");

system("cls");

str = (char *)malloc (sizeof (char)); // pedimos espacio para str

while(op==1){

do{

printf ("\n\tIngrese string binario de 8 bits:\n\t ");

scanf ("%s", str);

system("cls");

if(strlen(str)!=8)printf("\n\tError, debe ser un string de 8 bits");

}while(strlen(str)!=8);//Validacion de tamaño del string

car = 0;//Se inicia el contador para el puntero

estadoq0 (*(str + car)); // se llama al estado inicial! :D

printf("\n\tPara verificar otro string ingrese 1, de lo \n\tcontrario ingrese otro valor\n\t");

scanf("%d",&op);

system("cls");

}

printf("\n\tFin de la ejecucion del AFD\n\n\n\t");

system ("pause");

}