View
87
Download
0
Category
Preview:
Citation preview
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");
}
Recommended