Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web

Simplificador de ecuaciones
Principal Arriba Simplificador de ecuaciones FLIP FLOPS Passwords Estrategia Silabeador Pac Man Mapas de rutas Control de clima Fuzzyset TA-TE-TI Maquina expendedora

 

Arriba

Por:

JORGE LUIS OLIVERIO

joliveri@alu.itba.edu.ar

año 2000

Programa simplificador de expresiones logicas

 

#include <stdio.h>
#include <math.h>

#define CANTENT 4

void
main(void)
{
int g, a, b, c, i, cantterm = 0, ingvalid, termaux , cantentdif, entdif, ntermdif , ntermeq, acant2, bcant2, hayterm = 0;
char ingterm;
int ecuaux[4*16][CANTENT], entsdif[CANTENT], etent[CANTENT] = {'A','B','C','D'}, tnoinf[16][CANTENT], ecuacion[4*16][CANTENT+1];

/* Entrada de datos */

do
{
cantterm++;
printf("\n\nTermino %d\n\n", cantterm);
for(i = 0 ; i < CANTENT; i++)
{
printf("Ingrese el estado de la entrada %c (0/1):", etent[i]);
do
{
ingvalid = scanf("%d",&ecuacion[cantterm-1][i]);
if(ingvalid == 0)
{
getchar();
}
}while((ecuacion[cantterm-1][i] != 0 && ecuacion[cantterm-1][i] != 1) || ingvalid == 0);
}
printf("\nDesea ingresar otro termino (S/N):");
do
{
ingterm = getchar();
}while(ingterm != 'n' && ingterm != 's'&& ingterm != 'N' && ingterm != 'S' && cantterm < 16);
}while (ingterm != 'n');

/* Procesamiento */

for(g = CANTENT ; g ; g--)
{

/* Busco posibles entradas que sean irrelevantes para el termino */

termaux = 0;
for(a = 0; a < cantterm ; a++)
{
ntermdif = 1;
for(b = a+1 ; b < cantterm ; b++)
{
cantentdif = 0;
for(i = 0 ; i < CANTENT ; i++)
{
if(ecuacion[a][i] != ecuacion[b][i])
{
cantentdif++;
entdif = i;
}
}
if(cantentdif == 1)
{
for(i = 0 ; i < CANTENT ; i++)
ecuaux[termaux][i] = ecuacion[a][i];
ecuaux[termaux][entdif] = 2;
termaux++;
ntermdif = 0;
}
}
if(ntermdif)
{
for(i = 0 ; i < CANTENT ; i++)
ecuaux[termaux][i] = ecuacion[a][i];
termaux++;
}
}

/* Elimino terminos repetidos */

cantterm = 0;
for(a = 0; a < termaux ; a++)
{
ntermeq = 1;
for(b = a+1 ; b < termaux ; b++)
{
acant2 = 0;
bcant2 = 0;
cantentdif = 0;
for(i = 0 ; i < CANTENT ; i++)
{
if(ecuaux[a][i] != ecuaux[b][i])
{
entsdif[cantentdif] = i;
cantentdif++;
}
}
if(cantentdif == 0)
ntermeq = 0;
else
{
for(i = 0 ; i < cantentdif ; i++)
{
if (ecuaux[a][entsdif[i]] == 2)
acant2++;
if(ecuaux[b][entsdif[i]] == 2)
bcant2++;
}
if(acant2 == cantentdif || bcant2 == cantentdif)
{
for(i = 0 ; i < cantentdif ; i++)
ecuaux[a][entsdif[i]] = ecuaux[b][entsdif[i]] = 2;
ntermeq = 0;
}
}
}
if(ntermeq)
{
for(i = 0 ; i < CANTENT ; i++)
ecuacion[cantterm][i] = ecuaux[a][i];
cantterm++;
}
}
}

/* Elimino terminos que no agregan informacion */

for(a = 0; a < cantterm ; a++)
ecuacion[a][CANTENT] = 1;
termaux = 0;
for(a = 0; a < cantterm ; a++)
{
int ntnoinf = 1;
int ent2[CANTENT];
int cantent2 = 0;
int cenoinf = 0;
int ctnoinf = 0;

for(i = 0 ; i < CANTENT ; i++)
{
if(ecuacion[a][i] == 2)
{
ent2[cantent2] = i;
cantent2++;
}
}
for(b = 0 ; b < cantterm ; b++)
{
int i;
int ceig = 0;
for(i = 0 ; i < CANTENT ; i++)
{
if((ecuacion[a][i] == ecuacion[b][i] || ecuacion[a][i] == 2 || ecuacion[b][i] == 2) && a != b && ecuacion[b][CANTENT])
ceig++;
}
if(ceig == CANTENT)
{
for(i = 0 ; i < CANTENT ; i++)
tnoinf[ctnoinf][i] = ecuacion[b][i];
ctnoinf++;
}
}
for(b = 0 ; b < pow(2,cantent2) ; b++)
{
int i;
int ceig = 0;
for(i = 0 ; i < cantent2 ; i++)
ecuacion[a][ent2[i]] = (b >> i) % 2;
for(int c = 0 ; c < ctnoinf ; c++)
{
if (ceig != CANTENT)
ceig = 0;
for(i = 0 ; i < CANTENT ; i++)
if(ecuacion[a][i] == tnoinf[c][i] || ecuacion[a][i] == 2 || tnoinf[c][i] == 2)
if (ceig != CANTENT)
ceig++;
}
if(ceig == CANTENT)
cenoinf++;
}
for(i = 0 ; i < cantent2 ; i++)
ecuacion[a][ent2[i]] = 2;
if (cenoinf == pow(2,cantent2))
{
ntnoinf = 0;
ecuacion[a][CANTENT] = 0;
}
if(ntnoinf)
{
for(i = 0 ; i < CANTENT ; i++)
ecuaux[termaux][i] = ecuacion[a][i];
termaux++;
}
}

/* Salida */

for(i = 0 ; i < CANTENT ; i++)
if(ecuaux[0][i] != 2)
hayterm = 1;

if(hayterm)
{
printf("\n\nLa ecuacion simplificada del sistema es:\n\nSalida = ");
for(b = 0 ; b < termaux ; b++)
{
if(b)
printf("+ ");
for(i = 0 ; i < CANTENT ; i++)
switch(ecuaux[b][i])
{
case 0: printf("%c'",etent[i]);

break;
case 1: printf("%c ",etent[i]);
}
}
printf("\n\n'= negado\n\n");
}
else
printf("\nLa salida es \"1\" para cualquier entrada.\n\n");
}