ESCUELA POLITÉCNICA NACIONAL
ESCUELA DE INGENIERÍA
MÉTODO DIDÁCTICO DE SIMPLIFICACIÓN DE FUNCIONESBOOLENAS
PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO ENELECTRÓNICA Y TELECOMUNICACIONES
LUIS EDUARDO LÓPEZ MEDINA
DIRECTOR: ING. CARLOS NOVILLO
Quito, Noviembre del 2003
DECLARACIÓN
Yo LUIS EDUARDO LÓPEZ MEDINA, declaro que el trabajo aquí descrito es de
mi autoría; que no ha sido previamente presentada para ningún grado o
calificación profesional; y, que he consultado las referencias bibliográficas que se
incluyen en este documento.
La Escuela Politécnica Nacional, puede hacer uso de los derechos
correspondientes a este trabajo, según lo establecido por la Ley, Reglamento de
Propiedad Intelectual y por la normatividad institucional vigente.
Luis Eduardo López Medina
CERTIFICACIÓN
Certifico que el presente trabajo fue desarrollado por LUIS EDUARDO LÓPEZ,
bajo mi supervisión.
Ing. Carlos
DIREbrOR-BÉPROYECTO
CONTENIDOR. RESUMEN iv
P. PRESENTACIÓN vi
1. INTRODUCCIÓN 1
1.1. Introducción 1
1.2. Algebra de Booie 3
1.2.1. Reseña Histórica 31.2.2. Ecuaciones Booleanasy Funciones Lógicas Básicas 71.2.3. Tabla de Verdad 12
2. SIMPLIFICACIÓN DE FUNCIONES BOOLEANAS 13
2.1. Funciones Booleanas 132.1.1. Deducción de Ecuaciones booleanasa partir de una tabla de
verdad 142.1.2. Tabla de verdad a partir de una ecuación booleana 19
2.2. Métodos de Simplificación 212.2.1. Método del Algebra de Boole 21
2.2.2. Método del Mapa de Karnaugh 24
2.2.3. Método Quine-McCIuskey 33
2.2.3.1. Representación cúbica de fas funciones de Boole 332.2.3.2. Obtención de los implicantes primos 362.2.3.3. Selección de un conjunto óptimo de implicantes primos. 40
2.2.4. Funciones Incompletamente especificadas 47
2.2.5. Comparación de los métodos de simplificación 49
2.3.lmplementación de las funciones booleanas simplificadas 51
3. DISEÑO DEL PROGRAMA COMPUTACIONAL PARASIMPLIFICAR FUNCIONES BOOLEANAS 53
3.1. Introducción 533.1.1. Breve descripción del uso de formularios de Visual Basic 54
3.1.2. Controles de Visual Basic 56
3.1.2.1. TextBox 573.1.2.2. Label 593.1.2.3. CommandBotton 60
3.1.3. Breve descripción del uso de comandos y sentencias en Visual
Basic ,. 62
3.1.3.1. Fundamentos de la programación 623.1.3.2. Variables...... 63
3.1.3.2.1. Alcances de las variables 633.1.3.2.2. Establecimiento del alcance de las variables 643.1.3.2.3. Variables utilizadas en un procedimiento 643.1.3.2.4. Variables utilizadas en un módulo 653.1.3.2.5. Variables utilizadas por todos los módulos 653.1.3.2.6. Declaración de variables 663.1.3.2.7. Tipos de variables 663.1.3.2.8. Consideraciones 67
3.1.3.3. Procedimientos 683.1.3.3.1. Procedimientos generales.... 693.1.3.3.2. Procedimientos de evento 70
3.1.3.4. Funciones 723.1.3.4.1. Llamadas a funciones 733.1.3.4.2. Paso de argumentos a Procedimientos y
funciones 733.1.3.4.3. Tipos de datos de los argumentos 743.1.3.4.4. Paso de argumentos por valor 743.1.3.4.5. Paso de argumentos por referencia 74
3.1.3.5. Estructuras de Control (Repetición y decisión) 753.1.3.5.1. Do While-Loop / Do-Loop While 753.1.3.5.2. For-Next 763.1.3.5.3. Else-End If.... 773.1.3.5.4. If-Then-Else 783.1.3.5.5. Select-Case 78
3.2. Diagrama de Flujo del Programa 803.2.1. Teoría 81
3.2.2. Simplificación 82
3.2.3. Tutorial 84
3.3. Diagrama de flujo de la simplificación 853.3.1. Ingreso de los datos en la tabla de combinaciones 85
3.3.2. Formación de cubos 88
3.3.3. Tabla de implicantes primos 95
3.3.4. Tabla de simplificación de los implicantes primos 97
3.3.5. Simplificación de la tabla de implicantes primos 102
3.3.6. Ecuación booleana simplificada 108
3.4. Resultados Obtenidos 112
IV
RESUMEN
Dada la importancia que tiene hoy en día el diseño de los circuitos
digitales para múltiples aplicaciones, es necesario aprender a interpretar las
funciones asociadas a cada una de las aplicaciones y traducirlas a tablas de
verdad y funciones booleanas.
Para tener un circuito adecuado es necesario simplificar la función
booleana hasta un mínimo posible, de tal forma que se utilicen la mínima
cantidad de compuertas, sin afectar el funcionamiento del circuito tanto en
entradas como en salidas.
Para poder simplificar una función booleana se pueden aplicar tanto
teoremas del álgebra booleana, como el mapa de Karnaugh (Veitch), como
métodos tabulares como el método de Quine-McCIuskey, que es el que se
implementa en este proyecto.
El método del álgebra de Boole utiliza la lógica matemática y sus
teoremas para poder simplificar la función; sin embargo, este método es
conveniente cuando se tienen pocas variables de entrada.
El método del mapa de Karnaugh es un método gráfico bastante bueno,
pero no es práctico cuando se tienen más de 5 variables de entrada.
El método de simplificación tabular de Quine-McCIuskey es un método
que compara todas las combinaciones con las siguientes dependiendo la
cantidad de unos que contenga cada combinación de las variables de entrada.
Este es un método recursivo y por esta razón es fácil de implementar en una
rutina de programación.
El proyecto de titulación consiste en implementar un programa tutorial
que simplifica funciones booleanas utilizando el método Quine-McCIuskey. El
procedimiento de simplificación de las funciones booleanas puede realizarse
paso a paso o directamente.
El ingreso de datos se puede hacer de dos formas: mediante una tabla
de combinaciones o utilizando un editor de mintérminos.
En este trabajo se incluye un resumen de los comandos y sentencias
utilizadas en Visual Basic para la programación. Además, se explica todo el
proceso de diseño del programa de simplificación.
VI
PRESENTACIÓN
Hoy en día el diseño electrónico no solo se limita a los elementos
analógicos, para poder obtener resultados confiables, rápidos y económicos, es
conveniente diseñar circuitos electrónicos utilizando chips de compuertas
lógicas; para esto es necesario transformar el problema a una función
booleana, y luego simplificarla, para que el número de compuertas utilizadas
sea lo mínimo posible.
La simplificación se la hace rápidamente utilizando el método de Quine-
McCIuskey ya que este proceso sirve para cualquier número de variables de
entrada.
En el Capitulo 1 se hace una introducción de los sistemas digitales y su
relación con los sistemas analógicos, una reseña histórica de la álgebra de
Boole, las ecuaciones booleanas, funciones lógicas básicas y las tablas de
verdad.
En el Capitulo 2 se explican los diferentes métodos que existen para
simplificar las funciones booleanas; tanto como álgebra de Boole, mapa de
Karnaugh y el método de Quine-McCIuskey, además se hace una comparación
de los mismos; también se explica la implementación de las funciones
booleanas.
En el Capitulo 3 se da una descripción rápida de los formularios,
comandos y sentencias utilizadas en Visual Basic; Además, se explica el
proceso de diseño del programa tutorial y de simplificación; además se
presentan los resultados de algunas pruebas realizadas.
Finalmente, en el Capitulo 4 se encuentran los comentarios, sugerencias
y conclusiones sobre este trabajo.
CAPITULO 1
INTRODUCCIÓN
1.1.- INTRODUCCIÓN.
El avance de la Tecnología y la necesidad de realizar tareas de una forma
automática, han llevado a desarrollar circuitos integrados que se pueden usar con
facilidad, estos circuitos se denominan compuertas lógicas, que están disponibles
en cápsulas de circuitos integrados.
Un sistema de automatización o de comunicaciones está diseñado utilizando
muchas de estas compuertas, para lo cual se deben desarrollar "tablas de
verdad", en las que se indica el estado de la salida para cada combinación de las
entradas, la implementación de estos sistemas requiere que el circuito esté
simplificado para que el costo de elementos sea el menor posible y así construir
un sistema fácil de implementar.
La simplificación de la tabla de verdad asociada al sistema que está
diseñándose, se puede hacer mediante varios métodos cuya eficiencia depende
de la cantidad de entradas y la habilidad de la persona que está simplificando, el
proceso de simplificación manual es demasiado tedioso, poco confiable y lleva
mucho tiempo, lo cual impide que el diseñador se dedique a otras cosas más
importantes y productivas, por esta razón se ha pensado en el desarrollo de este
trabajo.
El resultado de la simplificación de la tabla se denomina función booleana la
cual es una relación lógica entre todas las entradas combinadas por medio de
operadores lógicos.
El presente trabajo consiste en desarrollar un programa que indique el
proceso detallado de simplificación de las tablas de verdad utilizando el método
tabular de Quine-McCIuskey de una manera didáctica, ordenada y comprensiva,
hasta obtener la función booleana simplificada, este programa debe ser capaz de
indicar paso por paso todos los detalles de la simplificación, para lograr una
comprensión de este método.
Para obtener un programa con las características descritas en el párrafo
anterior, se utilizó el programa Visual Basic, que permite el fácil manejo de
formularios, comando y menús estandarizados de Windows.
En la Carrera de Ingeniería en Electrónica y Telecomunicaciones no existe
un programa de este tipo para ayudar a la enseñanza de la simplificación de
funciones booleanas utilizando este método, este proyecto servirá para que los
alumnos de Sistemas Digitales comprendan con mayor facilidad el método tabular
de Quine-McCIuskey, y para los diseñadores de sistemas digitales permitirá
simplificar las funciones booleanas asociadas a sus diseños de una manera
rápida y segura,
SISTEMAS ANALÓGICOS Y SISTEMAS DIGITALES.
Representación Analógica.- Es una cantidad que se representa por medio de
otra cantidad directamente proporcional, es decir es una variación totalmente
continua, ya que puede variar gradualmente sobre un intervalo continuo de
valores.
Sistema Analógico.- Es un dispositivo que trabaja con magnitudes netamente
analógicas o de variación continua.
Representación Digital.- Es una cantidad que se representa por medio de
dígitos los cuales son cantidades discretas de valores a pesar de que la magnitud
a la que representa sea continua u analógica.
Sistema Digital.- Es un sistema que trabaja con información discreta, estos
sistemas pueden ser electrónicos, mecánicos, o magnéticos.
Un sistema digital tiene muchas ventajas sobre un sistema analógico.
- Mayor facilidad de diseñar con Circuitos Integrados.
- Facilidad para almacenar la información.
- Más exactitud y precisión.
- Flexibilidad para implementar los diseños.
- Es un sistema casi inmune al ruido.
- Tiene un alto grado de integración.
- Facilidad de programación para la operación.
1.2. -ÁLGEBRA DE BOOLE.
1.2.1. -RESEÑA HISTÓRICA
"El concepto de variable lógica fue introducido en 1850 a través del uso
del álgebra booleana. El álgebra booleana es un método muy sencillo para
expresar situaciones, en forma de lenguaje matemático. La lógica digital adquiere
su dimensión práctica a través de las compuertas y se consolida como una
ciencia estructurada mediante el álgebra booleana. Sus principios teóricos fueron
desarrollados por el matemático ingles George Boole en su obra "Análisis
matemático de la lógica" publicada en 1847. Sin embargo, sólo hasta 1938 se
descubrió su real utilidad".
"En este año, Claude E. Shannon, estudiante de postgrado del MIT
(Instituto Tecnológico de Massachusetts, EE.UU) presentó un trabajo en el cual
describía como el álgebra booleana se adaptaba perfectamente a la
representación y al diseño de circuitos de conmutación, basados en relés e
interruptores".
"Con el advenimiento de los tubos de vacío, los transistores y los circuitos
integrados y la fabricación de compuertas, circuitos y sistemas digitales con estas
tecnologías, el álgebra booleana adquirió un papel determinante en el desarrollo
de la electrónica digital moderna y sus aplicaciones".
"El álgebra booleana proporciona el método más compacto y conveniente de
representar, analizar y diseñar circuitos lógicos. La operación completa de un
circuito digital se puede describir mejor por el álgebra booleana que utilizando
complicados diagramas lógicos y extensas tablas de verdad".
"Cuando se diseña un circuito por métodos booleanos, el primer paso
consiste generalmente en obtener su tabla de verdad de acuerdo con las
condiciones de entrada y de salida. A partir de esta tabla se deriva entonces una
ecuación booleana que se simplifica y conduce al circuito lógico deseado. El
circuito obtenido por este método es el óptimo porque requiere de un número
mínimo de compuertas para su realización. Esto reduce el costo, el tamaño físico
y el consumo de potencia del mismo y mejora su confiabilidad y velocidad. Todas
estas consideraciones son importantes cuando se diseñan circuitos digitales".1
El álgebra de Boole es un conjunto de elementos y operadores que ayudan
en el diseño de circuitos combinacionales, los axiomas y teoremas que utiliza el
álgebra de Boole ayudan a la simplificación de las funciones booleanas. Todas las
operaciones del álgebra de Boole actúan sobre dos elementos básicos 1 y O que
representan verdad o falsedad, físicamente estos dos estados se pueden
representar como O lógico (un nivel entre Ov -- 0.8 v), y 1 lógico (un nivel de 2.5v -
5v). En la figura 1.1 se representan los niveles lógicos, en función del voltaje.
VOLTAJE
v
2.5
0.8Vxi
lógico 1 lógico NIVEL
Fig. 1.1: Niveles de voltaje para cada valor lógico
1 http://pehuen.chiUan.ubiobio.cl/-lgaiardo/odc/algebra/
Como se puede ver en la figura 1.1 Vx es el rango de voltaje analógico
prohibido, es decir que para representar un 1 lógico o un O lógico no debe existir
un voltaje en este rango.
La utilización de variables que trabajan con dos valores, la desarrolló
Shannon, usando algunas ideas que habían sido expresadas anteriormente por el
matemático inglés George Boole.
Las variables booleanas no toman valores cuantitativos, pero pueden
usarse para representar información cuantitativa.
Para trabajar con variables booleanas, se utilizan operadores similares a
los del álgebra común. A estos operadores booleanos comúnmente se los conoce
como conectivos lógicos.
El álgebra de Boole, como cualquier otro sistema matemático puede ser
definida por un conjunto de elementos, un conjunto de operadores, y un número
de axiomas o postulados.
En 1938 Shannon introdujo una álgebra de Boole de dos valores llamada
álgebra de conmutación en la cual él demostró que las propiedades de los
circuitos de conmutación eléctrica biestables pueden ser representadas por esta
álgebra.
El álgebra de Boole es una estructura algebraica definida para un conjunto
de elementos B juntamente con dos conectivos binarios +(or) y .(and) de tal forma
que cumplan con las siguientes propiedades.
1. (a) Conjunto cerrado con respecto al conectivo +
(b) Conjunto cerrado con respecto al conectivo.
2. (a) Un elemento de identidad con respecto a + designado por el 0:
x+0=0+x=x.
(b) Un elemento de identidad con respecto a . designado por el 1:
x.1=1.x=x.
3 (a) Conmutativo con respecto a +: x + y = y + x
(b) Conmutativo con respecto a .: x. y = y. x
4 (a). Es distributivo sobre +: x.(y + z) = (x. y) + (x. z).
(b) + es distributivo sobre .: x + (y. z) = (x+ y). (x+ z).
5 Para cada elemento xeB, existe un elemento x'eB (llamado el
complemento de x) tal que: (a) x+ x' = 1 y (b) x. x' = 0.
6 Existen al menos dos elementos x, y e B tales que x *y.
Al comparar el álgebra de Boole con la aritmética y el álgebra ordinaria se notan
las siguientes diferencias:
1. Los postulados no incluyen la ley asociativa. Sin embargo esta ley es válida
para el álgebra de Boole y puede deducirse de otros postulados.
2. La ley distributiva de + sobre . , es decir, x+ (y. z) = (x+ y).(x+ z) es valida
para el álgebra de Boole pero no para e! álgebra ordinaria.
3. El álgebra de Boole no tiene inversos aditivos o multiplicativos y por tanto
no hay operaciones de sustracción o división.
4. La propiedad 5 define un operador llamado complemento el cual no está
disponible en el álgebra ordinaria.
5. El álgebra ordinaria trata con los números reales, los cuales constituyen un
conjunto infinito de elementos. El álgebra de Boole trata con los elementos
del conjunto B, que es un conjunto de solamente dos elementos, O y 1.
El álgebra de Boole se asemeja al álgebra ordinaria en algunos aspectos;
escoger los símbolos + y . es intencional con el fin de facilitar las manipulaciones
con álgebra de Boole por parte de personas familiarizadas con el álgebra
ordinaria. Aunque no se puede usar algunos conocimientos debe ser muy
cuidadoso de no sustituir las reglas del álgebra ordinaria donde no sean
aplicables.
Es muy importante distinguir entre los elementos del conjunto de una
estructura algebraica y las variables de una sistema algebraico, por ejemplo, los
elementos del campo de los números reales son números, mientras que las
variables a, b, c, etc. usadas en el álgebra ordinaria son símbolos que se
establecen para los números reales. Similarmente en el álgebra de Boole se
definen los elementos de un conjunto B y las variables, tales que x, y, z sean
simplemente símbolos que representen los elementos. A estas alturas es
importante darse cuenta que para tener una álgebra de Boole se debe demostrar:
1. Los elementos del conjunto B.
2. Las reglas de operación de los dos operadores binarios, y
3. Que el conjunto de elementos B, juntamente con los dos conectivos,
satisfagan los seis postulados.
1.2.2. -ECUACIONES BOOLEANAS Y FUNCIONES LÓGICAS BÁSICAS.
Las funciones lógicas tienen analogía con los interruptores, debido a una
concepción histórica, ya que antes de la invención de los dispositivos de estado
sólido y de los circuitos integrados, las funciones lógicas se construyeron con
relés electromecánicos (relevadores), y las primeras computadoras tenían miles
de estos dispositivos interconectados mediante conjuntos de alambres.
A continuación se definen algunos términos que servirán para estructurar
una función booleana.
Proposición.- Planteamiento de un teorema o de un problema que se debe
resolver.
Conectivo.- Son los operadores del álgebra de Boole, similares a los del
álgebra común, y representan a los circuitos digitales más fundamentales.
Variable booleana.- Las variables booleanas solo pueden tomar dos
valores lógicos "O" o "1". En un circuito lógico, una variable booleana puede
representar presencia o ausencia de voltaje.
Las ecuaciones booleanas tienen las siguientes características básicas:
1. Cada ecuación tiene la forma F = f (A, B, C) donde F, A, B, C, etc.
son variables booleanas.
2. Todas las variables son variables lógicas, caracterizadas por tener
sólo dos posibles valores: VERDADERO o FALSO, ALTO o BAJO, 1
o O, etc.
3. Las variables lógicas están relacionadas con las ecuaciones
mediante operadores lógicos o conectivos: EQUIVALENCIA
LÓGICA, AND, OR e INVERSIÓN LÓGICA.
Las operaciones básicas del álgebra de Boole son las siguientes.
1) Complementaron.- Cambia el valor de verdad de una proposición,
se representa con el símbolo"-" sobre la variable, o con un apostrofe
delante de la variable (A1); la compuerta asociada a esta operación
se denomina "NOT"; la tabla y su símbolo lógico son los siguientes.
2) Conjunción. - Es una operación de producto lógico. Se lo representa
con el punto o con la ausencia de este. ("A.B"); esta operación se la
realiza con la compuerta "AND", su símbolo lógico y tabla son los
siguientes.
r=A.BA B0 00 11 01 1
A.B0001
3)
4)
Disyunción.- Es equivalente a la operación suma lógica y se
representa con "A+B"; la compuerta asociada a esta operación se
denomina "OR". A continuación se muestra su símbolo lógico y su
tabla de verdad.
1>A+B
Disyunción exclusiva.- Esta operación es una variante de la
operación disyunción y se lee "XOR"; se representa como "A®B".
Basándose en estas cuatro operaciones básicas se genera la función
booleana simplificada a partir de la tabla de verdad asociada a cada diseño
combinacional.
10
Las compuertas AND, OR y XOR tienen otras variantes, que no son más
que, a las compuertas antes mencionadas, añadir a la salida la compuerta NOT,
obteniéndose como resultado las compuertas NAND, ÑOR y XNOR. Las salidas
de estas compuertas son por lo tanto de un valor de verdad contrario ai valor de
verdad origina! de las compuertas.
NAND
ÑOR
A
B
XNOR
. Y = ( A . B ) '
f = ( A + B ) '
XAÍ
A B0 00 11 01 1
A.B0001
(A.B)'1110
AB00011 01 1
A+B0111
(A+B)11000
AB00011 01 1
A®B0110
(A®B)'1001
Todas las compuertas antes mencionadas se las puede reemplazar
únicamente con compuertas NAND o únicamente con compuertas ÑOR, a esta
característica se denomina universalidad de las compuertas NAND, o
universalidad de las compuertas ÑOR respectivamente, así por ejemplo.
UNIVERSALIDAD DE LAS NAND.
a) NOT. A'=(A.A)'.
11
b) AND. A.B=((A.B)')'
c) OR. A+B=(A')'+(B')' = (A'.B1)'
"-•
UNIVERSALIDAD DE LAS ÑOR.
a) NOT. A'=(A+A)'.
b)AND. A.B=(A'+B')'
A->:
B-S
={A' .B1
( B . B ¡
(=(A+A) '
(A+A) '
Y = { A ' + B I )
(B+B) f
c) OR. A+B=((A+B)')'
O Y = { ( ñ + B ) ' ) '
A continuación se definen algunos términos que se usan en álgebra
booleana:
Literal.- Es una variable o su complemento (A, A', B, B', etc.)
Término Producto.- Es una serie de literales relacionados con la compuerta
AND, ej. AB'D, ACD'E', etc.
Término Suma.- Es una serie de literales relacionados con la compuerta
OR, ej. A+C+D', A+B+D'+E, etc.
12
Término normal.- Es un término producto o un termino suma en el cual
ninguna variable aparece más de una vez.
1.2.3. -TABLA DE VERDAD.
Una tabla de verdad sirve para representar simbólicamente una función
lógica. Todas las posibles combinaciones de los valores de la variable de entrada
se presentan en una tabla y, para cada combinación única de entradas, los
valores de la variable de salida se listan en una columna separada asignada a
cada una de las variables. De este modo, la tabla de verdad constituye una
especificación completa de la lógica combinacional que se va a diseñar. En
muchos casos, la construcción de una tabla de verdad a partir de la especificación
del problema puede ser muy difícil, por lo tanto, el proceso que se implante en
lógica debe ser estudiado en detalle, hasta que se comprendan sus
características.
FORMAS ESTÁNDAR DE LAS FUNCIONES BOOLEANAS.- Es posible
describir una función booleana mediante tablas de verdad en la que se indiquen
los valores de la salida para todas y cada una de las combinaciones de las
entradas, también es posible escribir una función booleana en forma de una
ecuación boofeana; esta ecuación booleana está compuesta por la suma de
productos; en este caso se denomina suma de mintérminos, también se puede
escribir por el producto de las sumas, en este caso se dice es un producto de
maxtérminos.
En el siguiente capitulo se hace una profundización de cómo obtener la
suma de productos (SOP) o producto de sumas (POS).
13
CAPITULO 2.
SIMPLIFICACIÓN DE FUNCIONES BOOLEANAS.
2.1 FUNCIONES BOOLEANAS
Una variable binaria puede tomar el valor O o 1. Una función de Boole es
una expresión formada con variables binarias, los conectivos OR, AND y NOT y el
paréntesis. Para un valor dado de variables, la función puede ser O o 1.
Una función de Boole puede ser representada por medio de la tabla de
verdad, para hacerlo se necesitan 2n combinaciones de unos y ceros de las n
variables binarias, donde n es el número de variables de entrada de la función.
Por ejemplo, si la función tiene 3 variables de entrada, entonces se necesitan 23
= 8 combinaciones. En otra columna se ponen los valores de la función, es decir
el valor que tiene la salida de este sistema 1 o O para cada una de las
combinaciones en las entradas.
Las combinaciones de unos y ceros se pueden obtener fácilmente para
cada fifa de los números binarios contando desde O a 2n-1. Para cada fila de la
tabla, hay un valor para la función igual a 1 o 0.
Las funciones booleanas se pueden transformar de una expresión
algebraica en un diagrama lógico compuesto por compuertas AND, OR y NOT. Se
necesita una compuerta AND para combinar dos o más variables en un término y
una compuerta OR para combinar 2 o más términos.
14
2.1.1 DEDUCCIÓN DE ECUACIONES BOOLEANAS A PARTIR DE UNA
TABLA DE VERDAD
Consideremos la siguiente tabla de verdad:
0123456789101112131415
A0000000011111111
B0000111100001111
c0011001100110011
D0101010101010101
Y0000000100010110
Mintérmino m?
Mintérminomn
Mintérmino mi3Mintérmino mu
A continuación se detalla la forma de obtener la ecuación lógica (función
lógica) que se representa o se sintetiza en forma de suma de mintérminos o
suma de términos mínimos.
El primer paso es identificar las filas o combinaciones de entrada que
producen como resultado un 1 a la salida. En nuestro caso, esto es aplicable a
las filas 7, 11, 13 y 14. A continuación, se observa en cada fila los valores que
toma cada variable de entrada. Si una variable determinada vale O, se
reemplaza mentalmente por su complemento (A't B1, C1, D1). Si la variable vale
1, se deja tal como estaba, es decir, sin complementar (A, B, C, D). En la
siguiente tabla se ilustra este paso:
15
7111314
A0111
B1011
e1101
&1110
1 -v *
1111
7111314
AA1
AAA
£..„
BB'BB
CccC1
c
oDDDD1
% 11111
Seguidamente, se asigna a la salida de cada fila una expresión
booleana equivalente a la operación AND de las variables de entrada
representadas de esta forma. En la siguiente tabla se ilustra este paso:
7111314
*£•0111
¿PL1011
;"<**
1
1
01
^Bt.jf ^1110
y^J^tWff?' :flt$3 *'rt¿T5
A'BCDAB'CDABC'DABCD'
Mintérmino m7
Mintérmino muMintérmino m13
Mintérmino mu
Cada una de estas ecuaciones es un mintérmino. por ejemplo, el
mintérmino asociado a la fila 13 es:
ini3 = ABC'D
A partir de estos datos se puede escribir la ecuación booleana como
una suma de mintérminos. En nuestro caso:
Y ™ m? •+• rn-M+ mía + m-u
Reemplazando cada mintérmino por su expresión booleana
correspondiente, se obtiene la ecuación solicitada:
Y = A'BCD + AB'CD + ABC'D + ABCD1
Esta expresión se denomina SOP (Suma de productos).
16
A este tipo de ecuación booleana, en la que en cada término están
presentes todas las variables de entrada, en su forma normal o en su forma
complementada, se la denomina forma estándar o forma canónica disyuntiva.
La misma tabla o función booleana se puede representar como un producto
de sumas o maxtérminps.
Consideremos la misma tabla de verdad de la sección anterior:
0123456789101112131415
-*V0000000011111111
fj0000111100001111
! #';.0011001100110011
;-sjjf£
0101010101010101
k-.y ,
0000000100010110
Maxtérmino MOMaxtérmino MiMaxtérmino M2Maxtérmino MaMaxtérmino M4
Maxtérmino MsMaxtérmino M6
Maxtérmino MaMaxtérmino MgMaxtérmino Mío
Maxtérmino Mi2
Maxtérmino Mi 5
A continuación se detalla la forma de obtener la ecuación lógica (función
lógica) que la describe o sintetiza en forma de producto de maxtérminos o
términos máximos.
El primer paso es identificar las filas o combinaciones de entrada que
producen como resultado un O a la salida. En nuestro caso, esto es aplicable a
las filas O, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 y 15. A continuación, se observa en cada
fila los valores que toma cada variable de entrada. Si una variable determinada
vale 1, se reemplaza mentalmente por su complemento (A1, Bf, C1, D'). Si la
17
variable vale O, se deja tal como estaba, es decir, sin negar (A, B, C, D). En la
siguiente tabla se ilustra este paso:
012345689101215
A000000011111
B000011100011
c001100100101
o010101001001
Y000000000000
012345689101215
AAAAAAAAA'A'A'A1
A'
BBBBBB'B'B'BBBB'B'
CCcC'C'ccC'ccC'cC'
DDD'DD'DD'DDD'DDD'
Y000000000000
Seguidamente, se asigna a la salida de cada fila una expresión
booleana equivalente a la operación OR de las variables de entrada
representadas de esta forma. En la siguiente tabla se ilustra este paso:
18
012345689101215
A
000000011111
-vp¿000011100011
c001100100101
D
010101001001
Y^Mo* jtf-m?itfM4* M5* M6* M8* M9*
Miü*Mi2*Mi5A+B+C+DA+B+C+D'A+B+C'+DA+B+C'+D'A+B'+C+DA+B'+C+D'A+B'+C'+DA'+B+C+DA'+B+C+D'A'+B+C'+DA'+B'+C+DA'+B'+C'+D'
Maxtérmíno M0
Maxtérmino MIMaxtérmino M2Maxtérmino M3
Maxtérmino M4
Maxtérmino M5
Maxtérmino MeMaxtérmino M8
Maxtérmino M9
Maxtérmino M-|0Maxtérmino Mi2Maxtérmino Mi5
Cada una de estas ecuaciones es un maxtérmino. por ejemplo, el
maxtérmino asociado a la fila 12 es:
Mi2 = A'+B'+C+D
A partir de estos datos se puede escribir la ecuación booleana como un
producto de Maxtérminos. En nuestro caso:
Y=M0* Mi* M2* M3* M4* M5* M6* M8* M9* M10* Mi2* Mi5
Reemplazando cada maxtérmino por su expresión booleana
correspondiente, se obtiene la ecuación solicitada:
Y = (A+B+C+D)(A+B+C+D')(A+B+C'+D') (A+B'+C+D) (A+B'+C+D1)
(A+B'+C'+D) (A'+B+C+D) (A'+B+C+D1) (A'+B+C'+D) (A'+B'+C+D)
(A'+B'+C'+D')
A esta expresión también se la conoce como una función POS (Producto
de sumas).
A esta forma de la ecuación booleana también se llama forma
estándar o forma canónica conjuntiva.
19
Cualquiera de las dos formas canónicas obtenidas para las
ecuaciones booleanas resulta demasiado costosa y difícil de implantar, por esta
razón es necesario simplificar estas funciones. En la siguiente sección se
detallará cada uno de los pasos que se seguirán para simplificar una ecuación
booleana a una forma más sencilla para poder implementarla con mayor facilidad.
2.1.2 TABLA DE VERDAD A PARTIR DE UNA ECUACIÓN BOOLEANA
Una tabla de verdad sirve para visualizar de mejor manera las salidas
que tiene una función con todas y cada una de las entradas, la tabla se
construye con un número de filas igual a 2n; donde n es el número de variables
de entrada
Asi por ejemplo:
F<A,B,C>=A*B'*C+A'*OB*C
Esta función tiene 3 variables de entrada A, B y C por lo tanto la tabla
tendrá 8 filas = 23.
Las salidas dependen de cada uno de los términos de la función, es
decir:
Debido al término A*B'*C, cuando las entradas tienen la combinación
101 tendrán una salida 1, con el término A'C indica que cuando las entradas
tienen la combinación 0X1 tendrán una salida 1 y el término B*C indica que
cuando las entradas tienen la combinación X11 la salida es un 1. El resto de
combinaciones tendrán una salida igual a 0.
Estas combinaciones y la tabla resultante se puede observar en la
siguiente tabla:
20
A B C0 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1
A*B'*C00000100
A'*C01010000
B*C00010001
F<A, B, C,>01010101
21
2.2. MÉTODOS DE SIMPLIFICACIÓN.
Para implementar una función booieana mediante un diagrama lógico se lo
puede hacer a partir de la función obtenida de la tabla de verdad, pero la forma
óptima de hacerlo es a partir de una función simplificada. El diagrama lógico de
una función sin simplificar tiene más elementos que el diagrama lógico de una
función simplificada. Provocando que sea más costoso, además de complejo.
Existen 3 métodos para simplificar una expresión algebraica:
• Simplificación algebraica a través de teoremas o método del Algebra de
Boole.
• Método gráfico de Mapas de Karnaugh
• Método tabular de Quine-McCIuskey
2.2.1 MÉTODO DEL ÁLGEBRA DE BOOLE.
Dentro del Álgebra de Boole se define algunos axiomas y teoremas que
pueden ser aplicados a las funciones booleanas para su simplificación. Los
teoremas son los siguientes.
1. - Una variable solo puede tomar 1 de 2 valores: [O, 1]
a) A = O cuando A * 1.
b) A= 1 cuando A *0.
2. - Si A es la entrada a un inversor su salida es A'.
a) Sí A = O luego A' = 1
b) Sí A = 1 luego A' = O
3. -La suma lógica representa una Unión mientras que un producto una
Intersección
a) A + B; A U B suma lógica.
0 + 0 = 0
22
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1
b) A. B; AnB producto lógico
0.0 = 0
0.1 =0
1.0 = 0
1.1 = 1
4. -Identidad.
A + 0 = A A.1=A
5. -Elementos Nulos.
A+1 = 1 A.0 = 0
6. -Idempotencia.
A + A = A A.A = A
7. -Involución.
(A')1 = A.
8. -Complementos.
A + A' = 1 A.AJ = O
9. -Ley Conmutativa
A+B = B+A A.B = B.A
10. -Ley Asociativa.
(A + B) + C = A + (B + C) (A.B). C = A. (B.C)
11.-Ley Distributiva.
A.B + A.C = A (B + C) A + B.C = (A + B)(A + C).
23
12.-Cobertura
A + A.B = A A. (A+B) = A
13.-Combinación.
AB + AB1 = A (A + B)(A + B') = A.
14.-Consenso
AB + A'C + BC = AB + A'C (A + B)(A' + C)(B + C) = (A + B)(A' + C)
15. -TEOREMA DE DeMorgan
A + B = A B
ÁB = Á + B
A + B + C+ + N=A. B. C N
A. B. C N = A + B + C+.... + N
16. -TEOREMA DE SHANNON. (Expansión).
F(X,X2, ,Xn) = XiF(1,X2,X3, ,Xn)-0<iF(0,X2,X3, -Xn)
F(X1X2, ,Xn)= [Xi+F(0,X2,X3, ,Xn)].[Xi+F(1,X2,X3, Xn)]
La primera expresión sirve para la suma de productos, mientras que la
segunda expresión sirve para producto de sumas.
Así por ejemplo:
F = xy + x'z + yz.
F = xy + x'z +yz(x+x'). Teorema del complemento.
= xy + x'z + xyz + x'yz Distributiva.
= (xy+xyz) + (x'z + x'yz) Asociativa.
= xy(1+z) + x'z(1+y) Distributiva.
= xy + x'z Elementos nulos.
24
Si comparamos la función original tiene 3 términos mientras que la función
simplificada tiene únicamente 2 términos, lo cual implica menos compuertas.
Cuando se utiliza este método no existe un solo camino sino que depende
de la habilidad de la persona que está simplificando para aplicar las propiedades.
2.2.2 MÉTODO DEL MAPA DE KARNAUGH.
El proceso del álgebra de Boole se relaciona directamente con la
complejidad de la función booleana, este método no tiene reglas específicas para
predecir cada paso a seguir. El mapa de Karnaugh es un método simple y directo
para simplificar la función booleana, y que puede ser tratado no solamente en
forma de una tabla de verdad, sino como una extensión del diagrama de Venn.
Este método fue propuesto por Veitch y modificado por Karnaugh, por esta razón
se lo conoce como el método de Karnaugh o de Veitch.
El mapa de Karnaugh es una tabla en la que cada cuadrado representa un
mintérmino. Como cualquier función de Boole puede ser expresada como una
suma de mintérminos, se puede concluir que dicha función se reconoce
gráficamente en un mapa a partir del área encerrada por aquellos cuadros en los
que están los "1" como parte de la función, de hecho, el mapa representa un
diagrama visual de todas fas formas posibles en que puede ser expresada una
función en la forma normalizada; al reconocer varios patrones, el usuario puede
derivar expresiones algebraicas alternas para la misma función de las cuales se
puede escoger la más simple. Se asume que la expresión algebraica más simple
es aquella en la que la suma de productos o producto de sumas que tiene el
mínimo número de literales.
Un mapa de Karnaugh o mapa K es una tabla de verdad modificada que
se utiliza para simplificar ecuaciones Booleanas y diseñar circuitos lógicos de
manera sistemática. Los mapas K aprovechan la capacidad del cerebro humano
25
de trabajar mejor con patrones gráficos que con ecuaciones y otras formas de
expresión analítica.
Externamente un mapa de Karnaugh consiste de una serie de cuadrados,
cada uno de los cuales representa una línea de la tabla de verdad. Puesto que la
tabla de verdad de una función de N variables posee 2N filas, el mapa K
correspondiente debe poseer también 2N cuadrados. Cada cuadrado alberga un O
o un 1, dependiendo del valor que toma la función en cada fila.
Este método se basa en dos teoremas básicos del Algebra de Boole, estos
son los siguientes.
í) XY + X'Y = Y.
íi) X + X'Y = X + Y.
A este método también se denomina mapa K y se puede trabajar a partir de
mintérminos y o maxtérminos.
El mapa de Karnaugh es un método gráfico que se utiliza para simplificar
una ecuación lógica, para convertir una tabla de verdad a su circuito lógico
correspondiente en un proceso simple y ordenado.
Este método se puede aplicar para cualquier cantidad de entradas aunque
su utilidad práctica se limita a un máximo de seis variables de entrada.
Formato del mapa de Karnaugh.
Cada casilla del mapa K corresponde a una salida de cada combinación de
la tabla de verdad, es decir contiene la misma información que en la tabla de
verdad pero en diferente formato.
Por ejemplo:
Para 2 variable -> 22 = 4 filas
26
A0011
B0101
XX0
XiX2
X3
En el mapa existen 22 = 4 cuadrados.
B'
Para tres variables. 23 = 8 filas.
A00001111
B00110011
c01010101
XXoXiX2
X3
X4
X5
X6
X7
En el mapa 23 = 8 cuadrados.
C'
27
Para cuatro variables. -> 24 = 16 filas.
A0000000011111111
B0000111100001111
c0011001100110011
D0101010101010101
XXoXTX2
X3
X4
X5
X6
X7
X8
X9
XioXnXi2
Xl3
Xu
Xis
En el mapa 24 = 16 cuadrados.
C'D' C'D CD CD'A'B'A'BABAB'
X0
X4
X-I2
X8
XiX5
Xl3
X9
X3
X7
Xis
Xn
X2
X6
Xl4
Xio
Los cuadrados del mapa K se marcan, de tal forma que los cuadrados
horizontalmente adyacentes solo difieran en una variable. Por ejemplo, el
cuadrado Xo del mapa de cuatro variables es A'B'C'D', mientras tanto que el
cuadrado Xi es A'B'C'D entre estos dos estados únicamente la variable D es
diferente. De la misma manera los cuadrados verticalmente adyacentes difieren
en una sola variable. Por ejemplo, el cuadrado Xo es A'B'C'D' mientras tanto que
el X4 es A'BC'D' en este caso solo la variable B es diferente.
Los cuadrados del renglón superior (X0, Xi, Xa, Xa) se consideran
adyacentes a los cuadrados del renglón inferior (Xg, X9, Xn, XIQ). Así mismo los
28
cuadrados del extremo derecho (X0, X4, Xi2, Xa) se consideran adyacentes a los
cuadrados del extremo izquierdo (X2, Xe, X14,
Para que los cuadrados adyacentes difieran en una sola variable el
marcado de arriba hacia abajo debe estar en el orden A'B', A'B, AB y AB', de la
misma forma de izquierda a la derecha en la parte superior de la tabla. Por
ejemplo:
Para tres variables:
A00001111
B00110011
c01010101
X11100010
De acuerdo a la tabla de verdad la función será.
X = A'B'C1 + A'B'C + A'BC1 + ABC1.
La misma información en el mapa de Karnaugh es:
29
Para cuatro variables:
A0000000011111111
B0000111100001111
c0011001100110011
D0101010101010101
X0011000010100000
La función correspondiente para esta tabla es:
X = A'B'CD' + A'B'CD + AB'C'D' + AB'CD'.
Representando en el mapa de Karnaugh.
C'D' C'D CD CD1
A'B'A'BABAB'
0001
0000
1000
1001
Agrupamiento.- La expresión de salida X se puede simplificar
adecuadamente combinando los cuadros en el mapa K que contengan 1. El
proceso para combinar estos unos se denomina agrupamiento.
Agrupamiento de grupos de dos.- Es el agrupamiento que se realiza
entre un par de cuadros adyacentes verticalmente u horizontalmente que
contengan 1 de tal manera que se logra eliminar la variable que está en forma
30
normal en el un cuadrado, y complementada en el otro cuadrado. "El
agrupamiento de un par de unos adyacentes en un mapa K elimina la variable que
aparece en forma complementada y no complementada". A este grupo se
denomina pares.
Agrupamiento de grupos de cuatro.- A este grupo se denomina
cuádruples y se forma con cuatro unos que están en cuadrados adyacentes.
Cuando se forman grupos cuádruples se eliminan dos variables las cuales están
en forma normal y en forma complementada.
Agrupamiento de grupos de ocho.- Estos grupos están formados por
ocho unos que se encuentran en cuadrados adyacentes, a este grupo se
denomina octeto, cuando se forman grupos de 8 se logran eliminar las 3 variables
que se encuentran complementadas y no complementadas.
Proceso completo de simplificación.- Para simplificar una función
booleana se debe tomar en cuenta que mientras más grande es el agrupamiento
más cantidad de variables se eliminan así, si el grupo es de 2 unos entonces se
elimina una variable, si el grupo es de 4 unos se eliminan 2 variables, si es un
octeto se eliminan 3 variables, etc... El proceso es el siguiente.
1. Construcción del mapa K. Ubicando los unos en los cuadrados que indican la
tabla de verdad y ceros en los otros cuadrados.
2. Examinar el mapa y ver los cuadrados que tienen un "1" pero con cuadrados
adyacentes diferentes a "1" a estos se llaman unos aislados, ya que no se
agrupan con ningún otro cuadrado que tenga un "1".
3. Identificar los cuadrados que pueden combinarse con otro de una sola
manera. Se señala estos grupos de dos cuadrados. Los cuadrados que
pueden combinarse con grupos de dos más de una manera, se omiten de
momento.
31
4. Identificar los cuadrados que puedan combinarse con otros tres de una sola
forma. Si todos los grupos de cuatro así obtenidos no están ya incluidos en
grupos de dos, señalarlos. De nuevo, se omiten los cuadrados que pueden
combinarse con grupos de cuatro, más de una manera.
5. Agrupar cualquier octeto aunque algunos de los cuadrados que tiene unos ya
estén agrupados.
6. Bajo el mismo criterio hacer grupos de 2' cuadrados, donde i = O, 1, 2, 3,...
7. Aplicando el procedimiento anterior, si aún quedan cuadrados sin agrupar,
pueden combinarse con otros, ya agrupados o no, arbitrariamente, tratando de
incluirlos en el menor número de grupos posibles.
8. Se escribe la suma OR de todos los términos generados por cada
agrupamiento.
A continuación un ejemplo para entender mejor estos pasos:
A0000000011111111
B0000111100001111
c0011001100110011
D0101010101010101
X0010010100010101
32
Construimos el mapa K.
A'B'A'BABAB'
C'D' C'D CD CQ'0000
0
^_0
0
^JJ¿\y(U000
El cuadrado X2 es el único que contiene un 1 que no es adyacente a ningún
otro cuadrado que contiene 1. Está marcado con rojo. De este agrupamiento se
obtiene el término A'B'CD1, no se elimina ninguna variable ya que es un uno
aislado.
El cuadrado Xn es adyacente solo al cuadrado X15, entre estos dos se
forma un par, está marcado con color verde. De este agrupamiento se forma el
término ACD ya que se elimina B.
Los cuadrados X5, X7j Xi3 y Xis forman un cuádruple, están encerrados con
azul, de este agrupamiento se obtiene el término BD y se eliminan las variables A
yC.
Note que el cuadrado X15 se repite tanto en el par como en el cuádruple.
Todos los cuadrados que contienen unos ya han sido agrupados.
Se obtiene la función simplificada como suma lógica de los términos
obtenidos.
X=A'B'CD'+ACD
33
2.2.3 MÉTODO QUINE-McCLÜSKEY.
2.2.3.1 Representación cúbica de las funciones de Boole.
Es conveniente introducir una nueva representación de las funciones
booleanas la cual proporcionará una terminología conveniente para el método de
Quine-McCIuskey.
Una variable de conmutación que puede asumir solo dos valores, se puede
representar mediante dos puntos en los extremos de un solo segmento.
0. A 1Fig 2.1: Representación de una variable de conmutación.
Los cuatro valores posibles de dos variables de conmutación se pueden
representar mediante los cuatro vértices de un cuadrado.
Con tres variables de conmutación existen 8 combinaciones y la
representación gráfica lo podemos hacer en los vértices de un cubo.
0 A 1 001 A 101
o ooox-" ¡ ior>^) 00 A 10
B B B
B
II
B ¡
_ **
• — — — 3-*
B
111
^1 oro A 110 ff c
1 01 A 11 o. A
Fig 2.2: Representación de 2 y 3 variables de conmutación
34
La extensión a más de tres variables, se requieren figuras de más de tres
dimensiones, es geométricamente difícil, pero bastante sencilla desde el punto de
vista conceptual.
En general las diferentes combinaciones posibles de n variables se
representan como puntos en el espacio - n, y todos los 2n puntos posibles forman
los vértices de un cubo - n o un hipercubo de Boole.
Para representar una función determinada se dibuja el hipercubo, se
marcan con un punto los vértices que corresponden a una combinación que
produce un "1" en fa función.
La representación de funciones booleanas en el cubo - n se realiza
estableciendo una correspondencia uno a uno entre los mintérminos de n -
variables y los vértices del cubo n. de la siguiente manera. En un cubo - 3, el
vértice 000 corresponde a mo, el vértice 001 es mi, etc. La representación cúbica
de una función de n variables consta, entonces, del conjunto de vértices de un
cubo - n, correspondientes a los mintérminos de la función. Por ejemplo.
F(A,B,C) = Zm<0, 2, 3, 7).
Esta función se representa en el cubo - 3, como se indica en la siguiente
figura.
00m r
Im3 j0111 _1
00.m
oxo11m7
010m2
010m2
Im3011
01X
Cubos - O Cubos - 1
Fig. 2.3: Representación de un cubo-3
m7
35
Los vértices correspondientes a mO, m2, m3, y m7 se indican por medio de
puntos negro. Estos vértices se denominan cubos - O de la función.
Dos cubos - O forman un cubo - 1, si difieren solo en una coordenada en el
ejemplo anterior se tiene tres cubos - 1, que están marcados en rojo, (01X, 0X0,
X11), los cubos - 1 se designan colocando una "X" en la coordenada que tienen
diferentes valores.
Un conjunto de cuatro cubos O, cuyos valores de coordenada son iguales
en todas las variables excepto en dos, forma un cubo - 2 que se representa
gráficamente como un plano sombreado.
Cubos - 2
Fig. 2.4: Representación de un cubo - 2
Cuando todos los vértices de un cubo - k está en el conjunto de
vértices que componen un cubo - k mayor, se dice que el cubo más pequeño está
contenido en/o cubierto por el cubo mayor.
Resumiendo, un cubo - O se representa con un punto, un cubo - 1 se
representa con un segmento, un cubo - 2 con un plano, un cubo 3 con un
volumen, para un cubo - k en espacios - n mayores que 4 no hay representación
geométrica, pero el principio de agrupación de productos fundamentales es el
mismo.
36
Entre la representación cúbica y el mapa de Kamaugh existe una
correspondencia, Los cubos - O corresponden a los cuadrados del mapa K, los
cubos - 1 corresponden a los pares de cuadrados adyacentes, los cubos - 2
corresponden a los cuádruples de cuatro cuadrados adyacentes, etc.
2.2.3.2 Obtención de los implicantes primos.
Definición. - "Un implicante primo es cualquier cubo de una función que no
esté totalmente contenido en otro cubo mayor de dicha función".
El método de Quine-McCIuskey es un procedimiento organizado
ingeniosamente para efectuar una búsqueda exhaustiva de todas las
combinaciones posibles de cubos - O en cubos mayores y, luego, seleccionar la
combinación mínima de cubos requerida para realizar la función.
El punto de partida de este método es la lista de mintérminos de la función.
Ejemplo 1. f(A, B, C, D) = Im(0, 2, 3, 6, 7, 8, 9, 10, 13)
MINTÉRMINO
0123456789101112131415
COMBINACIONESA B C D0 0 0 00 0 0 10 0 1 00 0 1 10 1 0 00 1 0 10 1 1 00 1 1 11 0 0 01 0 0 11 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1
NUMERO DE "UNOS"
0112122312232334
FUNCIÓN
1011001111100100
37
En la tabla de productos fundamentales de la función, se dispone de la
representación binaria de las combinaciones de las variables de entrada, ya que
se ha definido que se consideran lógicamente adyacentes dos términos cuyas
combinaciones de variables son idénticas excepto en una sola de ellas, se halla
que una de las condiciones es que el número de "UNOS" en las representaciones
binarias difieran solo en una unidad.
Se separan únicamente los mintérminos que tienen un "UNO" asignado a la
función, y se los ordena de acuerdo al número de "UNOS" existentes en las
combinaciones de entrada, se separan los mintérminos en grupos con el mismo
número de unos por medio de las lineas horizontales. "Este agolpamiento de los
mintérminos se hace para reducir la cantidad de comparaciones que se deben
efectuar para determinar los cubos UNO".
VVVVVVVVV
monri2m8
1113m6
iTlg
mío
m7
mis
COMBINACIÓNA B C D0 0 0 00 0 1 01 0 0 00 0 1 10 1 1 01 0 0 11 0 1 0
0 1 1 11 1 0 1
#de"UNOS"
01
2
3
Se compara las combinaciones de cada grupo con las combinaciones del
grupo siguiente, si existe una variable diferente entre las dos combinaciones que
se están comparando entonces se reemplaza como una sola poniendo en el lugar
que está la variable diferente con una X anotando el mintérmino que se combina.
A los términos originales que se combinan se coloca una marca, por ejemplo "V".
También se debe anotar los números enteros correspondientes a los
mintérminos que se combinaron. En el caso de nuestro ejemplo mo se combina
con m2 para formar el cubo - 1 (XOOO) esta combinación es equivalente a la
operación algebraica A'B'C'D' + A'B'CD' = A'B'D'(C + CJ) = A'B'D'.
38
El mintérmino m0 se combina también con ms para formar el cubo - 1
(XOOO). Esto completa la comparación entre los mintérminos de los dos primeros
grupos, de manera que se traza una línea por debajo de los cubos - 1 resultantes.
A continuación, se comparan en la misma forma los mintérminos del segundo y
tercer grupos. Esta comparación produce cinco cubos - 1 más, formados de rr}2 y
ms, ms y mg, etc. Se traza una recta debajo de estos cinco cubos 1 para indicar la
terminación de las comparaciones entre el segundo y tercer grupos. Cada
mintérmino de un grupo se debe comparar con cada mintérmino del otro grupo,
incluso si cualquiera o ambos ya han sido marcados, y han formado un cubo - 1 ,
se debe encontrar cada cubo - 1 .
Este proceso de comparación se repite entre los grupos sucesivos hasta
que se agote la lista de mintérminos.
Cubo 10,20,82,32,62, 108,98, 103,76,79, 13
00X0XOOO001 X0X10X010100X10X00X1101 1X1X01
VVVVV
VVV
Una vez obtenida esta tabla se debe seguir el mismo proceso para obtener
la tabla de cubos 2, pero aquí interviene un nuevo elemento como es la X.
Nuevamente, los cubos de cada grupo se deben comparar sólo con los cubos del
siguiente grupo hacia abajo. En el ejemplo nuestro el cubo - 1 (0,2) se combina
con el cubo -1 (8,10) y se obtienen el cubo 2 (O, 2, 8, 10) (XOXO), los dos cubos -
1 usados se marcan para indicar que se han usado para formar cubos - 2.
Una explicación algebraica de esta combinación es la siguiente.
39
mO + m2 + m8 + m10 = A'B'C'D1 + A'B'CD' + AB'C'D' + AB'CD'
= A'B'D'(C + C') + AB'D'(C+ C1)
= A'B'D' + AB'D'
=B'D'(AÍ + A)
=B'D'.
Al comparar el cubo - 1 (0,8) con el cubo -1 (2,10) también se obtiene el
cubo - 2 (O, 2, 8, 10) (XOXO), el cual ya existe en la tabla de cubos 2.
Luego de comparar todos y cada uno de los cubos - 1 se obtiene la
siguiente tabla.
Cubo -20, 2, 8, 102, 3, 6, 7
XOXOOX1X
Este proceso se sigue hasta cuando ya no existan elementos que se
puedan combinar siendo esta tabla la de los cubos de mayor orden.
Existen combinaciones que no están marcadas razón por la cual no están
en cubos de mayor orden, a estas combinaciones se denominan implicantes
primos.
Un mintérmino que no se combina para formar cubos de mayor orden
también se debe considerar como parte de los implicantes primos.
Para el ejemplo anterior, la tabla de cubos - 2 tiene elementos que no se
pueden combinar entre sí para formar cubos - 3 es decir que todos estos son los
implicantes primos, también en la tabla de los cubos - 1 existe algunas
combinaciones que no se combinaron para formar cubos - 2, estos términos
también forman parte de los implicantes primos.
40
IMPLICANTES PRIMOS
1 O O X1 X 0 1X O X OO X 1 X
2.2.3.3 Selección de un conjunto óptimo de implicantes primos.
No todos los términos de la tabla de implicantes primos forman parte de la
solución ya que pueden tener varias soluciones y se debe escoger la que
contenga menos mintérminos. Para lograr encontrar los términos adecuados se
hace una tabla en la que en la fila se encuentran los términos originales y en la
columna estarán los implicantes primos. En el cruce de una fila y una columna se
coloca una marca si ese termino está contenido en el implicante primo.
Para el ejemplo anterior la tabla será:
*
*
*
1 0 0 X1 X 0 1X 0 X 0-n y 1 y -
0
yv
2
•J•^'
1
V
3
Jy
V
6
JV
V
7
^V
8V
, /1
V
9yT í
V
10
V
V
13
•\
V
Basándose en esta tabla se encuentra los implicantes primos esenciales de
la siguiente manera.
Buscamos en cada una de las columnas dónde se encuentra una
sola marca.
41
ii) El implicante primo que se encuentra en esta fila se considera como
un implicante primo esencial.
iii) Toda la fila se elimina para indicar que ya ha sido tomada en cuenta
iv) Las columnas en las que se encuentran las señales eliminadas
también se eliminan.
v) Se forma la tabla de implicantes primos esenciales.
IMPLICANTES PRIMOS ESENCIALES
X O X OO X 1 X1 X 0 1
vi) A continuación se escoge una de las señales en las columnas en las
que se encuentran 2 señales y se eliminan las columnas y filas con
el mismo criterio anterior. Pero en nuestro ejemplo no existen
columnas sobrantes con dos o más marcas, por esta razón la
solución es única.
La solución entonces es:
XOXO -> B'D'
OX1X -^ A'C
1X01 ->AC'D.
F(A, B, C, D) = A'C + AC'D + B'D'.
Ejemplo 2.
F(A, B, C, D, E) = Smíl, 2, 3, 5, 9, 10, 11, 18, 19, 20, 21, 23, 25, 26, 27).
42
TABLA DE COMBINACIONES.
Mintér-minos
miTf\2
mamsm9
míomumismi9m2om2im23m25m2em27
Forma BinariaA B C D E0 0 0 0 10 0 0 1 00 0 0 1 10 0 1 0 10 1 0 0 10 1 0 1 00 1 0 1 11 0 0 1 01 0 0 1 11 0 1 0 01 0 1 0 11 0 1 1 11 1 0 0 11 1 0 1 01 1 0 1 1
No. del's
112222323234334
CUBOS - 0VVVVVVVVVVVVVVV
12359101820
1119212526
2327
0 0 0 0 10 0 0 1 00 0 0 1 10 0 1 0 10 1 0 0 10 1 0 1 01 0 0 1 01 0 1 0 0
0 1 0 1 11 0 0 1 11 0 1 0 11 1 0 0 11 1 0 1 0
1 0 1 1 11 1 0 1 1
No. 1 's1
2
3
4
43
V
VVVVVV
VVVVv
vV
VV
CUBOS - 11,31,51,92,3
2, 102, 18
3,113, 195,219,119,2510, 1110,2618, 1918,2620,2111,2719,2319,2721,2325,2726,27
000X100X010X0010001 X0X010X0010
0X011X0011X0101010X1X10010101XX10101001X1X0101010XX101110X111X011101X1110X11101X
VVVV
VV
Cubos - 21,3,9,11
2,3, 10, 112,3, 18, 19
2, 10, 18,26
3, 11, 19,279, 11,25,2710, 11,26,2718, 19,26,27
0X0X1OX01XX001XXX010
XX011X10X1X101X1X01X
2, 3, 10, 11,Cubos18, 19,
-326, 27 XX01X
IMPLICANTES PRIMOS1,5
5,2120,2119,2321,23
1,3,9, 119, 11,25,27
2,3, 10, 11, 18. 19,26,27
00X01X01011010X10X11101X10X0X1X10X1XX01X
44
TABLA DE REDUCCIÓN DE LOS IMPLICANTES PRIMOS.
*
*
*
00X01X0101- — J — ,»,
1010X"10X11101X10X0X1X10X1-vYrn Y/v/xU ly\
V
V
2
_ /V
V
3
|
^V
5VV
9
\lt l1
V
10
-/f
V
11
V^/fJV
-\l
18
„ /**V
19
"
_
f
/
V
20
"N
V
21
V
V
V
23
VV
25
•Jí
V
26
_ /1
V
27
VjV
V
IMPLICANTES PRIMOS ESCENCIALES
X10X1 -» BC'E
XX01X C'D.
Una vez que tenemos los implicantes primos esenciales, ya tenemos una
parte de fa función simplificada ahora tendremos que ver los implicantes primos
secundarios que tienen menor costo, es decir, que tienen menos variables en el
término.
Teorema: 'Sean a y b dos términos implicantes primos de una tabla
reducida de tal manera que el costo de a sea menor o igual al costo de b.
Entonces, si a domina a b o si a y b son intercambiables existe una suma mínima
de productos que no incluye a b.
Utilizamos los implicantes que no se han tomado en cuenta como
implicantes primos esenciales, con las columnas que no han sido eliminadas de la
tabla de simplificación de los implicantes primos para buscar los implicantes
primos secundarios.
45
00X01X010110X11101X10X0X1
1V
V
5VV
23
VV
El implicante primo 00X01 cubre el mintérmino mi y el mintérmino m5
mientras que el implicante primo X0101 cubre únicamente al mintérmino m5 entre
estos dos el que tiene menos costo es el 00X01, luego el implicante 10X11 y
101X1 ambos cubren únicamente al mintérmino m2s tomamos cualquiera de los
dos
*
*
00X01 J
10X110X0X1
1/
-
i
VV
5i
V
V
23
/V
V
IMPLICANTES PRIMOS SECUNDARIOS
00X01 -> A'B'D'E
10X11 -* AB'DE.
Como se puede observar existen implicantes primos esenciales y
secundarios, la función resultante simplificada es la operación OR de todos estos
implicantes.
F(A, B, C, D, E) = AB'CD' + BC'E + C'D + A'B'D'E + AB'DE.
46
Ejemplo 3.
F(A, B,C) = Sm(1,4(6,7).
MINTÉRMINO
01234567
COMBINACIONESA B C0 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1
NUMERO DE "1S"
01121223
FUNCIÓN
01001011
Tabla de cubos O
mirrum6
m7
COMBINACIÓNA B C0 0 11 0 01 1 01 1 1
número de"UNOS"
1
23
M
VVV
Tabla de cubos -1
Combinaciones
4, 6
6, 7
Cubos 1
1 X 0
1 1 X
M
IMPLICANTES PRIMOS
011
0X1
10X
47
TABLA DE IMPLICANTES
IMPLICANTES PRIMOS ESENCIALES
0 O 11 X O1 1 X
FUNCIÓN RESULTANTE
En el ejemplo anterior solamente existen implicantes primos esenciales y
no existen implicantes primos secundarios por esta razón existe una única
solución.
2.2.4 FUNCIONES INCOMPLETAMENTE ESPECIFICADAS.
Recordemos que una función de conmutación es especificada en la tabla
de verdad en la que se indica una lista de valores para las 2n combinaciones
posibles para una función de n variables. Los diseños consisten en resolver un
problema o una descripción que por lo general es verbal de un trabajo lógico
traduciendo en una tabla de verdad, para luego buscar una función específica que
satisfaga esta tabla de verdad y un costo mínimo.
En algunas ocasiones el circuito que se diseña es un sistema en el que
ciertas combinaciones no influyen en el funcionamiento del sistema, es decir que
no importa para la salida de este sistema cuando estas combinaciones de
48
entradas sea "O" o "1". Otra posibilidad es que algunas combinaciones de las
entradas nunca suceden debido a restricciones externas del sistema que se va a
diseñar.
Cuando sucede cualquiera de las situaciones antes descritas se dice que la
función es no especificada. Este tipo de salidas se indica en la función como una
salida "X" en lugar de poner un "O" o un "1". Estas condiciones se las conoce
como opcionales y se dice que las funciones están incompletamente
especificadas. La realización de una función incompletamente especificada es
cualquier circuito que produce las mismas salidas para todas las combinaciones
de entrada para las cuales se especifica la salida
Es conveniente tener una forma algebraica compacta para indicar una
función incompletamente especificada. Para lo cual se usa la suma de los
mintérminos mas una suma de términos no especificados. Ejemplo una función no
especificada es:
F(A, B, C) = Im<4, 5) + d(0, 6, 7).
Esta función indica que los mintérminos m4 y m5 tienen como salida "1"
mientras que los mintérminos mo, me y m7 tienen como salida no especificada.
Representando esto en la tabla de verdad queda.
A00001111
B00110011
C01010101
F(A, B, C)X00011XX
Para simplificar las funciones incompletamente especificadas es más
practico usar el método del mapa de Karnaugh ya que en este mapa se toma a
49
las salidas no especificadas como "1" o "O" de acuerdo como produzca un grupo
de mayor cantidad de cuadros, con el objeto de tener una función más
simplificada posible.
1
En este caso los mintérmino me y m? se tomaron como "1" mientras que el
mintérmino m0 se le tomo como riO" ya que con estas consideraciones se obtienen
un grupo de más cuadros es decir la mínima simplificación.
F(A,B)=A
2.2.5 COMPARACIÓN DE LOS MÉTODOS DE SIMPLIFICACIÓN.
- El método del álgebra de Boole es complicado cuando se tienen funciones con
muchas variables de entrada mientras que el método de mapa de Karnaugh
es un método directo y simple sin importar la cantidad de mintérminos.
- En el método del álgebra de Boole se necesita que la persona que está
simplificando la función tenga habilidad para aplicar los axiomas apropiados ya
que no existe una regla que especifique cual axioma se debe aplicar con
certeza; mientras que los métodos tanto del mapa de Karnaugh como el
método de Quine-McCIuskey son métodos mecánicos y con proceso fijo lo
cual se puede decir con precisión cual método seguir en el siguiente paso.
- El método del mapa Karnaugh es un método muy rápido, mientras el método
de Quine-McCIuskey es más elaborado por lo tanto más largo.
50
Cuando existen más de cuatro variables el método del mapa de Karnaugh es
dudoso su seguridad mientras que el método de Quine-McCIuskey es seguro y
confiable.
Cuando son cuatro variables o menos el método del mapa de Karnaugh es
mucho más confiable ya que el método de Quine-McCIuskey es más largo.
El método del mapa de Karnaugh no es un iterativo lo cual dificulta la
posibilidad de implementar un programa computacional, mientras que el
método de Quine-McCIuskey utiliza una técnica iterativa lo cual facilita la
Implementación de un programa computacional para su uso y así lograr
simplificar funciones de muchas variables de entrada.
51
23 IMPLEMENTACION DE LAS FUNCIONES BOOLEANAS
SIMPLIFICADAS.
Una vez simplificada la ecuación correspondiente a la función obtenida
para resolver el problema planteado, se debe implementarlo para su
funcionamiento, es decir construir el hardware necesario para que cumpla el
objetivo y realice el trabajo planteado en el problema.
Para construir este hardware se utilizan las compuertas lógicas relacionas
con cada una de las operaciones existentes en la función simplificada.
En el primer ejemplo se tiene.
Y = A'C + AC'D + B'D'.
En esta expresión observamos que tanto las entradas A, B, C, y D están
complementadas es decir que se necesitan pasar por compuertas NOT para
obtener A', B1, C1 y D'.
Para obtener el primer término A'C es necesario las salidas de A' y C
ingresarlas por una compuerta AND de dos entradas, entonces a la salida de la
compuerta AND se obtendrá el valor correspondiente a la expresión A'C.
De la misma manera obtendremos el valor correspondiente al término AC'D
para lo cual la variable A, la salida de C' y la variable D en forma directa se
ingresan a una compuerta AND de tres entradas, o a dos compuertas AND de 2
entradas, y a la salida de cualquiera de estas compuertas se obtendrá AC'D.
Para obtener B'D' igualmente en una compuerta AND se ingresa la salida
de B1 y la salida de D' en forma directa y se obtiene el valor correspondiente de
B'D'.
52
Las tres salidas de las tres compuertas AND antes descritas se deben
ingresar a una compuerta OR de tres entradas para obtener la respuesta final.
Todo esto se resume en el siguiente gráfico del esquemático
correspondiente al circuito de la función dada.
ni 'C
Y=A1C+AC'D+B'D'
£>«BU-IJo.B'D'
Fig. 2.5: Circuito Esquemático de la función Simplificada
Para implementar este esquemático se necesita los siguientes chips:
- Un chip 7404 el cual contiene 6 compuertas NOT.
- Un chip 7408 el cual contiene 4 compuertas AND.
- Un chip 7432 el cual contiene 4 compuertas OR.
Como se puede observar únicamente con tres circuitos integrados se
puede construir el sistema planteado con la función booleana del ejemplo.
53
CAPITULO 3
DISEÑO DEL PROGRAMA COMPUTACIONAL PARA
SIMPLIFICAR FUNCIONES BOOLEANAS.
3.1. INTRODUCCIÓN.
Para simplificar las funciones booleanas utilizando un computador, es
necesario programar el proceso de simplificación paso a paso, en un lenguaje que
permita presentar una interfaz gráfica, amigable, llamativa y fácil de usar, esto
permitirá entender el proceso de Simplificación de Quine-McKIusky.
El programa que se diseñará tendrá una sección teórica en la que se
explica todo el proceso de simplificación de funciones booleanas utilizando ei
método de Quine-McKIusky paso a paso.
Existe otra sección en la que se presenta un tutorial de cómo utilizar el
programa de simplificación explicando cada una de las partes y objetos
existentes en este programa diseñado.
La tercera sección de este software, es un programa que sirve para
simplificar funciones booleanas de hasta 10 entradas, el programa realiza el
proceso de simplificación utilizando el método de Quine-McKIusky paso a paso
presentando cada uno de los cubos hasta obtener los implicantes primos, luego
indica la tabla de simplificación o de selección de los implicantes primos
esenciales, a continuación realiza una optimización de los implicantes primos
secundarios de menor costo, y por ultimo presenta la función totalmente
simplificada.
Este programa también permite guardar la tabla de combinaciones para
que sea utilizada en otro momento.
54
El ingreso de los datos se los puede hacer directamente en la tabla de
combinaciones o por medio de un editor de mintérminos.
El software diseñado funciona en cualquier computador que tenga el
sistema operativo Windows 95 o superior.
El desarrollo de este software se lo hace utilizando el lenguaje de
programación Visual Basic 6.0 ya que este lenguaje permite programar cualquier
aplicación bajo Windows.
A continuación se hace una descripción de los más importantes objetos de
Visual Basic usados para realizar la aplicación descrita anteriormente.
3.1.1. BREVE DESCRIPCIÓN DEL USO DE FORMULARIOS DE VISUAL
BASIC.
Un formulario en Visual Basic es un objeto en el que se presenta toda la
información, en este objeto se pone los controles los cuadros de texto para el
ingreso de datos, gráficos, listas de datos, comandos, tablas etc.
Fig. 3.1: Formulario usado en VisualBasic.
55
Cuando se ejecuta el programa muestra únicamente el formulario que está
definido como formulario inicial, para mostrar los demás formularios hay que
escribir el código respectivo.
Un formulario al igual que todos los objetos de Visual Basic responden a
eventos que se generan durante la ejecución del programa. Hay cuatro métodos
para trabajar con los formularios.
Show.- Como su nombre indica, el método Show muestra el formulario en
la pantalla, y lo pasa al primer plano del escritorio si está cubierto por otro
formulario. Para ello, cuando use el método Show, Visual Basic comprueba
primero que el formulario está cargado en la memoria, si no lo está, lo carga. La
sintaxis básica de método Show es
/VombreFomru/arío.Show
Load.- La palabra Load carga el formulario en la memoria pero no lo
presenta. Visual Basic carga también el formulario en la memoria siempre que se
haga referencia a sus propiedades o controles en el código. Por esto, la razón
principal para cargar un formulario antes de mostrarlo es disminuir el tiempo de
respuesta, a cambio se emplea más memoria, ya que Visual Basic tiene que
reservar memoria suficiente para el formulario. La sintaxis es
Load NombreFormularío.
Cuando Visual Basic carga un formulario, restaura en todas las
propiedades del mismo los valores definidos inicialmente al diseñarlo, y luego
llama al procedimiento de evento Form_Load.
Hide.- La palabra Hide retira el formulario de la pantalla, pero no lo
descarga de la memoria, los controles no están af alcance del usuario, pero puede
seguir haciendo referencia a ellos en el código. Los valores de fas variables al
nivel de formulario no desaparecen, igual que al cargar el formulario, la ocultación
56
del formulario aumenta la velocidad si va a necesitarlo de nuevo, pero a cambio
de seguir usando la memoria para guardarlo. La sintaxis es
NombreFormulario. Hide
Unload.- Esta palabra borra el formulario de la memoria es decir tiene el
mismo efecto que pulsar el botón de salida o pulsar dos veces en el cuadro de
control en la parte izquierda de la barra de titulo, se pierde toda la información
contenida en sus variables al nivel de formulario. La sintaxis es
Unload NombreFormulario
Cuando se carga, descarga y vuelve a cargar un formulario, siempre
activará el evento Form_Load, pero la única llamada al método Load que activa el
evento Initialize es la primera.
3.1.2. CONTROLES DE VISUAL BASIC
Antes de empezar a conocer los controles básicos veamos cuales son sus
características generales:
Propiedades.- Todos los controles disponen de una serie de propiedades
las cuales se puede cambiar al incluirlos en nuestras aplicaciones; ejemplos de
propiedades son el color, el tipo de letra, el nombre, el texto, etc...
Métodos.- Son procedimientos asociados a los controles, es decir, rutinas
ya establecidas que podemos invocar desde nuestras aplicaciones para que se
realice alguna operación sobre el control.
Eventos.- Son acciones que pueden ser motivadas por el propio usuario o
por mismo sistema operativo. Ejemplos pueden ser el movimiento del ratón o
hacer click sobre su botón. En Visual Basic se puede decir que se utiliza la
programación orientada a eventos, lo cual es una de las diferencias más
importantes respecto a la programación lineal de MS DOS. No necesitamos
57
detectar cuando se ha producido un evento determinado, Windows lo detecta
automáticamente. Los eventos ya están definidos, son bastantes y cada control
cuenta con los suyos propios, aunque son muy parecidos, lo único que se tiene
que hacer es asociar el código necesario al evento que necesitemos tratar.
3.1.2.1 TextBox
Fig. 3.2: Objeto TextBox
Mediante este control se puede realizar tanto la entrada como la salida de
datos en nuestras aplicaciones.
No hace falta indicar las coordenadas de la situación del formulario en
pantalla, simplemente se tiene que marcar sobre el control de la caja de
herramientas y dibujarlo con el tamaño deseado en el formulario.
Propiedades:
Las propiedades de las que dispone el control son las siguientes
Text: Aquí se indica el texto que aparecerá en el control. Podemos
asignarle cualquier texto en tiempo de diseño o ejecución. También podemos
tomar el texto que haya introducido el usuario para tratarlo durante la ejecución.
Ñame: Esta propiedad tiene todos los controles, el nombre que viene por
defecto en este caso Textl y es el nombre con el que se conocerá el control
cuando lo utilicemos en el código. En un mismo formulario no puede haber 2
controles con el mismo nombre. Conviene poner un nombre que represente la
función que tiene el control en la aplicación para que el código quede más claro.
MultiLine: Permite introducir varias líneas de texto en el control en lugar de
sólo una.
Alignment: Es la alineación que tendrá el texto dentro del control: izquierda,
centro o derecha. Para que funcione la propiedad MultiLine debe estar con el
valor true.
Locked: Si está con valor true bloquea el control, es decir, el usuario no
puede introducir ni modificar el texto que contenga. Nos puede servir para utilizar
el control como salida de datos sin que el usuario pueda modificarlos por error.
Otras propiedades que son comunes a la mayoría de los controles:
Backcolor: color de fondo.
Forecolor: color de letra.
Font: tipo y tamaño de letra.
Métodos
Recordemos que por métodos se entienden los procedimientos o funciones
asociados a un control, los cuales nos permiten realizar ciertas operaciones útiles
sobre dicho control: Ej. Ordenar sus elementos, buscar un dato, etc...
Eventos:
Los eventos son acciones que se pueden realizar en cualquier control:
click, doble click, movimiento del ratón. A estos eventos se les puede asociar
código para que se ejecute al producir el evento.
MouseMove: Al mover el ratón por encima del control.
MouseDown: Al pulsar cualquier botón del ratón.
59
Change: Al cambiar el contenido del control.
Click: Al hacer click con el botón izquierdo del ratón sobre el control.
DoubleClick: Al hacer doble click con el botón izquierdo del ratón sobre el
control.
GetFocus: Este evento se activa cuando el control recibe el enfoque, es
decir, cuando se activa el control en tiempo de ejecución para introducir datos en
él o realizar alguna operación.
LostFocus: Es el contrario del anterior evento, se activa cuando el control
pierde el enfoque, es decir, se pasa a otro control para seguir introduciendo datos.
3.1.2.2 Labe!.
Fig. 3.3: Objeto Label
Este control es también uno de los más utilizados, aunque su utilidad
queda restringida a la visualización de datos en el mismo, no permitiendo la
introducción de datos por parte del usuario.
La forma de utilizarlo es similar a la del control anterior, dibujar el control en
el formulario con el tamaño que queramos y asignarle un texto en tiempo de
diseño o de ejecución esta vez sin utilizar la propiedad text puesto que no la
incorpora, sino utilizando la propiedad Caption.
Este control sirve para mostrar mensajes en nuestro formulario que
orienten al usuario sobre la utilidad de los demás controles que tengamos en la
aplicación o para indicarnos acciones que podemos realizar.
60
Propiedades
Caption: Es el texto que contendrá el control.
Alignment: Alineación del texto contenido en el control, no necesita que
esté activada ninguna otra propiedad.
BorderStyle: Si queremos que aparezca un borde alrededor del control
activaremos esta propiedad.
Para este control no se suelen utilizar los eventos ya que su contenido
suele cambiar poco a lo largo de la ejecución de la aplicación. De todas formas
los eventos son casi los mismos del control textbox excepto que no dispone de los
eventos GetFocus y LostFocus ya que a este control no se le puede dar el
enfoque.
3.1.2.3. CommandButton
Fig. 3.4: Objeto CommandButton.
Este control es el típico botón que aparece en todas las aplicaciones y que
al hacer click sobre él nos permite realizar alguna operación concreta,
normalmente Aceptar o Cancelar. Aunque según el código que le asociemos
podremos realizar las operaciones que queramos.
Pero sólo con introducir un control de este tipo con el texto salir que se
introduce a través de la propiedad Caption no basta. Habrá que asociarle un
código que nos permita salir de la aplicación en el evento adecuado. Y el evento
por excelencia de este control es click. Así pues accederemos al código del
control y la sentencia que nos permitirá salir de la aplicación es End, simplemente
61
tecleamos esa palabra en el evento click y comprobar que realmente
finalizaremos nuestra aplicación al pulsar sobre dicho botón.
Propiedades
Gaption: Aquí se pone el letrero que queremos que aparezca en el botón:
aceptar, cancelar, salir, etc...
Enabled: Esta es una nueva propiedad, cuando su valor es true el botón
funciona normalmente, cuando su valor es false el botón se encuentra
desactivado, no responde a los eventos producidos sobre él y el texto aparece en
un gris claro advirtiéndonos de su estado. Podemos utilizar esta propiedad para
activar o desactivar un botón dependiendo del estado de otros controles.
Eventos
Click: Es el evento típico de este control y el que más se utiliza.
MouseMove: Como sabemos detecta el movimiento del ratón sobre el
control. Puede servir para que aparezca un mensaje en un control Label que nos
aporte información sobre la utilidad del control ampliando el texto que hayamos
colocado como Caption del CommandButton.
3.1.3. BREVE DESCRIPCIÓN DEL USO DE COMANDOS Y SENTENCIAS EN
VISUAL BASIC.
3.1.3.1. Fundamentos de la Programación
Cada módulo de formulario contiene procedimientos de evento (secciones
de código donde se colocan las instrucciones que se ejecutarán como respuesta a
62
eventos específicos). Los formularios contienen controles, por cada control de un
formulario, existe el correspondiente conjunto de procedimientos de evento en el
módulo de formulario; además de procedimientos de evento, los módulos de
formulario pueden contener procedimientos generales que se ejecutan como
respuesta a una llamada desde cualquier procedimiento de evento.
El código que no esté relacionado con un control o un formulario específico
se puede colocar en un tipo diferente de módulo, un módulo estándar (. bas). Se
deben colocar en un módulo estándar los procedimientos que se puedan utilizar
como respuesta a eventos de diversos objetos, en lugar de duplicar el código en
los procedimientos de evento de cada objeto.
¿Cómo Funciona una Aplicación controlada por Eventos?
Un evento es una acción reconocida por un formulario o un control. Las
aplicaciones controladas por eventos ejecutan código Basic como respuesta a un
evento. Cada formulario y control de Visual Basic tiene un conjunto de eventos
predefinido. Si se produce uno de dichos eventos y el procedimiento de evento
asociado tiene código, Visual Basic llama a ese código.
Aunque los objetos de Visual Basic reconocen automáticamente un
conjunto predefinido de eventos, se decide cuándo y cómo se responderá a un
evento determinado. A cada evento le corresponde una sección de código que se
denomina procedimiento de evento, cuando se desea que un control responda a
un evento, se escribe el código en el procedimiento de ese evento.
Los tipos de eventos reconocidos por un objeto varían, pero muchos tipos
son comunes a la mayoría de los controles, por ejemplo, la mayoría de los objetos
reconocen el evento Click: si un usuario hace clic en un formulario, se ejecuta el
código del procedimiento de evento Click del formulario; si un usuario hace clic en
un botón de comando, se ejecuta el código del procedimiento de evento Click del
botón, el código en cada caso será diferente.
63
Aquí una secuencia típica de eventos en una aplicación controlada por
eventos:
• Se inicia la aplicación y se carga(LOAD) y muestra(SHOW) el formulario
inicial.
• El formulario (o un control del formulario) recibe un evento. El evento puede
estar causado por el usuario (por ejemplo, por la pulsación de una tecla) o
por el sistema (por ejemplo, un evento de cronómetro) o, de forma indirecta
por el código (por ejemplo un evento Load cuando el código carga un
formulario).
• Si hay código en el procedimiento de evento correspondiente, se ejecuta.
La aplicación espera al evento siguiente.
3.1.3.2. Variables.
3.1.3.2.1. Alcances de las Variables
El alcance de una variable define qué partes del código conocen de su
existencia; cuando se declara una variable en un procedimiento, sólo el código de
dicho procedimiento puede tener acceso o modificar el valor de la variable, tiene
un alcance que es local al procedimiento.
A veces, sin embargo se necesita utilizar una variable con un alcance más
general, como aquella cuyo valor está disponible para todos los procedimientos
del mismo módulo o incluso para todos los procedimientos de toda la aplicación;
Visual Basic fe permite especificar el alcance de una variable cuando la declara.
3.1.3.2.2. Establecimiento del Alcance de las Variables
64
Dependiendo de cómo se declara, una variable tiene como alcance un
procedimiento (local) o un módulo.
Alcance
Nivel deprocedimiento
Nivel de módulo
Privado
Las variables son privadasdel procedimiento en el queaparecen.Las variables son privadasdel módulo en el queaparecen.
Público
No es aplicable. No puededeclarar variables públicasdentro de un procedimiento.
Las variables están disponiblespara todos los módulos.
3.1.3.2.3. Variables Utilizadas en un Procedimiento
Las variables al nivel de procedimiento sólo se reconocen en el
procedimiento en el que se han declarado. Se las conoce también como variables
locales. Se declaran mediante las palabras clave Dim o Static. Por ejemplo:
Dim col As Integer
- o bien -
Static col As Integer
Los valores de variables locales declaradas con Static existen mientras se
ejecuta la aplicación, mientras que las variables declaradas con Dim sólo existen
mientras se ejecuta el procedimiento.
Las variables locales resultan una elección apropiada para cálculos
temporales. Por ejemplo, puede crear una docena de procedimientos distintos que
contengan una variable llamada col, como cada col se ha declarado como una
variable local, cada procedimiento sólo reconoce su propia versión de col.
Cualquier procedimiento puede alterar el valor de su col local sin que ello
afecte a las variables col de los demás procedimientos.
3.1.3.2.4. Variables Utilizadas en un Módulo
65
De forma predeterminada, una variable al nivel de módulo está disponible
para todos los procedimientos del módulo, pero no para el código de otros
módulos. Se crea variables al nivel de módulo declarándolas con la palabra clave
Prívate en la sección Declaraciones al principio del módulo. Por ejemplo:
Prívate col As Integer
Al nivel de módulo, no hay diferencia entre Prívate y Dim, pero es preferible
Prívate porque contrasta con Public y hace que el código sea más fácil de
comprender.
3.1.3.2.5. Variables utilizadas por todos los Módulos
Para hacer que una variable al nivel de módulo esté disponible para otros
módulos, se utiliza la palabra clave Public para declarar la variable. Los valores de
las variables públicas están disponibles para todos los procedimientos de la
aplicación.
Al igual que todas las variables al nivel de módulo, las variables públicas se
declaran en la sección Declaraciones al principio del módulo. Por ejemplo:
Public col As Integer
A/o se puede declarar variables públicas en un procedimiento, sólo en la
sección Declaraciones de un módulo.
3.1.3.2.6. Declaración de Variables
La forma de declarar las variables es la siguiente:
Dim \ | Static nombre_varíable As tipo
Dim: Al declarar una variable con esta palabra estamos diciendo que la
variable sea local al ámbito en que se declara; puede ser dentro de un
66
procedimiento o dentro de un formulario, de esta forma no sería accesible desde
los demás procedimientos o formularios.
Public: Las variables declaradas serán publicas y podrán estar accesibles
desde todos los formularios de la aplicación. Para conseguirlo tendremos que
declararlas en un módulo de código, no en la sección declarations de cualquier
formulario de los que conste la aplicación. Para crear un módulo de código en el
menú principal de Visual Basic marcamos en PROYECTO/INSETAR MÓDULO y
aparecerá junto a los demás formularios de la ventana de proyecto aunque con un
icono distinto indicando que se trata de un módulo de código
3.1.3.2.7. Tipos de Variables
Tipo
BOOLEAN
BYTE
INTEGER
LONG
SINGLE
DOUBLE
CURRENCY
STRING
DATE
Comentario
Sólo admite 2 valores TRUE o FALSE
Admite valores entre 0 y 255
Admite valores entre -32768 y 32767
Admite valores entre -2.147.483.648 y 2.147.483.647
Admite valores decimales con precisión simple
Admite valores decimales de doble precisión
Válido para valores de tipo moneda
Cadenas de caracteres (Texto)
Fechas, permite operar con ellas
Matrices
Para declarar matrices debemos colocar entre paréntesis el número de
elementos de los que constará a continuación del nombre de la variable:
Dim fíl(16) as Integer
67
De esta forma tenemos una matriz de 16 elementos identificados del O al
15
También se puede indicar los límites inferior y superior de la matriz:
Dim filaanulada(5 To 14) as Integer
Lo que seria una matriz de 10 elementos cuyos índices van del 5 al 14
Las matrices multidimensionales se declaran de la siguiente forma:
Dim Tabla(1 To 1023, 1 To 1023) as Integer
3.1.3.2.8. Consideraciones
Al trabajar con Visual Basic es preferible que se active la opción que nos
obligue a declarar todas las variables que se utilizan, de esta forma nos
ahorraremos errores inesperados como el de trabajar con una variable ya utilizada
anteriormente produciéndose un conflicto difícil de resolver.
En cambio si se intenta declarar 2 variables con el mismo nombre, en el
mismo formulario o procedimiento se produce un error en tiempo de edición
avisándonos de la situación.
Otra opción que es interesante activar, es la de Guardar los cambios en la
ficha entorno, la cual guarda una copia del código antes de ejecutarlo por si acaso
luego no podemos, se bloquea la aplicación etc... de esta forma se asegura que lo
último que se haya ejecutado se tiene guardado en el disco.
3.1.3.3. Procedimientos
Se puede simplificar las tareas de programación si se divide los programas
en componentes lógicos más pequeños. Estos componentes, llamados
68
procedimientos, pueden convertirse en bloques básicos que le permiten mejorar y
ampliar Visual Basic.
Los procedimientos resultan muy útiles para condensar las tareas
repetitivas o compartidas, como cálculos utilizados frecuentemente, manipulación
de texto y controles.
Hay dos ventajas principales cuando se programa con procedimientos:
• Los procedimientos permiten dividir los programas en unidades lógicas
discretas, cada una de las cuales se puede depurar más fácilmente que un
programa entero sin procedimientos.
• Los procedimientos que se utilizan en un programa pueden actuar como
bloques de construcción de otros programas, normalmente con poca o
ninguna modificación.
En Visual Basic se utilizan varios tipos de procedimientos:
• Procedimientos Sub que no devuelven un valor.
• Procedimientos Function que devuelven un valor (normalmente conocidos
como funciones).
Un procedimiento Sub es un bloque de código que se ejecuta como respuesta a
un evento. Al dividir el código de un módulo en procedimientos Sub, es más
sencillo encontrar o modificar el código de la aplicación.
La sintaxis de un procedimiento Sub es la siguiente:
[Prívate | Public][Static]Sub nombre_procedimiento (argumentos)
instrucciones
End Sub
69
Cada vez que se llama af procedimiento se ejecutan las instrucciones que hay
entre Sub y End Sub. Se pueden colocar los procedimientos Sub en módulos
estándar, módulos de clase y módulos de formulario.
De forma predeterminada, los procedimientos Sub son Public en todos los
módulos, lo que significa que se les puede llamar desde cualquier parte de la
aplicación.
Los argumentos de un procedimiento son como las declaraciones de variables;
se declaran valores que se pasan desde el procedimiento que hace la llamada.
Resulta muy útil en Visual Basic distinguir entre dos tipos de procedimientos Sub,
procedimientos generales y procedimientos de evento.
3.1.3.3.1 Procedimientos generales
Un procedimiento general indica a la aplicación cómo realizar una tarea
específica. Una vez que se define un procedimiento general, se le debe llamar
específicamente desde la aplicación. Por el contrario, un procedimiento de evento
permanece inactivo hasta que se le llama para responder a eventos provocados
por el usuario o desencadenados por el sistema.
¿Por qué se crean procedimientos generales? Una razón es que muchos
procedimientos de evento distintos pueden necesitar que se lleven a cabo las
mismas acciones. Es una buena estrategia de programación colocar las
instrucciones comunes en un procedimiento distinto (un procedimiento general) y
hacer que los procedimientos de evento lo llamen. Esto elimina la necesidad de
duplicar código y también hace que la aplicación sea más fácil de mantener.
3.1.3.3.2. Procedimientos de evento
Cuando un objeto en Visual Basic reconoce que se ha producido un evento,
llama automáticamente al procedimiento de evento utilizando el nombre
70
correspondiente al evento. Como el nombre establece una asociación entre el
objeto y el código, se dice que los procedimientos de evento están adjuntos a
formularios y controles.
• Un procedimiento de evento de un control combina el nombre real del
control (especificado en la propiedad Ñame), un carácter de subrayado (_)
y el nombre del evento. Por ejemplo, si desea que un botón de comando
llamado siguiente llame a un procedimiento de evento cuando se haga clic
en él, Se utiliza el procedimiento siguiente_Click.
• Un procedimiento de evento de un formulario combina la palabra "Form",
un carácter de subrayado y el nombre del evento. Si desea que un
formulario llame a un procedimiento de evento cuando se hace clic en él,
se utiliza el procedimiento Form_Click, (Como los controles, los formularios
tienen nombres únicos, pero no se utilizan en los nombres de los
procedimientos de evento.)
Todos los procedimientos de evento utilizan la misma sintaxis general.
Sintaxis de un evento de control Sintaxis de un evento de formulario.
Prívate Sub nombrecontrol_nombreevento (argumentos)
instrucciones
End Sub
Prívate Sub Fotrn_nombreevento (argumentos)
instrucciones
End Sub
Aunque se puede escribir procedimientos de evento nuevos, es más sencillo
utilizar los procedimientos de código que facilita Visual Basic, que incluyen
automáticamente los nombres correctos de procedimiento.
71
Se puede seleccionar una plantilla en la ventana Editor de código si selecciona
un objeto en el cuadro Objeto y selecciona un procedimiento en el cuadro
Procedimiento.
También es conveniente establecer la propiedad Ñame de los controles antes
de empezar a escribir los procedimientos de evento para los mismos. Si se
cambia el nombre de un control tras vincularte un procedimiento, se deberá
cambiar también el nombre del procedimiento para que coincida con el nuevo
nombre del control. De lo contrario, Visual Basic no será capaz de hacer coincidir
el control con el procedimiento.
Cuando el nombre de un procedimiento no coincide con el nombre de un
control, se convierte en un procedimiento general.
Llamadas a Procedimientos.
Un procedimiento Sub difiere de un procedimiento Function en que, al
procedimiento Sub no se le puede llamar mediante su nombre en una expresión.
La llamada a un procedimiento Sub es una instrucción única.
Además, un procedimiento Sub no devuelve un valor en su nombre como
hace una función. Sin embargo, al igual que Function, un procedimiento Sub
puede modificar los valores de las variables que se le pasan.
Hay dos formas de llamar a un procedimiento Sub:
Ambas instrucciones llaman a un Sub denominado MostrarTabla.
Cali MostrarTabla (PrímerArgumento, SegundoArgumento)
MostrarTabla PrímerArgumento, SegundoArgumento
72
Cuando se utiliza la sintaxis Cali, se debe poner los argumentos entre
paréntesis. Si omite la palabra clave Cali, se debe también omitir los paréntesis
alrededor de los argumentos.
3.1.3.4. Funciones
La sintaxis de un procedimiento Function es la siguiente:
[ Prívate \ nombre_j>rocedimiento(argumentos) [As
tipo]
instrucciones
End Function
Al igual que un procedimiento Sub, un procedimiento Function es un
procedimiento diferente que puede tomar argumentos, realizar una serie de
instrucciones y cambiar el valor de los argumentos. A diferencia de los
procedimientos Sub, los procedimientos Function pueden devolver un valor al
procedimiento que realiza la llamada. Hay tres diferencias entre los
procedimientos Sub y Function:
• Generalmente, se llama a una función incluyendo el nombre y los
argumentos del procedimiento en la parte derecha de una instrucción o
expresión mayor (Vaior_Retorno = funciónQ).
• Los procedimientos Function tienen tipos de datos, al igual que las
variables. Esto determina el tipo del valor de retorno. (En ausencia de la
cláusula As, el tipo es el tipo predeterminado Variant.)
• Se devuelve un valor asignándole al propio Nombre_Procedimiento.
Cuando el procedimiento Function devuelve un valor, se puede convertir en
parte de una expresión mayor.
3.1.3.4.1. Llamadas a Funciones.
73
Normalmente se llama a un procedimiento de función que se ha escrito de la
misma forma en que se llama a una función intrínseca de Visual Basic como Abs;
es decir, utilizando su nombre en una expresión:
También es posible llamar a una función igual que se llama a un procedimiento
Sub. Las instrucciones siguientes llaman a la misma función:
Cali Year(Now)
YearNow
Cuando llama a una función de esta manera, Visual Basic desecha el valor de
retorno.
3.1.3.4.2 Paso de Argumentos a Procedimientos y Funciones
Normalmente el código de un procedimiento necesita cierta información
sobre el estado del programa para realizar su trabajo. Esta información consiste
en variables que se pasan al procedimiento cuando se le llama. Cuando se pasa
una variable a un procedimiento, se llama argumento.
3.1.3.4.3 Tipos de datos de los argumentos
Los argumentos de los procedimientos que escriba tienen el tipo de dato Variant
de forma predeterminada. Sin embargo, puede declarar otros tipos de datos para
los argumentos.
3.1.3.4.4 Paso de argumentos por valor
74
Sólo se pasa una copia de la variable cuando se pasa un argumento por
valor. Si el procedimiento cambia el valor, el cambio afecta sólo a la copia y no a
la variable propiamente dicha.
3.1.3.4.5 Paso de argumentos por referencia
El Paso de argumentos por referencia le da al procedimiento acceso al
contenido real de la variable en su ubicación de dirección de memoria. Como
resultado, el procedimiento al que se pasa el valor de la variable se puede
modificar de forma permanente. La forma predeterminada de pasar valores en
Visual Basic es por referencia.
Si especifica el tipo de dato de un argumento que se pasa por referencia,
debe pasar un valor de ese tipo para el argumento. Se puede eludirlo si pasa una
expresión en vez de un tipo de dato como argumento. Visual Basic evalúa la
expresión y la pasa como el tipo requerido si puede.
La forma más sencilla de convertir una variable en una expresión es
ponerla entre paréntesis.
3.1.3.5 Estructuras de Control (Repetición y Decisión)
3.1.3.5.1 Do While - Loop / Do - Loop While.
El bucle Do se utiliza para ejecutar un bloque de instrucciones un número
indefinido de veces. Hay algunas variantes en la instrucción Do...Loop, pero cada
una evalúa una condición numérica para determinar si continúa la ejecución.
75
Como ocurre con If.Then, la condición debe ser un valor o una expresión
que dé como resultado False (cero) o True (distinto de cero).
En el ejemplo de Do...Loop siguiente, las instrucciones se ejecutan siempre y
cuando condición sea True:
Do While condición
instrucciones
Loop
Cuando Visual Basic ejecuta este bucle Do, primero evalúa condición. Si
condición es False (cero), se salta todas las instrucciones. Si es True (distinto de
cero), Visual Basic ejecuta las instrucciones, vuelve a la instrucción Do While y
prueba la condición de nuevo.
Por tanto, el bucle se puede ejecutar cualquier número de veces, siempre y
cuando condición sea distinta de cero o True. Nunca se ejecutan las instrucciones
si condición es False inicialmente. Por ejemplo, este procedimiento cuenta las
veces que se repite una cadena de destino dentro de otra cadena repitiendo el
bucle tantas veces como se encuentre la cadena de destino.
Otra variante de la instrucción Do...Loop ejecuta las instrucciones primero y
prueba condición después de cada ejecución. Esta variación garantiza al menos
una ejecución de instrucciones:
Do
instrucciones
Loop While condición
Hace el bucle al menos una vez
Do Until condición
instrucciones
Loop Do
76
instrucciones
Loop Until condición
3.1.3.5.2 For-Next.
Los bucles Do funcionan bien cuando no se sabe cuántas veces se
necesitará ejecutar las instrucciones del bucle. Sin embargo, cuando se sabe que
se va a ejecutar las instrucciones un número determinado de veces, es mejor
elegir el bucle For...Next. A diferencia del bucle Do, el bucle For utiliza una
variable llamada contador que incrementa o reduce su valor en cada repetición
del bucle. La sintaxis es la siguiente:
For contador = iniciar To finalizar [Step incremento]
instrucciones
Next [contador]
Los argumentos contador, iniciar, finalizar e incremento son todos
numéricos.
El argumento incremento puede ser positivo o negativo. Si incremento es
positivo, iniciar debe ser menor o igual que finalizar o no se ejecutarán las
instrucciones del bucle. Si incremento es negativo, iniciar debe ser mayor o igual
que finalizar para que se ejecute el cuerpo del bucle. Si no se establece Step, el
valor predeterminado de incremento es 1.
Al ejecutar el bucle For, Visual Basic:
• Establece contador al mismo valor que iniciar.
• Comprueba si contador es mayor que finalizar. Si lo es, Visual Basic sale
del bucle. (Si incremento es negativo, Visual Basic comprueba si contador
es menor que finalizar.)
77
• Ejecuta instrucciones.
• Incrementa contador en 1 o en instrucciones, si se especificó.
• Repite los pasos 2 a 4.
3.1.3.5.3 Else-Endlf.
Se usa la estructura If.Then para ejecutar una o más instrucciones basadas
en una condición. Se puede utilizar la sintaxis de una línea o un bloque de varias
líneas:
If condición Then instrucción Aquí no hace falta cerrar con End If
If condición Then
instrucciones
Endlf
Condición normalmente es una comparación, pero puede ser cualquier
expresión que dé como resultado un valor numérico. Visual Basic interpreta este
valor como True o False; un valor numérico cero es False y se considera True
cualquier valor numérico distinto de cero. Si condición es True, Visual Basic
ejecuta todas las instrucciones que siguen a la palabra clave Then. Puede utilizar
la sintaxis de una línea o de varias líneas para ejecutar una instrucción basada en
una condición.
3.1.3.5.4 If...Then...Else
Se utiliza un bloque lf...Then...Else para definir varios bloques de
instrucciones, uno de los cuales se ejecutará:
I f condición 1 Then
[bloque de instrucciones 1]
/E/se
ui i v GMWI ci i ui ia noua, oc acfJdi di i 1UO vclKJI C& UUII IAJI11 día. WdUd Uiuque U tí
79
instrucciones contiene cero o más instrucciones. Si más de un Case coincide con
la expresión de prueba, sólo se ejecutará el bloque de instrucciones asociado con
la primera coincidencia. Visual Basic ejecuta las instrucciones de la cláusula
(opcional) Case Else si ningún valor de la lista de expresiones coincide con la
expresión de prueba.
Observe que la estructura Select Case evalúa una expresión cada vez al
principio de la estructura.
80
3.2 DIAGRAMA DE FLUJO DEL PROGRAMA
Este programa presenta un formulario inicial desde el que se puede
acceder a las diferentes opciones que tiene el programa como son: Una parte
teórica, que explica el proceso de simplificación de Quine-McCIuskey, la segunda
sección en la que se da un tutorial de cómo utilizar el programa de simplificación,
y la tercera parte es para la simplificación de funciones de hasta diez variables de
entrada, en este programa el ingreso de los datos y el proceso de simplificación
se lo realiza paso a paso hasta obtener la respuesta de la función simplificada.
También hay la opción de correr el programa en un solo paso, y por último hay la
opción de salir. En la fig. 3.5 se indica el diagrama de flujo correspondiente al
primer interface del programa.
FundamentoTeórico
Presentación \e la Teoría J
MenúPrincipal
Presentacióndel tutorial
Iniciar /Simplificación /""
f Proceso de \ Simplificación J
Fig. 3.5: Diagrama de Flujo del inicio del programa
81
3.2.1 TEORÍA
Regresaral Menú
Comandopresionado
Imprimir-
Flechas de NavegacióniNavegaren el
Texto
Imprimir el Textocompleto
Fig. 3.6: Diagrama de flujo de la presentación de la Teoría,
Es una explicación teórica, en la que se presenta todo lo referente a la
teoría, con respecto al método de simplificación de Quine-McCIuskey, para esto
lo que se hace es abrir un documento realizado en Word y guardado con una
extensión rtf.
La explicación se la hace siguiendo todo el proceso de simplificación para
un ejemplo en particular, el cual está compuesto de tres variables de entrada [A,
82
B, C]. Esta sección es una parte de consulta en la que se explica paso a paso
todo el proceso de simplificación de las funciones booleanas utilizando el método
de Quine-McCIuskey. La presentación de la teoría se hace únicamente
presentando en un objeto RichTextBox el documento realizado en Word y
guardado con el nombre "Texto, rtf, la navegación y revisión del texto se lo hace
con la barra de navegación existente en el objeto RichTextBox..
En esta ventana también existe la opción de imprimir todo el contenido del
Texto; y se puede seleccionar y copiar una parte del texto y pegarlo en alguna
otra aplicación. La figura 3.6 muestra el diagrama de flujo de la rutina de
presentación de la teoría en la pantalla del monitor
3.2.2 SIMPLIFICACIÓN
En esta parte existe un programa que permite simplificar paso a paso una
función booleana de hasta diez variables o entradas utilizando el método de
Quine-McCIuskey, el ingreso de datos se puede hacer por medio de una tabla de
combinaciones, en la que el programa genera cada una de fas combinaciones de
las variables de entrada mientras que el usuario ingresará las salidas O o 1
correspondientes a cada combinación, el programa se encarga de poner los
mintérminos respectivos en el editor de mintérminos. También se puede ingresar
directamente todos y cada uno de los mintérminos en este caso el programa se
encarga de calcular el número de entradas y construir la tabla de combinaciones
correspondiente a la suma de los mintérminos asociados, este programa también
permite guardar la tabla de datos ingresada para recuperarla en otro momento, la
extensión de los archivos tipo texto con los que se guarda es *.boo, también se
puede abrir un archivo o una tabla ingresada anteriormente para simplificarla.
En el figura 3.7 se presenta el diagrama de flujo del programa para la
simplificación de funciones lógicas.
83
^Simplificación
Presenta la pantalla deingreso de datos
-Abrir
Abrir el Archivo
Ingresar datospor mintérminos
iF
Ingresar datospor tabla
Presentar Tabla deCombinaciones y
mintérminos
ComandoIngresado
Tiene larespuesta
final?
Está la tabla decombinaciones
Simplifica elsiguiente paso
Simplifica elpaso anterior
O¡
Fig. 3.7: Diagrama de flujo para la simplificaóión de las funciones.
84
3.2.3 TUTORIAL
El tutorial enseña paso a paso a utilizar el programa de simplificación para
lo cual se utiliza un ejemplo de 4 variables de entrada, la presentación es igual
que la presentación de la simplificación, también se explica paso a paso la forma
de utilizar este programa tanto en el ingreso de datos como en el proceso de
simplificación. En la figura 3.8 está el diagrama de flujo para el tutorial.
InicioTutorial
Presenta laTeoría
IngresarComando
ComandoIngresado
/Siguiente Anterior /
Ultimaxplicación?
Primeraxplicación?
Presentar lasiguiente
explicación
Presentar laanterior
explicación
Fig. 3.8: Diagrama de flujo del Tutorial.
85
33. DIAGRAMA DE FLUJO DE LA SIMPLIFICACIÓN.
Para realizar la simplificación de una función se siguen los siguientes
pasos:
Ingreso de los datos en la tabla de verdad
Formación de los cubos n
Construcción de la tabla de implicantes primos
Construcción de la tabla de simplificación
Simplificación de la tabla de implicantes primos
Obtención de la ecuación booleana
3.3.1. INGRESO DE LOS DATOS EN LA TABLA DE COMBINACIONES.
El ingreso de los datos se puede hacer de dos formas: directamente en la
tabla, o ingresando los mintérminos. Si el ingreso se hace en la tabla los
mintérminos se actualizan automáticamente, para esto se debe saber cuantas
entradas o variables tiene la función. Si el ingreso de datos es por medio de los
mintérminos la tabla de combinaciones se actualiza automáticamente, también se
calcula inmediatamente el número de entradas de acuerdo a los mintérminos
ingresados.
Si el ingreso de datos se lo hace por medio de la tabla, la salida debe ser
un 1 o un O caso contrario aparece un mensaje que indica que se ha ingresado un
dato incorrecto, la combinación que tiene como salida un 1, da lugar a un
mintérmino, este mintérmíno se actualiza en un vector r(i), luego se actualiza en el
indicador de mintérminos, Cuando la salida de la función es O o 1, también se
actualiza el indicador de mintérminos, a continuación se revisa que se haya
ingresado todos los datos de la tabla, si es así se habilita el botón del comando
<siguiente> para estar preparado y empezar en cualquier momento el proceso
de simplificación.
86
Mientras se ingresa las salidas de la función se puede regresar a cambiar
cualquier dato errado o fallante, el cambio o corrección también se puede hacer
en el indicador de mintérminos.
Las combinaciones se ponen automáticamente de acuerdo al número de
entradas de tal forma que una función de n entradas tendrá 2n combinaciones. En
la figura 3.9 se indica una función con 4 entradas que contiene 16 combinaciones.
Número de entradas A
Indicador\s
-x/Tabla deV Combinaciones^
Fig. 3.9: Tabla de una función con 4 entradas
Cuando se ingresa los datos por medio de la tabla se debe también
analizar si el dato ingresado es O o 1 caso contrario se debe volver a pedir el
ingreso del dato correspondiente, también estos datos ingresados en la salida de
la función se almacena en un vector r(i), que es el que tienen los datos de salida
de la función. Basándose en el valor del r(i) se actualiza el indicador de
mintérminos.
87
(jngresoj
Nuevo ~z_
Ingresar Mintérminos
Ver indicador de Mintérminos
Calcular nActualizar r(i)
Actualizar Tabla
<Space>
<Otro>
<Enter>
Calcular nActualizar r(i)
Actualizar Tabla
Ingresar Tabla* ~
Ingresare!número deentradas
IndicarCombinación
/ Ingresar la // función /
No
r(i)=fActualizar mintérminos
Habilitar botón SiguienteHabiliotar Menú Guardar
C Fin )
Fig. 3.10: Diagrama de flujo para el ingreso de los datos.
88
Cuando se ingresa los datos por medio de la ecuación o mintérminos en
cambio la posición r(i) se escribe un 1 basándose en el mintérmino ingresado y en
las posiciones r(i) que no tiene dato alguno se pone el 0. Inmediatamente y
basándose en el mintérmino más alto ingresado se calcula el valor de n, y
finalmente se actualiza la tabla de combinaciones.
Cuando se presiona la tecla <Enter> quiere decir que ya se han ingresado
todos los mintérminos correspondientes a esta función entonces habrá que
completar la tabla de combinaciones y dejar listo para empezar el primer paso de
la simplificación.
En la figura 3.10 se indica el diagrama de flujo para el ingreso de los datos
ya sea directamente en la tabla o como un mintérmino.
33.2. FORMACIÓN DE CUBOS.
La formación de los cubos O, cubos 1, cubos 2, etc... depende del número
de entradas. Para poder realizar la formación de cubos se utiliza una matriz de
cubos c(i, j) que está definida como una matriz de orden 2047 x 16 debido a que
el programa se hará de hasta 10 variables y para seguridad por el número de
combinaciones en cada uno de los cubos se define de 2047. la primera columna
de la matriz contiene los cubos O, la segunda columna tiene el cubo 1, la tercera
columna tiene los cubos 2, y así sucesivamente, los datos de cada una de los
cubos de simplificación se indican en dos objetos llamados ListBox. Para llevara
el control de que cubos han sido calculados se utiliza una variable llamada (coi),
para tener control de cuantos elementos existen en cada columna de la matriz se
utiliza un vector fil(¡) en el que se almacena el número de elementos en cada una
de las filas. También se debe almacenar los mintérminos, y combinaciones de
mintérminos utilizados para construir los respectivos cubos, este almacenamiento
se hace en otra matriz O(i, j).
Los cubos se forman únicamente con las combinaciones que tienen como
salida un 1, se ordena estas combinaciones de acuerdo al número de 1s que tiene
cada combinación.
Finalmente eí resultado se muestra en un ListBox. Si ya fueron calculados
fos cubos O únicamente se muestran sin necesidad de volver a calcularlos. En la
fig. 3.11 se muestra una tabla de cubos ceros para la función anterior.
rnrri[ilifu:.i<Mnn
Número de entradas 4
MINTERMINOS0001001 10 1 0 10 1 1 11 0011 0 1 11 1 0 11 1 1 1
CUBOS O0001
001 10 1 0 11 001
0 1 1 11 0 1 11 1 0 1
1 1 1 1
Fig. 3.11: Tabla de Cubos ceros para una función de 4 entradas
Los cubos O se almacenan en la primera columna de la matriz c(i, j) los
demás cubos se almacenaran en las demás columnas de la misma matriz. En las
figura 3.12 y 3.13 se indica el diagrama de flujo para la obtención de los cubos 0.
Una vez calculado los cubos ceros se debe calcular los cubos 1, cubos 2, hasta
cuando ya no haya mas combinaciones que se asocien las combinaciones que se
han asociado forman parte de los cubos n y las combinaciones que no se ha
combinado con otras para formar parte de los cubos de orden superior formaran
parte de los implicantes primos, para esto se señala la combinación asociada
ubicando unas marcas en la misma posición de la matriz c(i, j) en otra matriz
90
llamada marca(í, j), basándose en esta matriz se encontraran los implicantes
primos. En las figuras 3.14, 3.15 y 3.16 se indica el diagrama de flujo para obtener
los cubos n de una función booleana. En la figura 3.17 se indica las tablas de
cubos 1 y cubos 2 para una función booleana de 5 entradas.
Ocultar la Tabla de combinacionescol=col"M
No fila=fila+1c(fila,0)=i
Fig. 3.12; Diagrama de Flujo para la obtención de los cubos 0.
91
Mn
i—
3
u *
r
•* -"~*"'r7ÍV-T "1""fc- »^
Sit
cont=0 |
^pos=1
*
No
Bit=Val(Mid(
i i. - fíií-T
sJ
fíi\ 1\Hv» P05» ';/ •
1^>— -""""¡ pos=pos+1
> J L
I cont=cont+1 I
if
Si
J* No -r-*^*rnnf~iTi *^^-^ i:
1 iSi
raya = raya + 1fila * fila + 1
c(fila, col) = f(i)O(fila, col) = Str(i)
*--— -"""^T?* n^ i""?" — **-• Nn
+1t
j=j+1^
Si^- — — nrr" - M~
4)
i
SiY
fil(col)=fila
*Mostra cubos 0Habilitar Comandos
Actuiiza MaxCol y Max
*O7 F in_^>
Fig. 3.13: Continuación del diagrama de flujo para la obtención de los cubos 0.
92
cont=cont+1spos=j
cpos = pos
Fig. 3.14: Diagrama de flujo de obtención de los cubos n
93
fila = fila + 1c(fila, col + 1) = c(i, col)
Marca(i, col) = "*"Marcaü, col) = "*"
Mid(c(fila, col + 1), cpos) = "X"cont2 = O
k=1
c(fila, col + 1) = c(k, col+
O(fila,colO(i, col) & " " & Oíspos, col)
Fig. 3.15: Continuación del diagrama de flujo de obtención de los cubos n
94
fil(col + 1) = fila
Actualizar MaxColCubos, MaxCol, Maxcol=col+1
ultima = Truefíl(col) = auxiliar
Mostrar los cubos no los implicantes primos
©
fila = O Or col = Aux
Fig. 3.16: Continuación del diagrama de flujo de obtención de los cubos n
95
Simplificación
1(1235910111819202123252627)
CUBOS 1
Número de entradas 6
000X100X010X0010001X0X01 OX001O
0X01 1X001 1X01 0101 0X1XI 00101 01 XXI 01 O1 001 X1X010
CUBOS 20 X 0 X 1O X 0 1 XX 0 0 1 XX X 0 1 O
X X 0 1 1X1 0X1XI 0 1 X1 X01 X
Fig. 3.17: Tabla de cubos 1 y cubos 2 para una función de 5 entradas.
3.3.3. TABLA DE IMPLICANTES PRIMOS
Para hallar los implicantes primos se debe tomar todas las combinaciones
de cada uno de los cubos n que no se combinaron para formar cubos de orden
superior. Para lo cual leemos en la matriz marcafi, j) las posiciones en las que no
existe la marca "*" dentro de esta matriz corresponden a los implicantes primos.
Como se puede ver en el diagrama de flujo de la figura 3.18, únicamente si
los implicantes primos no han sido hallados antes aux1<>col se hace el cálculo de
los implicantes primos caso contrario se muestra directamente.
En ai figura 3.19 se indica una tabla de implicantes primos de una función
de 5 entradas.
96
No No
fila = fila + 1O(fila, col) = O(i( j)c(fila, col) = c(i, j)
Marca(fila, col) =""
fil(col) = fila
i'Mostrar Implicantes Primos
Actualizar MaxCofActualizar Max
Implicantes =True
d-J rFin^>
Fig. 3.18: Diagrama de flujo para la obtención de los implicantes primos.
funcionSb boo
(12359101118192021232526271:3 Número de entradas b
IMPLICANTES PRIMOS00X01X01 011 01 OX1 0X1 11 01X10X0X1XI 0X1XX01 X
Fig. 3.19. Tabla de implicantes primos para una función de 5 entradas.
3.3.4. TABLA DE SIMPLIFICACIÓN DE LOS IMPLICANTES PRIMOS.
La tabla de simplificación de implicantes primos es una tabla que se
construye en base de todos los implicantes primos y los mintérminos, poniendo
una marca en cada casillero que pertenece al mintérmino y al implicante primo en
el que está contenido; para construir esta tabla de simplificación se ubica en la
primera columna a todos los implicantes primos, y todos los mintérminos
ordenado en la primera fila y en cada celda que corresponde al implicante primo
con sus respectivos mintérminos se ubica una marca.
Los mintérminos se encuentran en forma desordenada dentro de la matriz
O(i, j) pero en la tabla se debe poner en forma ordenada ascendentemente para lo
cual la primera columna de la matriz O(i, j) la pasamos a un vector s(i) para poder
ordenarlo.
En la figura 3.20 se indica una tabla de simplificación para una función de 5
entradas.
98
235310111819202123252627 Numero de entradas 5
TABLA DE SIMPLIFICACIÓN
0 o s o iX 0 1 0 11 O 1 O X
Para poder construir esta tabla de simplificación primero se debe construir
una matriz tabla(i, j) en la que se guardan las marcas en la misma posición que se
ubica dentro de la tabla.
La matriz tabla(i, j) tiene el mismo número de filas que el número de
implicantes primos, y el mismo número de columnas que el número de
mintérminos o del vector S(i, j).
Cada elemento de la última columna de la matriz O(i, j) se compara con
cada uno de los elementos del vector S(i) y en el caso de que coincidan quiere
decir que el mintérmíno correspondiente contiene al elemento S(i) entonces se
pondrá una marca en esa posición de ía tabla.
Luego comparamos cada elemento del vector s(i) con cada uno de los
elementos de la matriz Q(i, j) para ver cual mintérmino coincide con los elementos
del vector.
Como se puede observar en el diagrama de flujo si la tabla ya ha sido
calculada lo único que se hace es indicarla, sin necesidad de volver a calcularla.
En las figuras 3.21, 3.22 y 3.23 se indica el diagrama de flujo para construir la
tabla de simplificación.
99
aux = s(i)
s(i) = aux
Fig. 3.21: Diagrama de flujo para la construcción de la tabla de simplificación.
100
subíndice = Mid(O(i, col), p1,
1 f
P2-P1)
No
al(subindice) = Val(s(j))
O-
Fig. 3.22. Continuación del diagrama de flujo para la construcción de la tabla de
simplificación.
101
3ps = Len(O(i, col)]
TSi
subíndice = Mid(O(i, col), p1, p2 - p1 + 1)
Dibujar TablaTablalmplicantes = True
marcas = True
al(subtndice) = Val(s
Fig. 3.23. Continuación del diagrama de flujo para la construcción de la tabla de
simplificación.
102
33.5. SIMPLIFICACIÓN DE LA TABLA DE IMPLICANTES PRIMOS
La simplificación de la tabla de implicantes primos consta de dos partes la
primera parte corresponde a encontrar los implicantes primos esenciales.
xxoix1 0 1 0 XX1 0X1
Fig. 3.24: Tabla de los implicantes primos esenciales y la tabla de
implicantes primos secundarios.
La segunda parte corresponde a encontrar los implicantes primos
secundarios si existen ya que es posible que no estén cubiertas todas las
columnas.
En la figura 3.24 se indica una tabla de implicantes primos esenciales y
secundarios para una función de 5 entradas.
Para encontrar los implicantes primos esenciales seguimos el siguiente
criterio.
Buscamos la primera columna que tiene una sola marca y lo
marcamos como anulada, para esto se crea un vector
ColumnaAnulada(i) en el que se almacenará los valores True o
False según sea la columna anulada o no.
El implicante primo que está en la fila de la marca encontrada se
toma como implicante primo esencial y forma parte ya de la solución
y le ponemos una marca como fila anulada, esto se hace utilizando
un vector FHaAnulada(i) en el que se almacena un True o un False.
103
iii) Todas las columnas que tienen marca en dicha fila se lo marca
como anulada usando el vector ColumnaAnulada(i).
«C^Esenciales__
contvmax = Oi=1
ablaíi, i) = T
contv(i)=contv
contvmax < contvTSi
contvmax = contv(i)
contv(i) = 1 andlumnaAnulada(i) = Fals
ColumnaAnuladfa(i)=True1=1
Fig. 3.25: Diagrama de flujo para hallar los implicantes primos esenciales.
104
No
abiafj, i) = "*" And filaAnuladaíi) = False
filaAnulada(j) = TruenumeroFila(i) = j
fila = fila + 1c(fila, col + 1) = c(j, col)
¡2 = 1
Tabla(j, Í2) = "*"olumnaAnulada(¡2)
columnaAnulada(¡2)True numeroFiia(i2)
fs ocok
True
fe~*
Poner las marcasfil(col+1)=fila
Actualizar MaxCoíActualizar Max
MostrarEsencialesesenciales=True
Fig. 3.26: Continuación del diagrama de flujo para obtener los implicantes primos
esenciales.
105
iv) Se repite este proceso en todas las columnas que tienen una sola
marca y no está anulada.
En las figuras 3.25 y 3.26 se indican el diagrama de flujo para encontrar los
implicantes primos esenciales.
Para calcular ios implicantes primos secundarios, se debe hallar los que
tengan el mayor costo con el objetivo de simplificar al máximo.
i) En cada fila se cuenta cuantas marcas tiene dentro de las columnas
no anuladas, para esto se crea un vector ContH(i) en el que se
almacena el número de marcas que tiene cada fita en tas columnas
no anuladas.
ii) Empezando por la fila que tiene el mayor número de marcas y se
toma ese implicante primo como secundario y formará parte de la
solución y se anula la fila para lo cual utilizamos el vector
FilaAnulada(i).
iii) Se eliminan todas las columnas que tienen marca en el implicante
primo tomado en el numeral anterior.
iv) Repetimos este proceso hasta que todas las columnas estén
anuladas.
Tanto los implicantes primos primarios y secundarios se almacenan en la
matriz c(i, j)f en las posiciones c(col+1, j) y c(col+2, j) respectivamente, para
tomarlas luego de esas columnas para hallar la solución.
En las figuras 3.27 y 3.28 se indica el diagrama de flujo para la
obtención de los implicantes primos secundarios.
106
marcasmax=0
contH(i)=0
filaAnulada(i):
lumnaAnulada(j)
conth(i) = conth(i) + 1
marcasmax < conthfi
marcasmaxconth(i)
Si
Fig. 3.27: Diagrama de flujo par obtener los implicantes primos
secundarios.
107
conthQ) = marcasmaxAnd filaAnulada(j) = False
nd marcasmax > O
sihay=False¡2 = 1
TablaG, ¡2) = "*"lumnaAnulada(¡2)
columnaAnulada(i2) = TruenumeroFíla(¡2) =j
sihay = True
filaAnulada(j) = Truefila = fila + 1
c(fila, col + 2) = c(j, col)
MostrarMarcasfil(col + 2) = fila
Actualizar MaxColActualizar Max
MostrarSecundarios
Fig. 3.28: Continuación del diagrama de flujo para obtener los
implicantes primos secundarios.
108
33.6. ECUACIÓN BOOLEANA SIMPLIFICADA
La ecuación booleana simplificada se calcula basándose en los implicantes
primos esenciales y basándose en los implicantes primos secundarios, de la
siguiente manera.
La ecuación booleana simplificada es una suma de productos.
Cada uno de los productos se forman de los implicantes primos obtenidos
tomando en cuenta que las variables que están con un 1 se toman las variables
directamente; la variable que está con un O se toma la variable complementada;
mientras que las variables que están con una X no se les toma en cuenta.
El resultado lo ponemos en un TextBox.
Como se puede ver primero analiza los implicantes primos esenciales
luego los implicantes primos secundarios.
En las figuras 3.29 y 3.30 se indican los diagramas de flujo para obtener la
solución de la ecuación booleana.
109
disolución1'
Text6="Y="i=1
'Text6=Text6+VariableComplementada
XxText6=Text6+Variable
Fig. 3.29: Diagrama de flujo para obtener la solución.
LIO
Text6=Text6+VariableComplementada
Text6=Text6+variable
-^Mostrar Solución ^
Fig. 3.30: Continuación del diagrama de flujo para la obtención de la
solución
111
3.4 RESULTADOS OBTENIDOS.
Para probar los resultados del programa diseñado se hizo con varias funciones
existentes en el libro de Hill and Peterson y se obtuvo los siguientes resultados.
La función de 4 entradas: f(A, B, C, D)=Zm(0, 2, 3, 6, 7, 8, 9, 10, 13).
'ínter minos 102367891013)
Fig. 3.31: Editor de mintérminos
Una vez ingresada la ecuación dentro del indicador de mintérminos
automáticamente se construye la tabla de combinaciones y se calcula el valor de
n correspondiente.
14
1000(1"
¡1001 [í"
Fig. 3.32: Tabla de combinaciones de la función ingresada como mintérminos.
Como se puede comprobar la tabla de combinaciones esta de acuerdo con
los mintérminos ingresados sin ningún error el tiempo de calculo fue de menos de
un segundo.
112
A continuación presionamos el comando para calcular el cubo O y
obtuvimos el siguiente resultado.
02367891013
0000001 0001 10 1 1 00 1 1 11 0001 0011 0 1 01 1 0 1
0 0 0 0
0 0 1 O1 000
0 0 1 101 1 O1 0011 0 1 0
0 1 1 11 1 0 1
Fig. 3.33: Tabla de cubos 0.
El tiempo de demora fue mucho menos que un segundo, efectivamente los
mintérminos están ordenados de acuerdo al número de unos que tiene cada
combinación. Y únicamente coge como cubos O a las combinaciones que tienen
como salida un 1.
Todos los cálculos hechos en el programa concuerdan con los cálculos
realizados a mano.
A continuación calcularemos los cubos 1 obteniendo el resultado que se
indica en la figura 3.34.
Los cubos 1 son las combinaciones resultantes de combinar dos cubos O
como se puede ver en la parte inferior de la tabla de cubos 1, el cubo 1 10X0
viene de combinar el m8 y el m10.
El tiempo de cálculo de los cubos 1 fue de aproximadamente 1 seg., lo cual
hace que sea bastante rápido.
113
* 0000
"0010* 1 000
" 0 0 1 1" 0 1 1 0* 1 001" 1 0 1 0
00X0xooo
001 X0X1 OX01 O1 OOX
* 01 1 1* 1 1 01
0X1 101 1 X1X01
Fig. 3.34: Cubos 1 de una función de 4 variables de entrada.
A continuación calculamos los cubos 2.
CUBOS 2* 00X0" XOOO
0X1 X1(0, 2. 8.
* 001 X* 0X1 O* X01 O
* 1 0X0
* 0X1 1* 01 1 X
1 X01
Fig. 3.35: Tabla de cubos 2 para la función de 4 variables de entrada.
Combinando los cubos 1 se calcula los cubos 2 por ejemplo el cubo 2
XOXO se formo combinando los cubos 1 (0,2) y (8, 10) mientras que los cubos 1
que no se combinaron para formar cubos 2 como es el caso de los cubos 1 (8, 9)
y los cubos 1 (9, 13), pasarán a formar parte de los implicantes primos.
114
Las combinaciones del cubo 1 que se combinaron para formar cubos 2 se
marcan con una "*" como se puede ver en la tabla de la parte izquierda, mientras
que los cubos 1 que no se combinaron no se marcan.
En la figura 3.36 se indican, los cubos 3 si es que existiera pero en este
caso ya no existen cubos de mayor orden es decir el siguiente paso será calcular
los implicantes primos.
GMBOS2 IMPLICANTES PRÍMOSx o x o
0 X 1 X
1 0 0 X1 X 0 1x o x o
11,2,3.6,7)1
Fig. 3.36: Tabla de implicantes primos
Los implicantes primos son los cubos anteriores que no se combinaron
para formar cubos de orden superior como se puede ver en el gráfico el cubo 2
0X1X forma parte también de los implicantes primos.
Una vez calculado los implicantes primos se procede a optimizarlos
utilizando una tabla de simplificación de los implicantes primos.
1 0 0 X1 X 0 1x o x o0 X 1 X
o
*
2
*
*
3
*
6
*
7
*
6*
*
9*
*
10
*
13
*
Fig. 3.37:Tabla de Simplificación de los implicantes primos.
En la Figura 3.37 podemos ver que el implicante primo 100X contiene a los
mintérminos m8 y m9 mientras que el implicante primo 0X1X contiene a los
mintérminos m2, m3, m6, m7. Es decir esta tabla se forma con los implicantes
primos y los mintérminos involucrados en estos implicantes primos.
115
El cálculo de los implicantes primos esenciales se los hace tomando los
implicantes primos que coinciden con las columnas que tienen una sola marca.
Todas las columnas que tienen marcas en la misma fila del implicante
primo encontrado se eliminan poniendo una marca en la parte inferior de las
columnas.
TABLA DE SIMPLIFICACIÓN
1 0 0 X
c
(•\s>
2
fk ¡i)
3
— j
3
É -
,
e
(•\»>
9i
jiitjT
!
i
/•\>i>
i3
xoxoox ix ;1X01 ;
Fig. 3.38: Tabla de los implicantes primos esenciales.
Como todas las columnas de la tabla están señaladas como anuladas no
existe implicantes primos secundarios y únicamente existen implicantes primos
esenciales.
El siguiente paso será entonces calcular la solución basándose en estos
implicantes.
Fig. 3.39: Solución simplificada de la función de 4 entradas
La solución obtenida es una solución de compuesta por una suma de tres
términos, es igual que la calculada manualmente.
A continuación se realiza una pruebe con una función de 5 entradas o
variables.
116
La función a probarse es:
f(A, B, C, D, E) = Z(0, 6, 8, 10, 12, 14, 17, 19, 20, 22, 25, 27, 28, 30)
En este caso haremos el ingreso de los datos directamente en la tabla de
combinaciones de 5 entradas, para este caso utilizamos el menú, como se indica
en la figura 3.40.
• f Quine McCIuskey Simplificación
Fig. 3.40: Comando para una función de 5 entradas.
Una vez ejecutada este comando aparece la siguiente ventana en la que
ingresaremos las salidas para cada una de las combinaciones.
Mint éi minos |(Q6810121417 192022 25 27 28 30)31
| O Q Q Q Q [ Í | I O O O O [ O '00001 [0
0 0 0 1 0 J O00011 ¡0
¡001 00|0
10001 |11 0 G 1 Q J O1001 1 ¡11 0100J1
I O Q I O I [5*11 0101 [ÍT|ooi iofT| i 011 op"|001 11 [O |101 1 1 [Oj___^p__j_.
O I Q O I
oioi ijo"
11001 fT11 oí ofo"11011 pT
ioofT|n ioo fT
|om i fo Jn 111 |T
Fig. 3.41: Tabla de combinaciones.
117
Cuando se ingresa la tabla automáticamente se actualizan los mintérminos
cuando se termina de ingresar todas las salidas se habilita el comando de
siguiente para proceder a la simplificación.
CUBOS O" 0 0 0 0 0
* 0 1 0 0 0
" 0 0 1 1 0" 0 1 0 1 0" 0 1 1 0 0* 1 0 0 0 1" 1 0 1 0 0
" 0 1 1 1 0" 1 0 0 1 1" 1 0 1 1 0" 1 1 0 0 1
0X000
01 0X001 XOO
0X1 1 OX01 1 O01X1001 1X0X1 1 001 00X11 X0011 01X01 X1 00
Fig. 3.42: Primera página de los Cubos O y cubos 1 de una función de 5 entradas.
En este caso como el número de cubos 1 es mayor que 16 mostramos por
paginas verticales de 16 en 16 para lo cual se muestra un comando para poder
ver las siguientes páginas con los otros cubos 1.
" 1 1 0 1 1" 1 1 1 1 0
1 X 0 1 11 X 1 1 01 1 0X11 1 1 XO
Fig. 3.43: Segunda página de los cubos O y de los cubos 1.
Cuando se indica la siguiente pagina aparece otro comando para mostrar la
pagina anterior.
118
01 XXO
XX1 1 OX1 1 XO1 XOX11X1 XO
0X00001 XXOXX1 1 OX1 1X01 XOX11 XI XO
Fig. 3.44: Cubos 2 e Implicantes primos.
TABLA DE SIMPLIFICACIÓN
*
1
•
_ „ _ — __
X 1 1 X 0
1 X O X 1
1 X 1 X Q-
0f\
6
f{ -\
8c{
s>
10
,¿4 •'
12
-;
-. -4
l'l
/,\
17
•
19
* ,-
*
2O
íl !?
22
•<
^
>,J
25
>!
'
27
'
-
Fig. 3.45: Primera página horizontal de la tabla de simplificación
*
ÉSCE
A U U Lr
1 A A Lr
X 1 1 X 0A U A 1
A 1 A U^
ENCiALES
2
/•\l!>.'
3 0
>i>
0X000XX1 1 O01XXO1X0X11X1X0
Fig. 3.46: Segunda página horizontal de la tabla de simplificación e implicantes
primos esenciales.
Y^AWE'+CDE'+A'SE'+AC'E+ACE'
Fig. 3.47: Solución simplificada de la función de 5 entradas
119
En esta función también únicamente existe implicantes primos esenciales y
la función obtenida es igual a la obtenida manualmente.
A continuación se prueba con otra función también de 5 entradas.
f(A, B, C, D, E) = Zm(1, 2, 3, 5, 9, 10, 11, 18, 19, 20, 21, 23, 25, 26, 27).
Esta función fue guardada anteriormente en el disco para lo cual tenemos
que abrirlo utilizando el menú como se indica a continuación el siguiente gráfico.
• Quine McCtuskey: Simplificación
Función TutoMi Teoría
Fig. 3.48: Ejecución del comando para abrir un archivo guardado en el disco
Ejecutando este comando aparece la siguiente ventana en la que se
selecciona el archivo deseado.
[MASTER
I ConsultasQj Piimef Texto presentadoC3 TEXTO
JfuncionSb boo
tunctónICb.boofunctón2.boofunción3.booIunctón3b.booIuncion4booIuncion4b.booluncionSboo
L ^J im \. 3.49: Ventana para seleccionar el archivo a abrir.
120
Este comando abre la función, construye la tabla de combinaciones,
actualiza los mintérminos y actualiza el número de entradas quedando listo para
proceder a la simplificación.
En la figura 3.50 y figura 3.51 se indica el proceso de obtención de
implicantes primos.
|oooon|o|OOOQl[T'f Í '
|OOQ1o[l"p'
ioooiif i~p'ÓF"F
|ooi loprpfooTTTfoT"
001 00
00101
O O Q O [ 0
0001 [oo o i o p r0011 fTo i o o p r0101 |T011 o|ooTTTfT1000(0'1001 [T1010(1"1011 [T
|01QQO|o'p
|0100lfTp
|oioio[Tp[oToTTfrp101100(5" p|0110l(?p
|0111Q[cTp
lonnJíTp
Fig. 3.50: Función abierta
En la figura 3.51 se indica todo el procedimiento para obtener los
respectivos Cubos O, Cubos 1, Cubos 2, cubos 3 y los implicantes primos
correspondientes a esta función que estamos utilizando como ejemplo.
121
CUBOS O
* 0 0 0 1 O
000110010101001010101001010100
0 1 0 1 11 0 0 1 11 0 1 0 11 1 0011 1 0 1 0
CUBQS10 0 0 X 10 0 X 0 10 X 0 0 10 0 0 1 X0X01 OX 0 0 1 O
CUBOS20 X 0 X 1O X O 1 XX O O 1 XX X 0 1 O
CUBOS 3| XX 01 X
X X 0 1 1XI 0X1X 1 O 1 X1 X O 1 X
IMPUONTES PRfWOS
1 0 1 1 11 1 0 1 1
0 0 X 0 1X01 011 01 OX1 0X1 11 0 1 X 10 X 0 X 1XI 0X1X X 0 1 X1 01 OX
XI 01 11 0X1 11 X01 11 0 1 X 11 1 0X11 1 01 X
Fig. 3.51: Proceso de obtención de los implicantes primos.
En las figuras 3.52 y 3.53 presentaremos la tabla de simplificación de los
implicantes primos, los implicantes primos esenciales, los implicantes primos
secundarios y la función simplificada.
*
X 0 1 0 1
1 0 1 X 10 X 0 X 1
X 1 0 X 1_ _ _ _ _ H __
]f\
:-•'-
*
T/s
•
.81Ae
1
DE
>1>
;S.M9
ir
=
Pi1
..-H
IFD
. ,1
G¿i
•
idi
F
0»113
-.>
19 2
f-\\
2
'f\\
2
/•\>,>
M|
Fig. 3.52: Primera página de la tabla de simplificación.
En el sentido horizontal no alcanzan todos mintérminos por esta razón hace
falta otra página horizontal para poder mostrar todos los mintérminos.
122
*
*
•
U X U JT^
X 0 1 0 1U 1 U Jt~
U A 1 1~
1 0 1 X 1
0 X 0 X 1
X 1 0 X 1
X X 0 1 X-
25
:•
26
':yI
27
,;
'ESCENeíALESSeCUNDARiOSXX01X1 01ÜXXI 0X1
00X0110X1 1
Fig. 3.53: Segunda pagina de la tabla de simplificación e implicantes primos
En este gráfico se puede comprobar que fa función tiene 3 implicantes
primos esenciales y dos implicantes primos secundarios.
La primera fila de la tabla de simplificación contiene a todos los
mintérminos, mientras que la primera columna contiene a los implicantes primos.
También se observa que a la izquierda de los implicantes primos están las marcas
de los implicantes primos que son tomados en cuenta como esenciales o
secundarios.
Fig. 3.54: Solución simplificada de la función abierta
La solución contiene los tres primeros términos que provienen de los
implicantes primos esenciales y los dos últimos términos que salen de los
implicantes primos secundarios.
Función de 6 entradas:
f(A, B, C, D, E, F) =Zm(1, 2, 3, 4, 5, 8, 9, 10, 17, 20, 21, 24, 25, 27, 32, 33, 34, 36,
37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 56, 59, 62)
123
( oooooo (irI o 10000(0 | looooo fTjoooooT 010001|1 f l O O C i G I [T
11 0000(1
11 0001(0
( Q O Q Q 1 Q
I Q O O O I I [ i " lo iooi i (o( ioocni [o [110011 [o*000100
(000101 1 (010101
(0001 1Q,|ÍT|01 011 O
I O O Q I I I |cT|oioTiio ( ioono|o'|noiio0 (100111 lo"! 110111'
J001001 [v [oí 1001(1 (101 d o ií"l 101000 (fl 111_000|1
To.1 J11101 o|o
10011 oo|o j011100(011011 oo[i~|i 11100(0001101 foO 01110 Jo"
011101
011110 101110(1"1111 01 (O111110(1
001111 [Oj011 111JO J101 1 11 ff (1 11 11 1 (0
Fig. 3.55: Tabla de combinaciones de una función de 6 entradas.
CUBOS o CUBOS0* oooooi* 00001 O* 000100* 001000* 100000
* 00001 1* 000101* 001001* 00101 O* 010001"010100* 01 1000* 100001* 10001 O* 100100
* 101000* 1 10000
" 0 1 0 1 0 1" 0 1 1 0 0 1" 1 0 0 1 0 1" 101001" 1 0 1 0 1 0" 1 0 1 1 0 0* 1 1 1000
" 0 1 1 0 1 1" 1 0 1 0 1 1" 1 0 1 1 0 1" 1 0 1 1 1 0
" 1 0 1 1 1 1" 1 1 1 0 1 1" 1 1 1 1 1 0
Fig. 3.56: Tabla de cubos 0.
124
CUBOS 10000X1000X0100X0010X0001X O O O O I00001X00X01 OX0001O0001OX0X0100X00100001OOX0010X00X1000X010001 O O O O X
CUBOS 11000X0100X0010X0001XOOOO
0X0101X001010X1001X01001X0101 O010X0101X0010101OX011OOXX11000100X01
CUBOS 11 0 X 0 0 11 0 X 0 1 O1 O O 1 O X1 O X 1 O O1 0 1 O O X1 0 1 0 X 01 0 1 X 0 01 X 1 0 0 01 • x o o o
01 1 0 X 11 0 X 1 0 11 0 1 0 X 1
0 1 X 0 11 0 1 0 1 X1 0 1 X 1 0
1 01 1 O X1 0 1 1 X 0
XI 101 11 0 1 X 1 11 X 1 0 1 11 0 1 1 X 11 0 1 1 1 X1 X 1 1 1 0
Fig. 3.57: Tabla de cubos 1,
CUBOS 2 CUBOS 30 X 0 X 0 1X O O X 0 1O X X 0 0 1X O X 0 0 1X O X 0 1 O0 X 0 1 O XX Q 0 1 O X0 X 1 O O XX 0 1 O O XX 0 1 0 X 0X X 1 0 0 0
* 1OOXOX* 1OXOOX10X0X0
* 1OXXOO1XXOOO
"1OXX01* 1 0X1 OX* 1 01OXX* 101XOX" 1 0 1 XXO
* 1 01XX1* 1 01XIX* 1 01 1 XX
1 O X X O X
1 01 XXX
Fig. 3.58: Tabla de cubos 2 y de cubos 3.
125
IMPLICANTES PRIMOS IMPLICANTES PRIMOS0 0 0 0 X 10 0 0 0 1 X0 1 1 0 X 1X 1 1 0 1 11 X 1 0 1 11 X 1 1 1 00 X 0 X 0 1X O O X 0 1O X X 0 0 1X O X 0 0 1X O X 0 1 O0 X 0 1 O XX 0 0 1 O X0 X 1 O O XX 0 1 O O XX 0 1 0 X 0
Fig. 3.59: Tabla de implicantes primos.
X X 1 0 0 01 0 X 0 X 01 X X O O O1 O X X O X1 01 XXX
TABLA DE SIMPLIFICACIÓN
*
*
,.—.,,
0 0 0 0 1 X0 1 1 0 X 1
1 X 1 0 1 1
0 X 0 X O 1X 0 0 X O 1
X 0 X 0 0 1_ _ _ _ _ _ _ _
X 0 0 1 0 X_ -- - n 1-1 VU X 1 U O X
X 0 1 0 0 XX 0 1 0 X 0
]
(\f
2
;
'
3f\1)
4
f\
G
f\
e c
(• \
D 1
(1
7
1
2 D
1)
2
{•\
>,t
_JidFig. 3.60: Primera página Horizontal y Primera página Vertical de la tabla de
simplificación
126
TABLA DE SIMPLIRCACION
-
X X 1 0 0 O
1 0 X 0 X 01 X X 0 0 0
1 2
t
i
3 4 5 8*
¡
1
9 10 17 20 21
^ •'1
Fig. 3.61: Primera Página Horizontal y Segunda Vertical de la tabla de
Simplificación.
TABLA DE SIMPLIFICACIÓN
»
•
•
•
*
0 O 0 0 1 X0 1 1 0 X 1
1 X 1 0 1 1
0 X 0 X 0 1X 0 0 X 0 1
X 0 X 0 0 1X 0 X 0 1 0-
X 0 0 1 0 X
X 0 1 0 O X
X 0 1 0 X 0
241
i
1
- -tí*..^
r~
25
(y. •>>
27
c-\¡ \
32 33 34
|(
36 37 40 41 42
.
pcsr^crur-iAi t=c QPi^iiunADiric
Fig. 3.62: Segunda Página Horizontal y primera página Vertical de la tabla de
simplificación.
TABLA DE SIMPLIFICACIÓN
•
X X 1 0 0 0
1 0 X 0 X 01 X X 0 0 0
„
24
f!
i
i
i:
1
25 27 32
--
ir
33
f^
34
if
36
{• \7 f \0
•
41
1
42
^^^^ j^^B^S
Fig. 3.63: Segunda página Horizontal y segunda página vertical de la tabla de
simplificación.
127
*
*
•
•
**
U U U A 1
0 0 0 0 1 X0 1 1 0 X 1
1 1 U 1 1
1 X 1 0 1 1
A l l í Lr^
0 X 0 X 0 1
X 0 0 X 0 1
A X U U 1
X 0 X 0 0 1U A U i Lr^A U 1 U A
X 0 0 1 0 X0 X 1 0 0 X-X 0 1 0 0 XX 0 1 0 X 0
43 44 45 46 47 48 56 59
(\\
62
s\
A * -t-r*
Fig. 3.64: Tercera Horizontal y primera vertical de la tabla de simplificación.
TABLA DE SÍM PURGACIÓN1
*<•
X X 1 0 0 01 0 X 0 X 01 X X 0 0 0
U A A U A
U 1 A A A
43
¿\i}
44
1
ri^
y
45
(.\7
46
(•\V
47
(.\>
48
-
56
-
T;
59 62
ce
Fig. 3.65: Tercera página Horizontal y segunda página vertical de la tabla de
simplificación.
ESCENCIALES SECUNDARIOS0 X 0 1 O X1 0 1 X X X1 X X O O O1 X 1 1 1 0
O X X O Q 10 X 1 O O XX O X 0 1 01 O X X O XX 1 1 0 1 10 0 0 0 X 1
Fig. 3.66: Implicantes primos esenciales y secundarios.
Fig. 3.67: Solución simplificada de la función
128
Función de 7 entradas.
F(A, B, C, D, E, F, G) =Sm (1, 2, 3, 5, 7, 9, 11, 15, 17, 19, 21, 22, 23, 25, 27, 29,
30, 31, 33, 37, 38, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 65, 66, 67, 69, 71,
73, 75, 77, 79, 81, 83, 85, 87, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111,
113, 115, 117, 119, 121, 123, 125, 127).
0000000J 0 0 0 0 0 0 10000010000001 10000100000010100001100000111000100000010D10001010D00101 1
0001 1 0000011010001 1 100001 1 1 1
0
11101010
10
1oo
0 0 1 0 Q O O J O00100010010010001001100101 00001010100101 1000101 11001 1000001 1001001 1010001101 10011100001 1101
0 J001 1110i joomi i
10
10
1110
[T0
o""F"
010000001000D1
0100010010001101 00100010010101001 1001001 11010100001010010101010010101 10101 1000101 1010101 1100101111
o•pPpFirirpir0
r01
0 1 1 0 0 0 0 |0110001 |011001 O J011001 1 |0 1 1 0 1 0 0 ]0110101 |011Ü11QJ01101 1 1 ¡01 1 1 0 0 0 ¡0 1 1 1 0 0 1 J01 1 1 0 1 0 J01110110111 100011 1 101
0 \ 1 1 1 1 1 01 ¡0111 111 j
Fig. 3,68: Tabla de combinaciones.
12357911151719212223252729
0000000000000000
0000000000000000
0000000011111111
0000011100000111
0001100100111001
0110101101011010
1011111111101111
MINTERMINOS MINTERMINOS30313337383941434547495153555759
0 0 1 1 1 1 10 0 1 1 1 101 000001001001 001 1 (0 1 0 0 1 10101000101010101 100 1 0 1 1 101 1 00001 1 0010 1 1 0 1 00 1 1 0 1 10 1 1 1 0 00 1 1 1 0 1
)
)
61656667697173757779818385879193
0111111111111111
1000000000000000
1000000000111111
1000001111000011
1000110011001101
0011010101010110
1101111111111111
Fig. 3.69: Mintérminos.
129
MINTERMINOS959799101103105107109111113115117119121123125
1 0 1 1 1 1 1 Al1 1 0 0 0 0 1 H|1 1 0 0 0 1 11 1 0 0 1 0 11 1 0 0 1 1 11 1 01 0011 1 0 1 0 1 11 1 0 1 1 0 11 1 0 1 1 1 11 1 1 00011 1 1 0 0 1 11 1 1 0 1 0 11 1 1 0 1 1 11 1 1 1 0 0 11 1 1 1 0 1 1 *j .1 1 1 1 1 0 1 IB
127 1 1 1 1 1 1 1
Fig. 3.70: Míntérminos.
A continuación se indica los cubos ceros.
CUBOS O* O O O O O Q 1* 0 0 0 0 0 1 0
* 0 0 0 0 0 11" 0 0 0 0 1 0 1* 0 0 0 1 0 0 1 •* 001 0001 '•'•• - • ;* 0 1 0 0 0 0 1* 1 0 0 0 0 0 1* 1 0 0 0 0 1 0
* 0 0 0 0 1 1 1* 0 0 0 1 0 1 1" 001 0 0 1 1" 001 o í 01 [si* oo 1 o 1 1 o IB
* 001 1 0 0 1 Al* 01 001 01 jQ
0 1 0 0 1 10" 0 1 0 1 0 0 1* 01 1 0 0 0 1* 1 0 0 0 0 1 1* 1 0001 01* 1 o o 1 o n i" 1 01 0 0 0 1* 1 1 0 0 0 0 1
* 0 0 0 1 1 1 1" 0 0 1 0 1 1 1" 0 0 1 1 0 1 1* 0 0 1 1 1 01 m¿* n n 1 1 1 1 n wi
* 01 0 0 1 1 1 Al" 0 1 0 1 0 1 1 JH
0 1 U 1 1 0 1" 0 1 1 0 0 1 1* 01 1 01 01 . -í
" 0 1 1 1 0 0 1" 1 0 0 0 1 1 1" 1 0 0 1 0 1 1" 1 0 0 1 1 0 1" 1 0 1 0 0 1 1
i U 1 U 1 U 1" 1 1 0 0 0 1 1" 1 1 0 0 1 01* 1 1 01 0 0 1" 1 1 1 0 0 0 1 jAé
n-?M
" 0 0 1 1 1 1 1 A]" 0 1 0 1 1 1 1 JH
0 1 1 0 1 1 1" 0 1 1 1 0 1 1 J:* 01 1 1 1 01* 1 0 0 1 1 1 1" 1 0 1 0 1 1 1* 1 o 1 1 n 1 i" 1 0 1 1 1 0 1" 1 1 0 0 1 1 1
1 1 v I U I 1 „ - *
" 1 1 0 1 1 0 1 • •" 1 1 1 0 0 1 1 v -* 1 11 01 01 v.;;,,
" 1 1 1 1 0 0 1 má"3$
" 1 0 1 1 1 1 1" 1 1 0 1 1 1 1" 1 1 1 0 1 1 1" 1 1 1 1 0 1 1" 1 1 1 1 1 0 1
" 1 1 1 1 1 1 1
Fig. 3.71: Cubos O
130
Desde la figura 3.72 hasta la figura 3.74 se indican los cubos unos.CUBOS1 CUBOS 1 CUBOS 1 CUBOS 1
00000X10000X01000X00100X00010X00001X000001000001XX00001 0
0000X1 1000X01 100X001 1X00001 100001X100X0101 *|0X00101 W\J
X000101 Al00010X1 TI00X1 0010X01 001X001 001001 00X1001 0X01001 X001f\v i f\ iUX 1 Ü U 0 1X01 000101 00X0101 0X00101 X0001XI 0000110000x1 jy1000X01 T|
100x001 Al10X0001 T|1X000011 00001 X
000X1 1 100X01 1 10X001 1 1V f\ 1 1A U U U 1 1 1
0001 XI 100X1 01 10X01 01 1X001 01 1001 0X1 1001x01 1 *|0X1 001 1 5]
X01 001 1 Al00101X1 3¡001X1010X1 0101X01 01 01001 01 IX001X110001 1 0X1001 1X010X1 1 00101001X101 0X1 0101 X01 01XI 001 010 1 0 0 1 1 X Jl0101 0X1 'W
0101X0101X1001XI 01 00101 1 00X101 1 0X0101 1 X001XI 1 00011 000X1 11 00X0 1 11 0X001 11 X0001 11 0001 XI1 00X1 011 0X01 011 X001 011 001 0X1
Fig. 3.72: Cubos 1
CUBOS 1 CUBOS 1 CUBOS 1 CUBOS 1 CUBOS 1i 001 xo i Al1 x 0 1 0 0 1 JQ1 01 0 0 X 11 01 0 X 0 11 XI 0 0 0 11 1 0 0 0 X 11 1 0 0 X 0 11 1 0 X 0 0 11 1 X 0 0 0 1
0 0 X 1 1 1 10 X 0 1 1 1 1X 0 0 1 1 1 10 0 1 X 1 1 10 X 1 0 1 1 1 f r )X01 01 1 1 ™
0 0 1 1 x 1 1 Alox i 1 0 1 1 ¥1X 0 1 1 01 10 0 1 1 1X10 X 1 1 1 01X 0 1 1 1 01001 11 1 X01 0 X 1 1 101 X 0 1 1 1XI 001 1 10 1 0 1 X 1 10 1 X 1 0 1 1XI 01 01 10 1 0 1 1 X 10 1 X 1 1 0 1 1 1X 1 0 1 1 0 1 ™
0 1 1 0 X 1 1 A l01 1 X 0 1 1 TjXI 1 0 0 1 10 1 1 0 1 X 10 1 1 X 1 0 1XI 1 01 010 1 1 1 0X101 1 1 X 0 1XI 11 0 0 11 0 0 X 1 1 11 0 X 0 1 1 11 X 0 0 1 1 11 0 0 1 X 1 11 0X1 01 11 X 0 1 01 1 jlj1 0 0 1 1 X 1 W\ ox i 1 0 1 Aj
1 X 0 1 1 01 Si1 01 0X1 11 0 1 X 0 1 11 X 1 0 0 1 11 0 1 0 1 X 11 0 1 X 1 0 11 X 1 0 1 0 11 1 00X1 11 1 0 X 0 1 11 1 X 0 0 1 11 1 0 0 1 X 11 1 0 X 1 011 1 X 0 1 011 1 0 1 ox i jrj1 1 0 1 x 0 1 W\1
1 1 1 0 0 X 11 1 1 0 X 0 11 1 1 X 0 0 1
X 0 1 1 1 1 1XI 01 1 1 1XI 1 01 1 1X1 1 1 01 1XI 1 1 1 011 0X1 1 1 11 X 0 1 1 1 11 0 1 X 1 1 11 X 1 0 1 1 11 0 1 1 X 1 11 X 1 1 0 1 1
Fig. 3.73: Cubos 1
131
CUBOS 1 CUBOS 1l o n i x i Al1 X 1 1 1 0 1 j]1 1 0X1 1 11 1X01 1 11 1 0 1 X 1 11 1 X 1 0 1 11 1 0 1 1 X 11 1 X 1 1 0 11 1 1 0X1 11 1 1 X 0 1 11 1 1 0 1 X 11 1 1 X 1 0 11 1 1 1 0X11 1 1 1 X 0 1
• 1X1 x 1 1 1 1 1 VI
1 1 X 1 1 1 11 1 1 X 1 1 11 1 1 1 X 1 11 1 1 1 1 X 1
Fig. 3.74: Cubos 1
Desde la figura 3.75 hasta la figura 3.77 se indican los cubos 2.
CUBOS 2 CUBOS 2 CUBOS 2O O O O X X 10 0 0 X 0 X 10 0 X 0 0 X 1X O O O O X 10 0 X 0 X 0 10 X 0 0 X 0 1X O O O X 0 1O O X X 0 0 10 X 0 X 0 0 1X O O X 0 0 1O X X 0 0 0 1X O X 0 0 0 1X X 0 0 0 0 1X 0 0 0 0 1 X
O O O X X 1 1 f f l
0 0 X 0 X 1 1 AlX O O O X 1 1 10O O X X 0 1 1X O O X 0 1 1X O X 0 0 1 10 0 X 0 1 X10 X 0 0 1 XIX 0 0 0 1 XIO X X 0 1 01X O X 0 1 01X X 0 0 1 010 0 X 1 0 X 10 X 0 1 0 X 1X 0 0 1 0X1n y y 1 n n 1 • 1U /\S 1 v \J 1 ^H
X X 0 1 0 0 1 "
o o i o x x i Al0 0 1 X 0 X 1 T\1 0 0 X 1
X 0 1 0 0 X 10 0 1 X X 0 10X1 0 X 0 1X 0 1 0 X 0 10 X 1 X 0 0 1XX1 0 0 0 101 O X X 0 101 X O X 0 1XI 0 0 X 0 10 1 X X O Q 1XI 0 X 0 0 1y 1 yo n o i • 1/>. 1 /*^ v v U 1 tl
1 0 0 0 X X 1 Tj
1 0 0 X 0 X 1 Al1 0 X 0 0 X 1 T|1 X 0 0 0 X 11 O O X X 0 11 0 X 0 X 0 11 X 0 0 X 0 11 X 0 X 0 0 11 X X 0 0 0 1
O O X X 1 1 10 X 0 X 1 1 1X O O X 1 1 1O X X 0 1 1 1X O X 0 1 1 1y y n n 1 i i • )A. .A. U \J 1 1 1 . tl
0 0 x 1 xi i T]
0 X 0 1 X I 1X 0 0 1 X 1 1O X X 1 01 1X O X 1 01 1X X 0 1 01 10 0 1 X X 1 10X1 0X1 1X 0 1 0X1 10 X 1 X 0 1 1X 0 1 X 0 1 1X X I 00 1 10 0 1 X 1 X 10X1 01 XIX 0 1 01 XIn y i y i niU XV 1 .A. 1 \J 1
X 0 1 XI 01
Fig. 3.75: Cubos 2
133
CU8OS8 CUBOS3O O X O X X 1X O O O X X 1O O X X O X 1X O O X O X 1X O X O O X 1O X X O X 0 1X O X O X 0 1X X O O X 0 1O X X X 0 0 1X X O X 0 0 1X X X 0 0 0 1 r
O O X X X 1 1X O O X X 1 1X O X O X 1 1 [jgxoxxo i 1 \m
o x x o i x i 'MX O X 0 1 X 1 H.X X 0 0 1 X 1X X X 0 1 0 1O X X 1 0 X 1X X 0 1 0 X 10 0 1 X X X 10X1 O X X 1X 0 1 O X X 10 X 1 X 0 X 1XXI 00X1 :
0X1 X X 0 1XX 1 0 X 0 101 X X X 0 1x i o x x o i a|X 1 X O X 0 1 1H<
x i x x o o i Mi ooxxx i ül1 0 X O X X 11 X O O X X 11 X 0 X 0 X 11 X X O O X 11 X O X X 0 11 X X O X 0 1
X O X X 1 1 1XXOX1 1 1X X X 0 1 1 1X O X 1 XI 1X X 0 1 XI 1xxx ion mtxoixxn m
XX1 0X1 1XX1 X 0 1 1X 0 1 X 1 X 1XX1 0 1 X 1XX1 XI 01XI 0 X 1 X 1X1 X 0 1 X1X 1 X X 1 01XI 01 XXIX 1 X 1 0X1X1 XI X01XI 1 O X X 1X1 1 X 0 X 1XI 1 X X 0 11 O X X X 1 11 X O X X 1 1
Fig. 3.78: Cubos 3
CUBOS31XXOX111XXX01 11 OXX1XI1XOX1X11XX01XI1XXX1011X01XX11X1OXX111OXXX111XOXX111XXOX111XXX01
1 X X X 1 1 11 X X 1 X I 11 X X 1 1 X 1
1 X 1 X X 1 11X1XIX11 1XXX1 11 1 X X I X I1 1X1XXI1 1 1XXXI
Fig. 3.79: Cubos 3
134
CUBOS 4x o x o x x fX X X O X 0 1
X O X X X 1 1X X X 0 1 X 1X X I O X X 1X 1 X X X 0 11 X O X X X 11 X X O X X 1
1 X X X X 1 11 X X X 1 X 11 1 X X X X 1
Fig. 3.80: Cubos 4
En la figura 3.81 se indican los implicantes primos.
IMPLICANTES PRIMOS IMPLICANTES PRIMOS IMPLICANTES PRIMOS01001 1 XX00001X00 1 X I 1 XOOXXOX1XOOXOX1OXXX001XXOX001OXX10X1XX010X1001XXX10X1X0X10X1XX01X X O X 1 1 1XX01X11XXXI011XXIX011
X01X1X1XX1X101XI0X1X1X101XX1XIXI0X1X11X0X1XOXOXX1XXXOX01XOXXX11XXX01X1XX1OXX1X1XXX011XOXXX11XXOXX11XXXX111XXX1X1
1 1 X X X X 1
Fig. 3.81: Implicantes primos
Desde la figura 3.82 hasta la figura 3.96 se indican la tabla de simplificación
135
TABLA DE SIMPLIFICACIÓN
»
•
-*
.
"
*
— _ -,X O U O O 1 JS~
0 0 X X 0 X 1
0 X X X 0 0 1X X 0 X 0 0 1
X X 0 1 0 X 1
0 X 1 X 0 X 10 X 1 X X 0 1
X X 0 1 X 1 1
X X X 1 0 1 1
X X 1 X 0 1 1
1
•
2
/4. s;
3
fL
1
\
5 7
1
9
•
••
•(•
•
\1
T_
•~
T
,
*
T
15
T
17 19
*
T
r
«wFig. 3.82: Tabla de Simplificación
TABLA DE SIMPLIFICACIÓN
*
*«
*
»
0 0 X X 0 X 1
0 X X X 0 0 1
X X 0 X 0 0 1
X X 0 1 0 X 1
0 X 1 X 0 X 10 X 1 X X 0 1
X X 0 1 X 1 1
X X X 1 0 1 1
X X 1 X 0 1 1
21 22
f\
23
t\
25
i-sfl7
27
*
—
T
*
*
29
f\
30
¿^
•i)
31
f-\3
37
Fig. 3.83: Tabla de Simplificación
136
"
*
0 0 X X 0 X 1
0 X X X 0 0 1
X X Q X 0 0 1
X X 0 1 0 X 1
0 X 1 X 0 X 10 X 1 X X 0 1
X O X 1 1 1
X X 0 1 X 1 1
X X X 1 0 1 1
X X 1 X 0 1 1
3(•\-,J
3c1.9\)
41
¡i
itt
1
1
- t
11i
4
(3
^
'
3
\5
,<!
!«
jiii1
4
•
7 4
•
9 5
!
1 53 55
"V
Fig. 3.84: Tabla de Simplificación
TABLA DE SIMPLIFICACIÓN
iVm
*
*
*
*
0 0 X X 0 X 1
0 X X X 0 0 1X X 0 X 0 0 1
X X 1 O X 1
X X 0 1 0 X 1
0 X 1 X 0 X 10 X 1 X X 0 1
X U X 1 1 1
X X 0 1 X 1 1
X X X 1 0 1 1X X 1 X 0 1 1
5
1•
7
i
5
f.
9
)
6
•
1 65 6
/•\f
6
t\ht
6 9 71 1
(•\\
75
_
T
*
V
•4»
Fig. 3.85: Tabla de Simplificación
137
TABLA DE SIMPLIFICACIÓN
-"
1mmm
*
a
*
0 0 X X 0 X 1
0 X X X 0 0 1X X 0 X 0 0 1
X X 0 1 0 X 1
0 X 1 X 0 X 1
o x i r x o i
X X 0 1 X 1 1
X X X 1 0 1 1
X X 1 X 0 1 1
77 7
1
9 81 83
'.
f
e 5 87 91
í
;
i
T
*
93 95 97
WÉf
Fig. 3.86: Tabla de Simplificación
Vr
.*
má
*
*
^
*
0 0 X X 0 X 1
0 X X X 0 0 1
X X 0 X 0 0 1
X X 0 1 0 X 1
0 X 1 X 0 X 10 X 1 X X 0 1
X X O 1 X 1 1
X X X 1 0 1 1X X 1 X 0 1 1
99 10 1 103 10
,
5
F
>
10
'
•
7 109 11
'•
1 113 115 117
• ' • -
fV*
Fig. 3.87: Tabla de Simplificación
138
*
0 0 X X 0 X 1u u x u & i
0 X X X 0 0 1
X X 0 X 0 0 1
X X 0 1 0 X 1U 1 X A X 1
0 X 1 X 0 X 1
0 X 1 X X 0 1A U Ji. 1 1 1
X X 0 1 X 1 1
X X X 1 0 1 1
X X 1 X 0 1 1
11
_]
9 12
..1 ,
~1
1 123 12 5
h""
127
i
ij
i
1i
i\
;if
s
!
Fig. 3.88: Tabla de Simplificación
i1
*
.
X 0 1 X 1 X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1
X 1 0 1 X X 1
X 1 X 1 0 X 1
X 1 1 X 0 X 1
X 0 X 0 X X 1
X 0 X X X 1 1
X X X 0 1 X 1
X X 1 O X X 1
X 1 X X X 0 1-
1 X 0 X X X 1
1 X X 0 X X 1
1 X X X X 1 1
1 X X X 1 X 1 -
3
f\„
L
\
2
—
•
-'
— —
I
•
f\ilf
—
7
*
.**
w
— («_
cí
—
11
;*••-
, — „
15
'f -
„;_
. -™^ .
1
f\
7
^ - -
—
19
*
-. .4.
«
,_
.~
•fH
Fig. 3.89: Tabla de Simplificación
139
TABLA DE SIMPLIFICACIÓN
Jí
»
«
X 0 1 X 1 X 1X X 1 X 1 0 1X 1 0 X 1 X 1X 1 0 1 X X 1X 1 X 1 0 X 1X 1 1 X 0 X 1X 0 X 0 X X 1
X 0 X X X 1 1X X X 0 1 X 1
1 X 0 X X X 11 X X 0 X X 11 X X X X 1 1
21
/k•l)
22 23
'
25 27
..*, .
29 30 31
•33
f.{\
37
•
/.\\
•P>
Fig. 3.90: Tabla de Simplificación
TABIA DE SIMPLIFICACIÓN
*
X 0 1 X 1 X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1X 1 0 1 X X 1
X 1 X 1 0 X 1
X 1 1 X 0 X 1
X 0 X 0 X X 1
X 0 X X X 1 1
X X X 0 1 X 1
1 i X X U 1—
1 X 0 X X X 1
1 X X 0 X X 1
1 X X X X 1 1
39 39 4
J•
1
1
r
t
-
„
43 ! 4
-*¡
5
•
*~1
1
47 4
/1.
9
1>
S
i
\\
5
/¡v¡
3
•,>
5
i
^
5
-
•NP
Fig. 3.91: Tabla de Simplificación
140
TABLA DE SIMPLIFICACIÓN1
*
1
X 0 1 X 1 X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1
X 1 0 1 X X 1
X 1 X 1 0 X 1
X 1 1 X 0 X i
X 0 X 0 X X 1
X 0 X X X 1 1
X X X 0 1 X 1
1 A A A U 1 -
1 X 0 X X X 1
1 X X 0 X X 1
1 X X X X 1 1
1 X X X 1 X 1 -
5
1
'
7 5
•
9 6
1
1
'
\1 —
6
/1
5
•>)-
66 67 6
/<!
•
9
&„ . , ,
7
1
JJ
^
í
•
-
'
![
-—
73
•
75
•T-
T
*
.
•P»
Fig. 3.92: Tabla de Simplificación
TABLA DE SIMPLIFICACIÓN
*
_..
X 0 1 X í X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1
X 1 0 1 X X 1
X 1 X 1 0 X 1
X 1 1 X 0 X 1
X 0 X 0 X X 1
X 0 X X X 1 1
X X X 0 1 X 1
V _ _ _ _ _ . _ .
X 1 A X A U 1
1 X 0 X X X 1
1 X X 0 X X 1
1 X X X X 1 1
1 X X X 1 X 1
7
. ¿
7
1" "
*-_-
7
•
•
9
•
1
!*— ~
a
f\
1
'it
83
T
T-
_
T
*, ,
8
fV.
—
5
!i7
81
1
— ,
7
•
•
k.
91
- '¿.
¥
9i
i
•*•—
3r
f —
r_.
9i
i
^
—
5
F
•
^h
9
<
^
7
s)
•v»
Fig. 3.93: Tabla de Simplificación
141
TABLA DE SfM PI.1 FICACION
*
X 0 1 X 1 X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1
X 1 0 1 X X 1
X 1 X 1 0 X 1X i 1 X 0 X 1X 0 X 0 X X 1
v r* *r ir *r 4i O A 2 X 1 1
X X X 0 1 X 1X 1 U A A 1—
1 X 0 X X X 11 X X 0 X X 1
1 X X X X 1 14 *T T» *» «• -á1 X X X 1 X 1
99 1C
f\>
10
1
•
-y
3 1C
1
••
5
')
10 7 10
;
•
9
•
1
11
1
1 11
f\s>
11
1
5 11
/\& ,
•V
Fig. 3.94: Tabla de Simplificación
DE SfMPUPCAGION
i•
'fl•£
*
X 0 1 X 1 X 1
X X 1 X 1 0 1X 1 0 X 1 X 1
X 1 0 1 X X 1X 1 X 1 0 X 1X 1 1 X 0 X 1
X 0 X 0 X X 1A A U A U 1
U A A A 1 1
X X X 0 1 X 1
A 1 U A A i
1 & A A U 1
1 X 0 X X X 11 X X 0 X X 1
1 X X X X 1 1
11
i
9
rhr
12
'
1
1
'
12
'
3 12
..
5
..
12 7
Fig. 3.95: Tabla de Simplificación
142
TABLA DE SIMPLIFICACIÓN1 2
|11
3|t1
5|T1
7 9 11 15 17 19
^W
•21 22 23 25
1
1
27 29 30 31 33 37
TABLA DE SIMPLIFICACIÓN38 39
1
1
41
,!
43I11
45
1
471í
491
1
51 53|
1
55
•PA i iroTABLA DE SIMPLIFICACIÓN
•57
i
591
I
61 65i11
66 67|
I
69 71
•i
73J11
75
TABLA DE SIMPLIFICACIÓN
^E9r
77
1
79 81 83 85 87
!
91 93
1
95
•
97
TABLA DE SIMPLIFICACIÓN
• 1 1 X X X X 1-
99
TT
101 103A
105
i
107\í\
i
109
T
111 113 115lí.rí
117
TABLA DE SIMPLIFICACIÓN
jfSr
1 1 X X X X 1-
119 121
T
123(ti'T
125 127
,;
Fig. 3.96: Tabla de Simplificación
En la figura 3.97 se presenta los implicantes primos esenciales y
secundarios
SECUNDARIOSX 0 0 0 0 1 X XXXOX01.Í001X1IX X 1 X X X 0 10 1 0 0 1 I X 1 X X X 1 X 1
1 1 X X X X 1XOXXX11O X X 1 0 X 1X X 1 O X X 1X O O X O X 1001XXX1¿J
X X O X 1 1 -Fig. 3.97: Tabla de Simplificación
144
CAPITULO IV
CONCLUSIONES.
4.1 COMENTARIOS.
- El método de simplificación Quine-McCIuskey es un método tabular que se
debe tener cuidado en el desarrollo del mismo para no cometer
equivocaciones, lo cual provocará que la simplificación no sea mejor.
- El programa de simplificación del presente proyecto de titulación es muy
simple de utilizar, ya que está hecho para correr bajo el sistema Windows y
prácticamente en cualquier Computador Personal, ya que fue desarrollado en
una máquina Pentium I, con 24 MB de memoria RAM.
- Para desarrollar el programa se usó el lenguaje de programación Visual Basic
6.0, ya que teñe las herramientas necesarias para diseñar este programa.
- Cada uno de los cubos n se almacena en una matriz que tiene el número de
filas de acuerdo al mayor número de cubos encontrados durante el desarrollo,
por ejemplo si se encontraron 80 cubos, entonces la matriz tendrá 80 filas;
mientras que el número de columnas que tiene esta matriz depende de los
cubos de mayor orden, por ejemplo, si se tiene hasta cubos 7 la matriz tendrá
7 columnas.
- La tabla de simplificación también se construye basándose en una matriz en la
que se ubican las marcas, dependiendo de los implicantes primos(filas), y los
mintérminos de la función original (columnas).
- Si se usa el programa hasta 5 variables de entrada se ha incluido un retardo
en cada uno de los pasos para visualizar de mejor manera, y entender el
proceso de simplificación, estos retardos se incluyen para facilitar el proceso
de aprendizaje, puesto que se trata de un proyecto de titulación didáctico.
Mientras que para un número mayor de variables no se introducen estos
145
retardos de tiempo porque, en este caso se necesita simplificar lo más rápido
posible y obtener la función simplificada sin importar el proceso.
- El archivo que contiene la teoría del método de simplificación tabular Quine-
McCIuskey se encuentra en el CD con el nombre Texto.rtT.
4.2 CONCLUSIONES.
Luego de terminar este trabajo se pueden obtener las siguientes
conclusiones:
- Las ecuaciones con más de 6 variables de entrada no se pudieron comprobar
manualmente debido a que el método gráfico del mapa de Karnaugh ya no es
aplicable, y el tiempo que tomaría la simplificación manual de una función de
tantas variables de entrada, sería demasiado largo, y poco confiable.
- El programa puede ser usado como un tutorial de aprendizaje usando hasta 5
variables de entrada, mientras que se puede usar profesionalmente para un
número mayor de variables de entrada.
- Este programa encuentra la función simplificada verdadera debido a que
calcula los implicantes primos esenciales, y los implicantes primos secundarios
de menor costo.
- El tiempo de demora de simplificación del programa es casi imperceptible
hasta una función de 3 entradas; mientras que hasta 6 entradas, el tiempo que
emplea es de únicamente unos pocos segundos; para un número alto de
variables el tiempo empleado es un poco alto, pero adecuado y aceptable,
considerando la cantidad de operaciones que se deben realizar hasta obtener
la función totalmente simplificada.
- Debido a que todos los cubos n se almacenan en una matriz, facilita para
regresar o adelantar con facilidad, sin necesidad de volver a realizar los
146
cálculos involucrados en el proceso. Esto ayuda a revisar el proceso de
simplificación y regresar a cualquier paso del mismo.
4.3 RECOMENDACIONES.
- Este programa se puede usar tanto como un tutorial de aprendizaje de
simplificación de funciones booleanas utilizando el método de Quine-McKIusky
como para simplificar funciones booleanas de hasta 10 variables de entrada
con propósitos profesionales.
- Este programa se puede cambiar, para utilizarlo en la simplificación de una
función de más de 10 variables de entrada, únicamente utilizando una
computadora más veloz y con una cantidad grande de memoria RAM para
almacenar las matrices de los cubos y la tabla de simplificación.
- Los cambios que se deben hacer son: Definir matrices de mayor orden en la
rutina de módulos, ya que este programa está desarrollado definiendo
matrices lo suficientemente grandes como para no tener problemas en la
simplificación de hasta 10 variables de entrada, además en la rutina de
escritura de la solución se debe incluir más líneas de programación que
permitan ingresar las variables adicionales.
- El programa permite realizar la simplificación de una función mientras se
revisa la teoría de simplificación o también se revisa el tutorial de uso del
programa, permitiendo de esta manera utilizar el programa como una guía de
aprendizaje y manejo.
147
BIBLIOGRAFÍA.
- M. MORRIS MANO, Lógica Digital y Diseño de Computadoras, Prentice
hall, 1982. México.
- Cornell Gary, Visual Basic 6.0 Manual de Referencia, Me Graw Hill, 1999,
España.
- Ronald J. TOCCI, Sistemas Digitales. Principios y aplicaciones, Sexta
edición, 1996. México.
- Fredrick J. Hill/ Gerald R. Peterson, Switching Theory & Logical Design,
Tercera Edición, 1981, New York.
- John F. Weakerly, Diseño Digital, Principios y prácticas, 1992, México
- Maurice Bird & Roy Schmidt. Practica! Digital Electronics, Laboratory
Workbook, Hewlett- Packard, Santa Clara California, 1974.
- Manual de circuitos integrados TTL de la Texas Instruments, Second
Edition, 1981.
- Apuntes de Sistemas Digitales EPN.
- http://campus.murravstate.edu/academic/facultv/bob.pilqrim/405/quine.html
- http://logik.phl.univie.ac.at/-chris/qmo-uk.html
- http://www.algoritm.qm.home.ro/
- www.seattlerobotics.orq/encoder/200106/qmccmin.htm
- www.ihs.theoinf.tu-ilmenau.de/-sane/projekte/qmc/embed_qmc.html
- www.math.uni-muenster.de/informatik/Scripten/
Praktischelnformatiklll/html/node38.html
- www.rpi.edu/dept/ecse/coco/SOO/W03/Q-Mmethod.ppt
- www.ece.odu.eduMeathrum/ECE241_284/support/quine.html
- http://pehuen.chiilan.ubiobio.cl/-lqaiardo/odc/aigebra/
148
ANEXO A.
LISTADO DEL CÓDIGO DEL PROGRAMA.
MODULO 1
Public ColorInicialBotones As ButtonConstantsPublic ColorEnfoque As ButtonConstantsPublic e As IntegerPublic f(0 To 1023) As StringPublic FigNum As IntegerPublic n As IntegerPublic num_tema As Integer 'indica el numero de frame que se va a mostrar esutilizada en la forma Indice_tutorialPublic m As IntegerPublic pagina As IntegerPublic paginal As IntegerPublic paginaO As IntegerPublic r(0 To 1023) As IntegerPublic Tutor 'contiene el valor que indica el tema del tutorialFunction valida_Numero(k)Select Case k
CaseS, 13, 32,46,48 To 57valida_Numero = k
Case Elsevalida_Numero = O
End SelectEnd Function
FORM1.
Prívate Type Registrocombinación As String * 20respuesta As Stríng * 1
End TypePrívate dato As RegistroPrívate Grupo(2047,16) As IntegerPrívate s(2047) As StringPrívate c(2047, 16) As String * 20Prívate O(2047,16) As StringPrívate contv(2047) As IntegerPrívate conth(2047) As IntegerPrívate fíl(16) As IntegerPrívate Marca(2047, 16) As StringPrívate Tabla(2047, 2047) As StringPrívate fílaAnulada(2047) As BooleanPrívate columnaAnulada(2047) As BooleanPrívate numeroFüa(2047) As IntegerPrívate fila As IntegerPrívate col As Integer
149
Prívate MaxColCubos As IntegerPrívate max As IntegerPrívate MaxCol As IntegerPrívate Auxl As IntegerPrívate Aux2 As IntegerPrívate ultima As BooleanPrívate Implicantes As BooleanPrívate Tablalmplicantes As BooleanPrívate marcas As BooleanPrívate lineas As BooleanPrívate Resultado As BooleanPrívate escenciales As BooleanPrívate anchoPrívate altoPrívate valizcomPrívate PaginaHorizontalPrívate PaginaVertícalPrívate NumeroGrupoPrívate espacioPrívate ColorLineaPrívate TiempoConst ColumnasDeTabla =17Sub simplifiqueQ 'Esta función simplifica la función directamente y da la respuesta
Commandl.Enabled = False 'Para desabilitar el comando de siguienteSimplificar.Enabled = False 'Para desabilitar el menú de simplificarCommandl4,Enabled = False 'Para desabilitar el comando de terminaraSimppaso.Enabled = False Tara desabilitar el menú de simplificar el siguiente pasoCommand2.Enabled - False 'Para desabilitar el botón de paso anteriorSimplificaranterior = False 'Para desabilitar el Menú de paso anteriorCommand3,Enabled = False 'Para desabilitar el botón de SalirMenu.Enabled = False Tara desabilitar el MenúText4,Locked = Truc 'Bloque el Editor de minterminosMousePointer = vbHourglass 'Cambia la forma del cursor del mouse a un relojTitulo(2).Visible = False 'Esconde el tituloMensaje.Top = Text4.Top + Text4.Height + 500 'Posición vartical del mensajeMensaje.Visible = True 'Hace visible el mensajeraya = " " 'borra la variable rayaFor i = 1 To n 'Ubica tantas lineas como se necesiten
raya = raya & "--"Next iDoEvents 'Actualiza los eventos ejecutadosIf lineas = True And Resultado = False Then 'Esta sección Genera la solución
Titulo(O). Visible = FalseTitulo(l). Visible = FalseMensaje.Caption = "¡Generando la solución!"Mensaje.Left = (Forml.Width - Mensaje.Width) / 2Command 10. Visible = FalseCommandl 1. Visible = FalseCommandl2.Visible = FalseCommandl3.Visible = False
150
Picturel. Visible = FalseList2(0). Visible = FalseList2(l). Visible = FalseTexto = "Y = "For i= l Tofil(col+l)
Ifn<5ThenTimer 1 = TimerDo
DoEventsLoop While Timer - Timer 1 <= Tiempo
ElseDoEvents
EndlfFor j = 1 To Len(c(i, col + 1))
If Mid(c(i, col + 1), j, 1) = "O" ThenIf j = 2 Then Texto = Texto & "A1"If j = 4 Then Texto = Texto & "B'MIf j = 6 Then Texto = Texto & "C"If j = 8 Then Texto = Texto & "D"1
If j = 10 Then Texto = Texto & "E1"If j = 12 Then Texto = Texto & "F"If j = 14 Then Texto = Texto & "Gm
If j = 16 Then Texto = Texto & "H"'If j - 18 Then Texto = Texto & "I"'If j = 20 Then Texto = Texto & "J"'
EndlfIf Mid(c(i, col + 1), j, 1) = "1" Then
If j = 2 Then Texto = Texto & "A11
If j = 4 Then Texto = Texto & "B"If j = 6 Then Texto = Texto & "C"If j = 8 Then Texto = Texto & "D"If j = 10 Then Texto = Texto & "E"If j = 12 Then Texto = Texto & "F"If j = 14 Then Texto = Texto & "G"If j = 16 Then Texto - Text6 & "H"If j = 18 Then Texto = Texto & T'If j = 20 Then Text6 = Texto & "J"
EndlfNextjIf i o fil(col + 1) And Mid(c(i, col + 1), j, 1) o "X" Then Texto = Text6 + " +
If Len(Text6) < 50 ThenTexto,Width - 130 * Len(Text6.Caption) + 130 / Len(Textó.Caption) + 200Text6.Height *= 500
ElseText6.Height = 4*330Textó.Width = 130 * 50 + 130 / 50 + 200
EndlfTextó.Left = ((Forml .Width / 2) - (Textó.Width / 2)) + 200Textó.Top = (Forml.Height / 2) - Textó.Height
151
Textó.Visible = TrueDoEvents
Next iIf fil(col + 2) > O Then Texto = Texto & " + "For i - 1 To fil(col + 2)
If n < 5 ThenTimerl = TimerDo
DoEventsLoop While Timer - Timerl <= Tiempo
ElseDoEvents
EndlfFor j = 1 To Len(c(i, col + 2))
If Mid(c(i, col + 2), j, 1) = "O" ThenIf j = 2 Then Texto = Texto & "A"'If j = 4 Then Texto = Texto & "B"1
If j = 6 Then Texto = Texto & "C1"If j = 8 Then Texto = Texto & "D"'If j - 10 Then Texto = Texto & "E"'If j = 12 Then Texto = Texto & "F"'If j = 14 Then Texto - Texto & "G"'If j = 16 Then Texto = Texto & "H"'If j - 18 Then Texto = Texto & "I"1
If j = 20 Then Texto = Texto & "J"1
EndlfIf Mid(c(i, col + 2), j, 1) - "1" Then
If j - 2 Then Texto = Texto & "A"If j - 4 Then Texto = Texto & "B"If j = 6 Then Texto = Texto & "C"If j = 8 Then Texto - Texto & "D"If j - 10 Then Texto = Texto & "E"If j = 12 Then Texto - Texto & "F"If j = 14 Then Texto = Texto & "G"If j = 16 Then Texto - Texto & "H"If j - 18 Then Texto = Texto & "I"If j = 20 Then Texto = Texto & "J"
EndlfNextjIf i o fil(col + 2) And Mid(c(i, col + 2), j, 1) o "X" Then Texto = Texto + " +
IfLen(Text6)<50ThenTexto.Width = 130 * Len(Textó.Caption) + 130 / Len(Textó.Caption) + 200Textó.Height = 500
ElseTextó.Height - 4 * 330Texto.Width = 130 * 50 + 130 / 50 + 200
EndlfTextó.Left = ((Forml .Width / 2) - (Textó.Width / 2)) + 200Textó.Top = (Forml .Height / 2) - Textó.Height
170
Texto.Width = 130 * Len(Text6.Caption) + 130 / Len(Text6.Caption) + 200Textó.Height = 500
ElseTextó.Height = 4 * 330Texto.Width = 130 * 50 + 130 / 50 + 200
EndlfTextó.Left = ((Forml.Width / 2) - (Texto.Width / 2)) + 200Textó.Top = (Forml.Height / 2) - Textó.HeightTexto. Visible = TrucDoEvents
Next iIf fil(col + 2) > O Then Texto = Texto & " + "For i = 1 To fíl(col + 2)
If n < 5 ThenTimer 1 = TimerDo
DoEventsLoop While Timer - Timerl <= Tiempo
ElseDoEvents
EndlfFor j = 1 To Len(c(i, col + 2))
If Mid(c(i, col + 2), j, 1) = "O" ThenIf j = 2 Then Texto = Texto & "A"1
If j = 4 Then Texto = Texto & "B"'If j = 6 Then Texto = Texto & "C"If j = 8 Then Texto - Texto & "D1"If j = 10 Then Texto = Texto & "E"1
If j = 12 Then Texto = Texto & "F"If j = 14 Then Texto = Texto & "G"1
If j = 16 Then Texto = Texto & "H1"If j = 18 Then Texto = Texto & "I"'If j = 20 Then Texto = Texto & "J"1
EndlfIf Mid(c(i, col + 2), j, 1) = "1" Then
If j = 2 Then Texto = Texto & "A"If j = 4 Then Texto = Texto & "B"If j = 6 Then Texto = Texto & "C"If j = 8 Then Texto = Texto & "D"If j = 10 Then Texto = Texto & "E"If j = 12 Then Texto - Texto & "F"If j = 14 Then Texto = Texto & "G"If j - 16 Then Texto - Texto & "H"If j = 18 Then Texto = Texto & "I"If j = 20 Then Texto = Texto & "J"
EndlfNextjIf i o fil(col + 2) And Mid(c(i, col + 2), j, 1) o "X" Then Texto - Texto + " +
IfLen(Textó)<50Then
171
Texto.Width = 130 * Len(Textó.Caption) + 130 / Len(Text6.Caption) + 200Textó.Height = 500
ElseText6.Height = 4 * 330Texto.Width = 130 * 50 + 130 / 50 + 200
EndlfTextó.Left = ((Forml.Width / 2) - (Texto.Width / 2)) + 200Textó.Top = (Forml.Height / 2) - Textó.HeightTextó.Visible = TrueDoEvents
Next iResultado = True
Endlf
If escenciales = True And lineas = False ThenMensaje.Caption = "¡BUSCANDO IMPLICANTES PRIMOS SECUNDARIOS!"Mensaje.Left = (Forml.Width - Mensaje.Width) / 2fila-ODo
marcasmax = OFor i = 1 To fil(col)
conth(i) = OForj = lTofil(0)
If Tabla(i, j) = "*" And fíIaAnulada(i) = False And columnaAnulada(j) =False Then
conth(i) = conth(i) + 1If marcasmax < conth(i) Then marcasmax = conth(i)
EndlfNextj
Next iFor j = 1 To fil(col)
If conth(j) = marcasmax And filaAnulada(j) = False And marcasmax > O Thensihay = FalseFor i2 = 1 To fil(O)
If Tabla(j, i2) = "*" And columnaAnulada(i2) = False Thenco1umnaAnulada(i2) = TruenumeroFila(i2) = jmostrarmarcasIfn<5Then
Timerl = TímerDo
DoEventsLoop Whíle Timer - Timerl <= Tiempo
ElseDoEvents
Endlfsihay = True
EndlfNext ¡2If sihay = True Then
172
fílaAnulada(j) - Trucfila = fila + 1c(fila, col + 2) = cG, col)mostrarmarcasfd(col + 2) = filamostrarsecundariosIf n < 5 Then
Timerl = TimerDo
DoEventsLoop While Timer - Timerl <= Tiempo
ElseDoEvents
EndlfEndlf
EndlfNext j
Loop Until marcasmax = Ofíl(col + 2) = filaIf MaxCol < col + 2 Then MaxCol = coi + 2If max < fil(col + 2) Then max = fil(col + 2)lineas = TrucIf fila = O Then Commandl_CIickfila = fil(col-l)Mensaje.Visible = FalseMensaje.Caption =""
Endlf
If marcas = Truc And escenciales = False ThenMensaje.Caption- "¡BUSCANDO IMPLICANTES PRIMOS ESENCIALES!"Mensaje.Left = (Forml.Width - Mensaje.Width) / 2Mensaje.Visible = TrueDoEventscontvmax = OFor i - 1 To fil(O)
contv(i) = OFor j = 1 To fil(col)
If TablaQ, i) = "*" Then contv(i) = contv(i) + 1NextjIf contvmax < contv(i) Then contvmax - contv(i)
Next ifila = OColorLinea = RGB(0, 255, 0)For i = 1 To fíl(O)
If contv(i) = 1 And columnaAnulada(i) = False ThencolumnaAnulada(i) = TruemostrarmarcasIfn<5Then
Timerl = TimerDo
173
DoEventsLoop While Timer - Timerl <— Tiempo
ElseDoEvents
EndlfForj = lTofd(col)
If TablaG, i) = "*" And filaAnuladaO) = False ThenfílaAnulada(j) = TruenumeroFila(i) = jmostrarmarcasfila-fila+1c(fila, col + 1) = c(j, col)fil(col + l) = filamostraresencialesI fn<5Then
Timerl = TimerDo
DoEventsLoop While Timer - Timerl <= Tiempo
ElseDoEvents
EndlfFor i2 = 1 To fil(O)
If Tabla(j, i2) = "*" And columnaAnulada(i2) = False ThencolurnnaAnulada(i2) = TruenumeroFila(i2) = jmostrarmarcasIfn<5Then
Timerl = TimerDo
DoEventsLoop While Timer - Timerl <= Tiempo
ElseDoEvents
EndlfEndlf
Next i2EndTf
NextjEndlf
Next ifíl(col+l) = filafila = fil(col-l)If MaxCol < col + 1 Then MaxCol = col + 1If max < fil(col + 1) Then max = fíl(col +1)escenciales = True
Endlf
If Implicantes = True And Tablalmplicantes = False Then Tara construir la tabla desimplificación
174
Mensaje.Caption = "¡Construyendo la tabla de simplificación!"Mensaje.Left = (Forml.Width - Mensaje.Width) / 2DoEventsIf Aux2 o col Then
For i = 1 To fil(O)s(i) = O(i, 0)
Next iFor i - 1 To fil(O) - 1
Forj = i+lTofi l (0)If Val(s(i)) > Val(sG)) Then
aux = s(i)
s(j) = auxEndlf
NextjNext iFor i = 1 To fíl(col)
pl =0For pos - 1 To Len(O(i, col))
If Mid(O(i, col), pos, 1) = " " Or Mid(O(i, col), pos, 1) = ",M Thenp l = p 2p2 = posI f p 2 - p l > l Then
subindice = Mid(O(i, col), pl, p2 - pl)For j = 1 To fil(O)
If Val(subindice) = Val(s(j)) Then Tabla(iJ) - "*"Nextj
EndlfEndlfIf pos = Len(O(i, col)) Then
pl=P2p2 = posI fp2-p l>OThen
subindice = Mid(O(i, col), pl, p2 - pl + 1)Forj = lTofil(0)
If Val(subindice) = Val(sQ)) Then Tabla(i, j) = "*"Nextj
EndlfEndlf
Next posDoEvents
Next iAux2 = col
EndlfTitulo(O). Visible = FalseListl(O).Visible-FalseTitulo(l).Visible = FalseListl(l). Visible = FalseCommandó.Enabled = FalseCommandó. Visible = False
175
Command7.Enabled = FalseCommandT.Visible = FalseCommandS.Enabled = FalseCommandS. Visible = FalseCommand9.Enabled = FalseCommand9.Visible = FalseLabel3(0).Visible = FalseLabel3(l). Visible = FalseDoEventsPaginaHorizontal = OPaginaVertical = OmostrarTablaTablalmplicantes = Truemarcas = True
EndlfIf col >= 1 And ultima = False Then Tara construir la tabla de Cubos r
Mensaje.Caption = "¡Calculando los cubos " & Str(col) & "!"Mensaje.Left = (Forml.Width - Mensaje.Width) / 2DoEventsauxiliar = fil(col + 1)If MaxColCubos < col Then
fila-ONumeroGrupo = 1sihay = FalseFor i = 1 To fil(col) - 1
IfO(i,col)o"-"Thenray = OFor j - i+1 Tofil(col)
If Grupo(j, col) = Grupo(i, col) + 1 And O(j, col) o "-" Thencont = OFor pos = 1 To 2 * n 'busca en cuales bits esta diferente
If Mid(c(i, col), pos, 1) o Mid(c(j, col), pos, 1) Thencont = cont + 1 'cuenta el numero de cambiosspos = j 'rescata la combinación con la que hay el cambiocpos = pos 'rescata la posición del bit que cambia
EndlfDoEvents
Next posIf cont - 1 Then
fila = fila+1c(fíla, col + 1) = c(i, col) 'crea la nueva columna con los cubos cerosMarca(i, col) = "*"MarcaOí col) = "*"Mid(c(fila, col + 1), cpos) = "X" 'inserta una X en el bit que cambiacont2 = OF o r k = l T o f i l a - l
If c(fila, col + 1) = c(k, col + 1) Then cont2 - cont2 + 1NextkIf cont2 = O Then
176
O(fíla, col + 1) = O(i, col) & "," & O(spos, col) 'Almacena lascombinaciones que cambiaron
Gmpo(fila, col + 1) = NumeroGruposihay = Truc
Elsefila = fila - 1
EndlfEndlf
EndlfIfO(j, col) = "-" Then
ray = ray + 1EndlfIf ray = 2 Then
Exit ForEnd If
NextjElse
If sihay = Truc Thenfila = fila +1c(fila, col + 1) = rayaO(fila, col+ !) = "-"Marca(i, col) ="-"Marca(fila, col + 1) = "-"Grupo(fila, col + 1) = NumeroGrupoNumeroGrupo = NumeroGrupo + 1
EndlfEndlf
Next iIf fila > O Then fila = fila - 1fil(col + 1) = fila
EndlfIf MaxColCubos < col Then MaxColCubos = colIf MaxCol < col + 1 Then MaxCol = col + 1If max < fil(col + 1) Then max = fil(col + 1)col = col + 1If (fila = 0) Or (col = Auxl) Then
ultima = Truefíl(col) = auxiliar
ElseCommandó.Enabled = FalseCommandó.Visible = FalseCommand7.Enabled - FalseCommand7.Visible - FalseCommandS.Enabled = FalseCommandS.Visible = FalseCommand9.Enabled = FalseCommand9.Visible = FalseLabel3(0). Visible = FalseLabel3(l).Visible - False
177
Titulo(0).Caption = "CUBOS " & col - 2Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)mostrarlistlO
Listl(l).ToolTipText = "Tabla de cubos " & Str(col - 1)Titulo(l).Caption = "CUBOS " & col -1mostrarlistl 1
DoEventsEndlf
Endlf
If ultima = True And Implicantes = False Then Tara hallar los implicantes primosMensaje.Caption = "¡Calculando los implicantes primos!"Mensaje.Leñ - (Forml .Width - Mensaje.Width) / 2DoEventsIf Auxl o col Then
Auxl =colfila = OForj = 1 To col -1
For i=lTof í l ( j )If Marca(i, j) o "*" And O(is j) o "-" Then
fila = fila +10(fila,col) = 0(i,j)c(fila,col) = c(i,j)Marca(fila, col) - ""
EndlfDoEvents
Next iNextjfil(col) = fila
EndlfCommandó.Enabled = FalseCommandó.Visible = FalseCommandT.Enabled = FalseCommand7.Visible = FalseCommandS.Enabled = FalseCommandS. Visible = FalseCommand9.Enabled = FalseComrnand9.Visible = FalseLabel3(0). Visible = FalseLabel3(l). Visible = FalseTitulo(0).Caption = Titulo(l).CaptionTitulo(0).ToolTipText = "Tabla de cubos " & Str(col - 2)mostrarlistlOTitulo(l).Captíon= "IMPLICANTES PRIMOS"Listl(l).ToolTipText = "Tabla de Implicantes primos "mostrarlistllIf MaxCol < col + 1 Then MaxCol = col + 1If max < fíl(col) Then max = fil(col)
178
Implicantes = TrueEndlf
If col = O Then 'Para Construir la tabla de los cubos OCommand4.Enabled = FalseCommand4. Visible = FalseCommandS.Enabled = FalseCommand5. Visible = FalseCommandS.Enabled = FalseMensaje.Caption = "¡Calculando los cubos O!"Mensaje.Leñ = (Forml.Width - Mensaje.Width) / 2DoEventsFor i = O To Text2.UBound
Text3(i).Visible = FalseText2(i).Visible = False
Next íDoEventscol = col + 1IfMaxCol = OThen
fila = OFor i = O To 2 A n - 1
Ifr(i)=lThenfila = fila+1c(fila, 0) = f(i)O(fila, 0) - i
EndlfNext ifil(O) = filafila = OForj = OTon
sihay = FalseFor i = O To 2 A n - 1
Ifr(i)=lThencont = OFor pos = 1 To 2 * n
Bit = Val(Mid(f(i), pos, 1))If Bit = 1 Then cont = cont + 1
Next posIf cont = j Then
fila = fila +1c(fila, col) = f(i)O(fíla, col) = Str(i)Grupo(fila, col) = jsihay = True
EndlfEndlf
Next iIf sihay = True Then
fila = fila +1c(fila, col) = raya
179
O(fíla, col) ="-"Grupo(fíla, col) = j
EndlfNextjfíl(col) = fila
EndlfLabel3(0). Visible - FalseLabel3(l). Visible = FalseTitulo(0).Caption = "MTNTERMINOS"Titulo(0).ToolTipText = "Tabla de MINTERMINOS"mostrarlistlOTitulo(l).Captíon = "CUBOS O"TituLo(l).ToolTipText = "Tabla de cubos O"mostrarlistllIf MaxCol < col Then MaxCol = colIf max < fíl(col) Then max = fíl(col)
EndlfIf Resultado = False Then
Commandl .Enabled = TrueSimplificar.Enabled = True
CommandH.Enabled = True
Simppaso.Enabled = TrueEndlfCommand2.Enabled = TrueSimplificaranterior = TrueCommand3.Enabled = TrueMenu.Enabled = TrueText4.Locked = FalseMensaje.Caption = ""Mensaje. Visible = FalseMousePointer = vbDefault
End Sub
Prívate Sub Commandl_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)
Commandl.BackColor = ColorEnfoqueCommand2.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesCommandl 4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Commandl0_Click()PaginaVertical = Pagina Vertical + 1mostrarTablamostrarmarcasIf fil(col + 1) > O Then mostraresencialesIf fil(col + 2) > O Then mostrarsecundarios
End Sub
180
Prívate Sub Commandl l_Click()PaginaVertical = PaginaVertical - 1mostrarTablamostrarmarcasIf fil(col + 1) > O Then mostraresencialesIf fil(col + 2) > O Then mostrarsecundarios
End SubPrívate Sub Commandl2_Click()
PaginaHorizontal = PaginaHorízontal + 1mostrarTablamostrarmarcasIf fíl(col + 1) > O Then mostraresencialesIf fíl(col + 2) > O Then mostrarsecundarios
End SubPrívate Sub Commandl3_Click()
PaginaHorizontal = PaginaHorizontal - 1mostrarTablamostrarmarcasIf fíl(col + 1) > O Then mostraresencialesIf fil(col + 2) > O Then mostrarsecundarios
End Sub
Prívate Sub Commandl4_Click()Tiempo = ODo
Cali simplifiqueLoop Until Resultado = TrueTiempo = 1End Sub
Prívate Sub Commandl4_MouseMove(Button As Integer, Shiñ As Integer, X AsSingle, Y As Single)
Commandl 4.BackColor = ColorEnfoqueCommandl.BackColor = ColorInicialBotonesCommand2.BackColor = ColorInicialBotonesCommandS.BackColor = ColorInicialBotones
End Sub
Prívate Sub Command2_Click()If col > O Then
Commandl.Enabled = FalseSimplificar.Enabled = FalseCommandl 4.Enabled = FalseSimppaso.Enabled = FalseCommand2. Enabled = FalseSimplificaranterior = FalseCommand3. Enabled = FiaseMenu.Enabled = FalseText4.Locked = True
181
Commandó.Enabled = FalseCommandó, Visible = FalseCommandT.Enabled = FalseCommand? .Visible = FalseCommandS.Enabled = FalseCommandS. Visible == FalseCommand9.Enabled = FalseCommand9.Visible = FalseLabel3(0).Visible = FalseLabel3(l).Visible - FalseIf Resultado = True Then
Texto = ""Textó.Visible = FalseTitulo(0).Visible = TruemostrarTablamostrarmarcasmostraresencialesIf fil(col + 2) > O Then mostrarsecundariosSimppaso.Enabled = TrueSimplifícar.Enabled = TrueCommandl4.Enabled = TrueResultado = False
El seIf lineas = True Or escenciales = True Then
Picturel. Visible = TrueTitulo(2). Visible = FalseList2(l). Visible = FalseTitulo(l).Visible = FalseList2(0).Visible = FalseTextó.Visible = FalseFor i = 1 To UBound(numeroFila)
numeroFila(i) = ONextiFor i = 1 To UBound(fllaAnulada)
filaAnulada(i) = FalseNextiFor i = 1 To UBound(columnaAnulada)
columnaAnulada(i) = FalseNextimostrarTablafil(col + 2) = Oescenciales = Falsefil(col + l) = 0lineas = False
ElseIf marcas = True Then
marcas = FalseCommand2_Click
ElseIf Tablalmplicantes = True Then
182
Picturel. Visible = FalseCommandlO. Visible = FalseCommandl 1.Visible = FalseCommandl2.Visible = FalseCommandl 3. Visible = FalseTitulo(0).Visible = FalseTitulo(l).Caption= "IMPLICANTES PRIMOS"DoEventsListl(l).ToolTipText = "Tabla de implicantes primos"Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)Listl(0).Left = 3000mostrarlistl 1
Titulo(0).Caption - "CUBOS " & col - 2mostrarlistl OTablalmplicantes = False
ElseIf ultima = True Then
col = col -1Titulo(l).Caption = Titulo(0).CaptionListl(l).ToolTipText = Listl(0).ToolTipTextListl(0).ToolTipText - Listl(0).ToolTipTextmostrarlistl 1Titulo(0).Caption = "CUBOS " & col - 2mostrarlistl OImplicantes = Falseultima = False
Elsecol = col - 1Ifcol> 1 Then
Titulo(l).Caption = Titulo(0).CaptionListl(l).ToolTipText = Listl(0).ToolTipTextListl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)mostrarlistllTitulo(0).Caption = "CUBOS " & col - 2mostrarlistl O
ElseIf col= 1 Then
Listl(l).Visible = FalseCommandS.Visible = FalseCommand9.Visible = FalseTitulo(l).Caption = "CUBOS O"Listl(l).ToolTipText = "Tabla de CUBOS O"mostrarlistl 1Titulo(0).Caption = "MINTERMINOS"Listl(0).ToolTipText = "Tabla de MINTERMINOS"mostrarlistl O
ElseTitulo(0).Visible = FalseList 1(0). Visible = False
183
Titulo(l),Visible = FalseListl(l).Visible = FalseCommandó.Visible = FalseCommand7.Visible = FalseDoEventsIf2An<=64Then
For i = O To 2 A n -1Text3 (i). Visible = TrueText2(i).Visible = TrueDoEvents
Next iElse
For i - O To Text3.UBoundText3 (i). Visible = TrueText2(i).Visible = TrueDoEvents
Next iIf pagina > O Then
Command4.Enabled = TrueCommand4.Visible - True
EndlfIf pagina < (2 A n) / 64 - 1 Then
CommandS.Enabled = TrueCommandS.Visible = True
EndlfEndlf
EndlfEndlfultima = False
EndlfEndlf
EndlfEndlf
EndlfCommandl.Enabled = TrueSimplificar.Enabled = TrueCommandH.Enabled = TrueSimppaso.Enabled = TrueIf col >0 Then
Command2.Enabled = TrueSimplificaranterior = True
EndlfCommandS.Enabled = TrueMenu.Enabled - TrueText4.Locked = False
EndlfEnd Sub
Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)
184
Commandl .BackColor = ColorlnicialBotonesCommand2.BackColor = ColorEnfoqueCommand3.BackColor = ColorlnicialBotonesCommandl 4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command3_Click()Unload Me
End Sub
Prívate Sub Command3_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)
Commandl.BackColor = ColorlnicialBotonesCommand2. BackColor = ColorlnicialBotonesCommand3.BackColor = ColorEnfoqueCommandl 4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command4_Click()Command5.Left = Text2(63).Left + Text2(63).Width - CommandS.WidthCommand5.Top — Command4.TopCommandS.Enabled = TrueCommandS. Visible = Truepagina = pagina - 1For i = O To 63
Text3(i).Text = f(i + pagina * 64)Text2(i).ToolTipText - "f(" & i + pagina * 64 & ")"If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Text2(i).Text = r(i + pagina * 64)Else
Text2(i).Text=""Endlf
NextiIf pagina = O Then
Command4.Enabled = FalseCommand4. Visible = False
EndlfEnd Sub
Prívate Sub Conunand5_Click()Command4.Left = Text3(15).LeftCommand4.Top = CommandS.TopCommand4.Enabled = TrueCommand4. Visible = Truepagina = pagina + 1For i = O To 63
Text3(i).Text = f(i + pagina * 64)Text2(i).ToolTipText = nf(" & i + pagina * 64 & ")"If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Text2(i).Text = r(i + pagina * 64)
185
ElseText2(i).Text=n"
EndlfNextiText2(0).SetFocusIf 2 A n - 1 = 63 + pagina * 64 Then
CommandS.Enabled = FalseCommandS. Visible = False
EndlfEnd Sub
Prívate Sub Command6_Click()paginaO = paginaO -1Commandó.Left = CommandT.LeftCommandó.Top = Listl(0).TopCommand6.Enabled = FalseCommand6.Visible = FalseCommand7.Enabled = TrueCommandT.Visible = TrueListl(0).ClearIf col = 1 Then
For i = paginaO * 16 + 1 To fil(O)If i <= paginaO * 16 + 16 Then
IfVal(O(i,0))<=9ThenListl(0).AddItem (" " & O(i, 0) + " " & c(i, 0))
ElseIfVal(O(i,0))<=99ThenListl(0).AddItem (" " & O(i, 0) + " " & c(i, 0))Else
Listl(0).AddItem (IIM & O(i, 0) + " " & c(i, 0))Endlf
EndlfEndlfIf paginaO > O Then
Commandó.Left = Commandó.LeftCommandó.Top = Listl(0),TopCommandó.Enabled = TrueCommandó. Visible = True
EndlfDoEvents
NextiElse
For i = paginaO * 16 + 1 To paginaO * 16+16If i <= paginaO * 16 + 16 Then
If Marca(i, col - 1) = "*" ThenListl(0).AddItem (Marca(i, col - 1) & " " & c(i, col - 1))
ElseListl(0).AddItem (" " & c(i, col - 1))
EndlfEndlf
186
If paginaO > O ThenCommandó.Left = Commandó.LeftCommandó.Top = Listl(0).TopCommandó.Enabled = TrucCommandó.Visible = True
EndlfDoEvents
NextiEndlfEnd SubPrívate Sub Command7_Click()
paginaO = paginaO + 1Commandó.Left = Command7.LeftCommandó.Top = Listl(0).TopCommandó.Enabled = TrueCommandó.Visible = TrueCommand7.Enabled = FalseCommand7.Visibie = FalseListl(0).ClearIf col = 1 Then
For i = paginaO * 16 + 1 To fil(O)If i <= paginaO * 16 + 16 Then
IfVal(O(i,0))<=9ThenListl(0).AddItem (" " & O(i, 0) +" (t & c(i, 0))
ElseIfVal(O(i,0))<=99Then
Listl(0).AddItem (" n & O(i, 0) +" " & c(i, 0))Else
Listl(0).AddItem ("" & O(i, 0) + " " & c(i, 0))Endlf
EndlfElse
Command7.Left = Listl(0).Left + Listl(0).WidthCommand7.Top = Listl(0).Top + Listl(0).Height - Command7.HeightCommand7.Enabled = TrueCommand7.Visible = True
EndlfDoEvents
NextiElse
For i = paginaO * 16 + 1 To fil(col - 1)If i <= paginaO * 16 + 16 Then
If Marca(i, col - 1) = "*" ThenListl(0).AddItem (Marca(i, col - ! ) & " " & c(i, col - 1))
ElseListl(0).AddItem (" " & c(i, col - 1))
EndlfElse
Command7.Left = Listl(0).Left + Listl(0).WidthCommand7.Top = Listl(0).Top + Listl(0).Height - Command7.Height
187
CommandT.Enabled = TrueCommandT.Visible = True
EndlfDoEvents
Next iEndlf
End SubPrívate Sub Cornmand8_Click()
pagina 1 = pagina 1 - 1CommandS.Left = CommandS.LeftCommandS.Top = Listl(l).TopCommandS.Enabled = FalseCommandS.Visible = FalseCommand9.Enabled - TrueCommand9.Visible = TrueListl(l).ClearFor i = paginal * 16 + 1 To fil(col)
If i <= paginal * 16 + 16 ThenListl(l).AddItem (c(i, col))
EndlfIf paginal > O Then
CommandS.Left = CommandS.LeftCommandS.Top = Listl(l).TopCommandS.Enabled = TrueCommandS.Visible = True
EndlfDoEvents
Next iEnd SubPrívate Sub Command9_Click()
paginal = paginal + 1CommandS.Left = Command9.LeftCommandS.Top = Listl(l).TopCommandS.Enabled = TrueCommandS.Visible = TrueCommand9.Enabled = FalseCommand9.Visible = FalseListl(l).ClearFor i = paginal * 16 + 1 To fil(col)
If i <= paginal * 16 + 16 ThenListl(l).AddItem (c(i, col))
ElseCommand9.Left - Listl(l).Left + Listl(l).WidthCommand9.Top = Listl(l).Top + Listl(l).Height - Command9.HeightCommand9.Enabled = TrueCommand9. Visible - True
EndlfDoEvents
Next iEnd Sub
188
Prívate Sub CuatroEntradas_Click()n = 4Forml.Caption = "Simplificación"Cali Empezar
End Sub
Prívate Sub DiezEntradas_Click()n=10Forml.Caption = "Simplificación"Cali Empezar
End Sub
Prívate Sub DosEntradas_Click()n = 2Forml.Caption = "Simplificación"Cali Empezar
End Sub
Prívate Sub FormJLoad()Tiempo = 1Commandl.BackColor = ColorInicialBotonesCommandH.BackColor = ColorInicialBotonesCommand2.BackColor = ColorInicialBotonesCommand3.BackColor = ColorInicialBotones
End Sub
Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y AsSingle)
Commandl.BackColor - ColorlmcialBotonesCommand2.BackCoior = ColorInicialBotonesCommandH.BackColor = ColorInicialBotonesCommand3.BackColor = ColorInicialBotones
End Sub
Prívate Sub Guardar_Click()FormS.Drível.Dríve = Mid(App.Path, 1, 3)Form2.Dirl .Path = App.PathForm2.Textl.Text=""Form2.Show
End Sub
Prívate Sub IngresarMinterminos_Click()LimpiarForml.Caption = "Simplificación"Label2.Visible = TrucText4. Visible = TrueLabell. Visible = TrueTextl.Text=Ilfl
Textl.Visible = TrueText4.Text = "("
189
Text4.SetFocusText4.SelStart = Len(Text4.Text)m = 0
End SubPrívate Sub Listl_CIick(Index As Integer)
If Index = O And col > 1 Then Listl(Index).ToolTipText = "(" & O(paginaO * 16 +Listl(0).ListIndex + 1, col - 1) & ")"
If Index = O And col = 1 Then Listl(Index).ToolTipText = "(" & O(paginaO * 16 +Listl(0).ListIndex + 1, 0) & ")"
If índex = 1 Then Listl(Index).ToolTipText = "(" & O(paginal * 16 +Listl(l).ListIndex + 1, col) & ")"
DoEventsEnd SubPrívate Sub List2_Click(Index As Integer)
Label3(Index).Left = List2(Index).LeftLabel3(Index).Top = List2(Index).Top + List2(Index).HeightLabel3(Index).Caption = O(List2(Index).ListIndex + 1, col + índex + 1)Label3(Index).Visible = True
End Sub
Prívate Sub Menu_Click()Command3_Click
End Sub
Prívate Sub NueveEntradas_ClickQn = 9Forml.Caption = "Simplificación"Cali Empezar
End Sub
Prívate Sub OchoEntradas_Click()n = 8Forml.Caption = "Simplificación"Cali Empezar
End Sub
Prívate Sub SeisEntradas_Click()n = 6Forml.Caption= "Simplificación"Cali Empezar
End SubPrívate Sub SieteEntradas_Click()
n = 7Forml.Caption = "Simplificación"Cali Empezar
End Sub
Prívate Sub Simplificar_Click()Do
Commandl Click
190
Loop Until Resultado = TrueEnd Sub
Prívate Sub Simplificaranterior_Click()Cali Command2_ClickEnd SubPrívate Sub Simppaso_Click()
Cali Commandl_ClickEnd Sub
Prívate Sub Teoria_Click()Texto. Show
End Sub
Prívate Sub Textl_Change()DosEntradas.Checked = FalseTresEntradas.Checked = FalseCuatroEntradas.checked = FalseCincoEntradas.Checked = FalseSeisEntradas.Checked = FalseSieteEntradas.Checked = FalseOchoEntradas.Checked = FalseNueveEntradas.Checked = FalseDiezEntradas.Checked = FalseIf n = 2 Then DosEntradas.Checked = TrueIf n = 3 Then TresEntradas.Checked = TrueIf n = 4 Then CuatroEntradas.checked = TrueIf n = 5 Then CincoEntradas.Checked = TrueIf n = 6 Then SeisEntradas.Checked = TrueIf n = 7 Then SieteEntradas.Checked = TrueIf n = 8 Then OchoEntradas.Checked = TrueIf n = 9 Then NueveEntradas.Checked = TrueIf n = 10 Then DiezEntradas.Checked = True
End Sub
Prívate Sub Text2_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)DoEventsIf Text2(Index).Text= "1" Then
r(Index + pagina * 64) = 1Else
If Text2(Index).Text = "O" Thenr(Index + pagina * 64) = O
Elser(Index + pagina * 64) = 2
EndlfEndlfa = Text2(Index).TextIf a o "O" And a o "1" And a o "" Then
mensage = MsgBox("Ingrese solamente O o 1", vbOKOnly, "Peligro")Text2(Index).Text=""
191
r(Index + pagina * 64) = 2EndlfCali LimpiarCali ContarCali ActualizarT4
End SubPrívate Sub Text2_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscü = vbKeyRetnrn ThenKeyAscii = O
EndlfDoEventsIf Text2(lndex).Text = "1" Then
r(Index + pagina * 64) = 1Else
If Text2(Index).Text= "O" Thenr(Index + pagina * 64) = O
Elser(Index + pagina * 64) = 2
EndlfEndlfa = Text2(Index).TextIf a o "O" And a o " 1" And a o "" Then
mensage = MsgBox("Ingrese solamente O o 1", vbOKOnly, "Peligro")Text2(Index).Text =""r(Index + pagina * 64) = 2
EndlfCali LimpiarCali ContarCali ActualizarT4
End SubPublic Sub Text2_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 38 And Index > O Then Text2(Index - l).SetFocusIf (KeyCode = 40 Or KeyCode = 13) And índex < (2 A n - 1) - pagina * 64 Then
If Index < 63 ThenText3(Index + l).Height = 150Text2(Index + l).Height = 150Text3(Index + l).Width = Text3(Index).WidthText2(Index + l).Width = Text2(Index).WidthText3(Index + l).Left - Text3(Index).LeftText2(Index + l).Left = Text2(Index).LeftText3(Index + l).Top = Text3(Index).Top + Text3(Index).HeightText2(Index + l),Top = Text3(Index + l).TopText3(Index + l).Text = f(Index + 1 + pagina * 64)Text2(Index + 1 ).ToolTipText = nf(M & Index + 1 + pagina * 64 & ")"
EndlfIf Index = 15 Or Index = 31 Or Index = 47 Then
If Text3(Index + 1).Visible = False ThenFor il = O To índex
Text3(il).Left = Text3(il).Left - (Text3(il).Width + Text2(il).Width) / 2Text2(il).Left = Text3(il).Left + Text3(il).Width
192
NextilEndlfText3(Index + l).Top = 2880Text3(Index + l).Left = Text2(Index).Left + Text2(Index).Width + 40Text2(Index + l).Top = 2880Text2(Index + l).Left = Text3(Index + l).Left + Text3(Index + l).Width
EndlfIf Index < 63 Then
Text3(Index + 1). Visible = TrueText2(Index + 1). Visible = TrueText2(Index + l).SetFocus
EndlfIf Index - 63 And (2 A n) - 1 > 63 + pagina * 64 Then
If CommandS.Visible = False Thenpagina = pagina + 1For i2 = O To Text2.UBound
Text2(i2).Text=""Text3(i2).Text =""
Next i2Text3(0).Text = f(pagina * 64)Text3(0).Visible = TrueText2(0). Visible = TrueText2(0).SetFocusText2(0).ToolTipText = "f(" & pagina * 64 & ")"Command4.Leñ = Text3(15).LeftCommand4.Top = Text3(15).Top + Text3(15).Height + 20Command4.Enabled = TrueCommand4.Visible = True
ElseCali Command5_Click
EndlfEndlf
EndlfEnd Sub
Prívate Sub Text4_KeyPress(KeyAscii As Integer)KeyAscii = valida_Numero(KeyAscii)
End Sub
Prívate Sub Text4_KeyUp(KeyCode As Integer, Shiñ As Integer)If KeyCode = 32 Or KeyCode = 13 Then
Text4.Enabled = False
'Esta sección ubica la posición donde inicia y donde termina el numero dentr'dentro del Text4
p2 = 2For i = 3 To Len(Text4.Text)
193
If Mid(Text4.Text, i, 1) = " " Or Asc(Mid(Text4.Text, i, 1)) = 10 OrAsc(Mid(Text4.Text, i, 1)) = 13 Or Mid(Text4.Text, i, 1) = ")" Then
I f p 2 - p l > l T h e nsubíndice = Mid(Text4.Text, pl, p2 - pl)
EndlfEndlf
Next iIf Val(subindice) < 1024 And Val(subindice) >= O Then
LimpiarDesactivarFor i = O To UBound(r)
f(i) = ""r(i) = 2
Next ip2 = 2For i = 3 To Len(Text4.Text)
If Mid(Text4.Text, i, 1) = "" Or Asc(Mid(Text4.Text, i, 1)) = 10 OrAsc(Mid(Text4.Text, i, 1)) = 13 Or Mid(Text4.Text, i, 1) = ")" Then
p l=p2p2 = iI fp2-p1 >1 Then
subindice = Mid(Text4.Text, pl, p2 - pl)r(Val(subindice)) = 1pagina = Int(Val(subindice) / 64)
EndlfEndlf
Next iIf n o Val(Int(Abs(Log(Val(subindice) + 0.6) / Log(2)) + 1)) Then
n = Val(Int(Abs(Log(Val(subindice) + 0.6) / Log(2)) + 1))EndlfIf n o m Then
For i - O To Text2.UBoundText3 (i). Visible = FalseText3(i).FontSize - 8Text3(i),Locked = FalseText2(i).Visible = FalseText2(i).FontSize - 8
Next iText3(0).Height=150Text2(0).Height=150Text3(0).Width - n * 150 + 150 / nText2(0).Width = 200Text3(0).Top = 2880Text2(0).Top = 2880Text3(0).Left = Forml.Width /2 - (Forml.Text3(0).Width +
Forml .Text2(0).Width) - 400Text2(0).Leñ = Forml .Text3(0).Left + Forml .Text3(0).WidthText3(0).Visible = Truc
194
Text2(0). Visible = TrueCommandS.Enabled = FalseCommand5. Visible = FalseCommand4.Enabled = FalseCommand4.Visible = Falsem = n
EndlfIfKeyCode = 32Then
For i = O To Val(subindice)Ifr(i) = 2Thenr(i) = 0
NextiEndlfIfKeyCode=13Then
For i = O To (2 A n) - 1Ifr(i) = 2Thenr(i) = 0
NextiEndlfTextl.Text = nActualizarfActualizarT4DoEventsIf(2An)<=64Then
For i = O To (2 A n) -1Text3(i).Text=f(i)Ifr(i)-OOrr(i)-lThen
Text2(i).Text = r(i)Else
Text2(i).Text=""EndlfCali Text2_KeyUp((i), (40), (0))DoEvents
NextiElse
For i - O To 63Text3(i).Text - f(i + pagina * 64)If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Text2(i).Text = r(i + pagina * 64)Else
Text2(i).Text=""EndlfCali Text2_KeyUp((i), (40), (0))DoEvents
Next iCommand4.Leñ = Text3(15).LeftCommand4.Top = Text3(15).Top + Text3(15).Height + 20Command4,Enabled = TrueCommand4.Visible = True
EndlfText4.Width - Text4.Width + 200Contar
195
ElseActualizarT4
EndTfText4.Enabled = TrueGuardar. Enabled = TrueText4.SelStart = Len(Text4.Text) -Text4.SetFocus
EndlfEnd SubSub LimpiarQ
Fori = OToListl.UBoundListl(i).ClearList 1 (i). Visible = False
Next iCommandó.Enabled = FalseCommand7.Enabled = FalseCommandó.Visible = FalseCommand7.Visible = FalseCommandS.Enabled = FalseCommand9.Enabled = FalseCommandS.Visible = FalseCommand9.Visible = FalseCommandlO. Visible — FalseCommandl 1 .Visible = FalseCommandl 2.Visible = FalseCommandl 3. Visible = FalseFor i = O To max
For j = O To MaxColMarca(i,j)=""Grupo(i,j) = 0
NextjNext iFor i = O To max
Forj-OTofíl(O)Tabla(iJ)=""
NextjNext iFor i = O To max
filaAnulada(i) = FalseNext iFor i - O To fíl(O)
numeroFila(Í) = OcolumnaAnulada(i) = False
Next iFor i = O To Titulo.UBound
Titulo(i). Visible = FalseTitulo(i).Caption - ""
Next iFor i = O To MaxCol
fíl(i) - O
196
NextiTextó.Visible = FalseList2(0).Visible = FaiseList2(l).Visible = FalsePicturel. Visible = FalsePicturel.Clsvalizcom = Forml .Width - Commandl .Width - 360m = 0col = 0Resultado = Falselineas = Falseescenciales = Falseultima = Falsemarcas = FalseTablalmplicantes = FalseImplicantes = Falsemax = OMaxCol = OMaxColCubos = OAuxl = OAux2 = 0
End Sub
Prívate Sub TresEntradas_Click()n = 3Forml.Caption^ "Simplificación"Cali Empezar
End SubPrívate Sub Tutoria_Click()
Tutorial.ShowEnd Sub
FORM2.
Prívate Type Registrocombinación As String * 20respuesta As String * 1
End TypePrívate dato As RegistroPrívate Sub Cancelar_Click()
Unload MeForml.Enabled = TrueForml. Show
End Sub
Prívate Sub Commandl_Click()nombrecarpeta = InputBox("Nombre de la Carpeta")MkDir (Dirl.Path & "\ & nombrecarpeta)Dirl.Path = Dirl.Path & "\ & nombrecarpeta
197
End Sub
Prívate Sub Dirl_Change()Filel.Path = Dirl.Path
End Sub
Prívate Sub Drivel_Change()Dirl .Path = Drivel .Orive
End Sub
Prívate Sub Filel_Click()lonar = Len(Filel.FileName)extensión = Mid(Filel.FileName, lonar - 3, 4)If extensión = ".boo" Then
Textl.Text = Mid(Filel.FileName, 1, lonar - 4)Else
Textl.Text = Filel.FileNameEndlfTextl.SetFocus
End SubPrívate Sub Form_Unload(Cancel As Integer)
Cancelar_ClickEnd SubPrívate Sub Guardar_Click()If Textl.Text o ""Then
encuentra = vbNoFor i = O To Filel .ListCount - 1
If Textl.Text & ".boo" = Filel.List(i) Thenresp = MsgBox("El archivo ya existe desea sobreescribir", vbYesNo)encuentra = vbYesExit For
EndlfNextiIf resp = vbYes Or encuentra = vbNo Then
archivo = Dirl.Path + "\ + Textl.Text + ".boo"Forml.Caption = Textl.Text & ".boo"Forml.Enabled = TrueOpen archivo For Random As 1 Len = Len(dato)
For i = 1 To 2 A ndato.combinacion - f(i - 1)dato.respuesta = r(i - 1)Put 1, i, dato
NextiCióse 1Cancelar_Click
EndlfElse
resp = MsgBox("Ingrese un nombre", vblnformation, "Información")EndlfEnd Sub
198
Prívate Sub Textl_KeyPress(KeyAscii As Integer)If KeyAscii =13 Then
Cali Guardar_ClickEndlf
End Sub
FORM3
Prívate Type Registrocombinación As String * 20respuesta As String * 1
End TypePrívate dato As RegistroPrívate Sub Commandl_Click()IfTextl.Texto ""Then
Forml.Textl.Enabled = FalseForml.Text4.Enabled = FalseForml.Mensaje.Caption = "Abriendo el archivo"Forml.Mensaje. Visible = TrueDoEventsCali Forml.LimpiarCali Forml.DesactivarForml.Enabled = Truearchivo - Dirl.Path + "\ + Textl.TextForml.Caption = Textl.TextOpen archivo For Random As 1 Len = Len(dato)nreg = LOF(l) / Len(dato)n = (Log(nreg))/(Log(2))For i = O To UBound(r)
f(i) = ""r(i) = 2
Next iCali Forml.ActualizarT4For i = 1 To nreg
Get 1, i, datof(i - 1) = dato.combinacionr(i - 1) = Val(dato.respuesta)
Next iForm3. Visible = FalseForml .Visible = TrueDoEventsFor i = O To Forml .Text2.UBound
Forml. Text3 (i). Visible = FalseForml.Text3(i).FontSize = 8Forml.Text3(i).Locked = FalseForml .Text2(i).Visible = FalseForml.Text2(i).FontSize = 8
Next iForml. Text3(0).Height = 150Forml.Text2(0).Height = 150
199
FormLText3(0).Width - n * 150 + 150 / nForml.Text2(0).Width = 200Forml.Text3(0).Top = 2880Forml.Text2(0).Top = 2880Forml .Text3(0).Left = Forml .Width / 2 - (Forml .Text3(0).Width +
Forml.Text2(0).Width) - 400Forml .Text2(0).Left = Forml.Text3(0).Left + Forml.Text3(0). WidthFormLText3(0).Visible = TrueForml.Text2(0). Visible = TrueForml.Command5.Enabled = FalseForml. Command5. Visible = FalseForml.Command4.Enabled = FalseForml .Command4.Visible - Falsepagina = Int(((2An)-l)/64)Forml.Text2(0).ToolTipText = "f(" & pagina * 84 & ")"If2An<-64Then
For i - O To (2 A n) - 1Forml.Text3(i).Text = f(i)Ifr(i) = OOrr( i )=lThen
Forml.Text2(i).Text = r(i)Else
Forml .Text2(i).Text=""EndlfCali Forml.Text2_KeyUp((i), (40), (0))DoEvents
Next iElse
For i = O To 63Forml.Text3(i).Text = f(i + pagina * 64)If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Forml.Text2(i).Text - r(i + pagina * 64)Else
Forml. Text2(i).Text=""EndlfCali Forml.Text2_KeyUp((i), (40), (0))DoEvents
Next iForml. Command4.Left = Forml. Text3(15).LeftForml.Command4.Top = Forml.Text3(15).Top + Forml.Text3(15).Height + 20Forml.Command4.Enabled = TrueForml.Command4.Visible = True
EndlfGlose 1Forml.Guardar.Enabled — Truecol = 0m = nForml .ClsForml.Labell. Visible = TrueForml.Textl.Visible = TrueForml .Textl .Text = n
200
Forml.Mensaje.Caption = "Actualizando los registros"DoEventsCali Forml.ActualizarT4Cali Forml.ContarCommand2_ClickForml.Mensaje.Visible = FalseForml.Text4.Enabled = True
ElseMsgBox ("Ingrese un nombre de archivo")
EndlfEnd Sub
Prívate Sub Command2_ClickQUnload MeForml .Enabled = TrueForml. Show
End SubPrívate Sub Dirl_Change()
Filel.Path = Dirl.PathEnd SubPrívate Sub Drivel_Change()
Dir 1 .Path = Drive 1 .DriveEnd Sub
Prívate Sub Filel_Click()Textl .Text = Filel .FileNameTextl .SetFocus
End Sub
Prívate Sub Filel_DblClick()Textl .Text = Filel .FileNameCali Commandl_Click
End SubPrívate Sub Form_Unload(Cancel As Integer)
Command2_ClickEnd Sub
Prívate Sub Textl_KeyPress(KeyAscü As Integer)If KeyAscii = 13 Then
Commandl_ClickEndlf
End Sub
FORMULARIO INICIAL
Prívate Sub Commandl_Click()Texto.Show 'Abre el formulario del Texto
End Sub
201
Prívate Sub Commandl_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)'Actualiza los colores de los comandos.
Commandl .BackColor = ColorEnfoqueConunand2.BackColor = ColorlnicialBotonesCommand3.BackColor = ColorlnicialBotonesCommand4.BackColor = ColorlnicialBotones
End SubPrívate Sub Command2_Click()
Forml.Show 'Abre el formulario de la simplificaciónEnd SubPrívate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)'Actualiza los colores de los comandos.
Commandl .BackColor = ColorlnicialBotonesCommand2.BackColor = ColorEnfoqueCommandS. BackColor = ColorlnicialBotonesCommand4.BackColor = ColorlnicialBotones
End SubPrívate Sub Command3_Click()
End Termina la ejecución del programna.End SubPrívate Sub Command3_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorEnfoqueCommand4.BackColor - ColorlnicialBotones
End SubPrívate Sub Command4_Click()
Tutorial.Show 'Indica el formualario del tutorial de uso del programa.End Sub
Prívate Sub Command4_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesCommand4.BackColor = ColorEnfoque
End SubPrívate Sub Forrn_Load()'Actualiza los colores de los comandos.
ColorlnicialBotones = &HFF8080ColorEnfoque = &HCOFFFFCommandl .BackColor = ColorlnicialBotonesCommandl.BackColor = ColorlnicialBotonesCommand3.BackColor = ColorlnicialBotones
202
Command4.BackColor = ColorlnicialBotonesEnd Sub
Prívate Sub Form_MouseMove(Button As Integer, Shiñ As Integer, X As Single, Y AsSingle)'Actualiza los colores de los comandos,
Commandl.BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesCommand4.BackColor = ColorlnicialBotones
End SubPrívate Sub Framel_MouseMove(Button As Integer, Shift As Integer, X As Single, YAs Single)'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotonesCommand2.BackColor - ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesCommand4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Labell_MouseMove(Button As Integer, Shift As Integer, X As Single, YAs Single)'Actualiza los colores de los comandos.
Commandl .BackColor = ColorlnicialBotonesCommandl.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesCommand4.BackColor = ColorlnicialBotones
End SubPrívate Sub Picturel_MouseMove(Button As Integer, Shift As Integer, X As Single, YAs Single)'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommand3.BackColor = ColorlnicialBotonesCommand4.BackColor = ColorlnicialBotones
End Sub
FORMULARIO SPLASH
Option ExplicitPrívate Sub Form_KeyPress(KeyAscii As Integer)
Unload MeFormulariolnicial. Show
End SubPrívate Sub Form_Load()
IblVersion.Caption = "Electrónica y Telecomunicaciones"IblProductName.Caption = "Simplificación de Funciones Booleanas"
End SubPrívate Sub Timerl_Timer()
Unload Me
203
Formulariolnicial. ShowEnd Sub
FORMULARIO TEXTO
Prívate Sub Commandl ClickQUnload MeFormularioInicial.Show
End SubPrívate Sub Commandl JVÍouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)
Commandl .BackColor = ColorEnfoqueCommand2.BackColor = ColorlnicialBotones
End SubPrívate Sub Conimand2_Click()
n = Printers.Count - 1Combo l.ClearFor i = O To n
Combo 1 .Addltem (Prínters(i).DeviceName)Next iCombo 1 .Text = Printer.DeviceNameFrame2.Visible = Truc
End SubPrívate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)
Command2.BackColor = ColorEnfoqueCommandl.BackColor = ColorlnicialBotones
End SubPrívate Sub Command3_Click()
Dim X As PrinterFor Each X In Printers
If X.DeviceName = Combo 1.Text Then' La define como predeterminada del sistema.Set Printer = X' Sale del bucle.Exit For
EndlfNextPrinter. DrawMode = 1RichTextBoxl.SelPrint (Printer.hDC)Printer.EndDocFrame2.Visible = False
End Sub
Prívate Sub Command4_Click()Frame2.Visible = False
End Sub
Prívate Sub Forrn_Load()RichTextBoxl.LoadFile (App.Path & "\Texto.rtf')
204
End SubPrívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y AsSingle)
Commandl .BackColor — ColorlnicialBotonesCommand2.BackCoIor = ColorlnicialBotones
End Sub
Prívate Sub Programa_Click()Me.HideForml .Show
End SubPrívate Sub Tutoria_Click()
Me.HideTutorial.Show
End Sub
FORMULARIO TUTORIAL
Dim re(16) As StringDim ce(12, 6) As StringDim mo(12, 6) As StringDim TablaT(4, 9) As StringDim so(9) As IntegerDim Ultimo As BooleanConst Tiempo = 0.5Prívate Sub MostrarTutorialQ 'esta sección consta todo el código para mostrar el tutorialUltimo = False 'Sirve para controlar y saber si ya se ha llegado a la ultima pantalla de lasimplificaciónMe.Cls 'Borra todo el formularioIf Tutor <= 22 And Commandl4.Enabled = True Then
Comrnandl4.Enabled = FalseEndlfIf Tutor <= 18 Then
Labell. Visible = FalseTextl. Visible = False
ElseLabell. Visible = TrueTextl .Visible = True
Endlf
Select Case TutorCase O
Función. Visible — TruePrograma. Visible = TrueTeoria. Visible = TrueTutorial.Picture = LoadPicture(App.Path & "\fondoTutorial.bmp")LabeB.Caption = "Para iniciar el Tutorial presione SIGUIENTE"' & vbCrLf & "Para
ir a la simplificación Presione el menú Simplificar" & vbCrLf & "Para ver la teoríapresionar el menú Teoria"Case 1
205
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl.bmp")LabeO.Caption = "El programa de Simplificación esta compuesto por: MENÚ,
EDITOR DE MINTERMINOS, INDICADOR DE VARIABLES, TABLA DECOMBINACIONES, Y COMANDOS"Case 2
Tutorial.Picture = LoadPicture(App.Path & "\Tutor2.bmp")LabeO.Caption = "El Menú tiene 3 opciones principales:" & vbCrLf & " FUNCIÓN,
TUTORIAL y TEORÍA"Case 3
Tutorial.Picture = LoadPicture(App.Path & "\Tutor3.bmp")LabeO.Caption = "El menú FUNCIÓN contiene: Nuevo, Abrir, Guardar, Simplificar,
Simplificar Siguiente Paso, Simplificar Paso Anterior y Pantalla Inicial"Case 4
Tutorial.Picture = LoadPicture(App.Path & "\Tutor4.bmp")LabeO.Caption = "El menú TUTORIAL le permite pasar de la simplificación a este
tutorial"Case 5
Tutorial.Picture = LoadPicture(App.Path & "\Tutor5.bmp")LabeO.Caption = "El menú Teoría sirve para pasar del proceso de simplificación a la
teoría sobre el método Quine McCluskey"Case 6
Tutorial.Picture = LoadPicture(App.Path & "\Tutor6.bmp")LabeO.Caption = "La opción FUNCIÓN / NUEVO permite ingresar una función
nueva ya sea como ECUACIÓN DE MINTERMINOS, o como TABLA DECOMBINACIONES"Case 7
Tutorial.Picture = LoadPicrure(App.Path & "\Tutor7.bmp")LabeO.Caption = "La Opción ABRIR permite leer una tabla grabada previamente en
disco con extensión .boo por ejemplo: 'funcionSb.boo'"Case 8
Tutorial.Picture = LoadPicture(App.Path & "\Tutor8.bmp")LabeO.Caption - "La opción GUARDAR graba en disco una tabla de combinaciones
o función con extensión .boo (el programa la pone automáticamente)"Case 9
Tutorial.Picture = LoadPicture(App.Path & "\Tutor9.bmp")LabeO.Caption = "La opción SIMPLIFICAR Simplifica completamente la función
booleana hasta el final en forma automática"Case 10
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl0.bmp")LabeO.Caption = "Simplifica paso por paso la función y es equivalente a presionar el
comando SIGUIENTE"Case 11
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl l.bmp")LabeO.Caption = "Regresa al paso anterior del proceso de simplificación de la
función"Case 12
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl2.bmp")LabeO .Caption = "Regresa al menú principal"
Case 13TutoriaLPicture = LoadPicture(App.Path & "\Tutorl3.bmp")
206
Label3.Caption = "Esta opción permite INGRESAR LOS MTNTERMINOS de unanueva función booleana"Case 14
Label2.Visible = FalseText4.Visible = FalseFori = OTo l5
Text3(i).Visible = FalseText2(i).Visible = False
Next iFuncion.Enabled = FalseFunción. Visible = FalsePrograma. Visible = FalseTeoria.Visible = FalseTutorial.Picture = LoadPicture(App.Path & "\Tutorl4.bmp")LabeO.Caption = "Esta opción sirve para ingresar la TABLA DE
COMBINACIONES de una función nueva (Máximo 10 variables de entrada)"Case 15
Tutorial.Picture = LoadPicture(App.Path & "\fondoTutorial.bmp")Label2.Visible = FalseText4.Visible = FalseFori = OTo 15
TextS (i). Visible - FalseText2(i). Visible = False
Next iFuncion.Enabled = TrueFuncion.Visible = TruePrograma. Enabled = FalsePrograma. Visible = TrueTeoria.Enabled = FalseTeoría. Visible = TrueAbrir.Enabled = FalseIngresarTabla.Enabled — FalseLabel3.Caption = "A continuación se hará un ejemplo de simplificación con 4
variables de entradas Para eso haga clic en:" & vbCrLf & " FUNCIÓN / NUEVO /INGRESARMINTÉRMINOS "
IngresarMinterminos. Enabled = TrueUltimo = True
Case 16Tutoría!. Cls
Text3 (i). Visible = FalseText2(i).Visible = False
Next iIngresarMmterminos_ClickMe.ClsCommandl .Enabled = FalseLabeB.Top = Text4.Top + Text4.HeightLabel3.Caption - "Mientras escribe los mintérminos, en la tabla de combinaciones
aparecerá el valor ingresado"Label3.Left = Tutorial.Width / 2 - Label3.Width / 4
207
For i = 1 To 16
cont = OText3(i-l) = n"Do
cont = cont + 1res = Q Mod 2Q = Q\Text3(i - 1) = Str(res) + Text3(i - 1)
Loop Until (cont = 4)Next iText4.Text="("DoEventsFor i = O To Text3.UBound
Text3(i).Height=150Text2(i).Height=150Text3(i).Width = 4 * 150 + 150 / 4Text2(i).Width = 200Text3(i).Left - Tutorial.Width / 2 - (Text3(i).Width + Text2(i).Width) - 400Text2(i).Leñ = Text3(i).Left + Text3(i).WidthText3(i).Top = 2880 + (i) * Text3(i).HeightText2(i).Top = Text3(i).TopIf re(i) = "1" And ¡ o 9 Then
Text4.Text = Text4.Text & Str(i) & 1( "BeepMe.ClsMe.DrawWidth = 2Me.Line (Label3.Left + 0.75 * Label3.Width, Label3.Top + Label3.Height)-
(Text2(i).Left + Text2(i).Width> Text2(i).Top)DoEventsIf Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 75 / Len(Text4.Text) + 200Text4.Height =
ElseText4.Height =Text4.Width = 75 * 50 + 75 / 50 + 200
EndlfText4.SelStart = Len(Text4.Text)Text4.SetFocus
EndlfIfi<=13Then
Text3(i).Visible = TrueText2(i).Visible - TrueIfio9Then
Text2(i).Text - re(i)Else
Text2(i).Text - "O"Endlf
ElseText2(i).Text - re(i)
208
EndlfTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo
Next iText4.Text = Text4.Text & ")"Label3.Caption = "Cuando se termina de ingresar todos los mintérminos, se presiona
<ENTER> para completar la tabla"Label3.Left = Tutorial.Width / 2 - LabeB.Width / 4DoEvents
Case 17Text4.Visible = TrueFuncion.Enabled = FalsePrograma.Enabled = TrueTeoría. Enabled = TrueMe.Line (LabelS.Left + LabeB.Width / 2, LabelS.Top + Label3.Height>
(Text2(0).Leñ + Text2(0).Width / 2, Text2(0).Top)Fori = OTol3
Text3 (i). Visible = TrueText2(i). Visible = True
Next iTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoText3(14).Visible = TrueText2(14).Visible = TrueTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoText3(15).Visible = TrueText2(15).Visible = TrueIf Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 75 / Len(Text4.Text) + 200Text4.Height = 215
ElseText4.Height - 2 * 237Text4.Width = 75 * 50 + 75 / 50 + 200
EndlfLabel3.Caption = "Otra forma de ingresar la función es ingresando en la TABLA DE
COMBINACIONES"CaselS
Fori = OTo 15Text3(i).Visible = FalseText2(i).Visible = False
Next iLabel2.Visible = FalseText4.Visible = False
209
LabeO.Caption = "Para ingresar los valores en la tabla de combinaciones se "LabeO.Caption = LabeB.Caption & "presiona: FUNCIÓN / NUEVO / INGRESAR
TABLA / n ENTRADAS (en este ejemplo n=4)"Funcion.Enabled = TrucPrograma.Enabled = FalseTeoria.Enabled = FalseIngresarTabla.Enabled = TrueIngresarMinterminos.Enabled = FalseUltimo = True
Case 19Titulo(0).Visible = FalseList 1(0). Visible = FalseFori = OTol5
Text3(i).Visible = FalseText2(i). Visible = False
Next iText4.Text=""CuatroEntradas_ClickCommandl .Enabled = FalseFori-OTo 15
Text3(i).Visible = TrueText2(i).Text = ""Text2(i).Visible = TrueLabeO.Caption = "Mientras se van poniendo las salidas, automáticamente se irán
ecribiendo los mintérminos en el editor de mintérminos"Text2(i).SetFocusMe.Line (Text4.Left + 200, Text4.Top + Text4.Height)-(Label3.Lefís LabeB.Top
+ Label3.Height/2)Timerl = TimerDo
DoEventsLoop Until Timer - Timerl > TiempoIfio9Then
Text2(i).Text = re(i)Else
Text2(i).Text = "O"EndlfIf re(i) = " 1" And i o 9 Then
Text4.Text = Text4.Text & " " & Str(i)Beep
EndlfText2(i).SeIStart = Len(Text2(i).Text)Text2(i).SetFocusTimerl = TimerDo
DoEventsLoop Until Timer - Timerl > TiempoIf Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 200Text4.Height =
210
ElseText4.Height - 2 * 237Text4.Width = 75 * 50 + 75 / 50 + 200
EndlfTimerl = TimerDo
DoEventsLoop Until Timer - Timerl > Tiempo / 2
Next iText4.Text = Text4.Text & " )"Me.ClsLabelS.Caption = "Una vez que se ha ingresado toda la función sea con los
mintérminos o en la tabla de combinaciones, se debe revisar que no tenga errores, encuyo caso se debe corregirlo "Case 20
Text4.Text =" ("Fori = OTol5
If re(i) = "1" And i o 9 Then Text4.Text = Text4.Text & ?1 " & Str(i)Next iText4.Text = Text4.Text & ")"Text2(9).Text = "O"Label3.Caption = "La corrección se puede hacer ya sea en la tabla de combinaciones,
como en el editor de mintérminos, como se indica a continuación. Haga clic en el botónSiguiente"
Me.Line (Text4.Left + 400, Text4.Top + Text4.Height)-(Label3.Left, Label3.Top +Label3.Height/2)
Me.Line (Text2(0).Leñ + Text2(0).Width, Text2(0).Top)-(Label3.Left +LabeB.Width / 2, LabelS.Top + Label3.Height)Case 21
Text4.Text="("Fori = OTo 15
If re(i) = "1" And i o 9 Then Text4.Text = Text4.Text & " n & Str(i)Next iText4.Text = Text4.Text & ")"Text2(9).Text=H0H
LabeD.Caption = "Si se corrige en el editor de mintérminos la tabla decombinaciones se actualizará automáticamente como vemos en este ejemplo"
For i = 1 To 22Text4.SelStart = iText4.SetFocusTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo / 2
Next icadena = Text4.Text &" "Mid(cadena,23)="910 13)"Text4.Text = cadenaText4.SelStart - 23Text4.SetFocus
211
Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo / 2cadena = Text4.TextMid(cadena, 23) = "9 10 13)"Text4.Text = cadenaText4.SelStart = 24Text4.SetFocusTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo / 2cadena = Text4.TextMid(cadena, 23) = "9 10 13)"Text4.Text = cadenaText4.SelStart - 25Text4.SetFocusTimerl = TimerDo
DoEventsLoop Until Tirner - Timerl >= Tiempo / 2Text2(9).Text = ""BeepMe.Line (LabeB.Left + LabeD.Width / 2, LabeO.Top + Label3.Height)-
(Text2(9).Left + Text2(9).Width, Text2(9).Top)Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoText2(9).Text = "l"Label3.Caption = "La corrección también se lo puede hacer en la tabla de
combinaciones como se muestra a continuación."Case 22
Text4.Text ="("Fori = OTo l5
If re(i) = n 1" And i o 9 Then Text4.Text - Text4,Text & "" & Str(i)Next iText4.Text = Text4.Text & ")"Text2(9).Text = "O"DoEventsLabeB.Caption = "Si la corrección se hace en la tabla de combinaciones entonces el
editor de mintérminos se actualizará automáticamente"For i^OTo 12
Text2(i).SelStart=lText2(i).SetFocusTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo
212
Next iFori=12To9Step-l
Text2(i).SelStart = 1Text2(i).SetFocusTimerl = TimerDo
DoEventsLoop Untíl Timer - Timerl >= Tiempo
Next iText2(9).Text=""Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoText2(9).Text=fT'DoEventsBeepMe.Lme (Text4.Left + 1000, Text4.Top + Text4.Height)-(Label3.Left, LabeB.Top +
Label3.Height/2)Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempocadena = Text4.Text & " "Mid(cadena, 23) = "9 10 13)"Text4.Text = cadena
Case 23Titulo(0).Visible = FalseListl(0).Visible = FalseTitulo(l). Visible = FalseListl(l).Visible = FalseFori = OTo 15
Text3(i).Visible = TrueText2(i).Visible = True
Next iLabel3.Caption = "Una vez que se ha ingresado y corregido los datos, se procede a
simplificar. La simplificación se puede realizar paso a paso presionando el botónSiguiente, ó, puede ir directamente a la solución haciendo clic en el botón Terminar "
Me.Line (Label3.Left + Label3.Width / 2, Label3.Top + LabeB.Height)-(Framel.Leñ, Framel.Top + Commandl.Top + Commandl.Height/2)
Me.Line (LabeB.Left + Label3.Width / 2, LabeB.Top + LabeB.Height)-(Framel.Left, Framel.Top + CommandH.Top + CommandH.Height/ 2)
Commandl4.Enabled = TrueCase 24
For i = O To Text3.UBoundText3(i). Visible = FalseText2(i). Visible = False
Next iTitulo(0).Top = LabeB.Top + LabeB.HeightTitulo(0).Caption = "MINTERMINOS"
213
Listl(0).Top = Titulo(0).Top + Titulo(0).HeightListl(0).Left = 3000Listl(0).Width = 2.75 * TextWidth("0 0000")Titulo(0).Left = 3000Listl(0).Height = 21 * TextHeight("0")Listl(0).ClearTitulo(0).Visible = TrueListl(O). Visible = TrueFor i = 1 To 9
IfVal(mo(i,0))<10ThenListl(0).AddItem (mo(i, 0) & " " & ce(i, 0))
ElseListl(0).AddItem (mo(i, 0) & " " & ce(i, 0))
EndlfDoEvents
Next iLabeB.Caption = "Esta es la tabla de MINTERMINOS y de CUBOS 0. Como se
ve, esta tabla está ordenada de acuerdo al número de UNOS en cada combinación quetiene salida 1"
Titulo(l).Top = LabeO.Top + LabelS.HeightTitulo(l).Captíon= "CUBOS O"Listl(l).Top = Titulo(l).Top + Titulo(l).HeightListl(l).Left = Listl(0).Left + Listl(0).Width + 1000Listl(l).Width = 3 * TextWidth("0000")Titulo(l).Left = Listl(0).Left + Listl(0).Width + 1000Listl(l).Height = 28 * TextHeight("0")Listl(l).ClearTitulo(l). Visible = TrueList 1(1). Visible = TrueF o r i = l T o l 2
Listl(l).AddItem(ce(i9l))DoEvents
Next iCase 25
Titulo(0).Top = LabeB.Top + Label3.HeightTitulo(0).Caption = "CUBOS O"Listl(0).Top = Titulo(0).Top + Titulo(0).HeightList l(0).Left = 3000Listl (O).Width = 2.75 * TextWidth("0 0000")Titulo(0).Left = Listl(0).Left + Listl(O).Width / 2 - Titulo(0).Width / 2Listl(0).Height = 28 * TextHeight("0")Listl(0).ClearTitulo(0).Visible = TrueListl(0).Visible = TrueF o r i = l Tol2
If i o 2 And i o 5 And i o 10 ThenListl(0).AddItem ("* " & ce(i, 1))
ElseListl(0).AddItem (" " & ce(i, 1))
Endlf
214
DoEventsNextiTitulo(l).Top = LabeB.Top + LabeB.HeightTitulo(l).Caption= "CUBOS 1"Listl(l).Top = Listl(0).TopListl(l).Left = Listl(0).Left + Listl(0).Width + 300Listl(l).Width = 2.75 * TextWidth("0000")Titulo(l).Left = Listl(l).Left + Listl(l).Width / 2 - Titulo(l).Width / 2Listl(l).Height = 28 * TextHeight("0")Listl(l).ClearTitulo(l). Visible = TrucListl(l).Visible = TrueFor i = 1 To 12
Listl(l).AddItem (ce(i, 2))DoEvents
NextiLabeB.Caption - "Aquí están las tablas de los CUBOS O y CUBOS 1." & vbCrLf
& "En los CUBOS O se pone una marca (*) para indicar las combinaciones que hansido usadas para formar los CUBOS 1"Case 26
Titulo(0).Top - LabeB.Top + LabeB.HeightTitulo(0).Caption = "CUBOS 1"Listl(0).Top = Titulo(0).Top + Titulo(0).HeightListl(0).Left = 3000Listl(0).Width = 2.75 * TextWidthf 0000")Titulo(0).Left = Listl(0).Left + Listl(0).Width / 2 - Titulo(0).Width / 2Listl(0).Height = 28 * TextHeight("0")Listl(0).ClearTitulo(0).Visible = TrueListl(0).Visible = TrueF o r i = l T o l 2
If i o 3 And i o 7 And i o 9 And i o 12 ThenListl(0).AddItem("* " & ce(i, 2))
ElseListl(0).AddItem (" " & ce(i, 2))
EndlfDoEvents
NextiTituio(l).Top - LabeB.Top + Label3.HeightTitulo(l).Caption = "CUBOS 2"Listl(l).Top = Listl(0).TopListl(l).Left = Listl(0).Left + Listl(0).Width + 300Listl(l).Width = 2.75 * TextWidth("0000")Titulo(l).Left - Listl(l).Left + Listl(l).Width / 2 - Titulo(l).Width / 2Listl(l).Height = 8 * TextHeight(M0")Listl(l).ClearTitulo(l).Visible = TrueListl(l).Visible = TrueFor i = Í To 3
Listl(l).AddItem (ce(i, 3))
215
DoEventsNext iLabelS.Caption = "Aquí se presentan las tablas de los CUBOS 1 y CUBOS 2." &
vbCrLf & "En los CUBOS 1 existen 2 combinaciones que no se han agrupado, estasforman parte de los implicantes primos"Case 27
Picturel. Visible = FalseTitulo(0).Top = LabeB.Top + Label3.HeightTitulo(0).Caption = "CUBOS 2"Listl(0).Top = Titulo(0).Top + Titulo(0).HeightListl(0).Left = 3000Listl(0).WÍdth = 2.75 * TextWidth(" 0000")Titulo(0).Left = Listl(0).Left + Listl(0).Width / 2 - Titulo(0).Width / 2Listl(0).Height = 8 * TextHeightfO")Listl(0).ClearTitulo(0).Visible = TrueList 1(0). Visible = TrueFor i = 1 To 3
List 1 (0).Addltem (" " & ce(i, 3))DoEvents
Next iTitulo(l).Top = Label3.Top + LabeB.HeightTitulo(l).Captíon= "IMPLICANTES PRIMOS"Listl(l).Top = Listl(0).TopListl(l).Left = Listl(0).Left + 2 * Listl(0).Width + 300Listl(l).Width = 2.75 * TextWidthfOOOO")Titulo(l).Left = Listl(l).Left + Listl(l).Width/ 2 - Titulo(l).Width / 2Listl(l).Height = 10 * TextHeightfO")Listl(l).ClearTitulo(l). Visible = TrueListl(l).Visible = TrueFor i = 1 To 4
Listl(l).AddItem(ce(i,4))DoEvents
Next iLabeB.Caption = "Aqui están las tablas de CUBOS 2 y los IMPLICANTES
PRIMOS. En los CUBOS 2 todas las combinaciones forman parte de los implicantesprimos, ya que no se pueden hacer combinaciones para formar CUBOS 3"Case 28 'Construcción de la tabla de simplificación
so(l) = 0so(2) = 2so(3) = 3so(4) = 6so(5) = 7so(6) = 8so(7) = 9so(8)=10so(9)=13For i = 1 To 4
Forj = l To9
216
TablaT(í,j) =Nextj
Next iTablaT(l,6) = "*"TablaT(l, ?) = "*"TablaT(2,7)-"*"TablaT(2>9) = 11*11
TablaT(3, 1) = "*"TablaT(3, 2) = "*"TablaT(3, 6) = "*"TablaT(3, 8) = "*"TablaT(4, 2) = "*"TablaT(4, 3) = "*"TablaT(4,4) = "*"TablaT(4, 5) = "*"Label3.Caption = "La tabla de simplificación se forma con los implicantes primos y
con los mintérminos; la marca se pone en todas las celdas que coinciden con losimplicantes y los mintérminos utilizados"
Titulo(l). Visible = FalseTitulo(0).Visible = FalseListl(0).Visible = FalseListl(l). Visible = FalseList2(0). Visible = FaiseTitulo(0).Top - LabeB.Height + LabeO.Height + 100Titulo(0).Caption = "TABLA DE SIMPLIFICACIÓN"Titulo(0).Left = Forml.Width / 2 - TituIo(O).Width / 2Picturel.Top = Titulo(0).Top + Titulo(0).HeightTitulo(0).Visible = TrueDoEventsespacio = TextWidth("00000000")ancho = TextWidth("OOOOOOn)alto = 1.25 * TextHeight("0")Picturel.Width = ancho + espacio + 9 * anchoPicturel.Left = Forml.Width / 2 - Picturel.Width / 2Picturel.Height = 6 * altoPicturel.ClsPicturel. Visible = TruePicturel.CurrentX = anchoPicturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picturel.Height), ,BFDoEventsFor i = 1 To 9
Picturel .CurrentX = ancho + espacio + ancho * (i - 1)Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picture 1.Height), ,BFPicturel.CurrentX = ancho + espacio + ancho * (i - 1) + ancho 12-
TextWidth(Str(so(i)))Picture l.Current Y = OPicturel.Print so(i)DoEvents
217
NextiFor i = 1 To 4
Picturel.CurrentY = i * altoPicturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width,
Picturel.CurrentY),, BFPicturel.CurrentX = 1.25 * anchoPicturel.CurrentY = i * altoPicturel.Print ce(i, 4);DoEventsForj = l To9
IfTablaT(iJ) = "*"ThenPicturel.CurrentX = ancho + espacio + ancho * (j - 1) + ancho /2 -
TextWidth("*")Picturel .CurrentY = i * alto + TextHeight(M*") / 8Picturel .Print TablaT(i, j);Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo / 4
EndlfNextjPicturel.Print
DoEventsNextiPicturel.CurrentY = 5 * altoPicturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width, Picturel.CurrentY),
>BFCase 29 'Cálculo de los implicantes primos esenciales
espacio = TextWidthfOOOOOOOO")ancho - TextWidth("000000")alto = 1.25 * TextHeight("0")Picturel.ClsPicturel. Visible = TruePicturel .CurrentX = anchoPicturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentXí
Picturel.Height),, BFDoEventsFor i = 1 To 9
Picturel.CurrentX = ancho + espacio + ancho * (i - 1)Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picturel.Height),, BFPicturel.CurrentX = ancho + espacio + ancho * (i - 1) + ancho 12-
TextWidth(Str(so(i)))Picturel.CurrentY = OPicturel,Print so(i)DoEvents
NextiFor i = 1 To 4
Picturel.CurrentY = i * alto
218
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width,Picturel.CurrentY),, BF
Picturel.CurrentX = 1.25 * anchoPicturel.CurrentY = i * altoPicturel .Print ce(i, 4);DoEventsForj = l T o 9
IfTablaT(iJ)="*"ThenPicturel.CurrentX = ancho + espacio + ancho * (j - 1) + ancho /2 -
TextWidth("*")Picturel.CurrentY = i * alto + TextHeight("*") / 8Picturel .Print TablaT(i, j);DoEvents
EndlfNextjPicturel.Print
DoEventsNext iPicturel.CurrentY = 5 * altoPicturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width, Picturel.CurrentY),
,BFLabel3.Caption = "Los implicantes primos esenciales formarán parte de la solución"Titulo(l).Left = Picturel.LeñTitulo(l).Top = Picturel.Top + Picturel. HeightTitulo(l).Captíon= "ESENCIALES"Titulo(l). Visible = TrueList2(0).Left = Titulo(l).LeftList2(0).Top = Titulo(l).Top + Titulo(l).HeightList2(0).ClearList2(0).Visible = TrueColorLinea = RGB(255, O, 0)Picturel.CurrentX = ancho + espacio + ancho * (1 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel.CurrentX = ancho + espacio + ancho *(!-!) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX5 alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel .CurrentX = ancho / 2Picturel.CurrentY = 3.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel.CurrentX = ancho + 0.85 * espacioPicturel.CurrentY = 3.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLineaPicturel.CurrentX = ancho + espacio + ancho *(!-!) + ancho / 2
219
Picturel.CurrentY = 3.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 1.5 * TextWidth("*"),
ColorLineaList2(0).AddItem ("XOXO")Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel.CurrentX = ancho + espacio + ancho * (2 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel .CurrentX = ancho + espacio + ancho * (2 - 1) + ancho / 2Picturel .CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Pictiirel.CurrentX, alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel .CurrentX = ancho + espacio + ancho * (6 -1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel .CurrentX = ancho + espacio + ancho * (6 - 1) + ancho / 2Picturel .CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel.CurrentX = ancho + espacio + ancho * (8 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel .CurrentX = ancho + espacio + ancho * (8 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.Curren:Y)-(Picturel.CurrentX, alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoColorLinea = RGB(0, 255, 0)Picturel.CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel .CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
220
Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel.CurrentX = ancho / 2Picturel .CurrentY = 4.5 * altoPicturel.Gírele (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel.CurrentX = ancho + 0.85 * espacioPicturel.CurrentY = 4.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLineaPicturel.CurrentX = ancho + espacio + ancho * (3 - 1) + ancho /2Picturel.CurrentY = 4.5 * altoPicturel.Circle(PictureLCurrentX,Picturel.CurrentY), 1.5 * TextWidth("*"),
ColorLineaList2(0).AddItem ("OX1X")Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel .CurrentX = ancho + espacio + ancho * (4 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLineaPicturel.CurrentX = ancho + espacio + ancho * (4 - 1) + ancho / 2PictureLCurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel .CurrentX = ancho + espacio + ancho * (5 - 1) + ancho / 2PictureLCurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLineaPicturel.CurrentX = ancho + espacio + ancho * (5 - 1) + ancho / 2Picturel .CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoColorLinea = RGB(0, O, 255)Picturel .CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLineaPicturel .CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2PictureLCurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
221
Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel.CurrentX = 0.5 * anchoPicturel.CurrentY = 2.5 * altoPicturel.Gírele (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel.CurrentX = ancho -f- 0.85 * espacioPicturel.CurrentY = 2.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLineaPicturel.CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2Picturel.CurrentY = 2.5 * altoPicturel.Circie (Picturel.CurrentX, Picturel.CurrentY), 1.5 * TextWidth("*fl),
ColorLineaList2(0).AddItem ("1X01")Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoPicturel.CurrentX = ancho + espacio + ancho * (7 - 1) + ancho / 2Picturel.CurrentY = 5.5 * altoPictureLCircle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLineaPicturel .CurrentX = ancho + espacio + ancho * (7 - 1)+ ancho / 2Picturel.CurrentY = 5.5 * altoPicturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLineaTimerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo
Case 30Labeló.Visible = FalseTituio(0).Visible = TrueTitulo(l). Visible = TruePicturel.Visible = TrueList2(0).Visible = TrueLabeB.Caption = "Puesto que se han cubierto todas las columnas, no se forman
implicantes secundarios, entonces de cada implicante escencial saldrá un término de lasolución y de cada implicante primo esencial sale un término de la solución final"
DoEventsCurrentX = List2(0).Left + List2(0).WidthCurrentY = List2(0).Top + 0.75 * TextHeight("X")Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(255, O, 0)CurrentY = CurrentY - TextHeight("X") / 2Print "B'D"'Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= Tiempo
222
CurrentX = List2(0).Left + List2(0).WidthCurrentY = List2(0).Top + 2 * TextHeight("X")Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(0, 255, 0)CurrentY = CurrentY - TextHeight("X") / 2Print "A'C"Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoCurrentX = List2(0).Left + List2(0).WidthCurrentY = List2(0).Top + 3.25 * TextHeightfX")Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(0, O, 255)CurrentY = CurrentY - TextHeight(nX") / 2Print "AC'D"
Case 31 'Construcción de la función ResultanteTitulo(O). Visible = FalseTitulo(l). Visible = FalsePicturel. Visible = FalseList2(0).Visible = FalseLabel3.Caption = "La solución tiene tres términos"Labeló.Visible = TrueDoEventsLabeló.Caption = "Y = B'D'"Labeló.Left = Tutorial.Width / 2 - Labelo,Width / 2Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoLabeló.Caption = "Y = B'D' + A'C"Labeló.Left = Tutorial.Width / 2 - Labelo.Width / 2Timerl = TimerDo
DoEventsLoop Until Timer - Timerl >= TiempoLabeló.Caption = "Y = B'D' + A'C + AC'D"Labeló.Left = Tutorial.Width / 2 - Labelo.Width / 2Ultimo = True
Case El seEnd SelectEnd Sub
Prívate Sub CincoEntradas_Click()Beep
End Sub
Prívate Sub Commandl_Click()Commandl.Enabled = FalseCommandH.Enabled = FalseCommand2.Enabled = FalseCommand3.Enabled = False
223
Tutor = Tutor + 1t
MostrarTutorial
Command2.Enabled - TrucCommand3.Enabled = TrucIf Tutor o 21 Then Command2.SetFocusIf Ultimo = False Then
Commandl. Enabled = TrueIf Tutor >= 23 Then Commandl4.Enabled = TrueIf Tutor o 21 Then Commandl.SetFocus
EndlfEnd Sub
Prívate Sub Commandl _MouseMove(Button As Integer, Shiñ As Integer, X As Single,Y As Single)
Commandl .BackColor = ColorEnfoqueCommand2.BackColor = ColorlnicialBotonesCommand3.BackColor = ColorlnicialBotones
End Sub
Private Sub Commandl4_Click()CommandH.Enabled = FalseDo
Command 1 _C1 ickLoop Until Ultimo = True
End Sub
Private Sub Command2_Click()Commandl .Enabled = FalseCommand 14.Enabíed = FalseCommand2.Enabled = FalseCommandB. Enabled = FalseTutor = Tutor - 1MostrarTutorialIf Tutor o 21 Then CommandS.Enabled = TrueIf Ultimo - False Then
Commandl .Enabled = TrueCommandl .SetFocus
EndlfIf Tutor > O Then
Command2.Enabled = TrueIf Tutor o 21 Then Command2. SetFocus
EndlfEnd Sub
Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,Y As Single)
Commandl.BackColor = ColorlnicialBotones
224
Command2.BackColor = ColorEnfoqueCommandS.BackColor = ColorlnicialBotonesCommandl4.BackColor = ColorTnicialBotones
End Sub
Prívate Sub Command3_Click()Unload Me
End Sub
Prívate Sub Command3_MouseMove(Button As Tnteger, Shift As Integer, X As Single,Y As Single)
Commandl.BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommandl4.BackColor = ColorlnicialBotonesCommand3.BackColor = ColorEnfoque
End Sub
Prívate Sub CuatroEntradas_Click()Label2.Visible = TrueText4.Text="("If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 200Text4.Height = 215
ElseText4.Height = 2*237Text4.Width - 75 * 50 + 75 / 50 + 200
EndlfText4.Visible = TrueText3(0).Visible = TrueText2(0).Text = ""Text2(0).Visible = TrueLabelS.Caption = "Para cada combinación de las variables de entrada se ingresa el
valor correspondiente a la función de salida como se ve a continuación. Haga clic enSiguiente."
Text2(0).SetFocusFuncion.Enabled = FalsePrograma.Enabled = TrueTeoria.Enabled = TrueCommandl.Enabled = True
End Sub
Prívate Sub DiezEntradas_Click()BeepEnd Sub
Prívate Sub DosEntradas_Click()Beep
End SubPrívate Sub Form_Load()
225
Commandl.BackColor = ColorlnicialBotonesCornmandl4.BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesre(0) = "l"re(l) = "0"re(2) = "l"re(3) = 'T're(4) = "O"re(5) = "O"re(6) = "l"re(7) = "l"re(8) = "l"re(9) = "l"re(10) = 'T'
re(12) = "0"re(13) = "l"re(14) = "0"
ce( 1,0) -"0000"ce(2,0) = lt0010"
ce(4íO)-M0110"ce(5, 0) = I10111"ce(6,0) = fl1000"ce(7,0) = "1001"ce(8,0) = lf1010n
ce(9,0) = "1101"ce(l, 1) = "0000H
06(2,1) = " --------
ce(3, l) = "0010n
ce(4, 1) = "1000"ce(5, 1) = " --------
ce(7s l) = M0110n
ce(8, 1) = "1001H
ce(9, l) = "1010n
06(10,1) = " --------
ce(ll, l) = lf01H11
ce(12, 1)-"1101M
ce( 1,2) = "00X0"ce(2, 2) - "XOOO"ce(3, 2) - " -------- "
ce(5,2) = MOX10M
ce(6,2)-"X010"ce(7s2) = M100X"ce(8,2) = n10XO"ce(9, 2) = " --------
'9 *£ tu = (17
'9 *£ t« = (£..-u - (e
«•i, = (ZOT í 8 , , = (ü«6 S8,, = feorr., = (r,,9 ti, - te,,e6ü., = fe
U - H ^ í ü
,,8 40,, = (2
.,£l,. = (066)oui
no,, = (O 4
,,8,i = (O 4
i,¿,. = (O £
,.9,, = (O«£,. = (O c£)oinUS,, = (O *
uOXOX» -
„ = (£ '
227
Tutor = OMostrarTutorialCommandl.Enabled - True
End SubPrívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y AsSingle)
Commandl .BackColor = ColorlnicialBotonesCommand2.BackColor = ColorlnicialBotonesCommandS.BackColor = ColorlnicialBotonesCommandl4.BackColor = ColorlnicialBotones
End SubPrívate Sub Framel_MouseMove(Button As Integer., Shift As Integer, X As Single, YAs Single)
Commandl. BackColor = ColorlnicialBotonesCommand2.BackCoÍor = ColorlnicialBotonesCommand3. BackColor = ColorlnicialBotonesComrnandl4.BackColor = ColorlnicialBotones
End SubPrívate Sub lngresarMinterminos_Click()
Label2.Visible = TrueText4.Visible = TrueText4.Text = "( "LabelS.Top = Text4,Top + Text4.HeightLabel3.Caption = "En la parte superior de la pantalla de simplificación se encuentra
el Editor de Mintérminos; aquí se pueden ingresar los mintérminos separados por unespacio. Haga clic en Siguiente"
LabeO.Left = Tutorial.Width / 2 - LabeO.Width / 2DoEventsMe.DrawWidth = 3Tutorial.Line (Text4.Left + 100, Text4.Top + Text4.Height)-(Label3.Left,
LabelS.Top + Label3.Height / 2), LabeD.ForeColorFuncion.Enabled = FalsePrograma. Enabled = TrueTeoria.Enabled - TrueCommandl.Enabled = True
End SubPrívate Sub NueveEntradas_Click()BeepEnd SubPrívate Sub OchoEntradas_Click()BeepEnd SubPrívate Sub Programa_Click()
Forml.ShowEnd SubPrívate Sub SeisEntradas_Click()BeepEnd Sub
Prívate Sub SieteEntradas_Click()
229
ANEXO B
MÉTODO DE SIMPLIFICACIÓN QUINE-MCCLUSKEY
Una función BOOLEANA se expresa en forma de tabla de combinaciones, como suma
de mintérminos y como producto de maxtérminos.
A B C
O O OO O 1O 1 O
1 1 O
lyiintértnirio Ma/t armiño
A+B+C = MoA+B+C1 -M1A+B'+C =M2A+B'+C =M3A+B+C =M4A'+B+C1 =M5A'+B'+C=M6A'+B'+C'=M7
F<AJB,C>=2m(0,2,3,5,6)
MINTÉRMINOS.- Son los productos de las variables que se forma de la siguiente
manera:
Si la combinación tiene un cero se pone la variable complementada, si la combinación
tiene un uno se pone la variable directamente.
Por ejemplo.
La combinación Olí tiene como mintérmino al producto A'BC ya que A=O, B=l y
Oí.
La función booleana expresada como suma de mintérminos^ se expresa como una suma
230
de todos los mintérminos que tiene una salida igual a I. así en el caso de la tabla será.
F<A, B, 0=2X0,2, 3,5,6)
MAXTERMINOS.- Son las sumas las variables que se forman de la siguiente manera:
Si la combinación tiene un cero se pone la variable directamente mientras que si la
combinación tiene un 1, se pone la variable complementada.
Por ejemplo.
La combinación 011 tiene como maxtérmino a la suma de A+B*+C' ya que A=O, B=l
y 01.
La función booleana expresada como producto de maxtérminos, se expresa como un
producto de todos los maxtérminos que tiene una salida igual a 0. Así en el caso de la tabla
será.
F<AfB,0-IlM(U4,7)
231
LISTA DE MINTERMINOS
El punto de partida del método Quine-McCluskey es la lista de Mintérminos de una
función. Si la función no está en esta fonna se debe convertirla. Para explicar se toma la
función siguiente:
A B C D0 0 0 00 0 0 10 0 i nU 1, U
0 0 1 10 1 0 00 1 0 10 1111 0 1 0I O D O
I 0 0 1í 0 1 11 0 1 1í 1 0 0í 1 A i
Jl 1 1 0* • * * • *1 I A 1
F1 __
0
ó0
l-.-j
¡..-i• 1 '
1: , — .
o0
i'l'i —00
^ m u
-frf> I T 'TF III U;
w' m »:
' m í o !
•W"W»««»«"f~i««»»ni»««ífflp- ?B'Í ^ " " 4 1
F < A,B*C,D > = Z m(0,2,3,6J,8,9JO,13)
La lista de mintérminos consiste en una tabla de combinaciones cuya salida tiene 1, en
el ejemplo los mintérminos que formarán parte de la tabla son /wft m2, m& m^ m7, /w& m^ mío,
m¡3.
232
minlirrtninu
m Om2m3m6m7m Bm 9míom!3
A B i. n
0 0 0 00 0 1 00 0 1 10 1 1 001111 0 0 01 0 0 11 0 1 01101
F
111111111
CUBOS O
En una tabla se agrupa todos los mintcrminos de acuerdo a la cantidad de unos que
contienen.
Por ejemplo.
Los mintérminos que tienen O unos es mintérmino mO.
Los que tienen / uno son los mintérminos m2 y tn8.
Los que tienen 2 unos son los mintérminos mB, m6t m9 y m/0.
Los que tienen 3 unos son los mintérminos m? y mi3.
No existen mintérminos con 4 unos.
Esta tabla se denomina tabla de CUBOS O
233
N" unos
0
1
2
3
minlrrmino
m O
ni 2m8
m3m6m9mlOm7m!3
A B <: D
0 0 0 0
0 0 1 01 0 0 00 0 1 10 1 1 01 0 0 11 0 1 00 1 1 11101
¥
111111111
CUBOS 1
Los CUBOS I se forman de la siguiente manera:
• Se agrupa CUBOS O del primer grupo con CUBOS O del segundo grupo.
• Se agrupa CUBOS O del segundo grupo con CUBOS O del tercer grupo.
• Se agrupa CUBOS O del tercer grupo con CUBOS O del cuarto grupo.
• Así sucesivamente hasta terminar de agrupar todos los CUBOS 0.
Se compara si ios dos CUBOS O que están siendo agrupados difieren en tina sola
posición, en cuyo caso el CUBO I será similar a los CUBOS O agrupados, pero en la posición
que cambia se pone una X.
A los CUBOS O que han sido agrupados y formaron un CUBO 1 se pone una señal
para especificar que si ha sido tomado en cuenta.
Por ejemplo.
234
Al comparar los cubos O m0 con m¡ forman el CUBO 1 00X0, ya que difieren
únicamente en la tercera posición, este nuevo CUBO 1 se denomina CUBO 1 (O, 2).
En los CUBOS O m0 y m2 se ponen las marcas para indicar que si han sido tomados en
cuenta.
Al comparar los CUBOS Om^y m¡3, forman el CUBO 1 (9,13) = 1X01 ya que difieren
únicamente en la segunda posición.
La siguiente tabla indica todo el proceso para el cálculo de los CUBOS /.
mintérmino
mO
m2m8
m 3m6m9rn 10
m7m 13
A B C D
0000
0 0 1 01 000
001 101101 00 110100 1 1 11 1 0 1
Min término
mO, m2
mO, m8
m2, m3m2, m6m2, m10m8, m9m8, m10
m3, m7m6, m7m9, m13
Resultante00X0
xoooooox0X1 OX01 O1 OOX1 0X0
0X1 101 1 X1 X01
CUBOS 2
Los CUBOS 2 se forman de la siguiente manera:
235
- Agrupando dos CUBOS 1 de un grupo con los CUBOS I del siguiente grupo. En esta
caso el CUBO 1 (O, 2) se agrupa con el CUBO 1 (8, 10) para formar el CUBO 2 (O, 2, 8, 10) =
XOXO ya que cambia únicamente en la primera posición. En el siguiente gráfico se indica todo
el proceso para encontrar los CUBOS 2.
Mintérmino
mO, m2
mO, m8
m2, m3m2, m6m2, m10m8, m9m8, m10
m3, m7m6, m7m9, m13
CUBOS 1
0 0 X 0
000
o o o x0 X 1 0X01 01 OOX1 0X0
0X1 101 1 X1 X01
• CUBOS 2^^^^"5(0,2,8,10) X O X O
~^^ ( 2, 3, 6, 7 ) 0 X 1 X
t."í//í í'
w//^
Como se puede ver existen dos CUBOS 1 100X y 1X01 que no se combinaron para
formar CUBOS 2 por esta razón estas combinaciones formarán parte de los implicantes
primos.
236
IMPLICANTES PRIMOS
Los implicantes primos se forman con todos los cubos que no se agruparon con ningún
otro cubo para formar un cubo de mayor grado.
Por ejemplo:
Los implicantes primos son los ClIBOS 1 100X y 1X01, mientras que, como no se han
agrupado los CUBOS 2 para formar CUBOS 3 también todos los CUBOS 2 formarán parte de
los implicantes primos.
En el gráfico se indican todos los implicantes primos.
IMPLICANTES PRIMOS
(8,9) 100X
(9,13) 1 X 0 1
(0,2,810) X O X O(2,3,6,7) O X 1 X
TABLA DE SIMPLIFICACIÓN
La tabla de simplificación sirve para simplificar mas los implicantes primos, ya que
algunos implicantes primos están contenidos en otros, para eso se construye una tabla, en la
que se pone una marca en cada celda que coincide con el implicante primo y el minténnino
que contiene. Por ejemplo el implicante primo OX1X contiene a los mintérminos m2, m3, mó,
m?. La tabla se indica en el siguiente gráfico.
237
TABLA DE SIMPLIFICACIÓN
1 OOX1 XO 1x o x o0X1 X
0
*
2
*
*
3
*
6
*
7
*
8
*
*
9
*
*
1O
*
13
*
Basándose en esta tabla se calcula los implicantes primos esenciales de la siguiente
manera:
• Buscamos la columna que tenga una sola marca.
• El implicante primo que contiene esta marca es ya un implicante primo
esencial.
• Se anulan todas las columnas que contienen marca en la fila correspondiente
de la marca encontrada en el primer paso.
• Se repite este proceso hasta que ya no existan columnas con una sola marca
es decir hasta que ya no existan mas implicantes primos esenciales.
238
o 8 1O 13
1 OOX1 XO 1x o x o0X1 X
E S C E N C I A L E S
Como ya fueron tomados en cuenta todos los mintérminos, ya no existen implicantes
primos secundarios y la solución simplificada se formaran únicamente con los implicantes
primos esenciales.
XOXO ^B'D5
OX1X -> A'C
1X01 -> BC'D
Entonces la solución será:
Y-B'D' + A'C + BC'D
Una vez encontrados todos los implicantes primos esenciales y si sobran columnas que no
han sido tomadas en cuenta se procede a calcular los implicantes primos secundarios de menor
239
costo para esto se sigue el siguiente procedimiento:
• De los implicantes primos que no se han tomado como esenciales se cuenta
cual de estos tiene mayor cantidad de marcas que están en columnas no eliminadas.
• Este implicante primo es un implicante primo secundario.
• Se anulan todas las columnas que tienen una marca en la fila del implicante
primo tomado.
• Se vuelve a repetir el proceso hasta que ya estén eliminadas todas las
columnas.
Esta es la tabla de simplificación para una función de 5 entradas que tiene implicantes
primos secundarios ya que el ejemplo anterior no tiene implicantes primos secundarios
TABLA DE SIMPLIFICACIÓN
•>,'
V^J
%•
ES
00X0 t-X01011010X-10X11-101X10X0X1X10X1XX01X-
3
^
nr
•u
2j
1|
f ""
"-j —
!
— ?>~i ,
3|
í
|
|
|
¡jf
~<5^~i,/
5
—
r)
•v/
9
- — -
r
*•
10Iii!líj
e J
"V
11
í|
— f— •
íi
j
íiT
~^—L\
18
j"~H~f —
jjj
-4-~f '
19í
— ± —-f-j)
__ái
í '"'f
20íe
^ j^ fV
~t"í
1í
%
21i
tí>
1iif "iV
?3
-<r•
/
25
*
26
iit
iIt$• —
l<
27!¡ií
1
ií
!
i~41:
ENCIALES SECUNDARIOSXX0 1 X.¿ /-í 4 ."v, •• y* i í i | í Af 'O1 S WV\1 10X11
Los implicantes primos esenciales y secundarios formaran la ecuación simplificada.
De los esenciales:
Quine HcCIuskeyMANUAL DE USUARIO.
Luis Eduardo López.
ESCUELA POLITÉCNICA NACIONAL.
CARRERA DE INGENIERÍA ELECTRÓNICA Y
TELECOMUNICACIONES.
2003
CONTENIDO.
Instalación del programa 3
Requerimientos Mínimos 3
Método de Instalación 3
Menú Principal 4
Fundamento Teórico 4
Tutorial 5
Iniciar Simplificación 5
Menú 5
Nuevo 6
Abrir 6
Guardar Como 7
Simplificar 7
Simplificación paso a paso 8
Simplificación paso anterior 8
Ingreso de datos en la tabla 8
Ingreso de mintérminos 9
Tabla de Mintérminos 9
Cubos O 9
Cubos n 10
Implicantes Primos 10
Tabla de Simplificación 10
Implicantes Primarios 10
Instalación del programa.
Requerimientos Mínimos.
Para instalar este programa se necesita los siguientes requerimientos mínimos:
- Procesador PI.
- 24 MB de memoria RAM.
15MB de espacio disponible en el disco Duro.
- Unidad de CD-Rom.
Método de Instalación.
Una vez comprobado que cumple con los requerimientos mínimos siga los
siguientes pasos:
1. Inserte el CD en la unidad de CD-ROM.
2. Ejecutar Setup.
3. Siga las instrucciones.
Menú Principal.
Cuando se ingresa al programa aparece el menú principal en el cual se puede
escoger entre FUNDAMENTO TEÓRICO, TUTORIAL, INICIAR SIMPLIFICACIÓN, Y
SALIR como se indica en la figura MI.
Fig. MI: Menú principal
Fundamento Teórico.
Explica el proceso de simplificación de una función booleana utilizando el método
de Quine-McCluskey como se indica en la figura M2.
Fig. M2: Comando para iniciar el fundamento Teórico.
Tutorial.
Hace una breve explicación de cómo utilizar el programa de simplificación de
funciones como se indica en la figura M3.
Fig. M3: Comando para ingresar al Tutorial
Iniciar simplificación.
Simplifica una función ingresando los datos ya sea en forma de tabla o en forma de
mintérminos, para luego simplificarla paso a paso o en forma directa.
Fig. M3: Comando para ingresar a la simplificación
Menú.
Permite Ingresar una función nueva, Abrir una función guardada, Guardar una
función, Simplificar, y salir como se indica en la figura M6.
M«.;Clusk(;y. Simplificación
Fig. M6: Menú de simplificación.
Nuevo.
Sirve para ingresar una función nueva ya sea como mintérminos o como una tabla
de salida.
Abrir.Abre una función almacenada en disco esta función tiene extensión *.boo, esta
función contiene las salidas de todas las combinaciones como se indica en la figura M7.
unctón2.boounctón3,boounctón3b.boouncion4.boouncton4b.boouncjon5,boouncionSb.boo
Fig. M7: Ventana para escoger un archivo.
Guardar Como.
Guarda los datos de las salidas de cada combinación de una función en un archivo
con extensión *.boo como se Índica en la figura M8.
funcjon1Qb.booÍunción2boofuncjon3.boQfunción3b.boofunc»n4.boofuncion4b.boofuncion5.boofuncion5fa.boo
Fig. M8: Ventana para ingresar el nombre del archivo a ser guardado
Simplificar.
Esta opción sirve para obtener directamente la respuesta simplificada de la función
sin necesidad de hacer pausa en cada paso.
Esta opción es equivalente al comando finalizar de la pantalla de simplificación
como se indica en la figura M9.
Fig. M9: Comando para finalizar la simplificación.
Simplificación paso a paso.
Esta opción avanza al siguiente paso de la simplificación.
Esta opción es similar al comando siguiente en la ventana de la simplificación
como se indica en la figura MÍO.
Fig. MÍO: Comando para simplificar el siguiente paso.
Simplificar paso anterior.
Esta opción avanza al paso anterior de la simplificación.
Esta opción es similar al comando anterior en la ventana de la simplificación como
se indica en la figura Mil.
Anterior
Fig. Mil: Comando para simplificar el paso anterior.
Ingreso de datos en la tabla.
Despliega un submenu con el número de entradas que puede aceptar la
simplificación y luego despliega una tabla con todas las combinaciones permitiendo
ingresar las salidas que corresponde a cada combinación.
Cuando se ha terminado de ingresar todas las salidas existentes presionamos enter
para que la tabla se complete automáticamente con ceros.
Mientras se ingresa cada salida de la función el editor de los mintérminos se
actualiza automáticamente.
Ingreso de mintérminos.
Aquí nos permite ingresar directamente los mintérminos en el editor de
mintérminos.
Los mintérminos se ingresan separados por espacios y cuando ya se han ingresado
todos los mintérminos de la función se presiona enter para que se termine de actualizar
toda la tabla de salidas de la función.
Mientras se va escribiendo los mintérminos actualiza automáticamente la tabla de
salidas de la función y calcula automáticamente el número de variables de entrada según
los mintérminos ingresados.
Tabla de mintérminos.
Es la tabla de todas las combinaciones cuya salida son unos.
Cubos 0.
Es la tabla de cubos ceros es decir son todas las combinaciones que tienen coma
salida igual a 1 y además están ordenadas de acuerdo al numero de unos que tienen cada
una de las combinaciones.
10
Cubos n,
Son las tablas de combinaciones que se van formando en el proceso de
simplificación estas combinaciones tienen ceros unos y condiciones no importa que
corresponden a las variaciones entre una combinación y otra.
Implicantes Primos.
Es la tabla que contiene todos y cada uno de los cubos n que no se utilizaron para
formar cubos de mayor orden.
Tabla de Simplificación.
Es la tabla conformada por los mintérminos y los implicantes primos para poder
simplificar.
Implicantes Primarios.
Los implicantes primarios son los términos que necesariamente deben estar dentro
de la solución.
Implicantes Secundarios.
Los implicantes secundarios son términos adicionales con menor costo, que
también deben estar dentro de la solución.
Solución.
Es la expresión mas simplificada posible de la función booleana.