долго же я сней страдал. и оно родилося!!!!!!!!
эта прога делает склеивание и строит табличку для минимизации СДНФ.
исходнве днные в массиве CDNF.
первый элемент в строке=0. далее- по порядку от Х1 до Х5. 0- не икс, 1- просто икс.
все выводит в html
==============жрите===================
#include <stdio.h>
//work datas
//fulling in process minimizating
//CDNF[0]- ne schitaetsa
int CDNF[100][6]={
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,1,0},
{0,0,0,0,1,1},
{0,0,0,1,0,0},
{0,0,0,1,0,1},
{0,0,1,0,0,0},
{0,0,1,0,0,1},
{0,0,1,0,1,0},
{0,0,1,0,1,1},
{0,0,1,1,0,1},
{0,0,1,1,1,0},
{0,1,0,0,0,0},
{0,1,0,0,0,1},
{0,1,0,0,1,0},
{0,1,0,0,1,1},
{0,1,0,1,1,1},
{7,7,7,7,7,7}
}; //vmesto sub5
//int sub* [32][8];
//contain history
//schet ot 1, a ne ot 0
int sub4[32][8];
int sub3[32][8];
int sub2[32][8];
int sub1[32][8];
//potom dobavit 2 elementa (kotorie kleili)
//i sapisivat chto kleili, chtobi poluchit etot subterm
int numb_sub5=1;//kolichestvo elementov v sub*
int numb_sub4=1;
int numb_sub3=1;
int numb_sub2=1;
int numb_sub1=1;
int *min_CDNF[32]; //trebuet proverki na sovpadenie
//eto prosto sostavlennie sub*
//min_CDNF[?][0]-poryadok subterma
int numb_min_CDNF; //kolichestvo elementov v min_CDNF
int first_tup[100][6]={{0}};//posle proverki na sovpadenie
int numb_tup=0;
int tup[100][6]={{0}}; //posle tablitsi
int main()
{
FILE *id;
int a=0; //stroka
int b=0; //stolbets
int i=0; //perebor X*
int nesovp=0; //number of non-ecual X*. if >1 =>will not minimize
//if ==1 => will minimize
//nesovp cann't be 0
int sovp=0;
int number_nesovp=0;
int vhozden=0;//eto dlya tablitsi
int color=0; //1-red, 0-white
int skleilsa=0; //skolko raz element iz stroki skleilsa
//(interesuet 0)
id=fopen("min.html", "w");
//================printing CDNF==============
fprintf(id,"F(X<sub>1</sub>X<sub>2</sub>X<sub>3</sub>X<sub>4</sub>X<sub>5</sub>)=");
for(a=1; CDNF[a][0]!=7; a++)
{
for(i=1; i<=5; i++)
{
if(CDNF[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(CDNF[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
//fprintf(id," <%d>",a);
fprintf(id,"<b>V</b>");
}
fprintf(id,"<br><br>rn");
fprintf(id,"===CDNF===<br>rn");
for(a=1; CDNF[a][0]!=7; a++)
{
fprintf(id,"<b><%d></b> ",a);
for(i=1; i<=5; i++)
{
if(CDNF[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(CDNF[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id,"<br>");
}
fprintf(id,"<br><br>rn");
//================================================
///////////////////////////////////////////////////
//STAGE 1. MINIMIZE AND SEARCH OST OF SUBTERM 5
///////////////////////////////////////////////////
for(a=1; CDNF[a][0]!=7; a++)//stroka
{
for(b=(a+1); CDNF[b][0]!=7; b++)//stolbets
{
for(i=1; i<=5; i++)//proverka na vozmoznost skleivania
{
if(CDNF[a][i]!=CDNF[b][i])
{
nesovp++;
number_nesovp=i;
}
}
if(nesovp==1)// kolichestvo nesovpad==1 (skleivanie vozmozno)
{
for(i=1; i<=5; i++)//skleivanie and zapis to "work datas"
{
if(i==number_nesovp)
{sub4[numb_sub4][i]=7;}
else
{sub4[numb_sub4][i]=CDNF[a][i];}
}
sub4[numb_sub4][6]=a;
sub4[numb_sub4][7]=b;
numb_sub4++;
skleilsa++;
}; //if----->skleivanie
nesovp=0;
number_nesovp=0;
}//for b
if(skleilsa==0)//zapis v ostatok (ne skleivshiisa sub5(=CDNF))
{
CDNF[a][0]=5;//poradok subterma (chtobi uznat ego, kogda vse subtermi vmeste)
min_CDNF[numb_min_CDNF]=CDNF[a];//zapis v *min_CDNF
numb_min_CDNF++;
}
skleilsa=0;
}//for a
sub4[numb_sub4][0]=7;
//================printigg subterm4==============
fprintf(id,"===sub4===<br>rn");
for(a=1; sub4[a][0]!=7; a++)
{
//fprintf(id,"<%d> ",a);
fprintf(id,"<b><%d-%d></b> ",sub4[a][6],sub4[a][7]);
for(i=1; i<=5; i++)
{
if(CDNF[(sub4[a][6])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(CDNF[(sub4[a][6])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>V</b>");
for(i=1; i<=5; i++)
{
if(CDNF[(sub4[a][7])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(CDNF[(sub4[a][7])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>=</b>");
for(i=1; i<=5; i++)
{
if(sub4[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub4[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
//fprintf(id,"<%d-%d>",sub4[a][6],sub4[a][7]);
fprintf(id,"<b><%d></b>",a);
fprintf(id,"<br>");
}
fprintf(id,"<br><br>rn");
//================================================
///////////////////////////////////////////////////
//STAGE 2. MINIMIZE AND SEARCH OST OF SUBTERM 4
///////////////////////////////////////////////////
for(a=1; sub4[a][0]!=7; a++)//stroka
{
for(b=(a+1); sub4[b][0]!=7; b++)//stolbets
{
for(i=1; i<=5; i++)//proverka na vozmoznost skleivania
{
if(sub4[a][i]!=sub4[b][i])
{
nesovp++;
number_nesovp=i;
}
}
if(nesovp==1)// kolichestvo nesovpad==1 (skleivanie vozmozno)
{
for(i=1; i<=5; i++)//skleivanie and zapis to "work datas"
{
if(i==number_nesovp)
{sub3[numb_sub3][i]=7;}
else
{sub3[numb_sub3][i]=sub4[a][i];}
}
sub3[numb_sub3][6]=a;
sub3[numb_sub3][7]=b;
numb_sub3++;
skleilsa++;
}; //if----->skleivanie
nesovp=0;
number_nesovp=0;
}//for b
if(skleilsa==0)//zapis v ostatok (ne skleivshiisa sub4)
{
sub4[a][0]=4;//poradok subterma (chtobi uznat ego, kogda vse subtermi vmeste)
min_CDNF[numb_min_CDNF]=sub4[a];//zapis v *min_CDNF
numb_min_CDNF++;
}
skleilsa=0;
}//for a
sub3[numb_sub3][0]=7;
//================printigg subterm3==============
fprintf(id,"===sub3===<br>rn");
for(a=1; sub3[a][0]!=7; a++)
{
fprintf(id,"<b><%d-%d></b> ",sub3[a][6],sub3[a][7]);
for(i=1; i<=5; i++)
{
if(sub4[(sub3[a][6])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub4[(sub3[a][6])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>V</b>");
for(i=1; i<=5; i++)
{
if(sub4[(sub3[a][7])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub4[(sub3[a][7])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>=</b>");
for(i=1; i<=5; i++)
{
if(sub3[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub3[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
//fprintf(id,"<%d-%d>",sub3[a][6],sub3[a][7]);
fprintf(id,"<b><%d></b>",a);
fprintf(id,"<br>");
}
fprintf(id,"<br><br>rn");
//================================================
///////////////////////////////////////////////////
//STAGE 3. MINIMIZE AND SEARCH OST OF SUBTERM 3
///////////////////////////////////////////////////
for(a=1; sub3[a][0]!=7; a++)//stroka
{
for(b=(a+1); sub3[b][0]!=7; b++)//stolbets
{
for(i=1; i<=5; i++)//proverka na vozmoznost skleivania
{
if(sub3[a][i]!=sub3[b][i])
{
nesovp++;
number_nesovp=i;
}
}
if(nesovp==1)// kolichestvo nesovpad==1 (skleivanie vozmozno)
{
for(i=1; i<=5; i++)//skleivanie and zapis to "work datas"
{
if(i==number_nesovp)
{sub2[numb_sub2][i]=7;}
else
{sub2[numb_sub2][i]=sub3[a][i];}
}
sub2[numb_sub2][6]=a;
sub2[numb_sub2][7]=b;
numb_sub2++;
skleilsa++;
}; //if----->skleivanie
nesovp=0;
number_nesovp=0;
}//for b
if(skleilsa==0)//zapis v ostatok (ne skleivshiisa sub3)
{
sub3[a][0]=3;//poradok subterma (chtobi uznat ego, kogda vse subtermi vmeste)
min_CDNF[numb_min_CDNF]=sub3[a];//zapis v *min_CDNF
numb_min_CDNF++;
}
skleilsa=0;
}//for a
sub2[numb_sub2][0]=7;
//================printigg subterm2==============
fprintf(id,"===sub2===<br>rn");
for(a=1; sub2[a][0]!=7; a++)
{
fprintf(id,"<b><%d-%d></b> ",sub2[a][6],sub2[a][7]);
for(i=1; i<=5; i++)
{
if(sub3[(sub2[a][6])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub3[(sub2[a][6])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>V</b>");
for(i=1; i<=5; i++)
{
if(sub3[(sub2[a][7])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub3[(sub2[a][7])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>=</b>");
for(i=1; i<=5; i++)
{
if(sub2[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub2[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
//fprintf(id,"<%d-%d>",sub2[a][6],sub2[a][7]);
fprintf(id,"<b><%d></b>",a);
fprintf(id,"<br>");
}
fprintf(id,"<br><br>rn");
//================================================
///////////////////////////////////////////////////
//STAGE 4. MINIMIZE AND SEARCH OST OF SUBTERM 2
///////////////////////////////////////////////////
for(a=1; sub2[a][0]!=7; a++)//stroka
{
for(b=(a+1); sub2[b][0]!=7; b++)//stolbets
{
for(i=1; i<=5; i++)//proverka na vozmoznost skleivania
{
if(sub2[a][i]!=sub2[b][i])
{
nesovp++;
number_nesovp=i;
}
}
if(nesovp==1)// kolichestvo nesovpad==1 (skleivanie vozmozno)
{
for(i=1; i<=5; i++)//skleivanie and zapis to "work datas"
{
if(i==number_nesovp)
{sub1[numb_sub1][i]=7;}
else
{sub1[numb_sub1][i]=sub2[a][i];}
}
sub1[numb_sub1][6]=a;
sub1[numb_sub1][7]=b;
numb_sub1++;
skleilsa++;
}; //if----->skleivanie
nesovp=0;
number_nesovp=0;
}//for b
if(skleilsa==0)//zapis v ostatok (ne skleivshiisa sub2)
{
sub2[a][0]=2;//poradok subterma (chtobi uznat ego, kogda vse subtermi vmeste)
min_CDNF[numb_min_CDNF]=sub2[a];//zapis v *min_CDNF
numb_min_CDNF++;
}
skleilsa=0;
}//for a
sub1[numb_sub1][0]=7;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!______V_DOBAVOK_____!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!
for(a=1; sub1[a][0]!=7; a++)//ostatok_sub1= sub1, zapis v min_CDNF
{
sub1[a][0]=1;//poradok subterma (chtobi uznat ego, kogda vse subtermi vmeste)
min_CDNF[numb_min_CDNF]=sub1[a];//zapis v *min_CDNF
numb_min_CDNF++;
}
min_CDNF[numb_min_CDNF]=sub1[numb_sub1];
//min_CDNF gotovo
//================printigg subterm1==============
fprintf(id,"===sub1===<br>rn");
for(a=1; sub1[a][0]!=7; a++)
{
fprintf(id,"<b><%d-%d></b> ",sub1[a][6],sub1[a][7]);
for(i=1; i<=5; i++)
{
if(sub2[(sub1[a][6])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub2[(sub1[a][6])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>V</b>");
for(i=1; i<=5; i++)
{
if(sub2[(sub1[a][7])][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub2[(sub1[a][7])][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>=</b>");
for(i=1; i<=5; i++)
{
if(sub1[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(sub1[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
//fprintf(id,"<%d-%d>",sub1[a][6],sub1[a][7]);
fprintf(id,"<b><%d></b>",a);
fprintf(id,"<br>");
}
fprintf(id,"<br><br>rn");
//================================================
//teper nado udalit sovpadenia iz min_CDNF i sapisat gotovoe v first_tup[][]
for(i=0; i<=5; i++)
{
first_tup[1][i]=min_CDNF[1][i];
first_tup[2][0]=7;
fprintf(id,"%d", first_tup[1][i]);
}
fprintf(id,"V");
for(numb_min_CDNF=2; min_CDNF[numb_min_CDNF][0]!=7; numb_min_CDNF++)
{
//avaliable datas
//a,b,i,nesovp,numb_tup
for(numb_tup=1; first_tup[numb_tup][0]!=7; numb_tup++)
{
sovp=0;
for(i=1; i<=5; i++)
{
if(min_CDNF[numb_min_CDNF][i]==first_tup[numb_tup][i])
{
sovp++;
/*
printf("<");
for(a=0; a<=5; a++)
printf("%d", first_tup[numb_tup][a]);
printf("-");
for(a=0; a<=5; a++)
printf("%d", min_CDNF[numb_min_CDNF][a]);
printf(">n");*/
}//if
}//for(i)
if(sovp==5)
break;
else sovp=0;
}//for (numb_tup)
if(sovp!=5)// vpisat na mesto zatichki subterm
{sovp=0;
for(i=0; i<=5; i++)
{
//copying
first_tup[(numb_tup)][i]=min_CDNF[numb_min_CDNF][i];
first_tup[(numb_tup+1)][0]=7;
fprintf(id,"%d", first_tup[numb_tup][i]);
}
fprintf(id,"V");
}//if(nesovp)
sovp=0;
}//for min_CDNF->tup
printf("n");
printf("====s povtoreniami====n");
for(a=1; min_CDNF[a][0]!=7; a++)
{
for(i=0;i<=5;i++)
printf("%d", min_CDNF[a][i]);
printf("n");
}
fprintf(id, "<br><br>");
fprintf(id,"F(X<sub>1</sub>X<sub>2</sub>X<sub>3</sub>X<sub>4</sub>X<sub>5</sub>)=");
for(a=0; first_tup[a][0]!=7; a++)
{
for(i=1; i<=5; i++)
{
if(first_tup[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(first_tup[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id, "<b>V</b>");
}
////////////////////////////////////////////////////////////////
// final stage
//teper tablitsa
////////////////////////////////////////////////////////////////
fclose(id);
fopen("table.html", "w");
//CDNF[][],first_tup[][],*min_CDNF[],numb_tup,numb_min_CDNF,vhozden, sovpad,i,a,b.
fprintf(id, "<table border="1">rn");
fprintf(id, "<tbody>rn");
fprintf(id, "<tr>rn");//pervaya stroka. soderzit CDNF
fprintf(id, "<td align=center></td>rn");
for(a=1; CDNF[a][0]!=7; a++)
{
fprintf(id, "<td align=center>rn");
for(i=1; i<=5; i++)
{
if(CDNF[a][i]==1)
fprintf(id, "X<sub>%d</sub><br>",i);
if(CDNF[a][i]==0)
fprintf(id, "-X<sub>%d</sub><br>",i);
}//for(i)
fprintf(id, "</td>rn");
}//for(a=1; CDNF[a][0]!=7; a++)
fprintf(id, "</tr>rn");//konets shapki tablitsi
/////////////////////////////////
//teper perebor na vhozdenie
/////////////////////////////////
for(b=1;CDNF[b][0]!=7;b++)//bez etogo ni hua ne pashet
CDNF[b][0]=0;
numb_tup=0;
tup[1][0]=7;
//chislo sovp==poradok subterma- vhodit.
//v CDNF pervi chislo v subterm pod takim nomerom 0- ne zanato, 1- uze est
//chislo vhozdeny ==0 (vse zanato), stroka krasnaya
//vhozdeny!=0 - zapisat v tup[][], pometit CDNF[][0] (1 or 0)
//first_tup --> tup
//posle etih proverok pisat stroku
for(a=1;first_tup[a][0]!=7;a++);
for(--a;a>=1;a--)
{
//snachala proverka
//opredelit tsvet stroki
for(b=1, sovp=0, color=1;CDNF[b][0]!=7;b++)//perebor ishodnih subtermov
{
for(i=1, sovp=0, vhozden=0;i<=5;i++)//sravnenie
{
if(CDNF[b][i]==first_tup[a][i])
{
sovp++;
}
}//for(i)
if(sovp==first_tup[a][0])
if(CDNF[b][0]==0)
{
vhozden++;
color=0;
CDNF[b][0]=1;
}
}//for(CDNF)
//
//
//konets proverki
//
//
//pechat stroki
if(color==1)
fprintf(id, "<tr bgcolor=#808080>rn");//stroka
if(color==0)
{
fprintf(id, "<tr>rn");
numb_tup++;
for(i=1;i<=5;i++)
{
tup[numb_tup][i]=first_tup[a][i];
}
tup[(numb_tup)][0]=0;
tup[(numb_tup)+1][0]=7;
}//if
fprintf(id,"<td>rn");//stolbets s subtermom
for(i=1; i<=5; i++)//pechat subterma
{
if(first_tup[a][i]==1)
fprintf(id, "X<sub>%d</sub>",i);
if(first_tup[a][i]==0)
fprintf(id, "-X<sub>%d</sub>",i);
}//for(i)
fprintf(id,"</td>rn");//konets pervogo stolbtsa
for(b=1, sovp=0;CDNF[b][0]!=7;b++)//perebor ishodnih subtermov
{
for(i=1, sovp=0;i<=5;i++)//sravnenie
{
if(CDNF[b][i]==first_tup[a][i])
{
sovp++;
}
}//for(i)
if(sovp==first_tup[a][0])
{
if(color==1)
fprintf(id,"<td>1</td>rn");
if(color==0)
{
fprintf(id,"<td>1</td>rn");
}
}
else
{
fprintf(id,"<td>.</td>rn");
}
}//for(CDNF)
fprintf(id,"</tr>rn");
}//for(first_tup)
//pod konets
fprintf(id, "</tbody>rn");
fprintf(id, "</table>rn");
//pechat tup[][]
fprintf(id,"F(X<sub>1</sub>X<sub>2</sub>X<sub>3</sub>X<sub>4</sub>X<sub>5</sub>)=");
for(a=1; tup[a][0]!=7;a++)
{
for(i=1; i<=5; i++)
{
if(tup[a][i]==1)
fprintf(id, "X<sub>%d</sub>", i);
if(tup[a][i]==0)
fprintf(id, "-X<sub>%d</sub>", i);
}
fprintf(id,"<b>V</b>");
}
fclose(id);
return 0;
}//main