Algebra Booleana PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 235

ESCUELA POLITÉCNICA NACIONAL

ESCUELA DE INGENIERÍA

MÉTODO DIDÁCTICO DE SIMPLIFICACIÓN DE FUNCIONES


BOOLENAS

PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN


ELECTRÓ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
CONTENIDO
R. 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 3


1.2.2. Ecuaciones Booleanasy Funciones Lógicas Básicas 7
1.2.3. Tabla de Verdad 12

2. SIMPLIFICACIÓN DE FUNCIONES BOOLEANAS 13


2.1. Funciones Booleanas 13
2.1.1. Deducción de Ecuaciones booleanasa partir de una tabla de
verdad 14
2.1.2. Tabla de verdad a partir de una ecuación booleana 19

2.2. Métodos de Simplificación 21


2.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 33
2.2.3.2. Obtención de los implicantes primos 36
2.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 PARA


SIMPLIFICAR FUNCIONES BOOLEANAS 53
3.1. Introducción 53
3.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 57
3.1.2.2. Label 59
3.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 62
3.1.3.2. Variables...... 63
3.1.3.2.1. Alcances de las variables 63
3.1.3.2.2. Establecimiento del alcance de las variables 64
3.1.3.2.3. Variables utilizadas en un procedimiento 64
3.1.3.2.4. Variables utilizadas en un módulo 65
3.1.3.2.5. Variables utilizadas por todos los módulos 65
3.1.3.2.6. Declaración de variables 66
3.1.3.2.7. Tipos de variables 66
3.1.3.2.8. Consideraciones 67
3.1.3.3. Procedimientos 68
3.1.3.3.1. Procedimientos generales.... 69
3.1.3.3.2. Procedimientos de evento 70
3.1.3.4. Funciones 72
3.1.3.4.1. Llamadas a funciones 73
3.1.3.4.2. Paso de argumentos a Procedimientos y
funciones 73
3.1.3.4.3. Tipos de datos de los argumentos 74
3.1.3.4.4. Paso de argumentos por valor 74
3.1.3.4.5. Paso de argumentos por referencia 74
3.1.3.5. Estructuras de Control (Repetición y decisión) 75
3.1.3.5.1. Do While-Loop / Do-Loop While 75
3.1.3.5.2. For-Next 76
3.1.3.5.3. Else-End If.... 77
3.1.3.5.4. If-Then-Else 78
3.1.3.5.5. Select-Case 78

3.2. Diagrama de Flujo del Programa 80


3.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 85


3.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

2.5
Vx
0.8 i

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.

A B A.B
r=A.B 0 0 0
0 1 0
1 0 0
1 1 1

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

4) 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
A B A.B (A.B)'
0 0 0 1
A
.Y=(A.B) ' 0 1 0 1
B 1 0 0 1
1 1 1 0

ÑOR

AB A+B (A+B)1
f=(A+B) ' 00 0 1
01 1 0
10 1 0
11 1 0

XNOR
A B A®B (A®B)'
00 0 1
XAÍ 01 1 0
10 1 0
11 0 1

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

