Перейти к содержимому

Здравствуйте, гость ( Вход | Регистрация )



  • Авторизуйтесь для ответа в теме
курсовая по матлогу Сообщений в теме: 5

#1
Отправлено 27 Январь 2005 - 22:07

linix

    Абитуриент

  • Пользователи
  • Pip
  • 13 сообщений
  • Район:москоу сити
долго же я сней страдал. и оно родилося!!!!!!!!

эта прога делает склеивание и строит табличку для минимизации СДНФ.

исходнве днные в массиве 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

#2
Отправлено 27 Январь 2005 - 22:24

linix

    Абитуриент

  • Пользователи
  • Pip
  • 13 сообщений
  • Район:москоу сити
всего-навсего 14 кб текста, полностью ручками. где-то 650 строк кода. месяц работы. за это курсовая зачтена на пятак неглядя.

#3
Отправлено 28 Январь 2005 - 03:16

Oxpa

    Профессор

  • Пользователи
  • PipPipPipPip
  • 1 237 сообщений
  • Пол:НЛО
си сакс... а так вроде пашет... надо было на месяц пораньше)))) а то я своё ужо слепил...

#4
Отправлено 28 Январь 2005 - 22:35

linix

    Абитуриент

  • Пользователи
  • Pip
  • 13 сообщений
  • Район:москоу сити
не надо , си рулит. вот с++ эт ацтой. сложный, а толку мало.

#5
Отправлено 29 Январь 2005 - 08:35

Oxpa

    Профессор

  • Пользователи
  • PipPipPipPip
  • 1 237 сообщений
  • Пол:НЛО
сдаётся мен что мы с тобой говорили у деканата МФИ вчера)))))))

#6
Отправлено 29 Январь 2005 - 09:32

linix

    Абитуриент

  • Пользователи
  • Pip
  • 13 сообщений
  • Район:москоу сити
неа... или ага...... а че мы там делали?




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных