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 1.2.2. Ecuaciones Booleanasy Funciones Lógicas Básicas 1.2.3. Tabla de Verdad 2. SIMPLIFICACIÓN DE FUNCIONES BOOLEANAS 3 7 12 13 2.1. Funciones Booleanas 2.1.1. Deducción de Ecuaciones booleanasa partir de una tabla de verdad 2.1.2. Tabla de verdad a partir de una ecuación booleana 13 2.2. Métodos de Simplificación 2.2.1. Método del Algebra de Boole 21 21 14 19 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 3. DISEÑO DEL PROGRAMA COMPUTACIONAL PARA SIMPLIFICAR FUNCIONES BOOLEANAS 3.1. Introducción 3.1.1. Breve descripción del uso de formularios de Visual Basic 3.1.2. Controles de Visual Basic 3.1.2.1. 3.1.2.2. 3.1.2.3. TextBox Label CommandBotton 51 53 53 54 56 57 59 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 3.1.3.2. Variables...... 3.1.3.2.1. Alcances de las variables 3.1.3.2.2. Establecimiento del alcance de las variables 3.1.3.2.3. Variables utilizadas en un procedimiento 3.1.3.2.4. Variables utilizadas en un módulo 3.1.3.2.5. Variables utilizadas por todos los módulos 3.1.3.2.6. Declaración de variables 3.1.3.2.7. Tipos de variables 3.1.3.2.8. Consideraciones 3.1.3.3. Procedimientos 3.1.3.3.1. Procedimientos generales.... 3.1.3.3.2. Procedimientos de evento 3.1.3.4. Funciones 3.1.3.4.1. Llamadas a funciones 3.1.3.4.2. Paso de argumentos a Procedimientos y funciones 3.1.3.4.3. Tipos de datos de los argumentos 3.1.3.4.4. Paso de argumentos por valor 3.1.3.4.5. Paso de argumentos por referencia 3.1.3.5. Estructuras de Control (Repetición y decisión) 3.1.3.5.1. Do While-Loop / Do-Loop While 3.1.3.5.2. For-Next 3.1.3.5.3. Else-End If.... 3.1.3.5.4. If-Then-Else 3.1.3.5.5. Select-Case 62 63 63 64 64 65 65 66 66 67 68 69 70 72 73 3.2. Diagrama de Flujo del Programa 3.2.1. Teoría 73 74 74 74 75 75 76 77 78 78 80 81 3.2.2. Simplificación 82 3.2.3. Tutorial 84 3.3. Diagrama de flujo de la simplificación 3.3.1. Ingreso de los datos en la tabla de combinaciones 85 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 QuineMcCIuskey ya que este proceso sirve para cualquier número de variables de entrada. En el Capitulo 1 se hace una introducción de los sistemas digitales y su relación con los sistemas analógicos, una reseña histórica de la álgebra de Boole, las ecuaciones booleanas, funciones lógicas básicas y las tablas de verdad. En el Capitulo 2 se explican los diferentes métodos que existen para simplificar las funciones booleanas; tanto como álgebra de Boole, mapa de Karnaugh y el método de Quine-McCIuskey, además se hace una comparación de los mismos; también se explica la implementación de las funciones booleanas. En el Capitulo 3 se da una descripción rápida de los formularios, comandos y sentencias utilizadas en Visual Basic; Además, se explica el proceso de diseño del programa tutorial y de simplificación; además se presentan los resultados de algunas pruebas realizadas. Finalmente, en el Capitulo 4 se encuentran los comentarios, sugerencias y conclusiones sobre este trabajo. CAPITULO 1 INTRODUCCIÓN 1.1.- INTRODUCCIÓN. El avance de la Tecnología y la necesidad de realizar tareas de una forma automática, han llevado a desarrollar circuitos integrados que se pueden usar con facilidad, estos circuitos se denominan compuertas lógicas, que están disponibles en cápsulas de circuitos integrados. Un sistema de automatización o de comunicaciones está diseñado utilizando muchas de estas compuertas, para lo cual se deben desarrollar "tablas de verdad", en las que se indica el estado de la salida para cada combinación de las entradas, la implementación de estos sistemas requiere que el circuito esté simplificado para que el costo de elementos sea el menor posible y así construir un sistema fácil de implementar. La simplificación de la tabla de verdad asociada al sistema que está diseñándose, se puede hacer mediante varios métodos cuya eficiencia depende de la cantidad de entradas y la habilidad de la persona que está simplificando, el proceso de simplificación manual es demasiado tedioso, poco confiable y lleva mucho tiempo, lo cual impide que el diseñador se dedique a otras cosas más importantes y productivas, por esta razón se ha pensado en el desarrollo de este trabajo. El resultado de la simplificación de la tabla se denomina función booleana la cual es una relación lógica entre todas las entradas combinadas por medio de operadores lógicos. El presente trabajo consiste en desarrollar un programa que indique el proceso detallado de simplificación de las tablas de verdad utilizando el método tabular de Quine-McCIuskey de una manera didáctica, ordenada y comprensiva, hasta obtener la función booleana simplificada, este programa debe ser capaz de indicar paso por paso todos los detalles de la simplificación, para lograr una comprensión de este método. Para obtener un programa con las características descritas en el párrafo anterior, se utilizó el programa Visual Basic, que permite el fácil manejo de formularios, comando y menús estandarizados de Windows. En la Carrera de Ingeniería en Electrónica y Telecomunicaciones no existe un programa de este tipo para ayudar a la enseñanza de la simplificación de funciones booleanas utilizando este método, este proyecto servirá para que los alumnos de Sistemas Digitales comprendan con mayor facilidad el método tabular de Quine-McCIuskey, y para los diseñadores de sistemas digitales permitirá simplificar las funciones booleanas asociadas a sus diseños de una manera rápida y segura, SISTEMAS ANALÓGICOS Y SISTEMAS DIGITALES. Representación Analógica.- Es una cantidad que se representa por medio de otra cantidad directamente proporcional, es decir es una variación totalmente continua, ya que puede variar gradualmente sobre un intervalo continuo de valores. Sistema Analógico.- Es un dispositivo que trabaja con magnitudes netamente analógicas o de variación continua. Representación Digital.- Es una cantidad que se representa por medio de dígitos los cuales son cantidades discretas de valores a pesar de que la magnitud a la que representa sea continua u analógica. Sistema Digital.- Es un sistema que trabaja con información discreta, estos sistemas pueden ser electrónicos, mecánicos, o magnéticos. Un sistema digital tiene muchas ventajas sobre un sistema analógico. - Mayor facilidad de diseñar con Circuitos Integrados. - Facilidad para almacenar la información. - Más exactitud y precisión. - Flexibilidad para implementar los diseños. - Es un sistema casi inmune al ruido. - Tiene un alto grado de integración. - Facilidad de programación para la operación. 1.2. -ÁLGEBRA DE BOOLE. 1.2.1. -RESEÑA HISTÓRICA "El concepto de variable lógica fue introducido en 1850 a través del uso del álgebra booleana. El álgebra booleana es un método muy sencillo para expresar situaciones, en forma de lenguaje matemático. La lógica digital adquiere su dimensión práctica a través de las compuertas y se consolida como una ciencia estructurada mediante el álgebra booleana. Sus principios teóricos fueron desarrollados por el matemático ingles George Boole en su obra "Análisis matemático de la lógica" publicada en 1847. Sin embargo, sólo hasta 1938 se descubrió su real utilidad". "En este año, Claude E. Shannon, estudiante de postgrado del MIT (Instituto Tecnológico de Massachusetts, EE.UU) presentó un trabajo en el cual describía como el álgebra booleana se adaptaba perfectamente a la representación y al diseño de circuitos de conmutación, basados en relés e interruptores". "Con el advenimiento de los tubos de vacío, los transistores y los circuitos integrados y la fabricación de compuertas, circuitos y sistemas digitales con estas tecnologías, el álgebra booleana adquirió un papel determinante en el desarrollo de la electrónica digital moderna y sus aplicaciones". "El álgebra booleana proporciona el método más compacto y conveniente de representar, analizar y diseñar circuitos lógicos. La operación completa de un circuito digital se puede describir mejor por el álgebra booleana que utilizando complicados diagramas lógicos y extensas tablas de verdad". "Cuando se diseña un circuito por métodos booleanos, el primer paso consiste generalmente en obtener su tabla de verdad de acuerdo con las condiciones de entrada y de salida. A partir de esta tabla se deriva entonces una ecuación booleana que se simplifica y conduce al circuito lógico deseado. El circuito obtenido por este método es el óptimo porque requiere de un número mínimo de compuertas para su realización. Esto reduce el costo, el tamaño físico y el consumo de potencia del mismo y mejora su confiabilidad y velocidad. Todas estas consideraciones son importantes cuando se diseñan circuitos digitales".1 El álgebra de Boole es un conjunto de elementos y operadores que ayudan en el diseño de circuitos combinacionales, los axiomas y teoremas que utiliza el álgebra de Boole ayudan a la simplificación de las funciones booleanas. Todas las operaciones del álgebra de Boole actúan sobre dos elementos básicos 1 y O que representan verdad o falsedad, físicamente estos dos estados se pueden representar como O lógico (un nivel entre Ov -- 0.8 v), y 1 lógico (un nivel de 2.5v 5v). En la figura 1.1 se representan los niveles lógicos, en función del voltaje. VOLTAJE v 2.5 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. r=A.B 3) A 0 0 1 1 B 0 1 0 1 A.B 0 0 0 1 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 A 0 0 1 1 .Y=(A.B) ' B B 0 1 0 1 A.B (A.B)' 0 1 0 1 0 1 1 0 ÑOR f=(A+B) ' AB 00 01 10 11 A+B (A+B)1 0 1 1 0 1 0 1 0 XNOR XAÍ A B A®B 00 0 01 1 10 1 11 0 (A®B)' 1 0 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, universalidad de las compuertas ÑOR respectivamente, así por ejemplo. UNIVERSALIDAD DE LAS NAND. a) NOT. A'=(A.A)'. o 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)'. b)AND. A.B=(A'+B')' (=(A+A) ' A->: (A+A) ' Y={A'+BI) B-S c) OR. (B+B) f 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: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 c 0 0 D 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 Y 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 Mintérmino m? Mintérminomn Mintérmino mi3 Mintérmino mu 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 0 1 1 1 7 11 13 14 7 11 13 14 e 1 1 B 1 0 1 1 0 1 £..„ A A1 A A A C c c B B' B B & 1 1 1 C1 c 1 -v * 1 1 1 1 0 o % D D D D1 1 1 1 1 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 7 11 13 14 0 1 ^Bt. jf ^ 1 1 1 1 1 0 ;"<** 1 0 1 1 1 1 1 y^J^tWff?' : flt$3 *'rt¿T5 0 A'BCD AB'CD ABC'D ABCD' Mintérmino m7 Mintérmino mu Mintérmino m13 Mintérmino mu Cada una de estas ecuaciones es un mintérmino. por ejemplo, el mintérmino asociado a la fila 13 es: ini3 = ABC'D A partir de estos datos se puede escribir la ecuación booleana como una suma de mintérminos. En nuestro caso: Y ™ m? •+• rn-M+ mía + m-u Reemplazando cada mintérmino por su expresión correspondiente, se obtiene la ecuación solicitada: Y = A'BCD + AB'CD + ABC'D + ABCD1 Esta expresión se denomina SOP (Suma de productos). booleana 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: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -*V fj ! #';.;-sjjf£ k -.y , 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 0 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 1 1 1 1 1 0 Maxtérmino MO Maxtérmino Mi Maxtérmino M2 Maxtérmino Ma Maxtérmino M4 Maxtérmino Ms Maxtérmino M6 Maxtérmino Ma Maxtérmino Mg Maxtérmino Mío Maxtérmino Mi2 Maxtérmino Mi 5 A continuación se detalla la forma de obtener la ecuación lógica (función lógica) que la describe o sintetiza en forma de producto de maxtérminos o términos máximos. El primer paso es identificar las filas o combinaciones de entrada que producen como resultado un O a la salida. En nuestro caso, esto es aplicable a las filas O, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 y 15. A continuación, se observa en cada fila los valores que toma cada variable de entrada. Si una variable determinada vale 1, se reemplaza mentalmente por su complemento (A1, Bf, C1, D'). Si la 17 variable vale O, se deja tal como estaba, es decir, sin negar (A, B, C, D). En la siguiente tabla se ilustra este paso: 0 1 2 3 4 5 6 8 9 10 12 15 0 1 2 3 4 5 6 8 9 10 12 15 A 0 0 0 0 0 0 0 B 0 0 0 0 c o Y 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 A A A A A A A A A' A' A' A1 A' B B B B C C D D B B' B' B' B B B B' B' 1 1 1 c C' C' c c C' c c C' c C' 1 1 0 0 1 1 D' D D' D D' D D D' D D D' 0 0 0 0 0 0 0 Y 0 0 0 0 0 0 0 0 0 0 0 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 A 0 1 2 3 4 5 6 8 9 10 12 15 0 0 0 0 0 0 0 1 1 1 1 1 Y^Mo* jtf-m?itf -vp¿ c D 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 M4* M5* M6* M8* M9* 1 1 0 0 1 0 0 1 Miü*Mi2*Mi5 A+B+C+D A+B+C+D' A+B+C'+D A+B+C'+D' A+B'+C+D A+B'+C+D' A+B'+C'+D A'+B+C+D A'+B+C+D' A'+B+C'+D A'+B'+C+D A'+B'+C'+D' Maxtérmíno M0 Maxtérmino MI Maxtérmino M2 Maxtérmino M3 Maxtérmino M4 Maxtérmino M5 Maxtérmino Me Maxtérmino M8 Maxtérmino M9 Maxtérmino M-|0 Maxtérmino Mi2 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 0 0 0 0 0 1 0 10 0 11 1 0 0 1 0 1 1 10 1 11 A*B'*C 0 0 0 0 0 1 0 0 A'*C 0 1 0 1 0 0 0 0 B*C 0 0 0 1 0 0 0 1 F<A, B, C,> 0 1 0 1 0 1 0 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, F(X1X2, ,Xn)= [Xi+F(0,X2,X3, ,Xn)-0<iF(0,X2,X3, ,Xn)].[Xi+F(1,X2,X3, -Xn) 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'). = xy + x'z + xyz + x'yz Teorema del complemento. 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 0 0 1 1 B 0 1 0 1 X X0 Xi X2 X3 En el mapa existen 22 = 4 cuadrados. B' Para tres variables. 23 = 8 filas. A 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 c 1 X Xo Xi X2 X3 0 X4 0 X5 X6 X7 0 1 0 1 1 En el mapa 23 = 8 cuadrados. C' 27 Para cuatro variables. -> 24 = 16 filas. A 0 0 0 0 0 0 0 0 c B D 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 X Xo XT X2 X3 X4 X5 X6 X7 X8 X9 Xio Xn Xi2 Xl3 Xu Xis En el mapa 24 = 16 cuadrados. A'B' A'B AB AB' C'D' C'D CD CD' Xi X3 X2 X0 X4 X5 X7 X6 X-I2 Xl3 Xis Xl4 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 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 c X 0 1 1 0 0 0 1 1 0 1 0 1 0 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 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 c D X 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 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. A'B' A'B AB AB' Agrupamiento.- C'D' 0 0 0 1 C'D 0 0 0 0 CD 1 0 0 0 CD1 1 0 0 1 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 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 c D X 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 32 Construimos el mapa K. A'B' A'B AB AB' C'D' 0 0 0 0 C'D 0 CD 0 ^_ JJ¿\y ^ 0 ^ CQ' (U 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. 1 A 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 representación gráfica lo podemos hacer en los vértices de un cubo. 0 A 001 1 o ooox-" ) 00 A 10 B B B 01 A 11 101 ¡ ior>^ I I B ¡ • — — — 3-* B _ ** 1 1 B A oro A o. A 110 111 ff ^c Fig 2.2: Representación de 2 y 3 variables de conmutación y la 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 m r I m3 j 0111 _1 010 m2 00. m oxo 11 m7 I m3 011 01X 010 m2 Cubos - O Cubos - 1 Fig. 2.3: Representación de un cubo-3 m7 35 Los vértices correspondientes a mO, m2, m3, y m7 se indican por medio de puntos negro. Estos vértices se denominan cubos - O de la función. Dos cubos - O forman un cubo - 1, si difieren solo en una coordenada en el ejemplo anterior se tiene tres cubos - 1, que están marcados en rojo, (01X, 0X0, X11), los cubos - 1 se designan colocando una "X" en la coordenada que tienen diferentes valores. Un conjunto de cuatro cubos O, cuyos valores de coordenada son iguales en todas las variables excepto en dos, forma un cubo - 2 que se representa gráficamente como un plano sombreado. Cubos - 2 Fig. 2.4: Representación de un cubo - 2 Cuando todos los vértices de un cubo - k está en el conjunto de vértices que componen un cubo - k mayor, se dice que el cubo más pequeño está contenido en/o cubierto por el cubo mayor. Resumiendo, un cubo - O se representa con un punto, un cubo - 1 se representa con un segmento, un cubo - 2 con un plano, un cubo 3 con un volumen, para un cubo - k en espacios - n mayores que 4 no hay representación geométrica, pero el principio de agrupación de productos fundamentales es el mismo. 36 Entre la representación cúbica y el mapa de Kamaugh existe una correspondencia, Los cubos - O corresponden a los cuadrados del mapa K, los cubos - 1 corresponden a los pares de cuadrados adyacentes, los cubos - 2 corresponden a los cuádruples de cuatro cuadrados adyacentes, etc. 2.2.3.2 Obtención de los implicantes primos. Definición. - "Un implicante primo es cualquier cubo de una función que no esté totalmente contenido en otro cubo mayor de dicha función". El método ingeniosamente de Quine-McCIuskey es para efectuar un procedimiento una búsqueda exhaustiva de organizado 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 A B C D 0 0 0 0 0 0 0 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 NUMERO DE "UNOS" FUNCIÓN 0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 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". V V V V V V V V V COMBINACIÓN A B C D mo 0 0 0 0 nri2 0 0 1 0 m8 1 0 0 0 1113 0 0 1 1 m6 0 1 1 0 iTlg 1 0 0 1 mío 1 0 1 0 m7 0 1 1 1 mis 1 1 0 1 #de "UNOS" 0 1 2 3 Se compara las combinaciones de cada grupo con las combinaciones del grupo siguiente, si existe una variable diferente entre las dos combinaciones que se están comparando entonces se reemplaza como una sola poniendo en el lugar que está la variable diferente con una X anotando el mintérmino que se combina. A los términos originales que se combinan se coloca una marca, por ejemplo "V". También se debe anotar los números enteros correspondientes a los mintérminos que se combinaron. En el caso de nuestro ejemplo mo se combina con m2 para formar el cubo - 1 (XOOO) esta combinación es equivalente a la operación algebraica A'B'C'D' + A'B'CD' = A'B'D'(C + CJ) = A'B'D'. 38 El mintérmino m0 se combina también con ms para formar el cubo - 1 (XOOO). Esto completa la comparación entre los mintérminos de los dos primeros grupos, de manera que se traza una línea por debajo de los cubos - 1 resultantes. A continuación, se comparan en la misma forma los mintérminos del segundo y tercer grupos. Esta comparación produce cinco cubos - 1 más, formados de rr}2 y ms, ms y mg, etc. Se traza una recta debajo de estos cinco cubos 1 para indicar la terminación de las comparaciones entre el segundo y tercer grupos. Cada mintérmino de un grupo se debe comparar con cada mintérmino del otro grupo, incluso si cualquiera o ambos ya han sido marcados, y han formado un cubo - 1 , se debe encontrar cada cubo - 1 . Este proceso de comparación se repite entre los grupos sucesivos hasta que se agote la lista de mintérminos. Cubo 1 0,2 0,8 00X0 XOOO 2,3 001 X 2,6 0X10 2, 10 X010 8,9 100X 8, 10 10X0 3,7 0X11 6,7 01 1X 9, 13 1X01 V V V V V V V V 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 1 X O 2.2.3.3 O X O X O 0 X 1 X 1 O X 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 * 1 0 0 X 1 X 0 1 X 0 X 0- * n y 1 y- * 2 3 6 7 8 V 9 y T y v í ,/ •J• ^1 ' Jy JV V V V V V V 1 ^ 10 13 •\ 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 ma ms m9 mío mu mis mi9 m2o m2i m23 m25 m2e m27 V V V V V V V V V V V V V V V 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 CUBOS - 0 1 0000 2 0 0 0 1 3 0 0 0 1 5 0 0 1 0 9 0 1 0 0 10 0 1 0 1 18 1 0 0 1 20 1 0 1 0 11 0 1 0 1 19 1 0 0 1 21 1 0 1 0 25 1 1 0 0 26 1 1 0 1 23 1 0 1 1 27 1 1 0 1 1 2 2 2 2 3 2 3 2 3 4 3 3 4 No. 1 's 1 0 1 1 1 0 0 0 1 1 1 1 0 1 1 1 2 3 4 43 V V V V V V V V V V V v v V V V V V V V V V CUBOS - 1 000X1 1,3 1,5 00X01 0X001 1,9 0001 X 2,3 2, 10 0X010 2, 18 X0010 3,11 0X011 3, 19 X0011 5,21 X0101 9,11 010X1 X1001 9,25 10, 11 0101X 10,26 X1010 18, 19 1001X 18,26 1X010 20,21 1010X 11,27 X1011 19,23 10X11 19,27 1X011 21,23 101X1 25,27 110X1 26,27 1101X Cubos - 2 0X0X1 1,3,9,11 2,3, 10, 11 OX01X 2,3, 18, 19 X001X 2, 10, 18,26 XX010 3, 11, 19,27 9, 11,25,27 10, 11,26,27 18, 19,26,27 XX011 X10X1 X101X 1X01X Cubos - 3 2, 3, 10, 11, 18, 19, 26, 27 XX01X IMPLICANTES PRIMOS 1,5 00X01 5,21 X0101 20,21 1010X 10X11 19,23 101X1 21,23 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 00X01 V X0101 1010X" 10X11 101X1 0X0X1 V 3 * X10X1- * vYrnly\ Y /v/xU 9 10 11 18 19 20 21 "N V ^ 23 25 26 27 _/ 1 V j V V V V V - — J —,», * 5 " ^| \l 1 V ^ V V -/ f V V V V V tl _/ f V ^/ f J V -\l „/ ** V •Jí _/ 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 00X01 1 5 23 V V V X0101 10X11 101X1 0X0X1 V V 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 * * / 00X01 J i 10X11 0X0X1 - V V 5 i V 23 / 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 1 0 1 5 2 0 6 1 1 0 1 2 1 7 1 1 1 3 Tabla de cubos O mi rru m6 m7 COMBINACIÓN A B C 0 0 1 1 0 0 1 1 0 1 1 1 número de "UNOS" 1 V V V 2 3 Tabla de cubos - 1 Combinaciones Cubos 1 M 4, 6 1 X 0 6, 7 1 1 X IMPLICANTES PRIMOS 0 0 1 X 1 1 1 0 X M 47 TABLA DE IMPLICANTES IMPLICANTES PRIMOS ESENCIALES 0 1 1 O X 1 1 O 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 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 C 0 1 0 1 0 1 1 0 1 1 F(A, B, C) X 0 0 0 1 1 X 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. 1 En este caso los mintérmino me y m? se tomaron como "1" mientras que el mintérmino m0 se le tomo como riO" ya que con estas consideraciones se obtienen un grupo de más cuadros es decir la mínima simplificación. F(A,B)=A 2.2.5 COMPARACIÓN DE LOS MÉTODOS DE SIMPLIFICACIÓN. - El método del álgebra de Boole es complicado cuando se tienen funciones con muchas variables de entrada mientras que el método de mapa de Karnaugh es un método directo y simple sin importar la cantidad de mintérminos. - En el método del álgebra de Boole se necesita que la persona que está simplificando la función tenga habilidad para aplicar los axiomas apropiados ya que no existe una regla que especifique cual axioma se debe aplicar con certeza; mientras que los métodos tanto del mapa de Karnaugh como el método de Quine-McCIuskey son métodos mecánicos y con proceso fijo lo cual se puede decir con precisión cual método seguir en el siguiente paso. - El método del mapa Karnaugh es un método muy rápido, mientras el método de Quine-McCIuskey es más elaborado por lo tanto más largo. 50 Cuando existen más de cuatro variables el método del mapa de Karnaugh es dudoso su seguridad mientras que el método de Quine-McCIuskey es seguro y confiable. Cuando son cuatro variables o menos el método del mapa de Karnaugh es mucho más confiable ya que el método de Quine-McCIuskey es más largo. El método del mapa de Karnaugh no es un iterativo lo cual dificulta la posibilidad de implementar un programa computacional, mientras que el método de Quine-McCIuskey utiliza una técnica iterativa lo cual facilita la Implementación de un programa computacional para su uso y así lograr simplificar funciones de muchas variables de entrada. 51 23 IMPLEMENTACION DE LAS FUNCIONES BOOLEANAS SIMPLIFICADAS. Una vez simplificada la ecuación correspondiente a la función obtenida para resolver el problema planteado, se debe implementarlo para su funcionamiento, es decir construir el hardware necesario para que cumpla el objetivo y realice el trabajo planteado en el problema. Para construir este hardware se utilizan las compuertas lógicas relacionas con cada una de las operaciones existentes en la función simplificada. En el primer ejemplo se tiene. Y = A'C + AC'D + B'D'. En esta expresión observamos que tanto las entradas A, B, C, y D están complementadas es decir que se necesitan pasar por compuertas NOT para obtener A', B1, C1 y D'. Para obtener el primer término A'C es necesario las salidas de A' y C ingresarlas por una compuerta AND de dos entradas, entonces a la salida de la compuerta AND se obtendrá el valor correspondiente a la expresión A'C. De la misma manera obtendremos el valor correspondiente al término AC'D para lo cual la variable A, la salida de C' y la variable D en forma directa se ingresan a una compuerta AND de tres entradas, o a dos compuertas AND de 2 entradas, y a la salida de cualquiera de estas compuertas se obtendrá AC'D. Para obtener B'D' igualmente en una compuerta AND se ingresa la salida de B1 y la salida de D' en forma directa y se obtiene el valor correspondiente de B'D'. 52 Las tres salidas de las tres compuertas AND antes descritas se deben ingresar a una compuerta OR de tres entradas para obtener la respuesta final. Todo esto se resume en el siguiente gráfico del esquemático correspondiente al circuito de la función dada. n £>«BU-I i'C Y=A1C+AC'D+B'D' Jo.B'D' Fig. 2.5: Circuito Esquemático de la función Simplificada Para implementar este esquemático se necesita los siguientes chips: - Un chip 7404 el cual contiene 6 compuertas NOT. - Un chip 7408 el cual contiene 4 compuertas AND. - Un chip 7432 el cual contiene 4 compuertas OR. Como se puede observar únicamente con tres circuitos integrados se puede construir el sistema planteado con la función booleana del ejemplo. 53 CAPITULO 3 DISEÑO DEL PROGRAMA COMPUTACIONAL PARA SIMPLIFICAR FUNCIONES BOOLEANAS. 3.1. INTRODUCCIÓN. Para simplificar las funciones booleanas utilizando un computador, es necesario programar el proceso de simplificación paso a paso, en un lenguaje que permita presentar una interfaz gráfica, amigable, llamativa y fácil de usar, esto permitirá entender el proceso de Simplificación de Quine-McKIusky. El programa que se diseñará tendrá una sección teórica en la que se explica todo el proceso de simplificación de funciones booleanas utilizando ei método de Quine-McKIusky paso a paso. Existe otra sección en la que se presenta un tutorial de cómo utilizar el programa de simplificación explicando cada una de las partes y objetos existentes en este programa diseñado. La tercera sección de este software, es un programa que sirve para simplificar funciones booleanas de hasta 10 entradas, el programa realiza el proceso de simplificación utilizando el método de Quine-McKIusky paso a paso presentando cada uno de los cubos hasta obtener los implicantes primos, luego indica la tabla de simplificación o de selección de los implicantes primos esenciales, a continuación realiza una optimización de los implicantes primos secundarios de menor costo, y por ultimo presenta la función totalmente simplificada. Este programa también permite guardar la tabla de combinaciones para que sea utilizada en otro momento. 54 El ingreso de los datos se los puede hacer directamente en la tabla de combinaciones o por medio de un editor de mintérminos. El software diseñado funciona en cualquier computador que tenga el sistema operativo Windows 95 o superior. El desarrollo de este software se lo hace utilizando el lenguaje de programación Visual Basic 6.0 ya que este lenguaje permite programar cualquier aplicación bajo Windows. A continuación se hace una descripción de los más importantes objetos de Visual Basic usados para realizar la aplicación descrita anteriormente. 3.1.1. BREVE DESCRIPCIÓN DEL USO DE FORMULARIOS DE VISUAL BASIC. Un formulario en Visual Basic es un objeto en el que se presenta toda la información, en este objeto se pone los controles los cuadros de texto para el ingreso de datos, gráficos, listas de datos, comandos, tablas etc. Fig. 3.1: Formulario usado en VisualBasic. 55 Cuando se ejecuta el programa muestra únicamente el formulario que está definido como formulario inicial, para mostrar los demás formularios hay que escribir el código respectivo. Un formulario al igual que todos los objetos de Visual Basic responden a eventos que se generan durante la ejecución del programa. Hay cuatro métodos para trabajar con los formularios. Show.- Como su nombre indica, el método Show muestra el formulario en la pantalla, y lo pasa al primer plano del escritorio si está cubierto por otro formulario. Para ello, cuando use el método Show, Visual Basic comprueba primero que el formulario está cargado en la memoria, si no lo está, lo carga. La sintaxis básica de método Show es /VombreFomru/arío.Show Load.- La palabra Load carga el formulario en la memoria pero no lo presenta. Visual Basic carga también el formulario en la memoria siempre que se haga referencia a sus propiedades o controles en el código. Por esto, la razón principal para cargar un formulario antes de mostrarlo es disminuir el tiempo de respuesta, a cambio se emplea más memoria, ya que Visual Basic tiene que reservar memoria suficiente para el formulario. La sintaxis es Load NombreFormularío. Cuando Visual Basic carga un formulario, restaura en todas las propiedades del mismo los valores definidos inicialmente al diseñarlo, y luego llama al procedimiento de evento Form_Load. Hide.- La palabra Hide retira el formulario de la pantalla, pero no lo descarga de la memoria, los controles no están af alcance del usuario, pero puede seguir haciendo referencia a ellos en el código. Los valores de fas variables al nivel de formulario no desaparecen, igual que al cargar el formulario, la ocultación 56 del formulario aumenta la velocidad si va a necesitarlo de nuevo, pero a cambio de seguir usando la memoria para guardarlo. La sintaxis es NombreFormulario. Hide Unload.- Esta palabra borra el formulario de la memoria es decir tiene el mismo efecto que pulsar el botón de salida o pulsar dos veces en el cuadro de control en la parte izquierda de la barra de titulo, se pierde toda la información contenida en sus variables al nivel de formulario. La sintaxis es Unload NombreFormulario Cuando se carga, descarga y vuelve a cargar un formulario, siempre activará el evento Form_Load, pero la única llamada al método Load que activa el evento Initialize es la primera. 3.1.2. CONTROLES DE VISUAL BASIC Antes de empezar a conocer los controles básicos veamos cuales son sus características generales: Propiedades.- Todos los controles disponen de una serie de propiedades las cuales se puede cambiar al incluirlos en nuestras aplicaciones; ejemplos de propiedades son el color, el tipo de letra, el nombre, el texto, etc... Métodos.- Son procedimientos asociados a los controles, es decir, rutinas ya establecidas que podemos invocar desde nuestras aplicaciones para que se realice alguna operación sobre el control. Eventos.- Son acciones que pueden ser motivadas por el propio usuario o por mismo sistema operativo. Ejemplos pueden ser el movimiento del ratón o hacer click sobre su botón. En Visual Basic se puede decir que se utiliza la programación orientada a eventos, lo cual es una de las diferencias más importantes respecto a la programación lineal de MS DOS. No necesitamos 57 detectar cuando se ha producido un evento determinado, Windows lo detecta automáticamente. Los eventos ya están definidos, son bastantes y cada control cuenta con los suyos propios, aunque son muy parecidos, lo único que se tiene que hacer es asociar el código necesario al evento que necesitemos tratar. 3.1.2.1 TextBox Fig. 3.2: Objeto TextBox Mediante este control se puede realizar tanto la entrada como la salida de datos en nuestras aplicaciones. No hace falta indicar las coordenadas de la situación del formulario en pantalla, simplemente se tiene que marcar sobre el control de la caja de herramientas y dibujarlo con el tamaño deseado en el formulario. Propiedades: Las propiedades de las que dispone el control son las siguientes Text: Aquí se indica el texto que aparecerá en el control. Podemos asignarle cualquier texto en tiempo de diseño o ejecución. También podemos tomar el texto que haya introducido el usuario para tratarlo durante la ejecución. Ñame: Esta propiedad tiene todos los controles, el nombre que viene por defecto en este caso Textl y es el nombre con el que se conocerá el control cuando lo utilicemos en el código. En un mismo formulario no puede haber 2 controles con el mismo nombre. Conviene poner un nombre que represente la función que tiene el control en la aplicación para que el código quede más claro. MultiLine: Permite introducir varias líneas de texto en el control en lugar de sólo una. Alignment: Es la alineación que tendrá el texto dentro del control: izquierda, centro o derecha. Para que funcione la propiedad MultiLine debe estar con el valor true. Locked: Si está con valor true bloquea el control, es decir, el usuario no puede introducir ni modificar el texto que contenga. Nos puede servir para utilizar el control como salida de datos sin que el usuario pueda modificarlos por error. Otras propiedades que son comunes a la mayoría de los controles: Backcolor: color de fondo. Forecolor: color de letra. Font: tipo y tamaño de letra. Métodos Recordemos que por métodos se entienden los procedimientos o funciones asociados a un control, los cuales nos permiten realizar ciertas operaciones útiles sobre dicho control: Ej. Ordenar sus elementos, buscar un dato, etc... Eventos: Los eventos son acciones que se pueden realizar en cualquier control: click, doble click, movimiento del ratón. A estos eventos se les puede asociar código para que se ejecute al producir el evento. MouseMove: Al mover el ratón por encima del control. MouseDown: Al pulsar cualquier botón del ratón. 59 Change: Al cambiar el contenido del control. Click: Al hacer click con el botón izquierdo del ratón sobre el control. DoubleClick: Al hacer doble click con el botón izquierdo del ratón sobre el control. GetFocus: Este evento se activa cuando el control recibe el enfoque, es decir, cuando se activa el control en tiempo de ejecución para introducir datos en él o realizar alguna operación. LostFocus: Es el contrario del anterior evento, se activa cuando el control pierde el enfoque, es decir, se pasa a otro control para seguir introduciendo datos. 3.1.2.2 Labe!. Fig. 3.3: Objeto Label Este control es también uno de los más utilizados, aunque su utilidad queda restringida a la visualización de datos en el mismo, no permitiendo la introducción de datos por parte del usuario. La forma de utilizarlo es similar a la del control anterior, dibujar el control en el formulario con el tamaño que queramos y asignarle un texto en tiempo de diseño o de ejecución esta vez sin utilizar la propiedad text puesto que no la incorpora, sino utilizando la propiedad Caption. Este control sirve para mostrar mensajes en nuestro formulario que orienten al usuario sobre la utilidad de los demás controles que tengamos en la aplicación o para indicarnos acciones que podemos realizar. 60 Propiedades Caption: Es el texto que contendrá el control. Alignment: Alineación del texto contenido en el control, no necesita que esté activada ninguna otra propiedad. BorderStyle: Si queremos que aparezca un borde alrededor del control activaremos esta propiedad. Para este control no se suelen utilizar los eventos ya que su contenido suele cambiar poco a lo largo de la ejecución de la aplicación. De todas formas los eventos son casi los mismos del control textbox excepto que no dispone de los eventos GetFocus y LostFocus ya que a este control no se le puede dar el enfoque. 3.1.2.3. CommandButton Fig. 3.4: Objeto CommandButton. Este control es el típico botón que aparece en todas las aplicaciones y que al hacer click sobre él nos permite realizar alguna operación concreta, normalmente Aceptar o Cancelar. Aunque según el código que le asociemos podremos realizar las operaciones que queramos. Pero sólo con introducir un control de este tipo con el texto salir que se introduce a través de la propiedad Caption no basta. Habrá que asociarle un código que nos permita salir de la aplicación en el evento adecuado. Y el evento por excelencia de este control es click. Así pues accederemos al código del control y la sentencia que nos permitirá salir de la aplicación es End, simplemente 61 tecleamos esa palabra en el evento click y comprobar que realmente finalizaremos nuestra aplicación al pulsar sobre dicho botón. Propiedades Gaption: Aquí se pone el letrero que queremos que aparezca en el botón: aceptar, cancelar, salir, etc... Enabled: Esta es una nueva propiedad, cuando su valor es true el botón funciona normalmente, cuando su valor es false el botón se encuentra desactivado, no responde a los eventos producidos sobre él y el texto aparece en un gris claro advirtiéndonos de su estado. Podemos utilizar esta propiedad para activar o desactivar un botón dependiendo del estado de otros controles. Eventos Click: Es el evento típico de este control y el que más se utiliza. MouseMove: Como sabemos detecta el movimiento del ratón sobre el control. Puede servir para que aparezca un mensaje en un control Label que nos aporte información sobre la utilidad del control ampliando el texto que hayamos colocado como Caption del CommandButton. 3.1.3. BREVE DESCRIPCIÓN DEL USO DE COMANDOS Y SENTENCIAS EN VISUAL BASIC. 3.1.3.1. Fundamentos de la Programación Cada módulo de formulario contiene procedimientos de evento (secciones de código donde se colocan las instrucciones que se ejecutarán como respuesta a 62 eventos específicos). Los formularios contienen controles, por cada control de un formulario, existe el correspondiente conjunto de procedimientos de evento en el módulo de formulario; además de procedimientos de evento, los módulos de formulario pueden contener procedimientos generales que se ejecutan como respuesta a una llamada desde cualquier procedimiento de evento. El código que no esté relacionado con un control o un formulario específico se puede colocar en un tipo diferente de módulo, un módulo estándar (. bas). Se deben colocar en un módulo estándar los procedimientos que se puedan utilizar como respuesta a eventos de diversos objetos, en lugar de duplicar el código en los procedimientos de evento de cada objeto. ¿Cómo Funciona una Aplicación controlada por Eventos? Un evento es una acción reconocida por un formulario o un control. Las aplicaciones controladas por eventos ejecutan código Basic como respuesta a un evento. Cada formulario y control de Visual Basic tiene un conjunto de eventos predefinido. Si se produce uno de dichos eventos y el procedimiento de evento asociado tiene código, Visual Basic llama a ese código. Aunque los objetos de Visual Basic reconocen automáticamente un conjunto predefinido de eventos, se decide cuándo y cómo se responderá a un evento determinado. A cada evento le corresponde una sección de código que se denomina procedimiento de evento, cuando se desea que un control responda a un evento, se escribe el código en el procedimiento de ese evento. Los tipos de eventos reconocidos por un objeto varían, pero muchos tipos son comunes a la mayoría de los controles, por ejemplo, la mayoría de los objetos reconocen el evento Click: si un usuario hace clic en un formulario, se ejecuta el código del procedimiento de evento Click del formulario; si un usuario hace clic en un botón de comando, se ejecuta el código del procedimiento de evento Click del botón, el código en cada caso será diferente. 63 Aquí una secuencia típica de eventos en una aplicación controlada por eventos: • Se inicia la aplicación y se carga(LOAD) y muestra(SHOW) el formulario inicial. • El formulario (o un control del formulario) recibe un evento. El evento puede estar causado por el usuario (por ejemplo, por la pulsación de una tecla) o por el sistema (por ejemplo, un evento de cronómetro) o, de forma indirecta por el código (por ejemplo un evento Load cuando el código carga un formulario). • Si hay código en el procedimiento de evento correspondiente, se ejecuta. La aplicación espera al evento siguiente. 3.1.3.2. Variables. 3.1.3.2.1. Alcances de las Variables El alcance de una variable define qué partes del código conocen de su existencia; cuando se declara una variable en un procedimiento, sólo el código de dicho procedimiento puede tener acceso o modificar el valor de la variable, tiene un alcance que es local al procedimiento. A veces, sin embargo se necesita utilizar una variable con un alcance más general, como aquella cuyo valor está disponible para todos los procedimientos del mismo módulo o incluso para todos los procedimientos de toda la aplicación; Visual Basic fe permite especificar el alcance de una variable cuando la declara. 3.1.3.2.2. Establecimiento del Alcance de las Variables 64 Dependiendo de cómo se declara, una variable tiene como alcance un procedimiento (local) o un módulo. Alcance Nivel de procedimiento Nivel de módulo Privado Las variables son privadas del procedimiento en el que aparecen. Las variables son privadas del módulo en el que aparecen. Público No es aplicable. No puede declarar variables públicas dentro de un procedimiento. Las variables están disponibles para todos los módulos. 3.1.3.2.3. Variables Utilizadas en un Procedimiento Las variables al nivel de procedimiento sólo se reconocen en el procedimiento en el que se han declarado. Se las conoce también como variables locales. Se declaran mediante las palabras clave Dim o Static. Por ejemplo: Dim col As Integer - o bien Static col As Integer Los valores de variables locales declaradas con Static existen mientras se ejecuta la aplicación, mientras que las variables declaradas con Dim sólo existen mientras se ejecuta el procedimiento. Las variables locales resultan una elección apropiada para cálculos temporales. Por ejemplo, puede crear una docena de procedimientos distintos que contengan una variable llamada col, como cada col se ha declarado como una variable local, cada procedimiento sólo reconoce su propia versión de col. Cualquier procedimiento puede alterar el valor de su col local sin que ello afecte a las variables col de los demás procedimientos. 3.1.3.2.4. Variables Utilizadas en un Módulo 65 De forma predeterminada, una variable al nivel de módulo está disponible para todos los procedimientos del módulo, pero no para el código de otros módulos. Se crea variables al nivel de módulo declarándolas con la palabra clave Prívate en la sección Declaraciones al principio del módulo. Por ejemplo: Prívate col As Integer Al nivel de módulo, no hay diferencia entre Prívate y Dim, pero es preferible Prívate porque contrasta con Public y hace que el código sea más fácil de comprender. 3.1.3.2.5. Variables utilizadas por todos los Módulos Para hacer que una variable al nivel de módulo esté disponible para otros módulos, se utiliza la palabra clave Public para declarar la variable. Los valores de las variables públicas están disponibles para todos los procedimientos de la aplicación. Al igual que todas las variables al nivel de módulo, las variables públicas se declaran en la sección Declaraciones al principio del módulo. Por ejemplo: Public col As Integer A/o se puede declarar variables públicas en un procedimiento, sólo en la sección Declaraciones de un módulo. 3.1.3.2.6. Declaración de Variables La forma de declarar las variables es la siguiente: Dim \ | Static nombre_varíable As tipo Dim: Al declarar una variable con esta palabra estamos diciendo que la variable sea local al ámbito en que se declara; puede ser dentro de un 66 procedimiento o dentro de un formulario, de esta forma no sería accesible desde los demás procedimientos o formularios. Public: Las variables declaradas serán publicas y podrán estar accesibles desde todos los formularios de la aplicación. Para conseguirlo tendremos que declararlas en un módulo de código, no en la sección declarations de cualquier formulario de los que conste la aplicación. Para crear un módulo de código en el menú principal de Visual Basic marcamos en PROYECTO/INSETAR MÓDULO y aparecerá junto a los demás formularios de la ventana de proyecto aunque con un icono distinto indicando que se trata de un módulo de código 3.1.3.2.7. Tipos de Variables Tipo 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 Teórico Presentación \e la Teoría Iniciar / Simplificación /"" J Presentación del tutorial f Proceso de Fig. 3.5: Diagrama de Flujo del inicio del programa \ Simpl 81 3.2.1 TEORÍA Regresar al Menú Comando presionado Imprimir- Flechas de Navegación i Imprimir el Texto completo Navegaren el 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 por mintérminos Ingresar datos por tabla iF Presentar Tabla de Combinaciones y mintérminos Comando Ingresado O¡ Tiene la respuesta final? Está la tabla de combinaciones Simplifica el siguiente paso Simplifica el 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 /Siguiente Comando Ingresado Anterior / Ultima xplicación? Primera xplicación? Presentar la siguiente explicación Presentar la anterior 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 /Tabla de -x 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) Actualizar Tabla <Otro> <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 0001 001 1 0101 0111 1 001 1011 1101 1111 CUBOS O 0001 001 1 0101 1 001 0111 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^> —-""""^ s¡ No • pos=pos+1 J> J L I cont=cont+1 I if Si J* No -r-*^*rnnf~iTi^*^^-^ i: +1 it 1 Si raya = raya + 1 fila * fila + 1 c(fila, col) = f(i) O(fila, col) = Str(i) *--—-"""^T?* n^ i""?"—**-• Si ^-——nrr"^- 4) j=j+1 ^i Nn M~ 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) CUBOS 1 000X1 00X01 0X001 0001X 0X01 O X001O 0X01 1 X001 1 X01 01 01 0X1 XI 001 01 01 X XI 01 O 1 001 X 1X010 Número de entradas 6 CUBOS 2 0X0X1 OX01X X001 X XX01 O XX01 1 X1 0X1 XI 0 1 X 1 X01 X Fig. 3.17: Tabla de cubos 1 y cubos 2 para una función de 5 entradas. 3.3.3. TABLA DE IMPLICANTES PRIMOS Para hallar los implicantes primos se debe tomar todas las combinaciones de cada uno de los cubos n que no se combinaron para formar cubos de orden superior. Para lo cual leemos en la matriz marcafi, j) las posiciones en las que no existe la marca "*" dentro de esta matriz corresponden a los implicantes primos. Como se puede ver en el diagrama de flujo de la figura 3.18, únicamente si los implicantes primos no han sido hallados antes aux1<>col se hace el cálculo de los implicantes primos caso contrario se muestra directamente. En ai figura 3.19 se indica una tabla de implicantes primos de una función de 5 entradas. 96 No No fila = fila + 1 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 d -J r 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) 1f No al(subindice) = Val(s(j)) O- Fig. 3.22. Continuación del diagrama de flujo para la construcción de la tabla de simplificación. 101 3ps = Len(O(i, col)] 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) = "*" olumnaAnulada(¡2) No 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 2 3 6 7 8 9 10 13 0000 001 0 001 1 0110 0111 1 000 1 001 1010 1101 0000 001O 1 000 001 1 01 1 O 1 001 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 X01 O 1 OOX "0011 "0110 * 1 001 "1010 0X1 1 01 1 X 1X01 * 01 1 1 * 1 1 01 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 xoxo 0X1 X 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 1 0 0 X 1 X 0 1 xoxo 0 X 1 X 6 * 9 * 10 13 * * * * * * * * Fig. 3.37:Tabla de Simplificación de los implicantes primos. En la Figura 3.37 podemos ver que el implicante primo 100X contiene a los mintérminos m8 y m9 mientras que el implicante primo 0X1X contiene a los mintérminos m2, m3, m6, m7. Es decir esta tabla se forma con los implicantes primos y los mintérminos involucrados en estos implicantes primos. 115 El cálculo de los implicantes primos esenciales se los hace tomando los implicantes primos que coinciden con las columnas que tienen una sola marca. Todas las columnas que tienen marcas en la misma fila del implicante primo encontrado se eliminan poniendo una marca en la parte inferior de las columnas. c TABLA DE SIMPLIFICACIÓN 2 3 É e - 1 0 0X —j (•\s> jii (•\» > fk ¡i) , t j i i3 /\• >i> T ! 3 xoxo 9 i 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 00010JO 0 0 0 1 1 ¡0 ¡001 00|0 10001 |1 10G1QJO 1001 1 ¡1 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_. 11001 fT 11 oí ofo" o i o i ijo" 11011 pT ioofT|n i o o f T OIQOI |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 "01100 * 10001 "10100 "01110 "10011 "10110 "11001 0X1 1 O X01 1 O 01X10 01 1X0 X1 1 00 1 00X1 1 X001 1 01X0 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 "11110 1X011 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 X1 1X0 1 XOX1 1 XI XO XX1 1 O X1 1 XO 1X O X 1 1X1 XO Fig. 3.44: Cubos 2 e Implicantes primos. TABLA DE SIMPLIFICACIÓN 0 * _ „ _ — __ 6 10 8 c{ s> f \ 12 ,¿ 17 2O 22 25 27 ' -. -4 •< >,J ^ /, \ X 1 1 X0 *, - 1 X O X1 • 19 -; 4 •' f -\ { 1 l'l > íl !? 1 X 1 X Q- • * ! ' - 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 U^ A /• !> \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 I Consultas Qj Piimef Texto presentado C3 TEXTO tunctónICb.boo functón2.boo función3.boo Iunctón3b.boo Iuncion4boo Iuncion4b.boo luncionSboo 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 001 00 fT Ó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 CUBQS1 CUBOS O * 0001 O 00011 00101 01001 01010 10010 10100 CUBOS 3 CUBOS2 000X1 00X01 0X001 0001X 0X01 O X001 O 0X0X1 OX O1 X X OO1 X XX01O | XX 0 1 X XX01 1 XI 0X1 X 1 O1 X 1 X O1 X IMPUONTES PRfWOS 01011 10011 10101 1 1 001 11010 10111 11011 00X01 X01 01 1 01 OX 1 0X1 1 101X1 0X0X1 XI 0X1 XX01 X 1 01 OX 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 :-•'- ] f\ 2 2 f- \ \ ' f\\ 1 X 0 1 0 1 * 1 0 1 X 1 0 X 0 X 1 X 1 _ _ _1_ 0 _ HX __ 19 2 >1> • ir = * • -H.. .,1 /•\>,> F -. > 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 * U X U 26 27 JT^ X 0 1 0 1 * U 1 U Jt~ • U A 1 1~ 0 X 1 X 1 0 0 0 1 1 1 X- 1 0 X X X X X 1 :• ':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 1111 01 (O 001101 fo 011101 101110(1" 111110(1 O 01110 Jo" 0 1 1 1 1 0 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 * oooooi * 101000 * * * * * 1 10000 00001 O 000100 001000 100000 * 00001 1 * 000101 * 001001 * 00101 O * 010001 "010100 * 01 1000 * 100001 * 10001 O CUBOS0 "101111 "111011 "111110 "010101 "011001 "100101 " 101001 "101010 "101100 * 1 1 1000 "011011 "101011 "101101 "101110 * 100100 Fig. 3.56: Tabla de cubos 0. 124 CUBOS 1 0000X1 000X01 00X001 0X0001 XOOOOI 00001X 00X01 O X0001O 0001OX 0X0100 X00100 001OOX 0010X0 0X1000 X01000 1OOOOX CUBOS 1 1000X0 100X00 10X000 1XOOOO 0X0101 X00101 0X1001 X01001 X0101 O 010X01 01X001 0101OX 011OOX X11000 100X01 CUBOS 1 10X001 10X01O 1 OO1 O X 1 OX 1 O O 1 01OOX 1010X0 101X00 1X1000 1 01 1 O X 1011X0 XI 101 1 101X11 1X1011 1011X1 101 1 1 X 1X1110 1 • xooo 01 1 0 X 1 10X101 1010X1 01X01 1 0 10 1X 1 0 1X 1 0 Fig. 3.57: Tabla de cubos 1, CUBOS 2 0X0X01 XOOX01 OXX001 XOX001 XOX01O 0X01OX XQ01OX 0X1OOX X01OOX X010X0 XX1000 * 1OOXOX CUBOS 3 1 OXXOX "1OXX01 * 1 0X1 OX * 1 01OXX * 101XOX "101 XXO 1 01 XXX * 1 01XX1 * 101XIX * 1 01 1 XX * 1OXOOX 10X0X0 * 1OXXOO 1XXOOO Fig. 3.58: Tabla de cubos 2 y de cubos 3. 125 IMPLICANTES PRIMOS IMPLICANTES PRIMOS XX1000 0000X1 10X0X0 00001X 1XXOOO 0110X1 1OXXOX X11011 1 01 XXX 1X1011 1X1110 0X0X01 XOOX01 OXX001 XOX001 XOX01O 0X01OX X001OX 0X1OOX X01OOX X010X0 Fig. 3.59: Tabla de implicantes primos. ] TABLA DE SIMPLIFICACIÓN c 3 2 4 e 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 1 _X _ 0_ _X_ 0_ _0 _ ' 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 4 3 8 * 5 X X 1 0 0 O 1 0 X 0 X 0 1 X X 0 0 0 9 10 17 20 21 - ¡ 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 X 0 0 X0 1 i 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 pcsr^crur-iAi t=c r~ 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 X X 1 0 0 0 f 1 0 X 0 X 0 1 X X 0 0 0 ! • „ i i i 25 27 32 33 ir 34 36 41 • if f ^ 42 {• \7 f \0 1 : ^^^^^j ^^B^S 1 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 • s \ A l l í Lr^ 0 X 0 X 0 1 X 0 0 X 0 1 • A X U U 1 X 0 X 0 0 1 * U A U i Lr^ * A U 1 U A X 0 X X 0 X 0 0 0 1 1 1 1 0 0 0 0 X 0 X0 X 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 43 44 45 46 47 X X 1 0 0 0 1 0 X 0 X 0 1 XX0 0 0 * U A A U A <• U 1 A A A 48 56 59 62 - T; 1 ¿ } \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 0X01OX 101XXX 1XXOOO 1X1110 SECUNDARIOS OXXOQ1 0X1OOX XOX010 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 J0000001 0000010 0000011 0000100 0000101 0000110 0000111 0001000 00010D1 0001010 D00101 1 0 0010QOOJO 0100000 1 1 1 01000D1 0 1 0 1 0 1 0 1 0001 1 00 o 0001101 o 0001 1 10 0 0001 1 1 1 0010001 0010010 0010011 00101 00 0010101 00101 10 00101 11 001 1000 001 1001 001 1010 001101 1 0011100 001 1101 J001 1110 1 o • p 0100011 P 01 0 0 1 0 0 p 0100101 0 0100010 1 0 1 F ir ir 1 1 0110000| 0110001 | 011001 O J 011001 1 | 0110100] 0110101 | 011Ü11QJ 01001 10 0 1 0 0 1 11 01101 1 1 ¡ 0 0101000 01 1 1 0 0 0 ¡ [T 0 1 0 1 0 0 1 0111001J 0 0 1 0 1 0 1 0 0 01 1 1 0 1 0 J 010101 1 0111011 o " p ir r 0101 100 0 0111 100 0101 101 1 011 1 101 " 0101 110 0 \ 1 1 11 1 0 i joomi iF" 0101111 1 ¡0111 111 j Fig. 3,68: Tabla de combinaciones. 1 2 3 5 7 9 11 15 17 19 21 22 23 25 27 29 000000 1 00000 10 000001 1 0000 10 1 0000 1 11 000 100 1 000 1011 000 1 1 1 1 00 1000 1 00 100 1 1 00 10 10 1 00101 10 00101 1 1 00 1 1 00 1 00 1 10 1 1 00 1 1 101 MINTERMINOS 30 31 33 37 38 39 41 43 45 47 49 51 53 55 57 59 0 0 1 1 1 1 1) 001111 01 0000 010010 01 001 1 ) ( 010011 010100 010101 0101 10 010111 01 1 000 01 1 001 011010 011011 011100 011101 Fig. 3.69: Mintérminos. MINTERMINOS 61 65 66 67 69 71 73 75 77 79 81 83 85 87 91 93 01 1 1 1 01 1 0 000 0 1 1 00 00 1 0 1 0000 1 1 1 0 00 1 0 1 1 000 1 1 1 1 00 1 00 1 1 00 1 0 1 1 1 00 1 1 0 1 1 00 1 1 1 1 1 0 1 000 1 1 0 1 00 1 1 1 01 01 01 1 01 01 1 1 1 0 1 1 01 1 1 01 1 1 01 129 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 1011111 1 100001 1 1 0001 1 1100101 1100111 1 1 01 0 0 1 1101011 1101101 1101111 1 1 10001 1110011 1110101 1110111 1111001 1111011 1111101 Al H| MINTERMINOS 127 1 1 1 1 1 1 1 *j . IB Fig. 3.70: Míntérminos. A continuación se indica los cubos ceros. CUBOS O *OOOOOQ1 * 000001 0 * 0 0 0 0 0 11 "0000101 * 000 100 1 * 001 0001 * 0 1 0000 1 * 100 0 001 * 1000010 * 00001 11 * 0001 0 1 1 " 001 001 1 * 001 1 001 * 01 0 0 1 01 Al * 01 0 0 1 1 1 jQ " 0 1 0 1 0 1 1 Al " 0 0 1 1 1 1 1 JH " 0 1 0 1 1 1 1 0 1 0 0 1 10 " 0 1 0 1 001 * 01 1 0 0 0 1 0 1U1 10 1 "0110011 * 01 1 0 1 01 "0111001 "1000111 "1001011 "1001101 "1010011 iU 1 U 1U1 "1100011 " 1 1 0 0 1 01 * 1 1 01 0 0 1 "1110001 0110111 "0111011 . -í * 01 1 1 1 0 1 * 10 0 1 1 11 "1010111 • * 1000011 '•'•• - • ; * 1 0 0 0 1 01 * 1 o o 1o n i " 1 01 0 0 0 1 * 1 100001 * 0001 1 11 "0010111 "0011011 " 001 o í 01 [si * 0 0 1 1 1 01 * oo 1 o 1 1 o IB * n n 1 1 1 1 n m¿ wi A] " 1 0 1 1 1 1 1 JH " 1 1 0 1 1 1 1 "1110111 J: " 1 1 1 1 0 1 1 "1111101 "1111111 * 1o 1 1n 1 i "1011101 "1100111 1 1 v I U I 1 jAé „ - * "1101101 • • "1110011 * 1 11 01 01 v v. ; ;,, "1111001 n-?M Fig. 3.71: Cubos O má "3$ 130 Desde la figura 3.72 hasta la figura 3.74 se indican los cubos unos. CUBOS1 CUBOS 1 00000X1 0000X01 000X001 00X0001 0X00001 X000001 000001X X00001 0 X000101 00010X1 00X1 001 0X01 001 X001 001 001 00X1 001 0X01 001 X001 0000X1 1 000X01 1 00X001 1 X00001 1 00001X1 00X0101 0X00101 CUBOS 1 X01 001 1 T| 0 0 1 0 1 X 1 001X101 000X1 1 1 00X01 1 1 0X001 1 1 001X110 f\v i f\ i UX 1 Ü U 0 1 V A Uf\ U1 1U X01 0001 01 00X01 01 0X001 01 X0001 XI 00001 0001 XI 00X1 01 0X01 01 X001 01 001 0X1 *| 10000x1 W\J1000X01 Al CUBOS 1 Al 100x001 TI 10X0001 1X00001 1 00001 X jy 001x01 1 T| 0X1 001 1 XI 01 01 01 XI 0X1 0 1 0 1 X01 01 01 001 01 IX 001 1 0X1 001 1 X 0 1 0X1 1 001 1 1 1 1 1 1 1 1 Al 0 1 0 1 X 0 1 3¡ 0 1 X 1 0 0 1 1 000X1 1 1 00X0 1 1 1 0X001 1 1 X0001 1 01001X1 01 0X1 01 01 X01 01 XI 001 01 *| 0 1 0 0 1 1 X 5] 0 1 0 1 0X1 01 001 1 00X1 1 0X01 1 X001 1 0001 1 0001 XI 1 00X1 01 1 0X01 01 Jl 1 X001 01 'W 1 001 0X1 Fig. 3.72: Cubos 1 CUBOS 1 CUBOS 1 i 001 x o i Al 0 0 1 1 x 1 1 JQ o x i 1 0 1 1 1x01001 1 01 0 0 X 1 1 01 0X01 1 XI 0 0 0 1 1 1000X1 1 100X01 1 1 0X001 1 1X0001 00X1 1 1 1 0X01 1 1 1 X001 1 11 001X111 0X10111 X 0 1 01 1 1 X 0 1 1 01 1 001 1 1X1 0X1 1 1 01 X 0 1 1 1 01 001 1 1 1 X 01 0X1 11 01 X 0 1 1 1 X I 0 0 1 11 0101X11 01X1011 XI 01 01 1 01011X1 fr) 01X1101 ™ X 1 0 1 10 1 CUBOS 1 0110X11 01 1 X 0 1 1 XI 1 001 1 01101X1 011X101 XI 1 01 01 0 1 1 1 0X1 01 1 1 X01 XI 11 0 0 1 1 00X1 1 1 1 0X01 1 1 1 X001 1 1 1001X11 1 0X1 01 1 1 1 1 X 0 1 01 1 ™ 10011X1 Al ¥1 CUBOS 1 Al Tj 1 X 0 1 1 01 1 01 0X1 1 101X011 1X10011 10101X1 101X101 1X10101 1 1 00X1 1 1 1 0X011 1 1 X001 1 11001X1 1 1 0 X 1 01 1 1 X 0 1 01 jlj 1 1 0 1 o x i W\ o1x1i 0110x10 1 Fig. 3.73: Cubos 1 CUBOS 1 Si 1 1 1 00X1 1 1 1 0X01 1 1 1X001 X01 1 1 1 1 XI 01 1 1 1 XI 1 01 11 X1 1 1 0 1 1 XI 1 1 1 01 1 0X1 1 1 1 1 X01 1 1 1 101X111 1X10111 jrj 1 0 1 1 X 1 1 AjW\1 1 X 1 1 0 1 1 131 CUBOS 1 lonixi 1X11101 1 1 0X1 1 1 1 1X01 1 1 1101X11 11X1011 11011X1 11X1101 1 1 1 0X1 1 111X011 11101X1 111X101 1 1 1 1 0X1 1 1 11X01 1x11111 CUBOS 1 Al 11X1111 j] 1 1 1 X 1 1 1 1111X11 11111X1 •1 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 OOOOXX1 000X0X1 00X00X1 XOOOOX1 00X0X01 0X00X01 XOOOX01 OOXX001 0X0X001 XOOX001 OXX0001 XOX0001 XX00001 X00001 X 00X0X11 XOOOX11 OOXX01 1 XOOX01 1 XOX0011 0 0 X 0 1 X1 0 X 0 0 1 XI X 0 0 0 1 XI O X X 0 1 01 X O X 0 1 01 XX001 01 00X1 0X1 0X01 0X1 X 0 0 1 0X1 OOOXX1 1 n y 11vn\Jn 11 U y /\S ffl XX01001 Al 10 CUBOS 2 ooioxxi Al Al 0 X 0 1 X I 1 T| X 0 0 1 X 1 1 O X X 1 01 1 X01 00X1 X O X 1 01 1 001 XX01 X X 0 1 01 1 0X1 0X01 001 XX1 1 X01 0X01 0X1 0X1 1 0X1 X001 X01 0X1 1 XX1 0001 0X1 X01 1 01 O X X 0 1 OOXX1 1 1 X01 X01 1 01 X O X 0 1 0X0X1 1 1 X X I 00 1 1 XI 0 0 X 0 1 XOOX1 1 1 001X1X1 01 X X O Q 1 OXX01 1 1 0 X 1 01 XI XI 0 X 0 0 1 X 0 1 01 XI XOX01 1 1 n y i y i ni yU n\Jn1 1 •1 y •y 1 .A. U )XV 1 .A. 1 \J 1 />. 1 1 /*^yo v vn U o 1 i ^tl ^H A. 1 1 i i .^tl • 1 0 0 0 X X 1 Tj X " 0 0 x 1 xi i T] 0 1 X I 0 1 001X0X1 100X0X1 T\1 10 00 X X 01 0 X 1 1X000X1 1 OOXX01 1 0X0X01 1X00X01 1X0X001 1XX0001 Fig. 3.75: Cubos 2 133 CU8OS8 OOXOXX1 XOOOXX1 OOXXOX1 XOOXOX1 XOXOOX1 OXXOX01 XOXOX01 XXOOX01 OXXX001 XXOX001 XXX0001 OOXXX1 1 XOOXX1 1 XOXOX1 1 CUBOS3 r oxxoixi 'M x i x x o o i XOX01X1 XX001X1 XXX0101 OXX1 0X1 XX010X1 001 XXX1 0X1 O X X 1 X01 OXX1 0X1X0X1 H. X X I 00X1 [jg xoxxoi 1 \m xioxxoi X1XOX01 XOXX1 11 XXOX1 11 XXX01 11 X O X 1 XI 1 X X 0 1 XI 1 a| x x x i o n 1H< x o i x x n Fig. 3.78: Cubos 3 CUBOS3 1XXOX11 1XXX01 1 1 OXX1XI 1XOX1X1 1XX01XI 1XXX101 1X01XX1 1X1OXX1 11OXXX1 11XOXX1 11XXOX1 11XXX01 M XX1 0X1 1 ül X X 1 X 0 1 1 10XOXX1 1XOOXX1 1X0X0X1 1XXOOX1 1XOXX01 1XXOX01 : 0X1 XX01 XX 1 0 X 0 1 01 X X X 0 1 i ooxxxi 1X1XX11 1X1XIX1 1 1XXX1 1 11XXIXI 1 1X1XXI 1 1 1XXXI 1XXX111 1XX1XI1 1XX11X1 Fig. 3.79: Cubos 3 mt m X01X1X1 XX1 0 1 X 1 X X 1 XI 01 XI 0 X 1 X 1 X1 X 0 1 X1 X 1 X X 1 01 X I 01 X X I X1X1 0X1 X1 X I X 0 1 XI 1 O X X 1 X1 1 X 0 X 1 XI 1 X X 0 1 1 OXXX1 1 1XOXX1 1 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 001XI1X OOXXOX1 XOOXOX1 OXXX001 XXOX001 OXX10X1 XX010X1 001XXX1 0X1X0X1 0X1XX01 XXOX111 XX01X11 XXXI011 XXIX011 XX1X101 XI0X1X1 X101XX1 XIXI0X1 X11X0X1 XOXOXX1 XXXOX01 XOXXX11 XXX01X1 XX1OXX1 X1XXX01 1XOXXX1 1XXOXX1 1XXXX11 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 /4. ; s fL \ 5 7 9 15 17 19 • — - _ -, 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 0 X 1 X X 0 1 , X X 0 1 X 1 1 X XX 1 0 1 1 X X 1 X0 1 1 * * » T T T r Fig. 3.82: Tabla de Simplificación TABLA DE SIMPLIFICACIÓN 21 22 23 f\ t \ 25 27 29 30 31 ¿ )•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 0 X 1 XX0 1 X X0 1 X 1 1 X XX 1 0 1 1 X X 1 X0 1 1 T * * Fig. 3.83: Tabla de Simplificación 37 «w 136 " 3 39 41 (• -, \ J c\ ) ¡ 1. 43 47 i 5 1 53 55 ! ! « * 0 0 X X 0 X 1 49 , < i t t 0 X X X 0 0 1 X X Q X 0 0 1 (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 X X X 1 0 1 1 ' 1 1 X X 1 X 0 1 1 • j ii i ! i 1 "V Fig. 3.84: Tabla de Simplificación TABLA DE SIMPLIFICACIÓN 57 59 61 * 65 6 6 /•\f t\ht 69 71 1 75 * 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 0 X 1 X X 0 1 i 1 • • X U X 1 1 1 i V m * X X 0 1 X 1 1 X XX 1 0 1 1 V X X 1 X 0 1 1 •4» Fig. 3.85: Tabla de Simplificación 137 TABLA DE SIMPLIFICACIÓN 79 91 81 83 e 5 87 77 93 95 97 -" * a í 0 0 X X 0 X 1 ; 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 1 X X 0 1 X 1 1 X X X 1 0 1 1 1 T f X X 1 X 0 1 1 m mm * WÉf Fig. 3.86: Tabla de Simplificación 99 Vr * 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 • •' • - fV* má Fig. 3.87: Tabla de Simplificación 138 119 12 1 12 3 12 5 127 i * i j ..1 , 0 0 X X 0 X 1 u u x u & i i 0 X X X 0 0 1 X X 0 X 0 0 1 i 1 _] i h"" X X 0 1 0 X 1 U 1 ; i f ~1 X A X 1 \ 0 X 1 X 0 X 1 0 X 1 X X 0 1 A U Ji. 1 1 1 s X X0 1 X 1 1 X X X 1 0 1 1 X X 1 X0 1 1 ! Fig. 3.88: Tabla de Simplificación i 1 3L 2 I 7 • * cí 11 15 17 19 X 0 1 X 1 X1 X X 1 X 1 0 1 X 1 0 X 1 X 1 X X X X 1 1 1 0 0 X 1 X 1 1 X 0 X 0 0 X X X X X 1 1 1 1 \„ X X X X 1 1 . • f \ * 0 X X 1 X X X X 1 X 0 X X 0 O X X 0 X 1 X X X X 1 1 X 1 X 1 0 1X 1 X 1 -' * f ilf \ f \ .** ;*••- 'f - ^ -- -. .4. w « — —— — —( «_ — „;_ ,_ — 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 22 21 X X X X X X X 0 X 1 1 1 1 0 1 1 0 0 X 1 X X X X 1 1 X 0 1 1 1 X 0 0 X X 0 X X X X X 25 23 27 29 30 1 1 1 1 1 1 1 31 • 33 37 • / •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 X X X X 1 1 1 0 0 X 1 X 1 1 X 0 X 0 0 X X X X X • Jr 1 1 1 1 •t i /¡ •, v¡ > /1 1. > * X 0 X X X 1 1 X X X 0 1 X 1 1 i X X U - - i „ 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 59 61 65 66 67 69 1 57 X 0 1 X 1 X 1 7í 73 75 • •T- ' 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 1 X 1 1 X 0 X i ' • • X 0 X 0 X X 1 / •> 1) * / „.,, <! & 1- - X 0 X X X 11 X X X 0 1 X 1 1 A A A U 1- • 1 X 0 X X X 1 1 X X X X 1 1 \1— 1 X X X 1 X 1- 1 ' J! J[ ^ 1 X X 0 X X 1 T * - . — •P» Fig. 3.92: Tabla de Simplificación TABLA DE SIMPLIFICACIÓN 79 a 1 83 85 87 91 77 1 X 0 1 X í X 1 X X 1 X 1 0 1 X 1 0 X 1 X 1 93 ir i 95 iF 97 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 !7i V. t * _ _ _ _ _ . _ • T- X 0 X X X 1 1 X X X 0 1 X 1 V • T f\ 'i . . f— X 1 A X A U 1 •• 1 X0 X X X 1 T 1 X X 0 X X 1 _.. <s ) ^ 1k _ 1" " i• - '¿. • 1 X X X X 1 1 1 X X X 1 X1 . ¿ *-_- 1 !*—~ * ,, ¥ —^ —, Fig. 3.93: Tabla de Simplificación •* •—^r_. ^^ h —^ •v» 141 TABLA DE SfM PI.1 FICACION 10 3 1C 99 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 X 1 0 1 X X 1 1 X 1 X1 0 X1 X i 1 X0 X1 • 1 1 X 0 X 0 X X 1 f s > f \>^ * v i r* *r ir *r \ / , \& 4 OA2 X 1 1 X XX0 1 X 1 X 1 U A A 1— ') • 1 X 0 X X X 1 1 1 1 X X 0 X X 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 11 9 12 1 12 3 12 5 i• X X X X X X X * 0 X 1 1 1 1 0 1 1 0 0 X 1 X X X X 1 1 X 0 1 1 1 X 0 0 X X 0 X X X X X 1 1 1 1 1 1 1 ' ' 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 'fl 1 X 0 X X X 1 1 X X 0 X X 1 1 X X X X 1 1 £ • Fig. 3.95: Tabla de Simplificación .. .. 12 7 142 TABLA DE SIMPLIFICACIÓN 1 5 7 2 3 9 11 | 1 1 21 • | t 1 22 15 19 17 | T 1 23 ^W 25 1 1 27 30 31 33 49 1 1 51 53 55 | 1 29 37 TABLA DE SIMPLIFICACIÓN 38 39 1 1 41 , ! 43 I 1 1 45 1 47 1 í A i iro •P TABLA DE SIMPLIFICACIÓN 57 • i 59 1 61 65 I i 66 67 | 1 1 I 69 71 73 J 1 1 75 • i 93 95 97 1 • TABLA DE SIMPLIFICACIÓN 77 79 81 83 85 87 1 91 ! ^E9r TABLA DE SIMPLIFICACIÓN 99 • 1 1 X X X X 1- 101 103 A T T 105 107 109 i \í\ T i 111 113 115 117 lí. r í TABLA DE SIMPLIFICACIÓN 119 1 1 X X X X 1- 121 123 T (ti 'T 125 127 , ; jfSr Fig. 3.96: Tabla de Simplificación En la figura 3.97 se presenta los implicantes primos esenciales y secundarios SECUNDARIOS X00001X 001X1IX 01 0 0 1 I X XXXOX01.Í X1XXX01 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 QuineMcCIuskey 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 12TextWidth(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 12TextWidth(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 O O 1 O 1 O 1 1 O A+B+C = Mo A+B+C1 -M1 A+B'+C =M2 A+B'+C =M3 A+B+C =M4 A'+B+C1 =M5 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 0 0 0 0 0 0 0 1 i Un U 1, 0 0 F 1 __ 0 0 0 1 1 0 0 0 1 1 0 0 101 111 010 I O D O I 0 0 1 ó 0 ^ 1 0 1 1 o í 1 0 0 0 í 1 Jl 1 1 0 * • * * A• *1 1 I TF w • 1' 1: i -frf> ¡..-i í 0 1 1 A mu l-.-j , —. i'l'i — IT' III U ; ' m »: ' mío! •W"W»««»«"f~i««»»ni»««ífflp- ?B'Í ^""41 0 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 mO m2 m3 m6 m7 0000 0010 0011 0110 0111 mB m9 mío m!3 1000 1001 1010 1101 F 1 1 1 1 1 1 1 1 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 0 mO 0000 1 ni 2 m8 0010 1000 0011 0110 1001 1010 2 3 m3 m6 m9 mlO m7 m!3 A B <: D 0111 1101 ¥ 1 1 1 1 1 1 1 1 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 /. mintérmino Min término Resultante A B C D mO 0000 m2 m8 0010 1 000 m3 m6 m9 rn 10 001 1 0110 1 00 1 1010 m7 m 13 0111 1101 mO, m2 00X0 mO, m8 xooo ooox m2, m2, m2, m8, m8, m3 m6 m10 m9 m10 m3, m7 m6, m7 m9, m13 CUBOS 2 Los CUBOS 2 se forman de la siguiente manera: 0X1 O X01 O 1 OOX 1 0X0 0X1 1 01 1 X 1 X01 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 mO, m8 000 m2, m3 m2, m6 m2, m10 m8, m9 m8, m10 •^ CUBOS 2 "5(0,2,8,10) X O X O ^^^^ ooox ~^^ ( 2, 3, 6, 7 ) 0X10 X01 0 1OOX 1 0X0 0 X 1X t."í // í í' m3, m7 m6, m7 m9, m13 0X1 1 01 1 X 1 X01 w / / ^ Como se puede ver existen dos CUBOS 1 100X y 1X01 que no se combinaron para formar CUBOS 2 por esta razón estas combinaciones formarán parte de los implicantes primos. 236 IMPLICANTES PRIMOS Los implicantes primos se forman con todos los cubos que no se agruparon con ningún otro cubo para formar un cubo de mayor grado. Por ejemplo: Los implicantes primos son los ClIBOS 1 100X y 1X01, mientras que, como no se han agrupado los CUBOS 2 para formar CUBOS 3 también todos los CUBOS 2 formarán parte de los implicantes primos. En el gráfico se indican todos los implicantes primos. IMPLICANTES PRIMOS (8,9) (9,13) (0,2,810) (2,3,6,7) 100X 1X01 XOXO 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 1 OOX 1 XO 1 xoxo 0X1 X 8 9 * * 1O 13 * * * * * * * * * * Basándose en esta tabla se calcula los implicantes primos esenciales de la siguiente manera: • Buscamos la columna que tenga una sola marca. • El implicante primo que contiene esta marca es ya un implicante primo esencial. • Se anulan todas las columnas que contienen marca en la fila correspondiente de la marca encontrada en el primer paso. • Se repite este proceso hasta que ya no existan columnas con una sola marca es decir hasta que ya no existan mas implicantes primos esenciales. 238 o 8 1O 13 1 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 •>,' V ^J %• 2j 3 nr 00X0 tX0101 1010X- ^ 10X11101X1 0X0X1 X10X1 XX01X- •u 1 | 3 | í 5 | f "" "-j— 9 -—- | | ! ¡ jf —^?>~ ~<5^~ — i,/ •v/ i, 10 I r) r *• ii ! l í j e J "V 11 í 18 | j — f— • "~H 20 21 ?3 25 26 27 19 í í i ! e ^j^fV í> í —±— ~f— -f- ~t" j j 1 j í í i j ) T __ái ~^— -4-~ f ' "'fí ' % \L ES ENCIALES XX0 1 X i -<r í i j ¡ i t • í ^1 * i i f "i V i í I ! i t $• — / 1 i t l< ~4 i 1: SECUNDARIOS .¿ /-í 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 ingresar las salidas que corresponde a cada combinación. permitiendo 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.