= { A ' .B 1

"-• (B.B¡

UNIVERSALIDAD DE LAS ÑOR.

a) NOT. A'=(A+A)'. (=(A+A) '

b)AND. A.B=(A'+B')'
(A+A) '
A->:
Y={A'+BI)
B-S (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:

A B c D Y
0 0 0 0 0 0
1 0 0 0 1 0
2 0 0 1 0 0
3 0 0 1 1 0
4 0 1 0 0 0
5 0 1 0 1 0
6 0 1 1 0 0
7 0 1 1 1 1 Mintérmino m?
8 1 0 0 0 0
9 1 0 0 1 0
10 1 0 1 0 0
11 1 0 1 1 1 Mintérminomn
12 1 1 0 0 0
13 1 1 0 1 1 Mintérmino mi3
14 1 1 1 0 1 Mintérmino mu
15 1 1 1 1 0

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

A B e & 1 -v *
7 0 1 1 1 1
11 1 0 1 1 1
13 1 1 0 1 1
14 1 1 1 0 1

£..„
A C o % 1
7 A1 B c D 1
11 A B' c D 1
13 A B C1 D 1
14 A B c D1 1

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:

*£• ¿PL ;"<** ^Bt.


jf ^
y^J^tWff?' :
flt$3 *'rt¿T5
7 0 1 1 1 A'BCD Mintérmino m7
11 1 0 1 1 AB'CD Mintérmino mu
13 1 1 0 1 ABC'D Mintérmino m13
14 1 1 1 0 ABCD' 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:

-*V fj ! #';.;-sjjf£ k -.y ,


0 0 0 0 0 0 Maxtérmino MO
1 0 0 0 1 0 Maxtérmino Mi
2 0 0 1 0 0 Maxtérmino M2
3 0 0 1 1 0 Maxtérmino Ma
4 0 1 0 0 0 Maxtérmino M4
5 0 1 0 1 0 Maxtérmino Ms
6 0 1 1 0 0 Maxtérmino M6
7 0 1 1 1 1
8 1 0 0 0 0 Maxtérmino Ma
9 1 0 0 1 0 Maxtérmino Mg
10 1 0 1 0 0 Maxtérmino Mío
11 1 0 1 1 1
12 1 1 0 0 0 Maxtérmino Mi2
13 1 1 0 1 1
14 1 1 1 0 1
15 1 1 1 1 0 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:

A B c o Y
0 0 0 0 0 0
1 0 0 0 1 0
2 0 0 1 0 0
3 0 0 1 1 0
4 0 1 0 0 0
5 0 1 0 1 0
6 0 1 1 0 0
8 1 0 0 0 0
9 1 0 0 1 0
10 1 0 1 0 0
12 1 1 0 0 0
15 1 1 1 1 0

A B C D Y
0 A B C D 0
1 A B c D' 0
2 A B C' D 0
3 A B C' D' 0
4 A B' c D 0
5 A B' c D' 0
6 A B' C' D 0
8 A' B c D 0
9 A' B c D' 0
10 A' B C' D 0
12 A1 B' c D 0
15 A' B' C' D' 0

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

Y^Mo* jtf-m?itf
A -vp¿ c D M4* M5* M6* M8* M9*
Miü*Mi2*Mi5
0 0 0 0 0 A+B+C+D Maxtérmíno M0
1 0 0 0 1 A+B+C+D' Maxtérmino MI
2 0 0 1 0 A+B+C'+D Maxtérmino M2
3 0 0 1 1 A+B+C'+D' Maxtérmino M3
4 0 1 0 0 A+B'+C+D Maxtérmino M4
5 0 1 0 1 A+B'+C+D' Maxtérmino M5
6 0 1 1 0 A+B'+C'+D Maxtérmino Me
8 1 0 0 0 A'+B+C+D Maxtérmino M8
9 1 0 0 1 A'+B+C+D' Maxtérmino M9
10 1 0 1 0 A'+B+C'+D Maxtérmino M-|0
12 1 1 0 0 A'+B'+C+D Maxtérmino Mi2
15 1 1 1 1 A'+B'+C'+D' Maxté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

ABC A*B'*C A'*C B*C F<A, B, C,>


0 0 0 0 0 0 0
0 0 1 0 1 0 1
0 10 0 0 0 0
0 11 0 1 1 1
1 0 0 0 0 0 0
1 0 1 1 0 0 1
1 10 0 0 0 0
1 11 0 0 1 1
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=AB

Á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:
26

Para 2 variable -> 22 = 4 filas

A B X
0 0 X0
0 1 Xi
1 0 X2
1 1 X3

En el mapa existen 22 = 4 cuadrados.

B'

Para tres variables. 23 = 8 filas.

A B c X
0 0 0 Xo
0 0 1 Xi
0 1 0 X2
0 1 1 X3
1 0 0 X4
1 0 1 X5
1 1 0 X6
1 1 1 X7

En el mapa 23 = 8 cuadrados.

C'
27

Para cuatro variables. -> 24 = 16 filas.

A B c
D X
0 0 0 0 Xo
0 0 0 1 XT
0 0 1
0 X2
0 0 1 1 X3
0 1 0 0 X4
0 1 0 1 X5
0 1 1 0 X6
0 1 1 1 X7
1 0 0 0 X8
1 0 0 1 X9
1 0 1 0 Xio
1 0 1 1 Xn
1 1 0 0 Xi2
1 1 0 1 Xl3
1 1 1 0 Xu
1 1 1 1 Xis

En el mapa 24 = 16 cuadrados.

C'D' C'D CD CD'


A'B' X0 Xi X3 X2
A'B X4 X5 X7 X6
AB X-I2 Xl3 Xis Xl4
AB' X8 X9 Xn 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:

A B c X
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 0

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:

A B c D X
0 0 0 0 0
0 0 0 1 0
0 0 1 0 1
0 0 1 1 1
0 1 0 0 0
0 1 0 1 0
0 1 1 0 0
0 1 1 1 0
1 0 0 0 1
1 0 0 1 0
1 0 1 0 1
1 0 1 1 0
1 1 0 0 0
1 1 0 1 0
1 1 1 0 0
1 1 1 1 0

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' 0 0 1 1
A'B 0 0 0 0
AB 0 0 0 0
AB' 1 0 0 1

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:

A B c D X
0 0 0 0 0
0 0 0 1 0
0 0 1 0 1
0 0 1 1 0
0 1 0 0 0
0 1 0 1 1
0 1 1 0 0
0 1 1 1 1
1 0 0 0 0
1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 0 0 0
1 1 0 1 1
1 1 1 0 0
1 1 1 1 1
32

Construimos el mapa K.

C'D' C'D CD CQ'


A'B' 0 0 0 (U
A'B 0 0
AB 0 ^_ JJ¿\y
^ ^ 0
AB' 0 0 0

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, X 7j 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 1
Fig 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.

001 A 101
0 A 1
o ooox-" ¡ ior>^
) 00 A 10 I B
I
B B ¡
• — — — 3-* 111
B B B
ff ^c
_ **

1 oro A 110
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.

00 00.
m r m
I I
m3 j
oxo m3
0111 _1 011
11 01X
m7 m7
010 010
m2 m2
Cubos - O Cubos - 1
Fig. 2.3: Representación de un cubo-3
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 COMBINACIONES NUMERO DE "UNOS" FUNCIÓN


A B C D
0 0 0 0 0 0 1
1 0 0 0 1 1 0
2 0 0 1 0 1 1
3 0 0 1 1 2 1
4 0 1 0 0 1 0
5 0 1 0 1 2 0
6 0 1 1 0 2 1
7 0 1 1 1 3 1
8 1 0 0 0 1 1
9 1 0 0 1 2 1
10 1 0 1 0 2 1
11 1 0 1 1 3 0
12 1 1 0 0 2 0
13 1 1 0 1 3 1
14 1 1 1 0 3 0
15 1 1 1 1 4 0
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".

COMBINACIÓN #de
A B C D "UNOS"
V mo 0 0 0 0 0
V nri2 0 0 1 0 1
V m8 1 0 0 0
V 1113 0 0 1 1 2
V m6 0 1 1 0
V iTlg 1 0 0 1
V mío 1 0 1 0
V m7 0 1 1 1 3
V mis 1 1 0 1

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 1
0,2 00X0 V
0,8 XOOO V
2,3 001 X V
2,6 0X10 V
2, 10 X010 V
8,9 100X
8, 10 10X0 V
3,7 0X11 V
6,7 01 1X V
9, 13 1X01

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 -2
0, 2, 8, 10 XOXO
2, 3, 6, 7 OX1X

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 X
1 X 0 1
X O X O
O 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á:

0 2 3 6 7 8 9 10 13
1 0 0 X V y
* 1 X 0 1 T í •\

* X 0 X 0- y •J•
^1 Jy
,/
1 V
* n y 1 y- ' JV
^
v V V V V V V V 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 O
O X 1 X
1 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- Forma Binaria No. del's


minos A B C D E
mi 0 0 0 0 1 1
Tf\2 0 0 0 1 0 1
ma 0 0 0 1 1 2
ms 0 0 1 0 1 2
m9 0 1 0 0 1 2
mío 0 1 0 1 0 2
mu 0 1 0 1 1 3
mis 1 0 0 1 0 2
mi9 1 0 0 1 1 3
m2o 1 0 1 0 0 2
m2i 1 0 1 0 1 3
m23 1 0 1 1 1 4
m25 1 1 0 0 1 3
m2e 1 1 0 1 0 3
m27 1 1 0 1 1 4

CUBOS - 0 No. 1 's


V 1 0000 1 1
V 2 0 0 0 1 0
V 3 0 0 0 1 1 2
V 5 0 0 1 0 1
V 9 0 1 0 0 1
V 10 0 1 0 1 0
V 18 1 0 0 1 0
V 20 1 0 1 0 0
V 11 0 1 0 1 1 3
V 19 1 0 0 1 1
V 21 1 0 1 0 1
V 25 1 1 0 0 1
V 26 1 1 0 1 0
V 23 1 0 1 1 1 4
V 27 1 1 0 1 1
43

CUBOS - 1
V 1,3 000X1
1,5 00X01
V 1,9 0X001
V 2,3 0001 X
V 2, 10 0X010
V 2, 18 X0010
V 3,11 0X011
V 3, 19 X0011
5,21 X0101
V 9,11 010X1
V 9,25 X1001
V 10, 11 0101X
V 10,26 X1010
v 18, 19 1001X
18,26 1X010
20,21 1010X
v 11,27 X1011
19,23 10X11
V 19,27 1X011
21,23 101X1
V 25,27 110X1
V 26,27 1101X

Cubos - 2
1,3,9,11 0X0X1
V 2,3, 10, 11 OX01X
V 2,3, 18, 19 X001X
V 2, 10, 18,26 XX010
V 3, 11, 19,27 XX011
9, 11,25,27 X10X1
V 10, 11,26,27 X101X
V 18, 19,26,27 1X01X

Cubos - 3
2, 3, 10, 11, 18, 19, 26, 27 XX01X

IMPLICANTES PRIMOS
1,5 00X01
5,21 X0101
20,21 1010X
19,23 10X11
21,23 101X1
1,3,9, 11 0X0X1
9, 11,25,27 X10X1
2,3, 10, 11, 18. 19,26,27 XX01X
44

TABLA DE REDUCCIÓN DE LOS IMPLICANTES PRIMOS.

2 3 5 9 10 11 18 19 20 21 23 25 26 27
00X01 V V
X0101
- — J —,»,
V
* 1010X" "N V
^
10X11 " f V
101X1 V V
0X0X1 V ^| \l V
X10X1- tl ^/ •Jí V
*
1 f
vYrnly\
Y _/ -/ J „/ _/ _/ j
* /v/xU V ^ f V ** 1 V
V V V V -\l V V V V V V 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

1 5 23
00X01 V V
X0101 V
10X11 V
101X1 V
0X0X1 V

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

1 5 23
* 00X01 J i/ i
V
* 10X11 /
V
0X0X1 - V
V 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 COMBINACIONES NUMERO DE "1S" FUNCIÓN


A B C
0 0 0 0 0 0
1 0 0 1 1 1
2 0 1 0 1 0
3 0 1 1 2 0
4 1 0 0 1 1
5 1 0 1 2 0
6 1 1 0 2 1
7 1 1 1 3 1
Tabla de cubos O

COMBINACIÓN número de M
A B C "UNOS"
mi 0 0 1 1
rru 1 0 0 V
m6 1 1 0 2 V
m7 1 1 1 3 V

Tabla de cubos - 1

Combinaciones Cubos 1 M
4, 6 1 X 0
6, 7 1 1 X

IMPLICANTES PRIMOS

0 0 1
1 X 0
1 1 X
47

TABLA DE IMPLICANTES

IMPLICANTES PRIMOS ESENCIALES

0 O 1
1 X O
1 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.

A B C F(A, B, C)
0 0 0 X
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 1
1 0 1 1
1 1 0 X
1 1 1 X

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.

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.

i'C

n Y=A1C+AC'D+B'D'

Jo.B'D'
£>«BU-I

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 Privado Público


Las variables son privadas No es aplicable. No puede
Nivel de
del procedimiento en el que declarar variables públicas
procedimiento
aparecen. dentro de un procedimiento.
Las variables son privadas
Las variables están disponibles
Nivel de módulo del módulo en el que
para todos los módulos.
aparecen.

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 Comentario
BOOLEAN Sólo admite 2 valores TRUE o FALSE
BYTE Admite valores entre 0 y 255
INTEGER Admite valores entre -32768 y 32767
LONG Admite valores entre -2.147.483.648 y 2.147.483.647
SINGLE Admite valores decimales con precisión simple
DOUBLE Admite valores decimales de doble precisión
CURRENCY Válido para valores de tipo moneda
STRING Cadenas de caracteres (Texto)
DATE 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á:

If 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.

Menú
Principal

Fundamento Iniciar /
Teórico Simplificación /""

f Proceso de \ Simpl
Presentación \e la Teoría J
Presentación
del tutorial

Fig. 3.5: Diagrama de Flujo del inicio del programa


81

3.2.1 TEORÍA

Regresar Comando
Imprimir-
al Menú presionado

Flechas de Navegación

i
Navegaren el
Imprimir el Texto
completo

Texto

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 de
ingreso de datos

-Abrir

Abrir el Archivo

Ingresar datos Ingresar datos


por mintérminos por tabla
iF
Presentar Tabla de
Combinaciones y
mintérminos

Comando
Ingresado

Tiene la
Está la tabla de
O¡ respuesta
final?
combinaciones

Simplifica el Simplifica el
siguiente paso paso anterior

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.

Inicio
Tutorial

Presenta la
Teoría

Ingresar
Comando

Comando
/Siguiente Anterior /
Ingresado

Ultima Primera
xplicación? xplicación?

Presentar la Presentar la
siguiente anterior
explicación 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 de
V 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 n
Actualizar r(i) <Otro>
Actualizar Tabla
<Space>

<Enter>
Calcular n
Actualizar r(i)
Actualizar Tabla

Ingresar Tabla
* ~
Ingresare!
número de
entradas
Indicar
Combinación
/ Ingresar la /
/ función /

No

r(i)=f
Actualizar mintérminos

Habilitar botón Siguiente


Habiliotar 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

MINTERMINOS CUBOS O
0001 0001
001 1
0101 001 1
0111 0101
1 001 1 001
1011
1101 0111
1111 1011
1101
1111

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 combinaciones


col=col"M

No fila=fila+1
c(fila,0)=i

Fig. 3.12; Diagrama de Flujo para la obtención de los cubos 0.


91

i— u *

3r
Mn •*^-"~*"'r7ÍV-T^"1""fc-^»^

Si
t
cont=0 |
^
pos=1

Bit=Val(Mid(*fíi\
Hv» 1\
P05» ';/ •

i i.^-^^fíií-T
1^>
—-""""^

J>
pos=pos+1
J L

No I cont=cont+1 I
if

Si
J* No -r-*^*rnnf~iTi^*^^-^ i: +1
1 it
Si

raya = raya + 1 j=j+1


^i
fila * fila + 1
c(fila, col) = f(i)
O(fila, col) = Str(i)

*--—-"""^T?* n^ i""?"—**-• Nn

Si
^-——nrr"^- M~

4) Si
Y

fil(col)=fila

Mostra *cubos 0
Habilitar Comandos
Actuiiza MaxCol y Max

O7F*in_^>
Fig. 3.13: Continuación del diagrama de flujo para la obtención de los cubos 0.
92

cont=cont+1
spos=j
cpos = pos

Fig. 3.14: Diagrama de flujo de obtención de los cubos n


93

fila = fila + 1
c(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,col
O(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, Max


col=col+1

fila = O Or col = Aux

ultima = True
fíl(col) = auxiliar

Mostrar los cubos n


o los implicantes primos

Fig. 3.16: Continuación del diagrama de flujo de obtención de los cubos n


95

Simplificación

1(1235910111819202123252627) Número de entradas 6

CUBOS 1 CUBOS 2
000X1 0X0X1
00X01 OX01X
0X001 X001 X
0001X XX01 O
0X01 O
X001O XX01 1
X1 0X1
0X01 1 XI 0 1 X
X001 1 1 X01 X
X01 01
01 0X1
XI 001
01 01 X
XI 01 O
1 001 X
1X010

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

fila = fila + 1
No No O(fila, col) = O(i( j)
c(fila, col) = c(i, j)
Marca(fila, col) =""

fil(col) = fila
i'
Mostrar Implicantes Primos
Actualizar MaxCof
Actualizar Max
Implicantes =True

-J r
d Fin^>

Fig. 3.18: Diagrama de flujo para la obtención de los implicantes primos.


funcionSb boo

(12359101118192021232526271:3 Número de entradas b

IMPLICANTES PRIMOS
00X01
X01 01
1 01 OX
1 0X1 1
1 01X1
0X0X1
XI 0X1
XX01 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 oso i
X 0 1 0 1
1 O 1 OX

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, P2-P1)

No
1f

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


T
Si

subíndice = Mid(O(i, col), p1, p2 - p1 + 1)

al(subtndice) = Val(s

Dibujar Tabla
Tablalmplicantes = True
marcas = True

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.

xxoix
1010X
X1 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 = O
i=1

ablaíi, i) = T

contv(i)=contv

contvmax < contv


T
Si
contvmax = contv(i)

contv(i) = 1 and
lumnaAnulada(i) = Fals

ColumnaAnuladfa(i)=True
1=1

Fig. 3.25: Diagrama de flujo para hallar los implicantes primos esenciales.
104

abiafj, i) = "*" And filaAnuladaíi) = False

filaAnulada(j) = True
numeroFila(i) = j
fila = fila + 1
c(fila, col + 1) = c(j, col)
¡2 = 1

Tabla(j, Í2) = "*"


No olumnaAnulada(¡2)

fs o
cok
columnaAnulada(¡2)
True numeroFiia(i2)

fe~*

Poner las marcas


fil(col+1)=fila
Actualizar MaxCoí
Actualizar Max
MostrarEsenciales
esenciales=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

marcasmax
conth(i)

Si

Fig. 3.27: Diagrama de flujo par obtener los implicantes primos


secundarios.
107

conthQ) = marcasmax
And filaAnulada(j) = False
nd marcasmax > O

sihay=False
¡2 = 1

TablaG, ¡2) = "*"


lumnaAnulada(¡2)

columnaAnulada(i2) = True
numeroFíla(¡2) =j
sihay = True

filaAnulada(j) = True
fila = fila + 1
c(fila, col + 2) = c(j, col)

MostrarMarcas
fil(col + 2) = fila
Actualizar MaxCol
Actualizar 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ón
1'
Text6="Y="
i=1

'Text6=Text6+Variable
Complementada

XxText6=Text6+Variable

Fig. 3.29: Diagrama de flujo para obtener la solución.


LIO

Text6=Text6+Variable
Complementada

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 1 0 2 3 6 7 8 9 1 0 1 3 )

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.

0 0000 0000
2 001 0
3 001 1 001O
6 0110 1 000
7 0111
8 1 000 001 1
9 1 001 01 1 O
10 1010 1 001
13 1101 1010

0111
1101

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 00X0
xooo
"0010
* 1 000 001 X
0X1 O
"0011 X01 O
"0110 1 OOX
* 1 001
"1010
0X1 1
* 01 1 1 01 1 X
* 1 1 01 1X01

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 1(0, 2. 8.
0X1 X
* 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ÍMOS


xoxo 100X
1X01
0X1 X xoxo
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.

o 2 3 6 7 6 9 10 13
1 0 0 X * *
1 X 0 1 * *
xoxo * * * *
0 X 1 X * * * *

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
c 2 3 É - e 9 i i3
1 0 0X i
—j jii
(•\s> fk ¡i) (•\»
>
t
j
/\• >i>
,
T

3 !

xoxo
oxix ;
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

|OQQQQ[Í|IOOOO[O'
0 0 0 0 1 [0 10001 |1
00010JO 10G1QJO
0 0 0 1 1 ¡0 1001 1 ¡1
¡001 00|0 1 0100J1
I O Q I O I [5*11 0101 [ÍT
|ooi iofT|i 011 op"
|001 11 [O |101 1 1 [O
j___^p__j_.
OIQOI 11001 fT
11 oí ofo"
o i o i ijo" 11011 pT
ioofT|n i o o f T

|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
"00000 0X000

* 01000 01 0X0
01 XOO
"00110
"01010 0X1 1 O
"01100 X01 1 O
* 10001 01X10
"10100 01 1X0
X1 1 00
"01110 1 00X1
"10011 1 X001
"10110 1 01X0
"11001 1 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.

"11011 1X011
"11110 1X110
1 1 0X1
1 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 0X000
01 XXO
XX1 1 O XX1 1 O
X1 1 XO X1 1X0
1X O X 1 1 XOX1
1X1 XO 1 XI XO
Fig. 3.44: Cubos 2 e Implicantes primos.

TABLA DE SIMPLIFICACIÓN
0 6 8 10 12 l'l 17 19 2O 22 25 27
*
_ „ _ — __ f
\ c{ s>
,¿ -; '
4 •' -. -4
f -\ /, •< >,J
1
{ \

X 1 1 X0 ^
*,
1 X O X1 - >
• 1 X 1 X Q- íl !? !
• * ' -

Fig. 3.45: Primera página horizontal de la tabla de simplificación

2 30
* A U U Lr^
1 A A Lr^
>i
>
X 1 1 X0
A U A 1
/• !>
A 1 A U^ \l.'

ÉSCEENCiALES
0X000
XX1 1 O
01XXO
1X0X1
1X1X0

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

tunctónICb.boo
functón2.boo
función3.boo
Iunctón3b.boo
Iuncion4boo
I Consultas Iuncion4b.boo
Qj Piimef Texto presentado luncionSboo
C3 TEXTO

JfuncionSb boo

m \. 3.49: Ventana para seleccio


L ^J i
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 OOQO[0
|OOOQl[T'fÍ' 0001 [o
|OOQ1o[l"p' ooiopr
ioooiifi~p' 0011 fT
001 00 ÓF oioopr
0 0 1 0 1 "F 0101 |T
|ooi loprp 011 o|o
fooTTTfoT" oTTTfT
|01QQO|o'p 1000(0'
| 0 1 0 0 l f T p 1001 [T
|oioio[Tp 1010(1"
[oToTTfrp 1011 [T
101100(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 CUBQS1 CUBOS2 CUBOS 3


000X1 0X0X1 | XX 0 1 X
* 0001 O 00X01 OX O1 X
0X001 X OO1 X
00011 0001X XX01O
00101 0X01 O
01001 X001 O XX01 1
01010 XI 0X1
10010 X 1 O1 X
10100 1 X O1 X

01011 IMPUONTES PRfWOS


10011 00X01
10101 X01 01
1 1 001 1 01 OX
11010 1 0X1 1
101X1
0X0X1
XI 0X1
10111 1 01 OX XX01 X
11011
X I 01 1
1 0X1 1
1 X01 1
101X1
1 1 0X1
1 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.

:-•'- T/s.81A DE;S.M PiIF G¿id 0»1


] e 9 1D i i 13 19 2 2 2
f\ >1>
X 0 1 0 1 1 '
f- \ f\\
* \
/•\>,>
1 0 1 X 1
0 X 0 X 1 ir • F

X =
_ _ _1_ 0
_ HX __
1
* •
-H.. .,1 -.
>
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

25 26 27
* U X U JT^
X 0 1 0 1
* U 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- ':y
I
'ESCENeíALESSeCUNDARiOS
XX01X 00X01
1 01ÜX 10X1 1
XI 0X1

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 fT11 0000(1


joooooT 010001|1 f l O O C i G I [T 11 0001(0
(QOQQ1Q
I Q O O O I I [i"loiooii(o(ioocni [o [110011 [o*
000100
(000101 1 (010101
( 0 0 0 1 1Q,|ÍT|01 011 O o (ioono|o'|noiio
I O O Q I I I |cT|oioTii 0 ( 1 0 0 1 1 1 lo"! 110111'
í"l 1 0 1 0 0 0 (fl 111_000|1
J 0 0 1 0 0 1 [v [oí 1001(1 (101 d o i To.
1 J11101 o|o

10011 oo|oj011100(011011 oo[i~|i 11100(0


001101 fo 011101 1111 01 (O
O 01110 Jo" 0 1 1 1 1 0 101110(1" 111110(1
001111 [ O j 0 1 1 111JO J 1 0 1 1 11 ff (1 11 11 1 (0

Fig. 3.55: Tabla de combinaciones de una función de 6 entradas.

CUBOSo CUBOS0
* oooooi * 101000 "101111
* 00001 O * 1 10000 "111011
* 000100 "111110
* 001000 "010101
* 100000 "011001
"100101
* 00001 1 " 101001
* 000101 "101010
* 001001 "101100
* 00101 O * 1 1 1000
* 010001
"010100 "011011
* 01 1000 "101011
* 100001 "101101
* 10001 O "101110
* 100100
Fig. 3.56: Tabla de cubos 0.
124

CUBOS 1 CUBOS 1 CUBOS 1


0000X1 1000X0 10X001 1 01 1 O X
000X01 100X00 10X01O 1011X0
00X001 10X000 1 OO1 O X
0X0001 1XOOOO 1 OX 1 O O XI 101 1
XOOOOI 1 01OOX 101X11
00001X 0X0101 1010X0 1X1011
00X01 O X00101 101X00 1011X1
X0001O 0X1001 1X1000 101 1 1 X
0001OX X01001 1 • xooo 1X1110
0X0100 X0101 O
X00100 010X01 01 1 0 X 1
001OOX 01X001 10X101
0010X0 0101OX 1010X1
0X1000 011OOX 01X01
X01000 X11000 1 0 10 1X
1OOOOX 100X01 1 0 1X 1 0

Fig. 3.57: Tabla de cubos 1,

CUBOS 2 CUBOS 3
0X0X01 1 OXXOX
XOOX01 "1OXX01
OXX001 * 1 0X1 OX 1 01 XXX
XOX001 * 1 01OXX
XOX01O * 101XOX
0X01OX "101 XXO
XQ01OX
0X1OOX * 1 01XX1
X01OOX * 101XIX
X010X0 * 1 01 1 XX
XX1000
* 1OOXOX
* 1OXOOX
10X0X0
* 1OXXOO
1XXOOO
Fig. 3.58: Tabla de cubos 2 y de cubos 3.
125

IMPLICANTES PRIMOS IMPLICANTES PRIMOS


0000X1 XX1000
00001X 10X0X0
0110X1 1XXOOO
X11011 1OXXOX
1X1011 1 01 XXX
1X1110
0X0X01
XOOX01
OXX001
XOX001
XOX01O
0X01OX
X001OX
0X1OOX
X01OOX
X010X0

Fig. 3.59: Tabla de implicantes primos.

TABLA DE SIMPLIFICACIÓN
] 2 3 4 e c G
D 17 2D 2
*
f\)1
0 0 0 0 1X ;

0 1 1 0 X 1

1 X 1 0 1 1

0 X 0 X O 1
X 0 0 X O 1
(\f (• \ (1 1
_X _ 0_ _X_ 0_ _0 _
1
'
f f 1 {• >,
* \ \ ) \t
X 0 0 1 0 X
_ -- - n 1-1 V
U X 1 U O X
X 0 1 0 0 X
X 0 1 0 X0
_J
,.—.,, id
Fig. 3.60: Primera página Horizontal y Primera página Vertical de la tabla de
simplificación
126

TABLA DE SIMPLIRCACION
1 2 3 4 5 8 9 10 17 20 21
X X 1 0 0 O *
1 0 X 0 X 0
1 X X 0 0 0
-
¡
t

i 1
^^•'1
Fig. 3.61: Primera Página Horizontal y Segunda Vertical de la tabla de
Simplificación.

TABLA DE SIMPLIFICACIÓN
24 25 27 32 33 34 36 37 40 41 42
1
»

0 O 0 0 1X
0 1 1 0 X 1
• c-\¡ \
1 X 1 0 1 1

0 X 0 X 0 1 i
X 0 0 X0 1 1 (y. •>>

X 0 X0 0 1
.
X 0 X 0 1 0-
*

X 0 0 1 0 X
- -tí*..
^ |
X 0 1 0 OX (
X 0 1 0 X 0
r~
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
24 25 27 32 33 34 36 41 42
X X 1 0 0 0 f
1 0 X 0 X 0 ! - if •
1 X X 0 0 0 i -
• ir f {• \7 f \0 1
i ^
„ i
:
1 ^^^^^j
^^B^S

Fig. 3.63: Segunda página Horizontal y segunda página vertical de la tabla de


simplificación.
127

43 44 45 46 47 48 56 59 62
* U U U A 1
0 0 0 0 1X
0 1 1 0 X 1
* 1 1 U 1 1
(\\
1 X 1 0 1 1
• A l l í Lr^ s
\
0 X 0 X 0 1
X 0 0 X 0 1
• A X U U 1
X 0 X 0 0 1
* U A U i Lr^
* A U 1 U A
X 0 0 1 0 X
0 X 1 0 0 X-
X 0 1 0 0 X
X 0 1 0 X0

A * -t-r*

Fig. 3.64: Tercera Horizontal y primera vertical de la tabla de simplificación.

TABLA DE SÍM PURGACIÓN


1 X X 1 0 0 0
43 44 45 46 47 48 56
-
59 62

1 0 X 0 X 0
1 XX0 0 0 - T;

* U A A U A
1

<• U 1 A A A
¿}
\i ri y (. 7
\ (• V
\ (.\>
^^
ce
Fig. 3.65: Tercera página Horizontal y segunda página vertical de la tabla de
simplificación.

ESCENCIALES SECUNDARIOS
0X01OX OXXOQ1
101XXX 0X1OOX
1XXOOO XOX010
1X1110 1OXXOX
X11011
0000X1

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

0000000 0 0010QOOJO 0100000 o 0110000|


J0000001 1 0010001 1 01000D1 • 0110001 |
0000010
0000011
1
1
0010010
0010011
0 0100010
1 0100011 P
p 011001 O J
011001 1 |
0000100 0 00101 00 0 01 0 0 1 0 0 p 0110100]
0000101 1 0010101 1 0100101 F 0110101 |
0000110 0 00101 10 1 01001 10 ir 011Ü11QJ
0000111 1 00101 11 1 0 1 0 0 1 11 ir 01101 1 1 ¡
0001000 0 001 1000 0 0101000 p 01 1 1 0 0 0 ¡
00010D1 1 001 1001 [T 0 1 0 1 0 0 1ir 0111001J
0001010 0 001 1010 0 0 1 0 1 0 1 0 0 01 1 1 0 1 0 J
D00101 1 1 001101 1 010101 1 r 0111011
0001 1 00 o 0011100 o 0101 100 0 0111 100
0001101 o 001 1101 " 0101 101 1 011 1 101
0001 1 10 0
0001 1 1 1
" 0101 110 0 \ 1 1 11 1 0
J001 1110
i joomi iF" 0101111 1 ¡0111 111 j

Fig. 3,68: Tabla de combinaciones.

MINTERMINOS MINTERMINOS
1 000000 1 30 0 0 1 1 1 1 1) 61 01 1 1 1 01
2 00000 10 31 001111 65 1 0 000 0 1
3 000001 1 33 01 0000 66 1 00 00 1 0
5 0000 10 1 37 010010 67 1 0000 1 1
7 0000 1 11 38 01 001 1 ) ( 69 1 0 00 1 0 1
9 000 100 1 39 010011 71 1 000 1 1 1
11 000 1011 41 010100 73 1 00 1 00 1
15 000 1 1 1 1 43 010101 75 1 00 1 0 1 1
17 00 1000 1 45 0101 10 77 1 00 1 1 0 1
19 00 100 1 1 47 010111 79 1 00 1 1 1 1
21 00 10 10 1 49 01 1 000 81 1 0 1 000 1
22 00101 10 51 01 1 001 83 1 0 1 00 1 1
23 00101 1 1 53 011010 85 1 01 01 01
25 00 1 1 00 1 55 011011 87 1 01 01 1 1
27 00 1 10 1 1 57 011100 91 1 0 1 1 01 1
29 00 1 1 101 59 011101 93 1 01 1 1 01

Fig. 3.69: Mintérminos.


129

MINTERMINOS
95 1011111 Al 127 1 1 1 1 1 1 1
97 1 100001 H|
99 1 1 0001 1
101 1100101
103 1100111
105 1 1 01 0 0 1
107 1101011
109 1101101
111 1101111
113 1 1 10001
115 1110011
117 1110101
119 1110111
121 1111001
123 1111011 *j .
125 1111101 IB

Fig. 3.70: Míntérminos.

A continuación se indica los cubos ceros.

CUBOS O
*OOOOOQ1 * 001 1 001 Al * 01 0 0 1 1 1 Al " 0 0 1 1 1 1 1 A] " 1 0 1 1 1 1 1
* 000001 0 * 01 0 0 1 01 jQ " 0 1 0 1 0 1 1 JH " 0 1 0 1 1 1 1 JH " 1 1 0 1 1 1 1
0 1 0 0 1 10 0 1U1 10 1 0110111 "1110111
* 0 0 0 0 0 11 " 0 1 0 1 001 "0110011 "0111011 J: " 1 1 1 1 0 1 1
"0000101 * 01 1 0 0 0 1 * 01 1 0 1 01 . -í * 01 1 1 1 0 1 "1111101
* 000 100 1 • * 1000011 "0111001 * 10 0 1 1 11
* 001 0001 '•'•• - • ; * 1 0 0 0 1 01 "1000111 "1010111 "1111111
* 0 1 0000 1 * 1 o o 1o n i "1001011 * 1o 1 1n 1 i
* 100 0 001 " 1 01 0 0 0 1 "1001101 "1011101
* 1000010 * 1 100001 "1010011 "1100111
iU 1 U 1U1 1 1 v I U I 1 „ - *
* 00001 11 * 0001 1 11 "1100011 "1101101 • •
* 0001 0 1 1 "0010111 " 1 1 0 0 1 01 "1110011 v -
" 001 001 1 "0011011 * 1 1 01 0 0 1 * 1 11 01 01 v. ; ;,,
" 001 o í 01 [si * 0 0 1 1 1 01 m¿ "1110001 jAé "1111001 má
* oo 1 o 1 1 o IB * n n 1 1 1 1 n wi n-?M
"3$

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
00000X1 X000101 Al 100x001 Al X01 001 1 Al 0 1 0 1 X 0 1
0000X01 00010X1 TI 10X0001 T| 0 0 1 0 1 X 1 3¡ 0 1 X 1 0 0 1
000X001 00X1 001 1X00001 001X101 XI 01 001
00X0001 0X01 001 1 00001 X 0X1 0 1 0 1 01 1 00X1
0X00001 X001 001 X01 01 01 01 1 0X01
X000001 001 00X1 000X1 1 1 001 01 IX 01 1 X001
000001X 001 0X01 00X01 1 1 001X110 XI 1 0001
X00001 0 001 X001 0X001 1 1 001 1 0X1 1 000X1 1
f\v i f\ i
UX 1 Ü U 0 1 V
A Uf\ U1 1U 1 1 1 001 1 X 0 1 1 00X0 1 1
0000X1 1 X01 0001 0001 XI 1 0X1 1 001 1 0X001 1
000X01 1 01 00X01 00X1 01 1 01001X1 1 X0001 1
00X001 1 01 0X001 0X01 01 1 01 0X1 01 1 0001 XI
X00001 1 01 X0001 X001 01 1 01 X01 01 1 00X1 01
00001X1 XI 00001 001 0X1 1 XI 001 01 1 0X01 01
00X0101 *| 10000x1 jy 001x01 1 *| 0 1 0 0 1 1 X Jl 1 X001 01
0X00101 W\J1000X01 T| 0X1 001 1 5] 0 1 0 1 0X1 'W 1 001 0X1

Fig. 3.72: Cubos 1

CUBOS 1 CUBOS 1 CUBOS 1 CUBOS 1 CUBOS 1


i 001 x o i Al 0 0 1 1 x 1 1 Al 0110X11 Al
1x01001 JQ o x i 1 0 1 1 ¥1 01 1 X 0 1 1 Tj 1 X 0 1 1 01 Si 1 1 1 00X1
1 01 0 0 X 1 X 0 1 1 01 1 XI 1 001 1 1 01 0X1 1 1 1 1 0X01
1 01 0X01 001 1 1X1 01101X1 101X011 1 1 1X001
1 XI 0 0 0 1 0X1 1 1 01 011X101 1X10011
1 1000X1 X 0 1 1 1 01 XI 1 01 01 10101X1 X01 1 1 1 1
1 100X01 001 1 1 1 X 0 1 1 1 0X1 101X101 XI 01 1 1 1
1 1 0X001 01 0X1 11 01 1 1 X01 1X10101 XI 1 01 11
1 1X0001 01 X 0 1 1 1 XI 11 0 0 1 1 1 00X1 1 X1 1 1 0 1 1
X I 0 0 1 11 1 00X1 1 1 1 1 0X011 XI 1 1 1 01
00X1 1 1 1 0101X11 1 0X01 1 1 1 1 X001 1 1 0X1 1 1 1
0X01 1 1 1 01X1011 1 X001 1 1 11001X1 1 X01 1 1 1
X001 1 11 XI 01 01 1 1001X11 1 1 0 X 1 01 101X111
001X111 01011X1 1 0X1 01 1 1 1 X 0 1 01 1X10111
0X10111 fr) 01X1101 1 1 1 X 0 1 01 1 jlj 1 1 0 1 o x i jrj 1 0 1 1 X 1 1
X 0 1 01 1 1 ™ X 1 0 1 10 1 ™ 10011X1 W\ o1x1i 0110x10 1 AjW\1 1 X 1 1 0 1 1

Fig. 3.73: Cubos 1


131

CUBOS 1 CUBOS 1
lonixi Al 11X1111
1X11101 j] 1 1 1 X 1 1 1
1 1 0X1 1 1 1111X11
1 1X01 1 1 11111X1
1101X11
11X1011
11011X1
11X1101
1 1 1 0X1 1
111X011
11101X1
111X101
1 1 1 1 0X1
1 1 11X01
•1
1x11111 X
VI

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 2


OOOOXX1 00X0X11 Al ooioxxi Al 100X0X1 Al 0 X 0 1 X I 1
000X0X1 XOOOX11 10 001X0X1 T\1 10 00 X
X 01 0 X 1 T| X 0 0 1 X 1 1
00X00X1 OOXX01 1 1X000X1 O X X 1 01 1
XOOOOX1 XOOX01 1 X01 00X1 1 OOXX01 X O X 1 01 1
00X0X01 XOX0011 001 XX01 1 0X0X01 X X 0 1 01 1
0X00X01 0 0 X 0 1 X1 0X1 0X01 1X00X01 001 XX1 1
XOOOX01 0 X 0 0 1 XI X01 0X01 1X0X001 0X1 0X1 1
OOXX001 X 0 0 0 1 XI 0X1 X001 1XX0001 X01 0X1 1
0X0X001 O X X 0 1 01 XX1 0001 0X1 X01 1
XOOX001 X O X 0 1 01 01 O X X 0 1 OOXX1 1 1 X01 X01 1
OXX0001 XX001 01 01 X O X 0 1 0X0X1 1 1 X X I 00 1 1
XOX0001 00X1 0X1 XI 0 0 X 0 1 XOOX1 1 1 001X1X1
XX00001 0X01 0X1 01 X X O Q 1 OXX01 1 1 0 X 1 01 XI
X00001 X X 0 0 1 0X1 XI 0 X 0 0 1 XOX01 1 1 X 0 1 01 XI
n
U y y 11vn\Jn 11
/\S •1 y
^H />. 1
1 /*^yo
v vnU o1 i ^tl
•y1 .A.
A. yU n\Jn1 1 n
1 1 i i .^tl •
y i y i ni
U )XV 1 .A. 1 \J 1

OOOXX1 1 ffl XX01001 " 1 0 0 0 X X 1 Tj 0 0 x 1 xi i T] 0 1 X I 0 1


X

Fig. 3.75: Cubos 2


133

CU8OS8 CUBOS3
OOXOXX1 oxxoixi 'M x i x x o o i M XX1 0X1 1
XOOOXX1 XOX01X1 H. i ooxxxi ül X X 1 X 0 1 1
OOXXOX1 XX001X1 10XOXX1 X01X1X1
XOOXOX1 XXX0101 1XOOXX1 XX1 0 1 X 1
XOXOOX1 OXX1 0X1 1X0X0X1 X X 1 XI 01
OXXOX01 XX010X1 1XXOOX1 XI 0 X 1 X 1
XOXOX01 001 XXX1 1XOXX01 X1 X 0 1 X1
XXOOX01 0X1 O X X 1 1XXOX01 X 1 X X 1 01
OXXX001 X01 OXX1 X I 01 X X I
XXOX001 0X1X0X1 XOXX1 11 X1X1 0X1
XXX0001 r X X I 00X1 : XXOX1 11 X1 X I X 0 1
0X1 XX01 XXX01 11 XI 1 O X X 1
OOXXX1 1 XX 1 0 X 0 1 X O X 1 XI 1 X1 1 X 0 X 1
XOOXX1 1 01 X X X 0 1 X X 0 1 XI 1 XI 1 X X 0 1
XOXOX1 1 [jg xioxxoi a| x x x i o n mt 1 OXXX1 1
xoxxoi 1 \m X1XOX01 1H< x o i x x n m 1XOXX1 1

Fig. 3.78: Cubos 3

CUBOS3
1XXOX11 1X1XX11
1XXX01 1 1X1XIX1
1 OXX1XI 1 1XXX1 1
1XOX1X1 11XXIXI
1XX01XI 1 1X1XXI
1XXX101 1 1 1XXXI
1X01XX1
1X1OXX1
11OXXX1
11XOXX1
11XXOX1
11XXX01
1XXX111
1XX1XI1
1XX11X1

Fig. 3.79: Cubos 3


134

CUBOS 4
xoxoxxf
XXXOX01

XOXXX11
XXX01X1
XXIOXX1
X1XXX01
1XOXXX1
1XXOXX1

1XXXX11
1XXX1X1
11XXXX1

Fig. 3.80: Cubos 4

En la figura 3.81 se indican los implicantes primos.


IMPLICANTES PRIMOS IMPLICANTES PRIMOS IMPLICANTES PRIMOS
01001 1 X X01X1X1 11XXXX1
X00001X XX1X101
001XI1X XI0X1X1
OOXXOX1 X101XX1
XOOXOX1 XIXI0X1
OXXX001 X11X0X1
XXOX001 XOXOXX1
OXX10X1 XXXOX01
XX010X1 XOXXX11
001XXX1 XXX01X1
0X1X0X1 XX1OXX1
0X1XX01 X1XXX01
XXOX111 1XOXXX1
XX01X11 1XXOXX1
XXXI011 1XXXX11
XXIX011 1XXX1X1

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
1 2 3 5 7 9 15 17 19

— _ -, /4. ;
s fL \
- X O U O O 1 JS~
1

0 0 X X 0 X 1 • 1 • T
_
*
.
0 X X X 0 0 1 •
X X 0 X 0 0 1 ••
" (• \1 ~•

X X 0 1 0 X 1 T
*

0 X 1 X 0 X 1 , T

0 X 1 X X 0 1

X X 0 1 X 1 1 * T

»
X XX 1 0 1 1 T

X X 1 X0 1 1 r

«w
Fig. 3.82: Tabla de Simplificación

TABLA DE SIMPLIFICACIÓN
21 22 23 25 27 29 30 31 37
*
*
« f\ t
\
¿ )•i f-
\3
* ^
0 0 X X 0 X 1
*

0 X X X 0 0 1
X X 0 X 0 0 1
i-sfl7 —

X X0 1 0 X 1
» f
\
0 X 1 X 0 X 1 T

0 X 1 XX0 1

X X0 1 X 1 1
X XX 1 0 1 1 *

X X 1 X0 1 1 *

Fig. 3.83: Tabla de Simplificación


136

3 39 41 43 47 49 5 1 53 55
(• -, c\ ,
" \ J )
1. ¡ <
i !

!
«
*
0 0 X X 0 X 1
i
0 X X X 0 0 1 t
X X Q X 0 0 1 t (3 \5
X X 0 1 0 X 1
^
1
0 X 1 X 0 X 1 •
0 X 1 X X 0 1 1

X O X 1 1 1
- t
X X 0 1 X 1 1 '
j •
X X X 1 0 1 1 1 ii
1
X X 1 X 0 1 1 i i !

1
"V

Fig. 3.84: Tabla de Simplificación

TABLA DE SIMPLIFICACIÓN
57 59 61 65 6 6 69 71 1 75
*
/•\f t\ht
*
0 0 X X0 X 1 _
(• \
\
0 XXX0 0 1
X X 0 X 0 0 1
f.
* X X 1 O X 1 )
X X 0 1 0 X 1 T

*
0 X 1 X 0 X 1 1 i
0 X 1 X X 0 1 • •
X U X 1 1 1
*
X X 0 1 X 1 1
X XX 1 0 1 1 V

i
V
X X 1 X 0 1 1
•4»
m

Fig. 3.85: Tabla de Simplificación


137

TABLA DE SIMPLIFICACIÓN
77 79 81 83 e 5 87 91 93 95 97
-"

* í
0 0 X X 0 X 1
a

0 X X X 0 0 1 ;
X X0 X 0 0 1 '.
i
X X 0 1 0 X 1
*
0 X 1 X 0 X 1
o xi r xoi
X X 0 1 X 1 1 1
X X X 1 0 1 1 T

m
mm
1 X X 1 X 0 1 1 f *
WÉf

Fig. 3.86: Tabla de Simplificación

Vr
99 10 1 10 3 10 5 10 7 10 9 11 1 11 3 11 5 11 7
* ,

*
0 0 X X 0 X 1

0 X X X 0 0 1
X X 0 X 0 0 1 F
^
X X 0 1 0 X 1 > '
*
0 X 1 X 0 X 1
0 X 1 X X 0 1

.* X X O 1 X 1 1 '•
X X X 1 0 1 1 •
X X 1 X 0 1 1 •' • -

má fV*

Fig. 3.87: Tabla de Simplificación


138

119 12 1 12 3 12 5 127
* i
..1 , i
j
0 0 X X 0 X 1 i
1
u u x u & i
i
0 X X X 0 0 1
X X 0 X 0 0 1
_] i
\
X X 0 1 0 X 1
h""
;
U 1 X A X 1 ~1 i
f
0 X 1 X 0 X 1
0 X 1 X X 0 1
A U Ji. 1 1 1

X X0 1 X 1 1 s

X X X 1 0 1 1
X X 1 X0 1 1
!

Fig. 3.88: Tabla de Simplificación

i
1 X 0 1 X 1 X1
3L 2 I 7 cí 11 15 17 19

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 • • * *
f \ f ilf f
* \„ \ \
^
X 0 X X X 1 1 -' .** ;*••-
'f - -- -. .4.

X X X 0 1 X 1 w
«
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 XX X X 1 1
. 1 X X X 1 X 1- ,—„ . -™^ . ^.~

•fH

Fig. 3.89: Tabla de Simplificación


139

TABLA DE SIMPLIFICACIÓN
21 22 23 25 27 29 30 31 33 37
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
» / •l f.{\ /. \
k) \
X 0 X X X 11 ..*, .
X X X 0 1 X 1 '
«
1 X 0 X X X1
1 X X 0 X X1
1 X X X X 11

Jí •P>

Fig. 3.90: Tabla de Simplificación

TABIA DE SIMPLIFICACIÓN
39 39 41 43 ! 45 47 49 S 53 55
X 0 1 X 1 X1
X X1 X1 0 1
X 1 0 X 1 X1
Jr

X 1 0 1 X X 1
X 1 X 1 0 X 1 •t
X 1 1 X 0 X 1 i
X 0 X 0 X X 1
/1 /¡ •,
* 1. > v¡ >
X 0 X X X 1 1 - -
X X X 0 1 X 1 i
\\
„ -*¡ *~ ^
1 i X X U 1— 1
1 X 0 X X X 1
1 X X 0 X X 1
1 XXX X 1 1
1 1
•NP

Fig. 3.91: Tabla de Simplificación


140

TABLA DE SIMPLIFICACIÓN
1 X 0 1 X 1 X 1
57 59 61 65 66 67 69 7í 73 75

X X 1 X 1 0 1
X 1 0 X 1 X 1
1
'
X 1 0 1 X X 1
X 1 X 1 0 X 1 1 •

X 1 1 X 0 X i '

X 0 X 0 X X 1 •
/ •> / „.,,
* 1) <! &
X 0 X X X 11 - 1- • •T-

X X X 0 1 X 1

1 A A A U 1-

1 X 0 X X X 1 • ' T

1 X X 0 X X 1 J!
1 X X X X 1 1 J[ *

1 X X X 1 X 1- \1— ^ - .

1 — •P»

Fig. 3.92: Tabla de Simplificación

TABLA DE SIMPLIFICACIÓN
77 79 a 1 83 85 87 91 93 95 97
X 0 1 X í X 1 1 ir iF
X X 1 X 1 0 1 i
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 T •
f\ 'i f !7i
V. <s
* t )
X 0 X X X 1 1 T- • - '¿. i• ^
X X X 0 1 X 1 _ 1k
1" " .
V _ _ _ _ _ . _ .
X 1 A X A U 1 f—
1 X0 X X X 1 ••
1 X X 0 X X 1 T
• *
_.. 1 X X X X 1 1 1 ¥
•* ^^
1 X X X 1 X1 . ¿ *-_- !*—~ ,, —, •—^r_. h
—^ —^
•v»
Fig. 3.93: Tabla de Simplificación
141

TABLA DE SfM PI.1 FICACION


99 1C 10 3 1C 5 10 7 10 9 11 1 11 11 5 11
X 0 1 X 1 X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1 ;•
1
X 1 0 1 X X 1 1

X 1 X1 0 X1 •

X i 1 X0 X1 1

X 0 X 0 X X 1
f f s / ,
* \>^ \ > \&
v r* *r ir *r 4
i OA2 X 1 1
X XX0 1 X 1
X 1 U A A 1—
')

1 X 0 X X X 1 • 1

1 X X 0 X X 1 1

1 X X X X 1 1 •
4
1 *T
X T»
X *»
X 1 «•
X1 -á
-y
•V

Fig. 3.94: Tabla de Simplificación

DE SfMPUPCAGION
i• X 0 1 X 1 X 1
11 9 12 1 12 3 12 5 12 7

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

X 0 X 0 X X 1
* A A U A U 1
U A A A 1 1

X X X 0 1 X 1
A 1 U A A i
r
ihr
.. ..
1 & 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
'fl
£

Fig. 3.95: Tabla de Simplificación


142

TABLA DE SIMPLIFICACIÓN
1 2 3 5 7 9 11 15 17 19
| | |
1 t T
1 1 1
^W
21 22 23 25 27 29 30 31 33 37
• 1
1

TABLA DE SIMPLIFICACIÓN
38 39 41 43 45 47 49 51 53 55
1 , I 1 1 |
1
í
A i iro
1 ! 1 1 1 1
•P
TABLA DE SIMPLIFICACIÓN
57 59 61 65 66 67 69 71 73 75
• i 1
I
i
1
1
|
I

i
J
1
1

TABLA DE SIMPLIFICACIÓN
77 79 81 83 85 87 91 93 95 97
1 ! 1 •

^E9r
TABLA DE SIMPLIFICACIÓN
99 101 103 105 107 109 111 113 115 117

• 1 1 X X X X 1- T
T
A
i \í\
i T
lí.
r
í

TABLA DE SIMPLIFICACIÓN
119 121 123 125 127
1 1 X X X X 1- (ti
T
'T ,
;
jfSr
Fig. 3.96: Tabla de Simplificación

En la figura 3.97 se presenta los implicantes primos esenciales y


secundarios

SECUNDARIOS
X00001X XXXOX01.Í
001X1IX X1XXX01
01 0 0 1 I X 1XXX1X1
11XXXX1
XOXXX11
OXX10X1
XX1OXX1
XOOXOX1
001XXX1¿J
XXOX11 -
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 ButtonConstants


Public ColorEnfoque As ButtonConstants
Public e As Integer
Public f(0 To 1023) As String
Public FigNum As Integer
Public n As Integer
Public num_tema As Integer 'indica el numero de frame que se va a mostrar es
utilizada en la forma Indice_tutorial
Public m As Integer
Public pagina As Integer
Public paginal As Integer
Public paginaO As Integer
Public r(0 To 1023) As Integer
Public Tutor 'contiene el valor que indica el tema del tutorial
Function valida_Numero(k)
Select Case k
CaseS, 13, 32,46,48 To 57
valida_Numero = k
Case Else
valida_Numero = O
End Select
End Function

FORM1.

Prívate Type Registro


combinación As String * 20
respuesta As Stríng * 1
End Type
Prívate dato As Registro
Prívate Grupo(2047,16) As Integer
Prívate s(2047) As String
Prívate c(2047, 16) As String * 20
Prívate O(2047,16) As String
Prívate contv(2047) As Integer
Prívate conth(2047) As Integer
Prívate fíl(16) As Integer
Prívate Marca(2047, 16) As String
Prívate Tabla(2047, 2047) As String
Prívate fílaAnulada(2047) As Boolean
Prívate columnaAnulada(2047) As Boolean
Prívate numeroFüa(2047) As Integer
Prívate fila As Integer
Prívate col As Integer
149

Prívate MaxColCubos As Integer


Prívate max As Integer
Prívate MaxCol As Integer
Prívate Auxl As Integer
Prívate Aux2 As Integer
Prívate ultima As Boolean
Prívate Implicantes As Boolean
Prívate Tablalmplicantes As Boolean
Prívate marcas As Boolean
Prívate lineas As Boolean
Prívate Resultado As Boolean
Prívate escenciales As Boolean
Prívate ancho
Prívate alto
Prívate valizcom
Prívate PaginaHorizontal
Prívate PaginaVertícal
Prívate NumeroGrupo
Prívate espacio
Prívate ColorLinea
Prívate Tiempo
Const ColumnasDeTabla =17
Sub simplifiqueQ 'Esta función simplifica la función directamente y da la respuesta
Commandl.Enabled = False 'Para desabilitar el comando de siguiente
Simplificar.Enabled = False 'Para desabilitar el menú de simplificar
Commandl4,Enabled = False 'Para desabilitar el comando de terminara
Simppaso.Enabled = False Tara desabilitar el menú de simplificar el siguiente paso
Command2.Enabled - False 'Para desabilitar el botón de paso anterior
Simplificaranterior = False 'Para desabilitar el Menú de paso anterior
Command3,Enabled = False 'Para desabilitar el botón de Salir
Menu.Enabled = False Tara desabilitar el Menú
Text4,Locked = Truc 'Bloque el Editor de minterminos
MousePointer = vbHourglass 'Cambia la forma del cursor del mouse a un reloj
Titulo(2).Visible = False 'Esconde el titulo
Mensaje.Top = Text4.Top + Text4.Height + 500 'Posición vartical del mensaje
Mensaje.Visible = True 'Hace visible el mensaje
raya = " " 'borra la variable raya
For i = 1 To n 'Ubica tantas lineas como se necesiten
raya = raya & "--"
Next i
DoEvents 'Actualiza los eventos ejecutados
If lineas = True And Resultado = False Then 'Esta sección Genera la solución
Titulo(O). Visible = False
Titulo(l). Visible = False
Mensaje.Caption = "¡Generando la solución!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
Command 10. Visible = False
Commandl 1.Visible = False
Commandl2.Visible = False
Commandl3.Visible = False
150

Picturel. Visible = False


List2(0). Visible = False
List2(l). Visible = False
Texto = "Y = "
F o r i = l Tofil(col+l)
Ifn<5Then
Timer 1 = Timer
Do
DoEvents
Loop While Timer - Timer 1 <= Tiempo
Else
DoEvents
Endlf
For j = 1 To Len(c(i, col + 1))
If Mid(c(i, col + 1), j, 1) = "O" Then
If j = 2 Then Texto = Texto & "A1"
If j = 4 Then Texto = Texto & "B'M
If 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"'
Endlf
If 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"
Endlf
Nextj
If i o fil(col + 1) And Mid(c(i, col + 1), j, 1) o "X" Then Texto = Text6 + " +

If Len(Text6) < 50 Then


Texto,Width - 130 * Len(Text6.Caption) + 130 / Len(Textó.Caption) + 200
Text6.Height *= 500
Else
Text6.Height = 4*330
Textó.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml .Width / 2) - (Textó.Width / 2)) + 200
Textó.Top = (Forml.Height / 2) - Textó.Height
151

Textó.Visible = True
DoEvents
Next i
If fil(col + 2) > O Then Texto = Texto & " + "
For i - 1 Tofil(col+ 2)
If n < 5 Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
For j = 1 To Len(c(i, col + 2))
If Mid(c(i, col + 2), j, 1) = "O" Then
If 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
Endlf
If 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"
Endlf
Nextj
If i o fil(col + 2) And Mid(c(i, col + 2), j, 1) o "X" Then Texto = Texto + " +

IfLen(Text6)<50Then
Texto.Width = 130 * Len(Textó.Caption) + 130 / Len(Textó.Caption) + 200
Textó.Height = 500
Else
Textó.Height - 4 * 330
Texto.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml .Width / 2) - (Textó.Width / 2)) + 200
Textó.Top = (Forml .Height / 2) - Textó.Height
170

Texto.Width = 130 * Len(Text6.Caption) + 130 / Len(Text6.Caption) + 200


Textó.Height = 500
Else
Textó.Height = 4 * 330
Texto.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml.Width / 2) - (Texto.Width / 2)) + 200
Textó.Top = (Forml.Height / 2) - Textó.Height
Texto. Visible = Truc
DoEvents
Next i
If fil(col + 2) > O Then Texto = Texto & " + "
For i = 1 To fíl(col + 2)
If n < 5 Then
Timer 1 = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
For j = 1 To Len(c(i, col + 2))
If Mid(c(i, col + 2), j, 1) = "O" Then
If 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
Endlf
If 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"
Endlf
Nextj
If 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) + 200


Textó.Height = 500
Else
Text6.Height = 4 * 330
Texto.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml.Width / 2) - (Texto.Width / 2)) + 200
Textó.Top = (Forml.Height / 2) - Textó.Height
Textó.Visible = True
DoEvents
Next i
Resultado = True
Endlf

If escenciales = True And lineas = False Then


Mensaje.Caption = "¡BUSCANDO IMPLICANTES PRIMOS SECUNDARIOS!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
fila-O
Do
marcasmax = O
For i = 1 To fil(col)
conth(i) = O
Forj = lTofil(0)
If Tabla(i, j) = "*" And fíIaAnulada(i) = False And columnaAnulada(j) =
False Then
conth(i) = conth(i) + 1
If marcasmax < conth(i) Then marcasmax = conth(i)
Endlf
Nextj
Next i
For j = 1 To fil(col)
If conth(j) = marcasmax And filaAnulada(j) = False And marcasmax > O Then
sihay = False
For i2 = 1 To fil(O)
If Tabla(j, i2) = "*" And columnaAnulada(i2) = False Then
co1umnaAnulada(i2) = True
numeroFila(i2) = j
mostrarmarcas
Ifn<5Then
Timerl = Tímer
Do
DoEvents
Loop Whíle Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
sihay = True
Endlf
Next ¡2
If sihay = True Then
172

fílaAnulada(j) - Truc
fila = fila + 1
c(fila, col + 2) = cG, col)
mostrarmarcas
fd(col + 2) = fila
mostrarsecundarios
If n < 5 Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
Endlf
Endlf
Next j
Loop Until marcasmax = O
fíl(col + 2) = fila
If MaxCol < col + 2 Then MaxCol = coi + 2
If max < fil(col + 2) Then max = fil(col + 2)
lineas = Truc
If fila = O Then Commandl_CIick
fila = fil(col-l)
Mensaje.Visible = False
Mensaje.Caption =""
Endlf

If marcas = Truc And escenciales = False Then


Mensaje.Caption- "¡BUSCANDO IMPLICANTES PRIMOS ESENCIALES!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
Mensaje.Visible = True
DoEvents
contvmax = O
For i - 1 To fil(O)
contv(i) = O
For j = 1 To fil(col)
If TablaQ, i) = "*" Then contv(i) = contv(i) + 1
Nextj
If contvmax < contv(i) Then contvmax - contv(i)
Next i
fila = O
ColorLinea = RGB(0, 255, 0)
For i = 1 To fíl(O)
If contv(i) = 1 And columnaAnulada(i) = False Then
columnaAnulada(i) = True
mostrarmarcas
Ifn<5Then
Timerl = Timer
Do
173

DoEvents
Loop While Timer - Timerl <— Tiempo
Else
DoEvents
Endlf
Forj = lTofd(col)
If TablaG, i) = "*" And filaAnuladaO) = False Then
fílaAnulada(j) = True
numeroFila(i) = j
mostrarmarcas
fila-fila+1
c(fila, col + 1) = c(j, col)
fil(col + l) = fila
mostraresenciales
Ifn<5Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
For i2 = 1 To fil(O)
If Tabla(j, i2) = "*" And columnaAnulada(i2) = False Then
colurnnaAnulada(i2) = True
numeroFila(i2) = j
mostrarmarcas
Ifn<5Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
Endlf
Next i2
EndTf
Nextj
Endlf
Next i
fíl(col+l) = fila
fila = fil(col-l)
If MaxCol < col + 1 Then MaxCol = col + 1
If max < fil(col + 1) Then max = fíl(col +1)
escenciales = True
Endlf

If Implicantes = True And Tablalmplicantes = False Then Tara construir la tabla de


simplificación
174

Mensaje.Caption = "¡Construyendo la tabla de simplificación!"


Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
DoEvents
If Aux2 o col Then
For i = 1 To fil(O)
s(i) = O(i, 0)
Next i
For i - 1 Tofil(O)- 1
Forj = i + l T o f i l ( 0 )
If Val(s(i)) > Val(sG)) Then
aux = s(i)

s(j) = aux
Endlf
Nextj
Next i
For i = 1 To fíl(col)
pl =0
For pos - 1 To Len(O(i, col))
If Mid(O(i, col), pos, 1) = " " Or Mid(O(i, col), pos, 1) = ",M Then
pl=p2
p2 = pos
I 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
Endlf
Endlf
If pos = Len(O(i, col)) Then
pl=P2
p2 = pos
Ifp2-pl>OThen
subindice = Mid(O(i, col), pl, p2 - pl + 1)
Forj = lTofil(0)
If Val(subindice) = Val(sQ)) Then Tabla(i, j) = "*"
Nextj
Endlf
Endlf
Next pos
DoEvents
Next i
Aux2 = col
Endlf
Titulo(O). Visible = False
Listl(O).Visible-False
Titulo(l).Visible = False
Listl(l). Visible = False
Commandó.Enabled = False
Commandó. Visible = False
175

Command7.Enabled = False
CommandT.Visible = False
CommandS.Enabled = False
CommandS. Visible = False
Command9.Enabled = False
Command9.Visible = False
Label3(0).Visible = False
Label3(l). Visible = False
DoEvents
PaginaHorizontal = O
PaginaVertical = O
mostrarTabla
Tablalmplicantes = True
marcas = True
Endlf
If 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) / 2
DoEvents
auxiliar = fil(col + 1)
If MaxColCubos < col Then
fila-O
NumeroGrupo = 1
sihay = False
For i = 1 To fil(col) - 1
IfO(i,col)o"-"Then
ray = O
F o r j - i + 1 Tofil(col)
If Grupo(j, col) = Grupo(i, col) + 1 And O(j, col) o "-" Then
cont = O
For 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) Then
cont = cont + 1 'cuenta el numero de cambios
spos = j 'rescata la combinación con la que hay el cambio
cpos = pos 'rescata la posición del bit que cambia
Endlf
DoEvents
Next pos
If cont - 1 Then
fila = fila+1
c(fíla, col + 1) = c(i, col) 'crea la nueva columna con los cubos ceros
Marca(i, col) = "*"
MarcaOí col) = "*"
Mid(c(fila, col + 1), cpos) = "X" 'inserta una X en el bit que cambia
cont2 = O
Fork=lTofila-l
If c(fila, col + 1) = c(k, col + 1) Then cont2 - cont2 + 1
Nextk
If cont2 = O Then
176

O(fíla, col + 1) = O(i, col) & "," & O(spos, col) 'Almacena las
combinaciones que cambiaron
Gmpo(fila, col + 1) = NumeroGrupo
sihay = Truc
Else
fila = fila - 1
Endlf
Endlf
Endlf
IfO(j, col) = "-" Then
ray = ray + 1
Endlf
If ray = 2 Then
Exit For
End If
Nextj
Else
If sihay = Truc Then
fila = fila + 1
c(fila, col + 1) = raya
O(fila, col+ !) = "-"
Marca(i, col) ="-"
Marca(fila, col + 1) = "-"
Grupo(fila, col + 1) = NumeroGrupo
NumeroGrupo = NumeroGrupo + 1
Endlf
Endlf
Next i
If fila > O Then fila = fila - 1
fil(col + 1) = fila
Endlf
If MaxColCubos < col Then MaxColCubos = col
If MaxCol < col + 1 Then MaxCol = col + 1
If max < fil(col + 1) Then max = fil(col + 1)
col = col + 1
If (fila = 0) Or (col = Auxl) Then
ultima = True
fíl(col) = auxiliar
Else
Commandó.Enabled = False
Commandó.Visible = False
Command7.Enabled - False
Command7.Visible - False
CommandS.Enabled = False
CommandS.Visible = False
Command9.Enabled = False
Command9.Visible = False
Label3(0). Visible = False
Label3(l).Visible - False
177

Titulo(0).Caption = "CUBOS " & col - 2


Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
mostrarlistlO

Listl(l).ToolTipText = "Tabla de cubos " & Str(col - 1)


Titulo(l).Caption = "CUBOS " & col - 1
mostrarlistl 1

DoEvents
Endlf
Endlf

If ultima = True And Implicantes = False Then Tara hallar los implicantes primos
Mensaje.Caption = "¡Calculando los implicantes primos!"
Mensaje.Leñ - (Forml .Width - Mensaje.Width) / 2
DoEvents
If Auxl o col Then
Auxl =col
fila = O
Forj = 1 To col -1
Fori=lTofíl(j)
If Marca(i, j) o "*" And O(is j) o "-" Then
fila = fila + 1
0(fila,col) = 0(i,j)
c(fila,col) = c(i,j)
Marca(fila, col) - ""
Endlf
DoEvents
Next i
Nextj
fil(col) = fila
Endlf
Commandó.Enabled = False
Commandó.Visible = False
CommandT.Enabled = False
Command7.Visible = False
CommandS.Enabled = False
CommandS. Visible = False
Command9.Enabled = False
Comrnand9.Visible = False
Label3(0). Visible = False
Label3(l). Visible = False
Titulo(0).Caption = Titulo(l).Caption
Titulo(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
mostrarlistlO
Titulo(l).Captíon= "IMPLICANTES PRIMOS"
Listl(l).ToolTipText = "Tabla de Implicantes primos "
mostrarlistll
If MaxCol < col + 1 Then MaxCol = col + 1
If max < fíl(col) Then max = fil(col)
178

Implicantes = True
Endlf

If col = O Then 'Para Construir la tabla de los cubos O


Command4.Enabled = False
Command4. Visible = False
CommandS.Enabled = False
Command5. Visible = False
CommandS.Enabled = False
Mensaje.Caption = "¡Calculando los cubos O!"
Mensaje.Leñ = (Forml.Width - Mensaje.Width) / 2
DoEvents
For i = O To Text2.UBound
Text3(i).Visible = False
Text2(i).Visible = False
Next í
DoEvents
col = col + 1
IfMaxCol = OThen
fila = O
For i = O To 2 A n - 1
Ifr(i)=lThen
fila = fila+1
c(fila, 0) = f(i)
O(fila, 0) - i
Endlf
Next i
fil(O) = fila
fila = O
Forj = OTon
sihay = False
For i = O To 2 A n - 1
Ifr(i)=lThen
cont = O
For pos = 1 To 2 * n
Bit = Val(Mid(f(i), pos, 1))
If Bit = 1 Then cont = cont + 1
Next pos
If cont = j Then
fila = fila + 1
c(fila, col) = f(i)
O(fíla, col) = Str(i)
Grupo(fila, col) = j
sihay = True
Endlf
Endlf
Next i
If sihay = True Then
fila = fila + 1
c(fila, col) = raya
179

O(fíla, col) ="-"


Grupo(fíla, col) = j
Endlf
Nextj
fíl(col) = fila
Endlf
Label3(0). Visible - False
Label3(l). Visible = False
Titulo(0).Caption = "MTNTERMINOS"
Titulo(0).ToolTipText = "Tabla de MINTERMINOS"
mostrarlistlO
Titulo(l).Captíon = "CUBOS O"
TituLo(l).ToolTipText = "Tabla de cubos O"
mostrarlistll
If MaxCol < col Then MaxCol = col
If max < fíl(col) Then max = fíl(col)
Endlf
If Resultado = False Then
Commandl .Enabled = True
Simplificar.Enabled = True

CommandH.Enabled = True

Simppaso.Enabled = True
Endlf
Command2.Enabled = True
Simplificaranterior = True
Command3.Enabled = True
Menu.Enabled = True
Text4.Locked = False
Mensaje.Caption = ""
Mensaje. Visible = False
MousePointer = vbDefault
End Sub

Prívate Sub Commandl_MouseMove(Button As Integer, Shift As Integer, X As Single,


Y As Single)
Commandl.BackColor = ColorEnfoque
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Commandl 4.BackColor = ColorlnicialBotones
End Sub

Prívate Sub Commandl0_Click()


PaginaVertical = PaginaVertical + 1
mostrarTabla
mostrarmarcas
If fil(col + 1) > O Then mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
End Sub
180

Prívate Sub Commandl l_Click()


PaginaVertical = PaginaVertical - 1
mostrarTabla
mostrarmarcas
If fil(col + 1) > O Then mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
End Sub
Prívate Sub Commandl2_Click()
PaginaHorizontal = PaginaHorízontal + 1
mostrarTabla
mostrarmarcas
If fíl(col + 1) > O Then mostraresenciales
If fíl(col + 2) > O Then mostrarsecundarios
End Sub
Prívate Sub Commandl3_Click()
PaginaHorizontal = PaginaHorizontal - 1
mostrarTabla
mostrarmarcas
If fíl(col + 1) > O Then mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
End Sub

Prívate Sub Commandl4_Click()


Tiempo = O
Do
Cali simplifique
Loop Until Resultado = True
Tiempo = 1
End Sub

Prívate Sub Commandl4_MouseMove(Button As Integer, Shiñ As Integer, X As


Single, Y As Single)
Commandl 4.BackColor = ColorEnfoque
Commandl.BackColor = ColorInicialBotones
Command2.BackColor = ColorInicialBotones
CommandS.BackColor = ColorInicialBotones
End Sub

Prívate Sub Command2_Click()


If col > O Then
Commandl.Enabled = False
Simplificar.Enabled = False
Commandl 4.Enabled = False
Simppaso.Enabled = False
Command2. Enabled = False
Simplificaranterior = False
Command3. Enabled = Fiase
Menu.Enabled = False
Text4.Locked = True
181

Commandó.Enabled = False
Commandó, Visible = False
CommandT.Enabled = False
Command? .Visible = False
CommandS.Enabled = False
CommandS. Visible == False
Command9.Enabled = False
Command9.Visible = False
Label3(0).Visible = False
Label3(l).Visible - False
If Resultado = True Then
Texto = ""
Textó.Visible = False
Titulo(0).Visible = True
mostrarTabla
mostrarmarcas
mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
Simppaso.Enabled = True
Simplifícar.Enabled = True
Commandl4.Enabled = True
Resultado = False
El se
If lineas = True Or escenciales = True Then
Picturel. Visible = True
Titulo(2). Visible = False
List2(l). Visible = False
Titulo(l).Visible = False
List2(0).Visible = False
Textó.Visible = False
For i = 1 To UBound(numeroFila)
numeroFila(i) = O
Nexti
For i = 1 To UBound(fllaAnulada)
filaAnulada(i) = False
Nexti
For i = 1 To UBound(columnaAnulada)
columnaAnulada(i) = False
Nexti
mostrarTabla
fil(col + 2) = O
escenciales = False
fil(col + l) = 0
lineas = False
Else
If marcas = True Then
marcas = False
Command2_Click
Else
If Tablalmplicantes = True Then
182

Picturel. Visible = False


CommandlO. Visible = False
Commandl 1.Visible = False
Commandl2.Visible = False
Commandl 3. Visible = False
Titulo(0).Visible = False
Titulo(l).Caption= "IMPLICANTES PRIMOS"
DoEvents
Listl(l).ToolTipText = "Tabla de implicantes primos"
Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
Listl(0).Left = 3000
mostrarlistl 1

Titulo(0).Caption - "CUBOS " & col - 2


mostrarlistl O
Tablalmplicantes = False
Else
If ultima = True Then
col = col -1
Titulo(l).Caption = Titulo(0).Caption
Listl(l).ToolTipText = Listl(0).ToolTipText
Listl(0).ToolTipText - Listl(0).ToolTipText
mostrarlistl 1
Titulo(0).Caption = "CUBOS " & col - 2
mostrarlistl O
Implicantes = False
ultima = False
Else
col = col - 1
Ifcol> 1 Then
Titulo(l).Caption = Titulo(0).Caption
Listl(l).ToolTipText = Listl(0).ToolTipText
Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
mostrarlistll
Titulo(0).Caption = "CUBOS " & col - 2
mostrarlistl O
Else
If col= 1 Then
Listl(l).Visible = False
CommandS.Visible = False
Command9.Visible = False
Titulo(l).Caption = "CUBOS O"
Listl(l).ToolTipText = "Tabla de CUBOS O"
mostrarlistl 1
Titulo(0).Caption = "MINTERMINOS"
Listl(0).ToolTipText = "Tabla de MINTERMINOS"
mostrarlistl O
Else
Titulo(0).Visible = False
List 1(0). Visible = False
183

Titulo(l),Visible = False
Listl(l).Visible = False
Commandó.Visible = False
Command7.Visible = False
DoEvents
If2 A n<=64Then
For i = O To 2 A n -1
Text3 (i). Visible = True
Text2(i).Visible = True
DoEvents
Next i
Else
For i - O To Text3.UBound
Text3 (i). Visible = True
Text2(i).Visible = True
DoEvents
Next i
If pagina > O Then
Command4.Enabled = True
Command4.Visible - True
Endlf
If pagina < (2 A n) / 64 - 1 Then
CommandS.Enabled = True
CommandS.Visible = True
Endlf
Endlf
Endlf
Endlf
ultima = False
Endlf
Endlf
Endlf
Endlf
Endlf
Commandl.Enabled = True
Simplificar.Enabled = True
CommandH.Enabled = True
Simppaso.Enabled = True
If col > 0 Then
Command2.Enabled = True
Simplificaranterior = True
Endlf
CommandS.Enabled = True
Menu.Enabled - True
Text4.Locked = False
Endlf
End Sub

Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,


Y As Single)
184

Commandl .BackColor = ColorlnicialBotones


Command2.BackColor = ColorEnfoque
Command3.BackColor = ColorlnicialBotones
Commandl 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 = ColorlnicialBotones
Command2. BackColor = ColorlnicialBotones
Command3.BackColor = ColorEnfoque
Commandl 4.BackColor = ColorlnicialBotones
End Sub

Prívate Sub Command4_Click()


Command5.Left = Text2(63).Left + Text2(63).Width - CommandS.Width
Command5.Top — Command4.Top
CommandS.Enabled = True
CommandS. Visible = True
pagina = pagina - 1
For 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
Nexti
If pagina = O Then
Command4.Enabled = False
Command4. Visible = False
Endlf
End Sub

Prívate Sub Conunand5_Click()


Command4.Left = Text3(15).Left
Command4.Top = CommandS.Top
Command4.Enabled = True
Command4. Visible = True
pagina = pagina + 1
For 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

Else
Text2(i).Text=n"
Endlf
Nexti
Text2(0).SetFocus
If 2 A n - 1 = 63 + pagina * 64 Then
CommandS.Enabled = False
CommandS. Visible = False
Endlf
End Sub

Prívate Sub Command6_Click()


paginaO = paginaO -1
Commandó.Left = CommandT.Left
Commandó.Top = Listl(0).Top
Command6.Enabled = False
Command6.Visible = False
Command7.Enabled = True
CommandT.Visible = True
Listl(0).Clear
If col = 1 Then
For i = paginaO * 16 + 1 To fil(O)
If i <= paginaO * 16 + 16 Then
IfVal(O(i,0))<=9Then
Listl(0).AddItem (" " & O(i, 0) + " " & c(i, 0))
Else
IfVal(O(i,0))<=99Then
Listl(0).AddItem (" " & O(i, 0) + " " & c(i, 0))
Else
Listl(0).AddItem ( IIM & O(i, 0) + " " & c(i, 0))
Endlf
Endlf
Endlf
If paginaO > O Then
Commandó.Left = Commandó.Left
Commandó.Top = Listl(0),Top
Commandó.Enabled = True
Commandó. Visible = True
Endlf
DoEvents
Nexti
Else
For i = paginaO * 16 + 1 To paginaO * 16+16
If i <= paginaO * 16 + 16 Then
If Marca(i, col - 1) = "*" Then
Listl(0).AddItem (Marca(i, col - 1) & " " & c(i, col - 1))
Else
Listl(0).AddItem (" " & c(i, col - 1))
Endlf
Endlf
186

If paginaO > O Then


Commandó.Left = Commandó.Left
Commandó.Top = Listl(0).Top
Commandó.Enabled = Truc
Commandó.Visible = True
Endlf
DoEvents
Nexti
Endlf
End Sub
Prívate Sub Command7_Click()
paginaO = paginaO + 1
Commandó.Left = Command7.Left
Commandó.Top = Listl(0).Top
Commandó.Enabled = True
Commandó.Visible = True
Command7.Enabled = False
Command7.Visibie = False
Listl(0).Clear
If col = 1 Then
For i = paginaO * 16 + 1 To fil(O)
If i <= paginaO * 16 + 16 Then
IfVal(O(i,0))<=9Then
Listl(0).AddItem (" " & O(i, 0) + " (t & c(i, 0))
Else
IfVal(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
Endlf
Else
Command7.Left = Listl(0).Left + Listl(0).Width
Command7.Top = Listl(0).Top + Listl(0).Height - Command7.Height
Command7.Enabled = True
Command7.Visible = True
Endlf
DoEvents
Nexti
Else
For i = paginaO * 16 + 1 To fil(col - 1)
If i <= paginaO * 16 + 16 Then
If Marca(i, col - 1) = "*" Then
Listl(0).AddItem (Marca(i, col - ! ) & " " & c(i, col - 1))
Else
Listl(0).AddItem (" " & c(i, col - 1))
Endlf
Else
Command7.Left = Listl(0).Left + Listl(0).Width
Command7.Top = Listl(0).Top + Listl(0).Height - Command7.Height
187

CommandT.Enabled = True
CommandT.Visible = True
Endlf
DoEvents
Next i
Endlf
End Sub
Prívate Sub Cornmand8_Click()
pagina 1 = pagina 1 - 1
CommandS.Left = CommandS.Left
CommandS.Top = Listl(l).Top
CommandS.Enabled = False
CommandS.Visible = False
Command9.Enabled - True
Command9.Visible = True
Listl(l).Clear
For i = paginal * 16 + 1 To fil(col)
If i <= paginal * 16 + 16 Then
Listl(l).AddItem (c(i, col))
Endlf
If paginal > O Then
CommandS.Left = CommandS.Left
CommandS.Top = Listl(l).Top
CommandS.Enabled = True
CommandS.Visible = True
Endlf
DoEvents
Next i
End Sub
Prívate Sub Command9_Click()
paginal = paginal + 1
CommandS.Left = Command9.Left
CommandS.Top = Listl(l).Top
CommandS.Enabled = True
CommandS.Visible = True
Command9.Enabled = False
Command9.Visible = False
Listl(l).Clear
For i = paginal * 16 + 1 To fil(col)
If i <= paginal * 16 + 16 Then
Listl(l).AddItem (c(i, col))
Else
Command9.Left - Listl(l).Left + Listl(l).Width
Command9.Top = Listl(l).Top + Listl(l).Height - Command9.Height
Command9.Enabled = True
Command9. Visible - True
Endlf
DoEvents
Next i
End Sub
188

Prívate Sub CuatroEntradas_Click()


n=4
Forml.Caption = "Simplificación"
Cali Empezar
End Sub

Prívate Sub DiezEntradas_Click()


n=10
Forml.Caption = "Simplificación"
Cali Empezar
End Sub

Prívate Sub DosEntradas_Click()


n =2
Forml.Caption = "Simplificación"
Cali Empezar
End Sub

Prívate Sub FormJLoad()


Tiempo = 1
Commandl.BackColor = ColorInicialBotones
CommandH.BackColor = ColorInicialBotones
Command2.BackColor = ColorInicialBotones
Command3.BackColor = ColorInicialBotones
End Sub

Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As


Single)
Commandl.BackColor - ColorlmcialBotones
Command2.BackCoior = ColorInicialBotones
CommandH.BackColor = ColorInicialBotones
Command3.BackColor = ColorInicialBotones
End Sub

Prívate Sub Guardar_Click()


FormS.Drível.Dríve = Mid(App.Path, 1, 3)
Form2.Dirl .Path = App.Path
Form2.Textl.Text=""
Form2.Show
End Sub

Prívate Sub IngresarMinterminos_Click()


Limpiar
Forml.Caption = "Simplificación"
Label2.Visible = Truc
Text4. Visible = True
Labell. Visible = True
Textl.Text= Ilfl
Textl.Visible = True
Text4.Text = "("
189

Text4.SetFocus
Text4.SelStart = Len(Text4.Text)
m=0
End Sub
Prí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) & ")"
DoEvents
End Sub
Prívate Sub List2_Click(Index As Integer)
Label3(Index).Left = List2(Index).Left
Label3(Index).Top = List2(Index).Top + List2(Index).Height
Label3(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_ClickQ


n=9
Forml.Caption = "Simplificación"
Cali Empezar
End Sub

Prívate Sub OchoEntradas_Click()


n =8
Forml.Caption = "Simplificación"
Cali Empezar
End Sub

Prívate Sub SeisEntradas_Click()


n=6
Forml.Caption= "Simplificación"
Cali Empezar
End Sub
Prívate Sub SieteEntradas_Click()
n=7
Forml.Caption = "Simplificación"
Cali Empezar
End Sub

Prívate Sub Simplificar_Click()


Do
Commandl Click
190

Loop Until Resultado = True


End Sub

Prívate Sub Simplificaranterior_Click()


Cali Command2_Click
End Sub
Prívate Sub Simppaso_Click()
Cali Commandl_Click
End Sub

Prívate Sub Teoria_Click()


Texto. Show
End Sub

Prívate Sub Textl_Change()


DosEntradas.Checked = False
TresEntradas.Checked = False
CuatroEntradas.checked = False
CincoEntradas.Checked = False
SeisEntradas.Checked = False
SieteEntradas.Checked = False
OchoEntradas.Checked = False
NueveEntradas.Checked = False
DiezEntradas.Checked = False
If n = 2 Then DosEntradas.Checked = True
If n = 3 Then TresEntradas.Checked = True
If n = 4 Then CuatroEntradas.checked = True
If n = 5 Then CincoEntradas.Checked = True
If n = 6 Then SeisEntradas.Checked = True
If n = 7 Then SieteEntradas.Checked = True
If n = 8 Then OchoEntradas.Checked = True
If n = 9 Then NueveEntradas.Checked = True
If n = 10 Then DiezEntradas.Checked = True
End Sub

Prívate Sub Text2_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)


DoEvents
If Text2(Index).Text= "1" Then
r(Index + pagina * 64) = 1
Else
If Text2(Index).Text = "O" Then
r(Index + pagina * 64) = O
Else
r(Index + pagina * 64) = 2
Endlf
Endlf
a = Text2(Index).Text
If 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) = 2


Endlf
Cali Limpiar
Cali Contar
Cali ActualizarT4
End Sub
Prívate Sub Text2_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscü = vbKeyRetnrn Then
KeyAscii = O
Endlf
DoEvents
If Text2(lndex).Text = "1" Then
r(Index + pagina * 64) = 1
Else
If Text2(Index).Text= "O" Then
r(Index + pagina * 64) = O
Else
r(Index + pagina * 64) = 2
Endlf
Endlf
a = Text2(Index).Text
If 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
Endlf
Cali Limpiar
Cali Contar
Cali ActualizarT4
End Sub
Public Sub Text2_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 38 And Index > O Then Text2(Index - l).SetFocus
If (KeyCode = 40 Or KeyCode = 13) And índex < (2 A n - 1) - pagina * 64 Then
If Index < 63 Then
Text3(Index + l).Height = 150
Text2(Index + l).Height = 150
Text3(Index + l).Width = Text3(Index).Width
Text2(Index + l).Width = Text2(Index).Width
Text3(Index + l).Left - Text3(Index).Left
Text2(Index + l).Left = Text2(Index).Left
Text3(Index + l).Top = Text3(Index).Top + Text3(Index).Height
Text2(Index + l),Top = Text3(Index + l).Top
Text3(Index + l).Text = f(Index + 1 + pagina * 64)
Text2(Index + 1 ).ToolTipText = n f( M & Index + 1 + pagina * 64 & ")"
Endlf
If Index = 15 Or Index = 31 Or Index = 47 Then
If Text3(Index + 1).Visible = False Then
For il = O To índex
Text3(il).Left = Text3(il).Left - (Text3(il).Width + Text2(il).Width) / 2
Text2(il).Left = Text3(il).Left + Text3(il).Width
192

Nextil
Endlf
Text3(Index + l).Top = 2880
Text3(Index + l).Left = Text2(Index).Left + Text2(Index).Width + 40
Text2(Index + l).Top = 2880
Text2(Index + l).Left = Text3(Index + l).Left + Text3(Index + l).Width
Endlf
If Index < 63 Then
Text3(Index + 1). Visible = True
Text2(Index + 1). Visible = True
Text2(Index + l).SetFocus
Endlf
If Index - 63 And (2 A n) - 1 > 63 + pagina * 64 Then
If CommandS.Visible = False Then
pagina = pagina + 1
For i2 = O To Text2.UBound
Text2(i2).Text=""
Text3(i2).Text =""
Next i2
Text3(0).Text = f(pagina * 64)
Text3(0).Visible = True
Text2(0). Visible = True
Text2(0).SetFocus
Text2(0).ToolTipText = "f(" & pagina * 64 & ")"
Command4.Leñ = Text3(15).Left
Command4.Top = Text3(15).Top + Text3(15).Height + 20
Command4.Enabled = True
Command4.Visible = True
Else
Cali Command5_Click
Endlf
Endlf
Endlf
End 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 = 2
For i = 3 To Len(Text4.Text)
193

If Mid(Text4.Text, i, 1) = " " Or Asc(Mid(Text4.Text, i, 1)) = 10 Or


Asc(Mid(Text4.Text, i, 1)) = 13 Or Mid(Text4.Text, i, 1) = ")" Then

Ifp2-pl>lThen
subíndice = Mid(Text4.Text, pl, p2 - pl)
Endlf
Endlf
Next i
If Val(subindice) < 1024 And Val(subindice) >= O Then
Limpiar
Desactivar
For i = O To UBound(r)
f(i) = ""
r(i) = 2
Next i
p2 = 2
For i = 3 To Len(Text4.Text)
If Mid(Text4.Text, i, 1) = "" Or Asc(Mid(Text4.Text, i, 1)) = 10 Or
Asc(Mid(Text4.Text, i, 1)) = 13 Or Mid(Text4.Text, i, 1) = ")" Then
pl=p2
p2 = i
I f p 2 - p 1 > 1 Then
subindice = Mid(Text4.Text, pl, p2 - pl)
r(Val(subindice)) = 1
pagina = Int(Val(subindice) / 64)
Endlf
Endlf
Next i
If 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))
Endlf
If n o m Then
For i - O To Text2.UBound
Text3 (i). Visible = False
Text3(i).FontSize - 8
Text3(i),Locked = False
Text2(i).Visible = False
Text2(i).FontSize - 8
Next i
Text3(0).Height=150
Text2(0).Height=150
Text3(0).Width - n * 150 + 150 / n
Text2(0).Width = 200
Text3(0).Top = 2880
Text2(0).Top = 2880
Text3(0).Left = Forml.Width / 2 - (Forml.Text3(0).Width +
Forml .Text2(0).Width) - 400
Text2(0).Leñ = Forml .Text3(0).Left + Forml .Text3(0).Width
Text3(0).Visible = Truc
194

Text2(0). Visible = True


CommandS.Enabled = False
Command5. Visible = False
Command4.Enabled = False
Command4.Visible = False
m=n
Endlf
IfKeyCode = 32Then
For i = O To Val(subindice)
Ifr(i) = 2Thenr(i) = 0
Nexti
Endlf
IfKeyCode=13Then
For i = O To (2 A n) - 1
Ifr(i) = 2Thenr(i) = 0
Nexti
Endlf
Textl.Text = n
Actualizarf
ActualizarT4
DoEvents
If(2 A n)<=64Then
For i = O To (2 A n) -1
Text3(i).Text=f(i)
Ifr(i)-OOrr(i)-lThen
Text2(i).Text = r(i)
Else
Text2(i).Text=""
Endlf
Cali Text2_KeyUp((i), (40), (0))
DoEvents
Nexti
Else
For i - O To 63
Text3(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=""
Endlf
Cali Text2_KeyUp((i), (40), (0))
DoEvents
Next i
Command4.Leñ = Text3(15).Left
Command4.Top = Text3(15).Top + Text3(15).Height + 20
Command4,Enabled = True
Command4.Visible = True
Endlf
Text4.Width - Text4.Width + 200
Contar
195

Else
ActualizarT4
EndTf
Text4.Enabled = True
Guardar. Enabled = True
Text4.SelStart = Len(Text4.Text) -
Text4.SetFocus
Endlf
End Sub
Sub LimpiarQ
Fori = OToListl.UBound
Listl(i).Clear
List 1 (i). Visible = False
Next i
Commandó.Enabled = False
Command7.Enabled = False
Commandó.Visible = False
Command7.Visible = False
CommandS.Enabled = False
Command9.Enabled = False
CommandS.Visible = False
Command9.Visible = False
CommandlO. Visible — False
Commandl 1 .Visible = False
Commandl 2.Visible = False
Commandl 3. Visible = False
For i = O To max
For j = O To MaxCol
Marca(i,j)=""
Grupo(i,j) = 0
Nextj
Next i
For i = O To max
Forj-OTofíl(O)
Tabla(iJ)=""
Nextj
Next i
For i = O To max
filaAnulada(i) = False
Next i
For i - O To fíl(O)
numeroFila(Í) = O
columnaAnulada(i) = False
Next i
For i = O To Titulo.UBound
Titulo(i). Visible = False
Titulo(i).Caption - ""
Next i
For i = O To MaxCol
fíl(i) - O
196

Nexti
Textó.Visible = False
List2(0).Visible = Faise
List2(l).Visible = False
Picturel. Visible = False
Picturel.Cls
valizcom = Forml .Width - Commandl .Width - 360
m =0
col = 0
Resultado = False
lineas = False
escenciales = False
ultima = False
marcas = False
Tablalmplicantes = False
Implicantes = False
max = O
MaxCol = O
MaxColCubos = O
Auxl = O
Aux2 = 0
End Sub

Prívate Sub TresEntradas_Click()


n=3
Forml.Caption^ "Simplificación"
Cali Empezar
End Sub
Prívate Sub Tutoria_Click()
Tutorial.Show
End Sub

FORM2.

Prívate Type Registro


combinación As String * 20
respuesta As String * 1
End Type
Prívate dato As Registro
Prívate Sub Cancelar_Click()
Unload Me
Forml.Enabled = True
Forml. 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.FileName
Endlf
Textl.SetFocus
End Sub
Prívate Sub Form_Unload(Cancel As Integer)
Cancelar_Click
End Sub
Prívate Sub Guardar_Click()
If Textl.Text o ""Then
encuentra = vbNo
For i = O To Filel .ListCount - 1
If Textl.Text & ".boo" = Filel.List(i) Then
resp = MsgBox("El archivo ya existe desea sobreescribir", vbYesNo)
encuentra = vbYes
Exit For
Endlf
Nexti
If resp = vbYes Or encuentra = vbNo Then
archivo = Dirl.Path + "\ + Textl.Text + ".boo"
Forml.Caption = Textl.Text & ".boo"
Forml.Enabled = True
Open archivo For Random As 1 Len = Len(dato)
For i = 1 To 2 A n
dato.combinacion - f(i - 1)
dato.respuesta = r(i - 1)
Put 1, i, dato
Nexti
Cióse 1
Cancelar_Click
Endlf
Else
resp = MsgBox("Ingrese un nombre", vblnformation, "Información")
Endlf
End Sub
198

Prívate Sub Textl_KeyPress(KeyAscii As Integer)


If KeyAscii =13 Then
Cali Guardar_Click
Endlf
End Sub

FORM3

Prívate Type Registro


combinación As String * 20
respuesta As String * 1
End Type
Prívate dato As Registro
Prívate Sub Commandl_Click()
IfTextl.Texto ""Then
Forml.Textl.Enabled = False
Forml.Text4.Enabled = False
Forml.Mensaje.Caption = "Abriendo el archivo"
Forml.Mensaje. Visible = True
DoEvents
Cali Forml.Limpiar
Cali Forml.Desactivar
Forml.Enabled = True
archivo - Dirl.Path + "\ + Textl.Text
Forml.Caption = Textl.Text
Open 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 i
Cali Forml.ActualizarT4
For i = 1 To nreg
Get 1, i, dato
f(i - 1) = dato.combinacion
r(i - 1) = Val(dato.respuesta)
Next i
Form3. Visible = False
Forml .Visible = True
DoEvents
For i = O To Forml .Text2.UBound
Forml. Text3 (i). Visible = False
Forml.Text3(i).FontSize = 8
Forml.Text3(i).Locked = False
Forml .Text2(i).Visible = False
Forml.Text2(i).FontSize = 8
Next i
Forml. Text3(0).Height = 150
Forml.Text2(0).Height = 150
199

FormLText3(0).Width - n * 150 + 150 / n


Forml.Text2(0).Width = 200
Forml.Text3(0).Top = 2880
Forml.Text2(0).Top = 2880
Forml .Text3(0).Left = Forml .Width / 2 - (Forml .Text3(0).Width +
Forml.Text2(0).Width) - 400
Forml .Text2(0).Left = Forml.Text3(0).Left + Forml.Text3(0). Width
FormLText3(0).Visible = True
Forml.Text2(0). Visible = True
Forml.Command5.Enabled = False
Forml. Command5. Visible = False
Forml.Command4.Enabled = False
Forml .Command4.Visible - False
pagina = Int(((2 A n)-l)/64)
Forml.Text2(0).ToolTipText = "f(" & pagina * 84 & ")"
If2 A n<-64Then
For i - O To (2 A n) - 1
Forml.Text3(i).Text = f(i)
Ifr(i) = OOrr(i)=lThen
Forml.Text2(i).Text = r(i)
Else
Forml .Text2(i).Text=""
Endlf
Cali Forml.Text2_KeyUp((i), (40), (0))
DoEvents
Next i
Else
For i = O To 63
Forml.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=""
Endlf
Cali Forml.Text2_KeyUp((i), (40), (0))
DoEvents
Next i
Forml. Command4.Left = Forml. Text3(15).Left
Forml.Command4.Top = Forml.Text3(15).Top + Forml.Text3(15).Height + 20
Forml.Command4.Enabled = True
Forml.Command4.Visible = True
Endlf
Glose 1
Forml.Guardar.Enabled — True
col = 0
m=n
Forml .Cls
Forml.Labell. Visible = True
Forml.Textl.Visible = True
Forml .Textl .Text = n
200

Forml.Mensaje.Caption = "Actualizando los registros"


DoEvents
Cali Forml.ActualizarT4
Cali Forml.Contar
Command2_Click
Forml.Mensaje.Visible = False
Forml.Text4.Enabled = True
Else
MsgBox ("Ingrese un nombre de archivo")
Endlf
End Sub

Prívate Sub Command2_ClickQ


Unload Me
Forml .Enabled = True
Forml. Show
End Sub
Prívate Sub Dirl_Change()
Filel.Path = Dirl.Path
End Sub
Prívate Sub Drivel_Change()
Dir 1 .Path = Drive 1 .Drive
End Sub

Prívate Sub Filel_Click()


Textl .Text = Filel .FileName
Textl .SetFocus
End Sub

Prívate Sub Filel_DblClick()


Textl .Text = Filel .FileName
Cali Commandl_Click
End Sub
Prívate Sub Form_Unload(Cancel As Integer)
Command2_Click
End Sub

Prívate Sub Textl_KeyPress(KeyAscü As Integer)


If KeyAscii = 13 Then
Commandl_Click
Endlf
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 = ColorEnfoque
Conunand2.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones

End Sub
Prívate Sub Command2_Click()
Forml.Show 'Abre el formulario de la simplificación
End Sub
Prívate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
'Actualiza los colores de los comandos.
Commandl .BackColor = ColorlnicialBotones
Command2.BackColor = ColorEnfoque
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command3_Click()
End Termina la ejecución del programna.
End Sub
Prívate Sub Command3_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorEnfoque
Command4.BackColor - ColorlnicialBotones
End Sub
Prí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 = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorEnfoque
End Sub
Prívate Sub Forrn_Load()
'Actualiza los colores de los comandos.
ColorlnicialBotones = &HFF8080
ColorEnfoque = &HCOFFFF
Commandl .BackColor = ColorlnicialBotones
Commandl.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
202

Command4.BackColor = ColorlnicialBotones
End Sub

Prívate Sub Form_MouseMove(Button As Integer, Shiñ As Integer, X As Single, Y As


Single)
'Actualiza los colores de los comandos,
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Framel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y
As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor - ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub

Prívate Sub Labell_MouseMove(Button As Integer, Shift As Integer, X As Single, Y


As Single)
'Actualiza los colores de los comandos.
Commandl .BackColor = ColorlnicialBotones
Commandl.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Picturel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y
As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub

FORMULARIO SPLASH

Option Explicit
Prívate Sub Form_KeyPress(KeyAscii As Integer)
Unload Me
Formulariolnicial. Show
End Sub
Prívate Sub Form_Load()
IblVersion.Caption = "Electrónica y Telecomunicaciones"
IblProductName.Caption = "Simplificación de Funciones Booleanas"
End Sub
Prívate Sub Timerl_Timer()
Unload Me
203

Formulariolnicial. Show
End Sub

FORMULARIO TEXTO

Prívate Sub Commandl ClickQ


Unload Me
FormularioInicial.Show
End Sub
Prívate Sub Commandl JVÍouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Commandl .BackColor = ColorEnfoque
Command2.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Conimand2_Click()
n = Printers.Count - 1
Combo l.Clear
For i = O To n
Combo 1 .Addltem (Prínters(i).DeviceName)
Next i
Combo 1 .Text = Printer.DeviceName
Frame2.Visible = Truc
End Sub
Prívate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Command2.BackColor = ColorEnfoque
Commandl.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command3_Click()
Dim X As Printer
For 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
Endlf
Next
Printer. DrawMode = 1
RichTextBoxl.SelPrint (Printer.hDC)
Printer.EndDoc
Frame2.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 Sub
Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Commandl .BackColor — ColorlnicialBotones
Command2.BackCoIor = ColorlnicialBotones
End Sub

Prívate Sub Programa_Click()


Me.Hide
Forml .Show
End Sub
Prívate Sub Tutoria_Click()
Me.Hide
Tutorial.Show
End Sub

FORMULARIO TUTORIAL

Dim re(16) As String


Dim ce(12, 6) As String
Dim mo(12, 6) As String
Dim TablaT(4, 9) As String
Dim so(9) As Integer
Dim Ultimo As Boolean
Const Tiempo = 0.5
Prívate Sub MostrarTutorialQ 'esta sección consta todo el código para mostrar el tutorial
Ultimo = False 'Sirve para controlar y saber si ya se ha llegado a la ultima pantalla de la
simplificación
Me.Cls 'Borra todo el formulario
If Tutor <= 22 And Commandl4.Enabled = True Then
Comrnandl4.Enabled = False
Endlf
If Tutor <= 18 Then
Labell. Visible = False
Textl. Visible = False
Else
Labell. Visible = True
Textl .Visible = True
Endlf

Select Case Tutor


Case O
Función. Visible — True
Programa. Visible = True
Teoria. Visible = True
Tutorial.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ía
presionar 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 DE
COMBINACIONES, 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 DE
COMBINACIONES"
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 13
TutoriaLPicture = LoadPicture(App.Path & "\Tutorl3.bmp")
206

Label3.Caption = "Esta opción permite INGRESAR LOS MTNTERMINOS de una


nueva función booleana"
Case 14
Label2.Visible = False
Text4.Visible = False
Fori = O T o l 5
Text3(i).Visible = False
Text2(i).Visible = False
Next i
Funcion.Enabled = False
Función. Visible = False
Programa. Visible = False
Teoria.Visible = False
Tutorial.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 = False
Text4.Visible = False
Fori = OTo 15
TextS (i). Visible - False
Text2(i). Visible = False
Next i
Funcion.Enabled = True
Funcion.Visible = True
Programa. Enabled = False
Programa. Visible = True
Teoria.Enabled = False
Teoría. Visible = True
Abrir.Enabled = False
IngresarTabla.Enabled — False
Label3.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 = True
Ultimo = True
Case 16
Tutoría!. Cls

Text3 (i). Visible = False


Text2(i).Visible = False
Next i
IngresarMmterminos_Click
Me.Cls
Commandl .Enabled = False
LabeB.Top = Text4.Top + Text4.Height
Label3.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 = O
Text3(i-l) = n"
Do
cont = cont + 1
res = Q Mod 2
Q = Q\
Text3(i - 1) = Str(res) + Text3(i - 1)
Loop Until (cont = 4)
Next i
Text4.Text="("
DoEvents
For i = O To Text3.UBound
Text3(i).Height=150
Text2(i).Height=150
Text3(i).Width = 4 * 150 + 150 / 4
Text2(i).Width = 200
Text3(i).Left - Tutorial.Width / 2 - (Text3(i).Width + Text2(i).Width) - 400
Text2(i).Leñ = Text3(i).Left + Text3(i).Width
Text3(i).Top = 2880 + (i) * Text3(i).Height
Text2(i).Top = Text3(i).Top
If re(i) = "1" And ¡ o 9 Then
Text4.Text = Text4.Text & Str(i) & 1( "
Beep
Me.Cls
Me.DrawWidth = 2
Me.Line (Label3.Left + 0.75 * Label3.Width, Label3.Top + Label3.Height)-
(Text2(i).Left + Text2(i).Width> Text2(i).Top)
DoEvents
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 75 / Len(Text4.Text) + 200
Text4.Height =
Else
Text4.Height =
Text4.Width = 75 * 50 + 75 / 50 + 200
Endlf
Text4.SelStart = Len(Text4.Text)
Text4.SetFocus
Endlf
Ifi<=13Then
Text3(i).Visible = True
Text2(i).Visible - True
Ifio9Then
Text2(i).Text - re(i)
Else
Text2(i).Text - "O"
Endlf
Else
Text2(i).Text - re(i)
208

Endlf
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Next i
Text4.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 / 4
DoEvents
Case 17
Text4.Visible = True
Funcion.Enabled = False
Programa.Enabled = True
Teoría. Enabled = True
Me.Line (LabelS.Left + LabeB.Width / 2, LabelS.Top + Label3.Height>
(Text2(0).Leñ + Text2(0).Width / 2, Text2(0).Top)
Fori = O T o l 3
Text3 (i). Visible = True
Text2(i). Visible = True
Next i
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text3(14).Visible = True
Text2(14).Visible = True
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text3(15).Visible = True
Text2(15).Visible = True
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 75 / Len(Text4.Text) + 200
Text4.Height = 215
Else
Text4.Height - 2 * 237
Text4.Width = 75 * 50 + 75 / 50 + 200
Endlf
Label3.Caption = "Otra forma de ingresar la función es ingresando en la TABLA DE
COMBINACIONES"
CaselS
Fori = OTo 15
Text3(i).Visible = False
Text2(i).Visible = False
Next i
Label2.Visible = False
Text4.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 = Truc
Programa.Enabled = False
Teoria.Enabled = False
IngresarTabla.Enabled = True
IngresarMinterminos.Enabled = False
Ultimo = True
Case 19
Titulo(0).Visible = False
List 1(0). Visible = False
Fori = O T o l 5
Text3(i).Visible = False
Text2(i). Visible = False
Next i
Text4.Text=""
CuatroEntradas_Click
Commandl .Enabled = False
F o r i - O T o 15
Text3(i).Visible = True
Text2(i).Text = ""
Text2(i).Visible = True
LabeO.Caption = "Mientras se van poniendo las salidas, automáticamente se irán
ecribiendo los mintérminos en el editor de mintérminos"
Text2(i).SetFocus
Me.Line (Text4.Left + 200, Text4.Top + Text4.Height)-(Label3.Lefís LabeB.Top
+ Label3.Height/2)
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl > Tiempo
Ifio9Then
Text2(i).Text = re(i)
Else
Text2(i).Text = "O"
Endlf
If re(i) = " 1" And i o 9 Then
Text4.Text = Text4.Text & " " & Str(i)
Beep
Endlf
Text2(i).SeIStart = Len(Text2(i).Text)
Text2(i).SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl > Tiempo
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 200
Text4.Height =
210

Else
Text4.Height - 2 * 237
Text4.Width = 75 * 50 + 75 / 50 + 200
Endlf
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl > Tiempo / 2
Next i
Text4.Text = Text4.Text & " )"
Me.Cls
LabelS.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, en
cuyo caso se debe corregirlo "
Case 20
Text4.Text = " ( "
Fori = O T o l 5
If re(i) = "1" And i o 9 Then Text4.Text = Text4.Text & ?1 " & Str(i)
Next i
Text4.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ón
Siguiente"
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 i
Text4.Text = Text4.Text & ")"
Text2(9).Text=H0H
LabeD.Caption = "Si se corrige en el editor de mintérminos la tabla de
combinaciones se actualizará automáticamente como vemos en este ejemplo"
For i = 1 To 22
Text4.SelStart = i
Text4.SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 2
Next i
cadena = Text4.Text &" "
Mid(cadena,23)="910 13)"
Text4.Text = cadena
Text4.SelStart - 23
Text4.SetFocus
211

Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 2
cadena = Text4.Text
Mid(cadena, 23) = "9 10 13)"
Text4.Text = cadena
Text4.SelStart = 24
Text4.SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 2
cadena = Text4.Text
Mid(cadena, 23) = "9 10 13)"
Text4.Text = cadena
Text4.SelStart - 25
Text4.SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Tirner - Timerl >= Tiempo / 2
Text2(9).Text = ""
Beep
Me.Line (LabeB.Left + LabeD.Width / 2, LabeO.Top + Label3.Height)-
(Text2(9).Left + Text2(9).Width, Text2(9).Top)
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text2(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 = O T o l 5
If re(i) = n 1" And i o 9 Then Text4.Text - Text4,Text & "" & Str(i)
Next i
Text4.Text = Text4.Text & ")"
Text2(9).Text = "O"
DoEvents
LabeB.Caption = "Si la corrección se hace en la tabla de combinaciones entonces el
editor de mintérminos se actualizará automáticamente"
F o r i ^ O T o 12
Text2(i).SelStart=l
Text2(i).SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
212

Next i
Fori=12To9Step-l
Text2(i).SelStart = 1
Text2(i).SetFocus
Timerl = Timer
Do
DoEvents
Loop Untíl Timer - Timerl >= Tiempo
Next i
Text2(9).Text=""
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text2(9).Text=fT'
DoEvents
Beep
Me.Lme (Text4.Left + 1000, Text4.Top + Text4.Height)-(Label3.Left, LabeB.Top +
Label3.Height/2)
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
cadena = Text4.Text & " "
Mid(cadena, 23) = "9 10 13)"
Text4.Text = cadena
Case 23
Titulo(0).Visible = False
Listl(0).Visible = False
Titulo(l). Visible = False
Listl(l).Visible = False
Fori = OTo 15
Text3(i).Visible = True
Text2(i).Visible = True
Next i
Label3.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ón
Siguiente, ó, 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 = True
Case 24
For i = O To Text3.UBound
Text3(i). Visible = False
Text2(i). Visible = False
Next i
Titulo(0).Top = LabeB.Top + LabeB.Height
Titulo(0).Caption = "MINTERMINOS"
213

Listl(0).Top = Titulo(0).Top + Titulo(0).Height


Listl(0).Left = 3000
Listl(0).Width = 2.75 * TextWidth("0 0000")
Titulo(0).Left = 3000
Listl(0).Height = 21 * TextHeight("0")
Listl(0).Clear
Titulo(0).Visible = True
Listl(O). Visible = True
For i = 1 To 9
IfVal(mo(i,0))<10Then
Listl(0).AddItem (mo(i, 0) & " " & ce(i, 0))
Else
Listl(0).AddItem (mo(i, 0) & " " & ce(i, 0))
Endlf
DoEvents
Next i
LabeB.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 que
tiene salida 1"
Titulo(l).Top = LabeO.Top + LabelS.Height
Titulo(l).Captíon= "CUBOS O"
Listl(l).Top = Titulo(l).Top + Titulo(l).Height
Listl(l).Left = Listl(0).Left + Listl(0).Width + 1000
Listl(l).Width = 3 * TextWidth("0000")
Titulo(l).Left = Listl(0).Left + Listl(0).Width + 1000
Listl(l).Height = 28 * TextHeight("0")
Listl(l).Clear
Titulo(l). Visible = True
List 1(1). Visible = True
Fori=lTol2
Listl(l).AddItem(ce(i 9 l))
DoEvents
Next i
Case 25
Titulo(0).Top = LabeB.Top + Label3.Height
Titulo(0).Caption = "CUBOS O"
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
List l(0).Left = 3000
Listl (O).Width = 2.75 * TextWidth("0 0000")
Titulo(0).Left = Listl(0).Left + Listl(O).Width / 2 - Titulo(0).Width / 2
Listl(0).Height = 28 * TextHeight("0")
Listl(0).Clear
Titulo(0).Visible = True
Listl(0).Visible = True
F o r i = l Tol2
If i o 2 And i o 5 And i o 10 Then
Listl(0).AddItem ("* " & ce(i, 1))
Else
Listl(0).AddItem (" " & ce(i, 1))
Endlf
214

DoEvents
Nexti
Titulo(l).Top = LabeB.Top + LabeB.Height
Titulo(l).Caption= "CUBOS 1"
Listl(l).Top = Listl(0).Top
Listl(l).Left = Listl(0).Left + Listl(0).Width + 300
Listl(l).Width = 2.75 * TextWidth("0000")
Titulo(l).Left = Listl(l).Left + Listl(l).Width / 2 - Titulo(l).Width / 2
Listl(l).Height = 28 * TextHeight("0")
Listl(l).Clear
Titulo(l). Visible = Truc
Listl(l).Visible = True
For i = 1 To 12
Listl(l).AddItem (ce(i, 2))
DoEvents
Nexti
LabeB.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 han
sido usadas para formar los CUBOS 1"
Case 26
Titulo(0).Top - LabeB.Top + LabeB.Height
Titulo(0).Caption = "CUBOS 1"
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
Listl(0).Left = 3000
Listl(0).Width = 2.75 * TextWidthf 0000")
Titulo(0).Left = Listl(0).Left + Listl(0).Width / 2 - Titulo(0).Width / 2
Listl(0).Height = 28 * TextHeight("0")
Listl(0).Clear
Titulo(0).Visible = True
Listl(0).Visible = True
Fori=lTol2
If i o 3 And i o 7 And i o 9 And i o 12 Then
Listl(0).AddItem("* " & ce(i, 2))
Else
Listl(0).AddItem (" " & ce(i, 2))
Endlf
DoEvents
Nexti
Tituio(l).Top - LabeB.Top + Label3.Height
Titulo(l).Caption = "CUBOS 2"
Listl(l).Top = Listl(0).Top
Listl(l).Left = Listl(0).Left + Listl(0).Width + 300
Listl(l).Width = 2.75 * TextWidth("0000")
Titulo(l).Left - Listl(l).Left + Listl(l).Width / 2 - Titulo(l).Width / 2
Listl(l).Height = 8 * TextHeight(M0")
Listl(l).Clear
Titulo(l).Visible = True
Listl(l).Visible = True
For i = Í To 3
Listl(l).AddItem (ce(i, 3))
215

DoEvents
Next i
LabelS.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, estas
forman parte de los implicantes primos"
Case 27
Picturel. Visible = False
Titulo(0).Top = LabeB.Top + Label3.Height
Titulo(0).Caption = "CUBOS 2"
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
Listl(0).Left = 3000
Listl(0).WÍdth = 2.75 * TextWidth(" 0000")
Titulo(0).Left = Listl(0).Left + Listl(0).Width / 2 - Titulo(0).Width / 2
Listl(0).Height = 8 * TextHeightfO")
Listl(0).Clear
Titulo(0).Visible = True
List 1(0). Visible = True
For i = 1 To 3
List 1 (0).Addltem (" " & ce(i, 3))
DoEvents
Next i
Titulo(l).Top = Label3.Top + LabeB.Height
Titulo(l).Captíon= "IMPLICANTES PRIMOS"
Listl(l).Top = Listl(0).Top
Listl(l).Left = Listl(0).Left + 2 * Listl(0).Width + 300
Listl(l).Width = 2.75 * TextWidthfOOOO")
Titulo(l).Left = Listl(l).Left + Listl(l).Width/ 2 - Titulo(l).Width / 2
Listl(l).Height = 10 * TextHeightfO")
Listl(l).Clear
Titulo(l). Visible = True
Listl(l).Visible = True
For i = 1 To 4
Listl(l).AddItem(ce(i,4))
DoEvents
Next i
LabeB.Caption = "Aqui están las tablas de CUBOS 2 y los IMPLICANTES
PRIMOS. En los CUBOS 2 todas las combinaciones forman parte de los implicantes
primos, ya que no se pueden hacer combinaciones para formar CUBOS 3"
Case 28 'Construcción de la tabla de simplificación
so(l) = 0
so(2) = 2
so(3) = 3
so(4) = 6
so(5) = 7
so(6) = 8
so(7) = 9
so(8)=10
so(9)=13
For i = 1 To 4
Forj = l To9
216

TablaT(í,j) =
Nextj
Next i
TablaT(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 los
implicantes y los mintérminos utilizados"
Titulo(l). Visible = False
Titulo(0).Visible = False
Listl(0).Visible = False
Listl(l). Visible = False
List2(0). Visible = Faise
Titulo(0).Top - LabeB.Height + LabeO.Height + 100
Titulo(0).Caption = "TABLA DE SIMPLIFICACIÓN"
Titulo(0).Left = Forml.Width / 2 - TituIo(O).Width / 2
Picturel.Top = Titulo(0).Top + Titulo(0).Height
Titulo(0).Visible = True
DoEvents
espacio = TextWidth("00000000")
ancho = TextWidth("OOOOOOn)
alto = 1.25 * TextHeight("0")
Picturel.Width = ancho + espacio + 9 * ancho
Picturel.Left = Forml.Width / 2 - Picturel.Width / 2
Picturel.Height = 6 * alto
Picturel.Cls
Picturel.Visible = True
Picturel.CurrentX = ancho
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picturel.Height), ,BF
DoEvents
For i = 1 To 9
Picturel .CurrentX = ancho + espacio + ancho * (i - 1)
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picture 1.Height), ,BF
Picturel.CurrentX = ancho + espacio + ancho * (i - 1) + ancho 12-
TextWidth(Str(so(i)))
Picture l.Current Y = O
Picturel.Print so(i)
DoEvents
217

Nexti
For i = 1 To 4
Picturel.CurrentY = i * alto
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width,
Picturel.CurrentY),, BF
Picturel.CurrentX = 1.25 * ancho
Picturel.CurrentY = i * alto
Picturel.Print ce(i, 4);
DoEvents
Forj = l To9
IfTablaT(iJ) = "*"Then
Picturel.CurrentX = ancho + espacio + ancho * (j - 1) + ancho / 2 -
TextWidth("*")
Picturel .CurrentY = i * alto + TextHeight(M*") / 8
Picturel .Print TablaT(i, j);
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 4
Endlf
Nextj
Picturel.Print
DoEvents
Nexti
Picturel.CurrentY = 5 * alto
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width, Picturel.CurrentY),
>BF
Case 29 'Cálculo de los implicantes primos esenciales
espacio = TextWidthfOOOOOOOO")
ancho - TextWidth("000000")
alto = 1.25 * TextHeight("0")
Picturel.Cls
Picturel. Visible = True
Picturel .CurrentX = ancho
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentXí
Picturel.Height),, BF
DoEvents
For i = 1 To 9
Picturel.CurrentX = ancho + espacio + ancho * (i - 1)
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picturel.Height),, BF
Picturel.CurrentX = ancho + espacio + ancho * (i - 1) + ancho 12-
TextWidth(Str(so(i)))
Picturel.CurrentY = O
Picturel,Print so(i)
DoEvents
Nexti
For 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 * ancho
Picturel.CurrentY = i * alto
Picturel .Print ce(i, 4);
DoEvents
Forj = l T o 9
IfTablaT(iJ)="*"Then
Picturel.CurrentX = ancho + espacio + ancho * (j - 1) + ancho / 2 -
TextWidth("*")
Picturel.CurrentY = i * alto + TextHeight("*") / 8
Picturel .Print TablaT(i, j);
DoEvents
Endlf
Nextj
Picturel.Print
DoEvents
Next i
Picturel.CurrentY = 5 * alto
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width, Picturel.CurrentY),
,BF
Label3.Caption = "Los implicantes primos esenciales formarán parte de la solución"
Titulo(l).Left = Picturel.Leñ
Titulo(l).Top = Picturel.Top + Picturel. Height
Titulo(l).Captíon= "ESENCIALES"
Titulo(l). Visible = True
List2(0).Left = Titulo(l).Left
List2(0).Top = Titulo(l).Top + Titulo(l).Height
List2(0).Clear
List2(0).Visible = True
ColorLinea = RGB(255, O, 0)
Picturel.CurrentX = ancho + espacio + ancho * (1 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + espacio + ancho *(!-!) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX5 alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho / 2
Picturel.CurrentY = 3.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + 0.85 * espacio
Picturel.CurrentY = 3.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * ( ! - ! ) + ancho / 2
219

Picturel.CurrentY = 3.5 * alto


Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 1.5 * TextWidth("*"),
ColorLinea
List2(0).AddItem ("XOXO")
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho + espacio + ancho * (2 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (2 - 1) + ancho / 2
Picturel .CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Pictiirel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho + espacio + ancho * (6 -1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (6 - 1) + ancho / 2
Picturel .CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho + espacio + ancho * (8 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (8 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.Curren:Y)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
ColorLinea = RGB(0, 255, 0)
Picturel.CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
220

Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho / 2
Picturel .CurrentY = 4.5 * alto
Picturel.Gírele (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + 0.85 * espacio
Picturel.CurrentY = 4.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2
Picturel.CurrentY = 4.5 * alto
Picturel.Circle(PictureLCurrentX,Picturel.CurrentY), 1.5 * TextWidth("*"),
ColorLinea
List2(0).AddItem ("OX1X")
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho + espacio + ancho * (4 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (4 - 1) + ancho / 2
PictureLCurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho + espacio + ancho * (5 - 1) + ancho / 2
PictureLCurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (5 - 1) + ancho / 2
Picturel .CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
ColorLinea = RGB(0, O, 255)
Picturel .CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2
PictureLCurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
221

Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = 0.5 * ancho
Picturel.CurrentY = 2.5 * alto
Picturel.Gírele (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho -f- 0.85 * espacio
Picturel.CurrentY = 2.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2
Picturel.CurrentY = 2.5 * alto
Picturel.Circie (Picturel.CurrentX, Picturel.CurrentY), 1.5 * TextWidth("*fl),
ColorLinea
List2(0).AddItem ("1X01")
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho + espacio + ancho * (7 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
PictureLCircle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (7 - 1)+ ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Case 30
Labeló.Visible = False
Tituio(0).Visible = True
Titulo(l). Visible = True
Picturel.Visible = True
List2(0).Visible = True
LabeB.Caption = "Puesto que se han cubierto todas las columnas, no se forman
implicantes secundarios, entonces de cada implicante escencial saldrá un término de la
solución y de cada implicante primo esencial sale un término de la solución final"
DoEvents
CurrentX = List2(0).Left + List2(0).Width
CurrentY = List2(0).Top + 0.75 * TextHeight("X")
Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(255, O, 0)
CurrentY = CurrentY - TextHeight("X") / 2
Print "B'D"'
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
222

CurrentX = List2(0).Left + List2(0).Width


CurrentY = List2(0).Top + 2 * TextHeight("X")
Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(0, 255, 0)
CurrentY = CurrentY - TextHeight("X") / 2
Print "A'C"
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
CurrentX = List2(0).Left + List2(0).Width
CurrentY = List2(0).Top + 3.25 * TextHeightfX")
Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(0, O, 255)
CurrentY = CurrentY - TextHeight(nX") / 2
Print "AC'D"
Case 31 'Construcción de la función Resultante
Titulo(O). Visible = False
Titulo(l). Visible = False
Picturel. Visible = False
List2(0).Visible = False
Label3.Caption = "La solución tiene tres términos"
Labeló.Visible = True
DoEvents
Labeló.Caption = "Y = B'D'"
Labeló.Left = Tutorial.Width / 2 - Labelo,Width / 2
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Labeló.Caption = "Y = B'D' + A'C"
Labeló.Left = Tutorial.Width / 2 - Labelo.Width / 2
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Labeló.Caption = "Y = B'D' + A'C + AC'D"
Labeló.Left = Tutorial.Width / 2 - Labelo.Width / 2
Ultimo = True
Case El se
End Select
End Sub

Prívate Sub CincoEntradas_Click()


Beep
End Sub

Prívate Sub Commandl_Click()


Commandl.Enabled = False
CommandH.Enabled = False
Command2.Enabled = False
Command3.Enabled = False
223

Tutor = Tutor + 1
t
MostrarTutorial

Command2.Enabled - Truc
Command3.Enabled = Truc
If Tutor o 21 Then Command2.SetFocus
If Ultimo = False Then
Commandl. Enabled = True
If Tutor >= 23 Then Commandl4.Enabled = True
If Tutor o 21 Then Commandl.SetFocus
Endlf
End Sub

Prívate Sub Commandl _MouseMove(Button As Integer, Shiñ As Integer, X As Single,


Y As Single)
Commandl .BackColor = ColorEnfoque
Command2.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
End Sub

Private Sub Commandl4_Click()


CommandH.Enabled = False
Do
Command 1 _C1 ick
Loop Until Ultimo = True

End Sub

Private Sub Command2_Click()


Commandl .Enabled = False
Command 14.Enabíed = False
Command2.Enabled = False
CommandB. Enabled = False
Tutor = Tutor - 1
MostrarTutorial
If Tutor o 21 Then CommandS.Enabled = True
If Ultimo - False Then
Commandl .Enabled = True
Commandl .SetFocus
Endlf
If Tutor > O Then
Command2.Enabled = True
If Tutor o 21 Then Command2. SetFocus
Endlf
End Sub

Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,


Y As Single)
Commandl.BackColor = ColorlnicialBotones
224

Command2.BackColor = ColorEnfoque
CommandS.BackColor = ColorlnicialBotones
Commandl4.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 = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
Commandl4.BackColor = ColorlnicialBotones
Command3.BackColor = ColorEnfoque

End Sub

Prívate Sub CuatroEntradas_Click()


Label2.Visible = True
Text4.Text="("
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 200
Text4.Height = 215
Else
Text4.Height = 2 * 2 3 7
Text4.Width - 75 * 50 + 75 / 50 + 200
Endlf
Text4.Visible = True
Text3(0).Visible = True
Text2(0).Text = ""
Text2(0).Visible = True
LabelS.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 en
Siguiente."
Text2(0).SetFocus
Funcion.Enabled = False
Programa.Enabled = True
Teoria.Enabled = True
Commandl.Enabled = True
End Sub

Prívate Sub DiezEntradas_Click()


Beep
End Sub

Prívate Sub DosEntradas_Click()


Beep
End Sub
Prívate Sub Form_Load()
225

Commandl.BackColor = ColorlnicialBotones
Cornmandl4.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
re(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)- M 0110"


ce(5, 0) = I10111"
ce(6,0) = fl 1000"
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) = lf 01H 11
ce(12, 1)-"1101 M
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, = (Z
OT í 8,, = (ü
«6 S8,, = fe
orr., = (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£)oin
US,, = (O *

uOXOX» -

„ = (£ '
227

Tutor = O
MostrarTutorial
Commandl.Enabled - True
End Sub
Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Commandl .BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Commandl4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Framel_MouseMove(Button As Integer., Shift As Integer, X As Single, Y
As Single)
Commandl. BackColor = ColorlnicialBotones
Command2.BackCoÍor = ColorlnicialBotones
Command3. BackColor = ColorlnicialBotones
Comrnandl4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub lngresarMinterminos_Click()
Label2.Visible = True
Text4.Visible = True
Text4.Text = "( "
LabelS.Top = Text4,Top + Text4.Height
Label3.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 un
espacio. Haga clic en Siguiente"
LabeO.Left = Tutorial.Width / 2 - LabeO.Width / 2
DoEvents
Me.DrawWidth = 3
Tutorial.Line (Text4.Left + 100, Text4.Top + Text4.Height)-(Label3.Left,
LabelS.Top + Label3.Height / 2), LabeD.ForeColor
Funcion.Enabled = False
Programa. Enabled = True
Teoria.Enabled - True
Commandl.Enabled = True
End Sub
Prívate Sub NueveEntradas_Click()
Beep
End Sub
Prívate Sub OchoEntradas_Click()
Beep
End Sub
Prívate Sub Programa_Click()
Forml.Show
End Sub
Prívate Sub SeisEntradas_Click()
Beep
End 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 lyiintértnirio Ma/t armiño


O O O A+B+C = Mo
O O 1 A+B+C1 -M1
O 1 O A+B'+C =M2
A+B'+C =M3
A+B+C =M4
A'+B+C1 =M5
1 1 O A'+B'+C=M6
A'+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<A f B,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 D F
1 __
0 0 0 0
0 0 0 1 0
0 0 i Un
U 1,

0 0 1 1
0 1 0 0 ó
0 101 0
0 111 ^ mu
l-.-j
1 010
I O D O -frf> IT'
¡..-i TF III U ;

I 0 0 1 • 1' w
' m »:
í 0 1 1 1: , —.
' mío!
1 0 1 1 o
í 1 0 0 0
í 1 A i
i'l'i — •W"W»««»«"f~i««»»ni»««ífflp- ?B'Í ^""41

Jl 1 1 0 0
* • * * A• *1
1 I 0

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 A B i. n F

mO 0000 1
m2 0010 1
m3 0011 1
m6 0110 1
m7 0111 1
mB 1000 1
m9 1001 1
mío 1010 1
m!3 1101 1

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 minlrrmino A B <: D ¥


0 mO 0000 1
1
ni 2 0010 1
m8 1000 1
m3 0011 1
2 m6 0110 1
m9 1001 1
mlO 1010 1
3 m7 0111 1
m!3 1101 1

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 /.

Min término Resultante


mintérmino A B C D
mO 0000 mO, m2 00X0

m2 0010 mO, m8 xooo


m8 1 000 m2, m3 ooox
m3 001 1 m2, m6 0X1 O
m6 0110 m2, m10 X01 O
m9 1 00 1 m8, m9 1 OOX
rn 10 1010 m8, m10 1 0X0
m7 0111 m3, m7 0X1 1
m 13 1101
m6, m7 01 1 X
m9, m13 1 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 CUBOS 1
mO, m2 00X0 •^ CUBOS 2
mO, m8 000 ^^^^
"5(0,2,8,10) X O X O
m2, m3 ooox ~^^ ( 2, 3, 6, 7 ) 0 X 1X
m2, m6 0X10
m2, m10 X01 0
m8, m9 1OOX
m8, m10 1 0X0 //
t."í

í í'

m3, m7 0X1 1 w/
/
^
m6, m7 01 1 X
m9, m13 1 X01

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) 1X01
(0,2,810) XOXO
(2,3,6,7) OX1X

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
0 2 3 6 7 8 9 1O 13
1 OOX * *

1 XO 1 * *

xoxo * * * *

0X1 X * * * *

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 OOX
1 XO 1
xoxo
0X1 X

ESCENCIALES

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'D 5
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
3 2j 3 5 9 10 11 18 19 20 21 ?3 25 26 27
•>,' 00X0 t- nr |
r) I í í
í i !
X0101
1
|
í

|
ii | j
e
t ¡
i
V 1010X- ^ f "" -—- — f— • "~H ^j^fV
í>
í
—±—
^J 10X11- "-j— | ! í ~f— -f- ~t" -<r i 1

101X1 |
l
i
j
j í
• i
t
i
í
0X0X1 ! ¡ r í
j í j j 1 ^1
i
I
!

X10X1 jf *• i
j ) í i *
T i
%• XX01X- —^?>~ ~<5^~ — ~^— -4-~ __ái
f "i
t $• —
~4
i

•u
i,
i,/ •v/ e
"V
J
\L f ' "'fí ' % V / l< 1:
ES ENCIALES SECUNDARIOS
XX0 1 X
.¿ /-í 4 ."v, •• y
* i í i | í A
f 'O1 S W V \1
10X11

Los implicantes primos esenciales y secundarios formaran la ecuación simplificada.

De los esenciales:
Quine HcCIuskey
MANUAL 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.boo
unctón3,boo
unctón3b.boo
uncion4.boo
uncton4b.boo
uncjon5,boo
uncionSb.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ón2boo
funcjon3.boQ
función3b.boo
func»n4.boo
funcion4b.boo
funcion5.boo
funcion5fa.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.

También podría gustarte