Professional Documents
Culture Documents
Tarea N° 3:
Programación de un
AFD
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:
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}.
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
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}.
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
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 errorNoMultiplo();
void errorAlfabeto ()//Impresion de mensaje de error por ingresar un caracter no existente dentro del
alfabeto
{
if (a == '0')
if (a == '0')
if (a == '0')
if (a == '0' || a == '1')
else
if (a == '0')
if (a == '0' || a == '1')
else
if (a == '0')
if (a == '0')
if (a == '0')
if (a == '0')
if (a == '0')
estadoq24 (*(str + ++car)); // si en q10 el caracter leido es 1, pasa a q24 con el siguiente
caracter
if (a == '0')
estadoq24 (*(str + ++car)); // si en q11 el caracter leido es 1, pasa a q24 con el siguiente
caracter
if (a == '0')
if (a == '0')
estadoq24 (*(str + ++car)); // si en q13 el caracter leido es 1, pasa a q24 con el siguiente
caracter
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
if (a == '0')
estadoq16 (*(str + ++car)); // si en q15 el caracter leido es 0, pasa a q16 con el
siguiente caracter
estadoq24 (*(str + ++car)); // si en q15 el caracter leido es 1, pasa a q24 con el siguiente
caracter
if (a == '0')
estadoq14 (*(str + ++car)); // si en q14 el caracter leido es 1, pasa a q14 con el siguiente
caracter
if (a == '0')
estadoq24 (*(str + ++car)); // si en q17 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
if (a == '0')
estadoq24 (*(str + ++car)); // si en q18 el caracter leido es 1, pasa a q24 con el siguiente
caracter
if (a == '0')
estadoq24 (*(str + ++car)); // si en q19 el caracter leido es 1, pasa a q24 con el siguiente
caracter
if (a == '0')
estadoq15 (*(str + ++car)); // si en q20 el caracter leido es 1, pasa a q15 con el siguiente
caracter
if (a == '0')
estadoq22 (*(str + ++car)); // si en q21 el caracter leido es 1, pasa a q22 con el siguiente
caracter
if (a == '0')
if (a == '0')
estadoq14 (*(str + ++car)); // si en q23 el caracter leido es 1, pasa a q14 con el siguiente
caracter
//Llegando a este estado, el string ya no esta reconocido, por tanto se llama al mensaje
correspondiente
errorNoMultiplo();
int main ()
int op=1;
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");
while(op==1){
do{
system("cls");
scanf("%d",&op);
system("cls");
system ("pause");