You are on page 1of 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
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
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:


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
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);


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

{
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')


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)


{

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
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)


{

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')


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')
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
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)


{

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')


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;
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");

You might also like