//************************************************************************// // PRAC_NDF.C // // Sluzi pre standartne operacie s Boolovskymi diferenciami, prevody // // nasobicky atd. // // // // PS: Pocas toho ako som robil tuto DP (mimochodom druhu, raz som letel // // zo statnic) som sa rozisiel s priatelkou, dostal povolavaci rozkaz, // // zacal ako prvak na hutnickej a samozrejme vela inych o ktorych by som // // mohol napisat, preto ak lustis tieto zdrojaky pomysli na to a nenadavaj// // dakujem TRSEK 25.8.1997 // //************************************************************************// // Nieco v neporiadku napr. strcpy( vysl, "" ); dava do vysl="a" - hahaha // #include #include #include "mbooldif.h" #include "color.h" #include "glob.h" #include "okno.h" #include "key.h" #include "util.h" #include "video.h" #include "menu.h" #include "error.h" #include "glob.h" #include "funkcie.h" #define v_NDF h_fnc->pNDF[h_fnc->poc_NDF] #define s_NDF subst_NDF->pNDF[subst_NDF->poc_NDF] #define pSubst_NDF subst_NDF->pSubst[subst_NDF->poc_NDF] //************************************************************************// // Vyhrad miesto pre dalsie NDF // // i: premenna zapis_NDF o:chyba malo pamate 25.8.1997 // //************************************************************************// int dalsie_NDF (zapis_NDF *h_fnc, int velkost ) { int i; h_fnc->poc_NDF++; if ( h_fnc->poc_NDF > max_NDF ) return(12); if( velkost == 0 ) velkost = h_fnc->pv_NDF; // taaake velke bude pole v_NDF = (char *) farmalloc(velkost + 1 ); min_mem = min_mem + velkost + 8 ; pamet(); // ukaz ako si na tom z pametou if ( v_NDF == NULL ) return(11); for (i=0; iadept[ h_fnc->poc_NDF ] =0; // aj adept na vyhodenie ma nulu h_fnc->t_vodic[ h_fnc->poc_NDF ] =0; // vzhladom na ktory t (a,b,c) zistujem chybu h_fnc->t_chyba[ h_fnc->poc_NDF ] =0; // chyba je 0 alebo 1 return(0); } //************************************************************************// // Prevedie do vnutorneho zapisu s ktorym potom pracujem // // i:zapis_NDF o:chyba malo pamate 25.8.1997 // //************************************************************************// int vytvor_formu(zapis_NDF *h_fnc,char vstr[]) { int i=0,err=0; // prax ma naucila v BC si clovek nieje nicim isty takze zicher je zicher znuluj(h_fnc,1); // zisti pocet premennych for (i=0 ; i<=strlen(vstr) ; i++) { if ( je_znak( vstr[i], jclen ) == TRUE ) // pre male a..z if ( (vstr[i]-'a') >= h_fnc->pv_NDF ) h_fnc->pv_NDF=vstr[i]-'a'+1; if ( je_znak( vstr[i], nclen ) == TRUE ) // pre velke A..Z if ( (vstr[i]-224) >= h_fnc->pv_NDF ) h_fnc->pv_NDF=vstr[i]-224+1; } if ( strlen(vstr) == 0 ) return(0); // aj to sa stava !? // vyhrad miesto pre zapis prveho if ( (err=dalsie_NDF(h_fnc,0)) == 1) return(err); // rozsekaj do vnutorneho zapisu i=0; while (i < strlen(vstr)) { // neake nasobenie 0 ma za nasledok zrusenie clena if ( vstr[i] == vstup_0[0] ) h_fnc->adept[ h_fnc->poc_NDF ]=1; if ( je_znak( vstr[i], jclen ) == TRUE ) { // pre male a..z chyba kontrola na viacnasobny vyskyt jednoho prvku !!! if (( v_NDF[ vstr[i] - 'a' ] == nclen ) && (h_fnc->adept[ h_fnc->poc_NDF ] == 0 )) h_fnc->adept[ h_fnc->poc_NDF ] =1; else v_NDF [ vstr[i] - 'a' ] = jclen; } else { if ( je_znak( vstr[i], nclen ) == TRUE ) { // pre velke A..Z chyba kontrola na viacnasobny vyskyt jednoho prvku !!! if (( v_NDF[ vstr[i] - 224 ] == jclen ) && (h_fnc->adept[ h_fnc->poc_NDF ] == 0 )) h_fnc->adept[ h_fnc->poc_NDF ] =1; else v_NDF[ vstr[i] - 224 ] = nclen; } else if( je_znak( vstr[i], nic ) == FALSE )// vyhrad miesto pre zapis prveho if ( (err=dalsie_NDF(h_fnc,0)) == 1) return(err); } i++; } return(0); } //************************************************************************// // Vyhodi vsetky NDF, ktore su adeptami na vyhodenie // // 25.8.1997 // //************************************************************************// void von_adept(zapis_NDF *h_fnc) { int x,y; // devky // ak sa nachadza clen 0000000 teda nema ani jclen ani jeho negaciu // ale ak sa nachadza nic tak az take nic to nieje ( skus pre f=a ) for (x=1; x<=h_fnc->poc_NDF; x++) // spravit z neho adepta ??? if( ( h_fnc->adept[x] == 0 ) && ( h_fnc->pv_NDF > 0 ) ) { h_fnc->adept[x]=1; for (y=0; ypv_NDF; y++) if(( h_fnc->pNDF[x][y] == jclen ) || ( h_fnc->pNDF[x][y] == nclen )) h_fnc->adept[x]=0; } for (x=h_fnc->poc_NDF; x>=0; x--) if (h_fnc->adept[x] == 1) { strcpy( h_fnc->pNDF[x], v_NDF ); h_fnc->adept[x] = h_fnc->adept[ h_fnc->poc_NDF ]; h_fnc->adept[ h_fnc->poc_NDF ]=0; farfree (v_NDF); v_NDF=NULL; pamet(); h_fnc->poc_NDF--; } } //************************************************************************// // Zistuje vsetky pohltenia, ktore sa nachadzaju // // ak ich ma tak oznaci adept[i] na vyhodenie 25.8.1997 // //************************************************************************// void pohltenie(zapis_NDF *h_fnc) { int i,x,y,adp_i,adp_y; int n_clen_i,n_clen_y; // su iba n-cleny ?? for (i=1; i<=h_fnc->poc_NDF-1; i++) for (y=i+1; y<=h_fnc->poc_NDF; y++) { adp_i=0;adp_y=0; // ci nahodou nieje len zo ziadnych clenov vtedy pohlti akykolvek iny clen n_clen_i=1;n_clen_y=1; for (x=0; xpv_NDF; x++) { if ( h_fnc->pNDF[i][x] != nic ) n_clen_i=0; if ( h_fnc->pNDF[y][x] != nic ) n_clen_y=0; // zatial pohlcuje if (( h_fnc->pNDF[i] [x] == nic ) && ( h_fnc->pNDF[y] [x] != nic )) adp_y=adp_y | 1 ; if (( h_fnc->pNDF[y] [x] == nic ) && ( h_fnc->pNDF[i] [x] != nic )) adp_i=adp_i | 1 ; // toto uz nie ma rozdielne if ( (( h_fnc->pNDF[i] [x] == nclen ) && ( h_fnc->pNDF[y] [x] == jclen )) || (( h_fnc->pNDF[y] [x] == nclen ) && ( h_fnc->pNDF[i] [x] == jclen )) ) { adp_i=adp_i | 2 ; adp_y=adp_y | 2 ; } } // su navlas podobne if ((n_clen_i == 0) && ( adp_i == 0 ) && ( adp_y == 0 )) h_fnc->adept[i]=1; // je cas vyhodnotit if ((n_clen_i == 0) && ( adp_i == 1 ) && ( adp_y != 1 )) h_fnc->adept[i]=1; if ((n_clen_y == 0) && ( adp_y == 1 ) && ( adp_i != 1 )) h_fnc->adept[y]=1; } } //************************************************************************// // Filter pre dalsie spracovanie vyrazu // // 25.8.1997 // //************************************************************************// int filter( char vstr[] ) { int i=0,err=0; while( i < strlen( vstr ) ) if (vstr[i] == ' ') strdel(vstr,i); else i++; for (i=0; i0 ) && ( i < strlen( vstr ) )) { if ( vstr[i] == '(' ) lava++; if ( vstr[i] == ')' ) lava--; i++; } if ( i == strlen( vstr )) { strdel( vstr, 0 ); strdel( vstr, strlen(vstr)-1 ); } } nasobitel[0]='\0';nasobenec[0]='\0';vysl[0]='\0'; lava=0;b_nec=0; for (i=0; i<=strlen(vstr); i++) { if ( vstr[i] == '(') { lava++; // odteraz kopirujem do nasobitel if ( nasobitel[0] == '+') { strchar( vysl, '+' );strdel( nasobitel, 0 ); } if (( lava == 1 ) && ( strlen(nasobitel) > 0 )) b_nec=1; } if (( lava == 0 ) && ( b_nec == 1 ) && (( vstr[i] == '+' ) || ( i == strlen( vstr ) ))) { odstran_zatvorky( nasobitel, 1 ); // zavola rekurzivne, co ak nieco obsahuje ??? odstran_zatvorky( nasobenec, 1 ); // zavola rekurzivne, co ak nieco obsahuje ??? if (( vysl[ strlen( vysl )-1 ] == '+' ) && (( vstr[i] == '+' ) || ( vstr[i] == '\0' )) || (( strlen( nasobenec ) == 0 ) && ( strlen( nasobitel ) == 0 ) )) {// kedy nedavat zatvorky, alebo je to zbytocne !!! strcat( vysl, nasob_NDF( nasobitel, nasobenec, alge ) ); } else { strchar( vysl, '(' ); strcat( vysl, nasob_NDF( nasobitel, nasobenec, alge ) ); strchar( vysl, ')' ); } nasobitel[0]='\0';nasobenec[0]='\0'; b_nec=0; } // end if(lava==0 // je to OK daj do vysledku if ((( vstr[i] == '+' ) && ( lava == 0 ) && ( b_nec == 0 )) || ( i == strlen( vstr ))) { odstran_zatvorky( nasobitel, 1 ); // zavola rekurzivne for (ii=0; ii 1 ) { prem=0; for( y=0; y< strlen( pom ); y++ ) if(( pom[y] == 'a' + x ) || ( pom[y] == 224 + x )) { // vetvy od primarneho vstupu prem++; subst_NDF.t_chyba[ subst_NDF.poc_NDF ] = prem; subst_NDF.adept[ subst_NDF.poc_NDF ] = 'a' + x; index[0]='a' + x; index[1]='0' + subst_NDF.t_chyba[ subst_NDF.poc_NDF ]; // bude mat nazov ako nasledujuci dalsi pom[y] = 'a'+zac_subst -1; subst_NDF.pNDF[subst_NDF.poc_NDF ][0] = 'a' + x; // to co som substioval // az sa pokusis pouzit ret_f2 dobre si to rozmysli !!! strcpy( ret_f2, ret_f ); for( i=strlen(ret_f)+1; i>y+1; i-- ) ret_f[i]=ret_f[i-1]; ret_f[y+1]='0'+prem; // sprav NDF ret_do_NDF( pom, &pom_f, TmpSubor[0] ); // vsetky okrem mojej difer_podla( &pom_f, zac_subst-1, subst_NDF.pNDF[subst_NDF.poc_NDF ], &p_chyb, &p_pokusov, &a_rezim ); // spat ako bolo strcpy( ret_f, ret_f2 ); strcpy( pom, ret_f2 ); } } // poriadok v pamati znuluj( &pom_f, 1 ); a_rezim=0; if( medzi_v ) { // derivacie aj pre vnutorne vstupy ??? tlac_retazec(zx+1,zy+2,atributy[20]," Vykon vam deriv cie pre vn£torn‚ vodi‡e "); // teraz hladame pre vnutorne vodice strcpy( ret_f2, ret_f ); // obnovy tak ako bol vstup znuluj( &subst_NDF, 1 ); // poriadok robi kamaratov s pamatou while ( nahrad_vetvy( ret_f2, subst, &subst_NDF ) > 0 ) ; index[0]=' ';index[1]=' '; // znuluj index for( i = 1; i < subst_NDF.poc_NDF; i++ ) { // to co tu mam zhoduje sa z niecim ??? prem = kontr_subst( subst_NDF.pNDF[i], i+1, subst_NDF.poc_NDF ); // nasiel som vetviaci sa vodic !!! if( prem != 0 ) { // znamena to, ze nasiel medzivoce medzi_v=0; // pre tento som nerobil diferenciu if( subst_NDF.t_chyba[i] == 0 ) { subst_NDF.t_chyba[i] = 1; // dostane oznacenie 1 // ma taky index napr. e1, e2 index[0]= subst_NDF.adept[i]; index[1]='0' + subst_NDF.t_chyba[i]; // retazec, ktory vznikol po substitucii do NDF strcpy( pom, subst_NDF.pSubst[i] ); // vsetky okrem mojej substitucie( pom, subst_NDF.adept[i] ); // nech vypisuje co substioval strcpy( ret_f2, ret_f ); strcpy( ret_f, pom ); ret_do_NDF( pom, &h_fnc, TmpSubor[0] ); // spravi komplet diferenciu podla substituovaneho strcpy( pom, subst_NDF.pNDF[i] ); difer_podla( &h_fnc, subst_NDF.adept[i] - 'a', pom, &p_chyb, &p_pokusov, &a_rezim ); strcpy( ret_f, ret_f2 ); } // dostane oznacenie +1 subst_NDF.t_chyba[ prem - zac_subst +1 ] = subst_NDF.t_chyba[i]+1; // ma taky index napr. e1, e2 index[1]='0'+subst_NDF.t_chyba[ prem - zac_subst +1 ]; // retazec, ktory vznikol po substitucii do NDF strcpy( pom, subst_NDF.pSubst[ prem - zac_subst +1 ] ); // vsetky okrem mojej substitucie( pom, subst_NDF.adept[ prem - zac_subst +1 ] ); // aby spravne zobrazoval potom !!! for( y=0; y < strlen(pom); y++ ) if( pom[y] == subst_NDF.adept[ prem - zac_subst +1 ] ) pom[y] = subst_NDF.adept[i]; // dostane meno ako ta s ktorou sa podoba subst_NDF.adept[ prem - zac_subst +1 ] = subst_NDF.adept[i]; // nech vypisuje co substioval strcpy( ret_f2, ret_f ); strcpy( ret_f, pom ); ret_do_NDF( pom, &h_fnc, TmpSubor[0] ); // spravi komplet diferenciu podla substituovaneho strcpy( pom, subst_NDF.pNDF[ prem - zac_subst +1 ] ); difer_podla( &h_fnc, subst_NDF.adept[ i ] - 'a', pom, &p_chyb, &p_pokusov, &a_rezim ); strcpy( ret_f, ret_f2 ); } // end if( prem != 0 ) } } // end if( medzi_v zatvor_okno(); // ziadne vnutorne vodice niesu if( medzi_v ) hlasky( chyba[27] ); // znuluj( &subst_NDF,1 ); if ( Rezim == PREV ) result_skusania( p_chyb, p_pokusov ); index[0]=' ';index[1]=' '; if( medzi_v == 0 ) hlasky(chyba[23]); return( 0 ); } //************************************************************************// // DIFER_PODLA vykona boolovske diferencie podla premennej // // 2.11.1997 // //************************************************************************// int difer_podla( zapis_NDF *hp_fnc, int podla_p, char subst[], int *p_chyb, int *p_pokusov, int *a_rezim ) // hp_fnc - funkcia, podla_p - podla akej premennej, subst - aky retazec substiujem // p_chyb p_pokusov - pocet chyb pokusov, a_rezim - automaticky rezim pri demo ??? { zapis_NDF K0,K1,K; // pre potreby derivacie dF/dA char pom_f[max_ret]; // pre pracu s derivaciami char pom[256]; // devka // pre potreby derivacie dF/dA znuluj(&K0,0); znuluj(&K1,0); znuluj(&K,0); // dame do statistickych udajov if( strlen( subst ) == 0 ) sprintf( pom,"dF/d%s", index ); else sprintf( pom,"dF/d%s subst(%s)", index, subst ); zarad_stat( pom,0 ); sprintf(pom," F = %s\n F(ndf) = ", ret_f ); // zobrazi NDF strukturu uloz_NDF( hp_fnc, pom, TmpSubor[3]); filter( subst ); if ( derivac_dF( hp_fnc, podla_p, &K, &K0, &K1) == FALSE ) { znuluj(&K0,1); znuluj(&K1,1); znuluj(&K,1); // uz nemam cas to inac spravit !!! // vypise pre aku premennu nemoze sparvit derivaciu chyba[28][0][14]=index[0]; if ( index[1] != ' ' ) // toto je vetviaci sa vodic chyba[28][0][15]=index[1]; chybove_okno( chyba[28] ); // priprav cleny del_tmp(TmpSubor[3]); return(1); } strcpy( pom_f, zderivuj_dF( &K, &K0, &K1) ); // vyrob so zatvorkami substitucie( pom_f, ' ' ); // substitucie spat na normalne cleny // taky akoze test, ci nahodov neodpoveda vzdy 0, alebo I jed_odpoved( pom_f ); // zlom !!! tento riadok je magicky uz sa mi o nom sniva ret_do_NDF( pom_f, &deriv_f, TmpSubor[0] ); // uprav do prijatelneho tvaru uloz_NDF( &deriv_f, "\n dF = ",TmpSubor[3]); // ulozi slovnik poruch pre t0( prem), alebo t1 neg( prem ) uloz_slovnik( pom_f, podla_p, &h_fnc, TmpSubor[3], subst ); // dame do statistickych udajov zarad_stat( "",1 ); // je Preverovaci rezim tak zobrazuj if ( (( Rezim == VYUK ) || ( Rezim == PREV )) && ( *a_rezim != ESC ) ) { zobraz_tmp5(); (*p_pokusov)++; // dalsi pokus *a_rezim=prever_uziv( &deriv_f, p_chyb ); // over jeho vedomosti zatvor_okno(); } if ( ( Rezim == DEMO ) && ( *a_rezim != ESC ) ) { // ak je DEMO tak zobrazuj // po zobrazeni zmaze !!! *a_rezim=zobraz_tmp4(); } // podla coho derivujem ??? if( strlen( subst ) == 0 ) sprintf( pom,"\n dF/d%s = ", index ); else sprintf( pom,"\n subst(%s) = %s\n dF/d%s = ", subst, index, index ); // zobrazi NDF strukturu do NDF.TMP uloz_NDF( &deriv_f, pom,TmpSubor[1]); // ulozi do vystupneho suboru if ( Vystup == TLC ) { // ak tlaciaren anti_ascii( TmpSubor[3] , TmpSubor[5] ); sprintf( pom_f,"type %s%s > prn", temp, TmpSubor[5] ); system( pom_f ); } if ( Vystup == SUB ) { // ak ukladat do suboru anti_ascii( TmpSubor[3], TmpSubor[5] ); sprintf( pom_f,"if exist %s%s type %s%s >> %s", temp, TmpSubor[5], temp, TmpSubor[5], TmpSubor[4] ); system( pom_f ); } // ak spustim znova aby neboli duplicitne vysledky del_tmp( TmpSubor[3] ); del_tmp( TmpSubor[2] ); // vycistime pamat znuluj(&K0,1); znuluj(&K1,1); znuluj(&K,1); // aj toto je na stabilitu, lebo ked je cista pamat aj hlava je cista return(0); } //************************************************************************// // KONTR_SUBST kontrola ci retazec subst sa nachadza v subst_NDF // // i:... o: 0-nenasiel som !=0 ako sa vola subst. premenna 30.10.1997 // // toto este prepracovat !!! //************************************************************************// int kontr_subst( char subst[], int odkial, int pokial ) { int x,y,i; // devky int prem=0; // toto je premenna, ktora ma dvojca zapis_NDF NDF1,NDF2; // nahadzem do NDF1, NDF2 porovnam char ret_NDF1[ max_ret ], ret_NDF2[ max_ret ]; znuluj( &NDF1, 0 ); znuluj( &NDF2, 0 ); strcpy( ret_NDF1, subst ); ret_do_NDF( ret_NDF1, &NDF1, TmpSubor[5] ); // s tymto porovnavam for( i=odkial; i <= pokial; i++ ) { for( x=0; x < NDF1.poc_NDF; x++ ) NDF1.t_vodic[x] = 0; strcpy( ret_NDF2, subst_NDF.pNDF[i] ); ret_do_NDF( ret_NDF2, &NDF2, TmpSubor[5] ); // maju aspon rovnaky pocet NDF ? if(( NDF1.pv_NDF == NDF2.pv_NDF ) && ( NDF1.poc_NDF == NDF2.poc_NDF )) { // grupak, kazdy s kazdym for( x=1; x <= NDF1.poc_NDF; x++ ) for( y=1; y <= NDF2.poc_NDF; y++ ) if(( strcmp( NDF1.pNDF[x], NDF2.pNDF[y] ) == 0 ) && ( NDF1.t_vodic[x] == 0 ) && ( NDF2.t_vodic[y] == 0 )) {// sedi rovnaju sa, a este som ich nezlucil NDF1.t_vodic[x] = 1; NDF2.t_vodic[y] = 1; } // tak je to ona, alebo nie ??? prem = subst_NDF.adept[i] - 'a' +1 ; for( x=1; x <= NDF1.poc_NDF; x++ ) if( NDF1.t_vodic[x] == 0 ) prem=0; // nie je to ono } // end if(( NDF1.pv_NDF == NDF2.pv_NDF ... znuluj( &NDF2, 1 ); // nasiel som ideme prec if( prem != 0 ) { znuluj( &NDF1, 1 ); return( prem ); } } // end for( i=0; i < subst_NDF.poc_NDF; i++ ) // nenasiel som znuluj( &NDF1, 1 ); return(0); } //************************************************************************// // Zisti ako by sa mala spravat funkcia ak je vsetko OK // // i:vektor(00I0II) o:vstup_0 "0" vstup_1 "1" 25.10.1997 // //************************************************************************// char odpoved_f( char v_vektor[], zapis_NDF *h_fnc ) { int x,y; // len tak char j_ndf,c_ndf=0; // hodnota jednoho ndf, celej f-cie for( y=1; y<= h_fnc->poc_NDF; y++ ) { j_ndf=1; for( x=0; x< h_fnc->pv_NDF; x++ ) { if (( h_fnc->pNDF[y][x] == jclen ) && ( v_vektor[x] == vstup_0[0] )) j_ndf=0; if (( h_fnc->pNDF[y][x] == nclen ) && ( v_vektor[x] == vstup_1[0] )) j_ndf=0; } c_ndf=c_ndf+j_ndf; } if ( c_ndf != 0 ) return( vstup_1[0] ); else return( vstup_0[0] ); } //************************************************************************// // NAHRAD_VETVY hlada podobne a nahrdzuje ich inym // // napr. abc+d(abc+de)= f+d(f+de) // // i:z akeho ret, co som substioval, slovnik substucii // // o:ake ma cislo novo vytvoreny vodic 30.10.1997 // //************************************************************************// int nahrad_vetvy( char ret_f[], char subst[], zapis_NDF *subst_NDF ) { int i,y,err; // devky int lav_z=0,prav_z=0; // lava, prava zatvorka pre subst a+b int ma_subst=0; // mam uz nejake subst char vysl[ max_ret ]; // vysledok subst[0]='\0'; // znulujeme vysl[0]='\0'; for( i=0; i <= strlen(ret_f); i++ ) { // koncim kopirovanie if( ( je_znak( ret_f[i], nic ) == FALSE ) && ( strlen( subst ) > 1 ) && ( ma_subst == 0 ) ) { filter( subst ); // odfiltruj medzery, zatvorky if ( (err = dalsie_NDF( subst_NDF, strlen( subst ) ) ) != 0) { chybove_okno(chyba[err] ); return(0); } for( y=0; y < strlen( subst ); y++ ) s_NDF[y] = subst[y]; // takto sa bude volat nova premenna subst_NDF->adept[ subst_NDF->poc_NDF ] = 'a' + zac_subst + subst_NDF->poc_NDF - 2 ; // takto to uz dalej nepojde mam malo pismen abecedy na vetvenia if( subst_NDF->adept[ subst_NDF->poc_NDF ] >= 'z' ) { chybove_okno(chyba[26] ); return(0); } // vyrobil som novu premennu strchar( vysl, 'a' + zac_subst + subst_NDF->poc_NDF - 2 ); subst[0]='\0'; // bratku nazavadzaj, my uz mame ine zaujmy ma_subst=1; // uz je to tady !!! } // kopirujem kam treba if( je_znak( ret_f[i], nic ) == FALSE ) { strcat ( vysl, subst ); strchar( vysl, ret_f[i] ); subst[0]='\0'; } else strchar( subst, ret_f[i] ); // nasiel som clen ohraniceny len zatvorkami if(( vysl[ strlen(vysl) -3 ] == '(' ) && ( vysl[ strlen(vysl) -1 ] == ')' )) { vysl[ strlen(vysl) -3 ]=' '; // zatvorky nebudu bratu, (x) je zbytocne vysl[ strlen(vysl) -1 ]=' '; filter(vysl); } } subst[0]='\0'; // znulujeme odlozene v subst_NDF if( ma_subst ) { strchar( subst, 'a' + zac_subst + subst_NDF->poc_NDF - 2 ); strcpy( ret_f, vysl ); // tuto je vysledok mojho snazenia pSubst_NDF = (char *) farmalloc( strlen( vysl ) + 1 );// sprav mu miesto min_mem = min_mem + strlen( vysl ) + 8; pamet(); // ukaz ako si na tom z pametou if ( pSubst_NDF == NULL ) { // malo pamete chybove_okno(chyba[err] ); return(0); } for( y=0; y <= strlen( vysl ); y++ ) pSubst_NDF[y] = vysl[y]; return( zac_subst + subst_NDF->poc_NDF - 1 ); // poslem aku premennu som vyrobil } // pozor ak tu return nebude radikalne meni pointu //***********************************************************************// // teraz taka lahodka premenne budu typu "or" subst (a+b+c) = d // //***********************************************************************// if( ma_zatv( ret_f ) == 1 ) { // hladam najpravejsiu zatvorku for( lav_z=strlen( ret_f ); lav_z>0; lav_z-- ) if( ret_f[lav_z] == ')' ) prav_z=lav_z; // k nej lavu zatvorku lav_z = prav_z; while(( lav_z>0 ) && ( ret_f[lav_z] != '(' )) lav_z--; subst[0]='\0'; vysl[0]='\0'; // po lavu zatvorku do vysl for( i = 0; i < lav_z; i++ ) strchar( vysl, ret_f[i] ); // od lavej do pravej do subst for( i = lav_z +1 ; i < prav_z; i++ ) strchar( subst, ret_f[i] ); strchar( vysl, 'a' + zac_subst + subst_NDF->poc_NDF -1 ); // vyrobil som novu premennu // od pravej do vysl for( i = prav_z +1; i < strlen( ret_f ); i++ ) strchar( vysl, ret_f[i] ); filter( subst ); if ( dalsie_NDF( subst_NDF, strlen( subst ) ) == 1) return(0); // tak ten clen tam hodim for( y=0; y <= strlen( subst ); y++ ) s_NDF[y] = subst[y]; subst_NDF->adept[ subst_NDF->poc_NDF ] = 'a' + zac_subst + subst_NDF->poc_NDF - 2 ; // takto to uz dalej nepojde mam malo pismen abecedy na vetvenia if( subst_NDF->adept[ subst_NDF->poc_NDF ] >= 'z' ) { chybove_okno(chyba[26] ); return(0); } subst_NDF->t_vodic[ subst_NDF->poc_NDF ] = '+';// znaci, ze je to clen OR strcpy( ret_f, vysl ); // tuto je vysledok mojho snazenia pSubst_NDF = (char *) farmalloc( strlen( vysl ) + 1 );// sprav mu miesto min_mem = min_mem + strlen( vysl ) +8; pamet(); // ukaz ako si na tom z pametou if ( pSubst_NDF == NULL ) { // malo pamete chybove_okno(chyba[err] ); return(0); } for( y=0; y <= strlen( vysl ); y++ ) pSubst_NDF[y] = vysl[y]; return( zac_subst + subst_NDF->poc_NDF -1 ); // poslem aku premennu som vyrobil } // end if( ma_zatv( ret_f ) == 1 ) else return(0); // subtitucie uz dosli } //************************************************************************// // SUBSTITUCIE nahradzuje cleny substituovane skutocnymi vstupmi // // i:slovnik substitucii o: retazec substitucii 30.10.1997 // //************************************************************************// int substitucie( char subst[], char okrem ) { int x,y; // devka char pom[ max_ret ]; char vysl[ max_ret ]; int ma_subst=0; // neaku substituciu som nahradil zapis_NDF pom_NDF; vysl[0]='\0'; // no a co mam robit ??? for( x=0; x< strlen( subst ); x++ ) {// je to clen zo substituciou if(( ( subst[x]-'a'+1 ) >= zac_subst ) && ( je_znak( subst[x],jclen ) == TRUE ) && ( subst[x] != okrem )) { ma_subst=1; pom[0]='\0'; for( y=0; y < strlen(subst_NDF.pNDF[ subst[x] - 'a' - zac_subst + 2 ] ); y++ ) strchar( pom, subst_NDF.pNDF[ subst[x] - 'a' - zac_subst + 2 ][y] ); // aj rekurzivne substitucie while ( substitucie( pom, okrem ) ); strcat( vysl, "(" ); // co ak je to substitucia (a+b) strcat( vysl, pom ); strcat( vysl, ")" ); } // end if( subst[x] > f_fnc.pv_NDF ) else {// a co ak su negovane if(( ( subst[x]-224+1 ) >= zac_subst ) && ( je_znak( subst[x],nclen ) == TRUE ) && ( subst[x]-224+'a' != okrem )) { ma_subst=1; pom[0]='\0'; for( y=0; y < strlen(subst_NDF.pNDF[ subst[x] - 224 - zac_subst + 2 ] ); y++ ) strchar( pom, subst_NDF.pNDF[ subst[x] - 224 - zac_subst + 2 ][y] ); znuluj( &pom_NDF, 0 ); // aby to bolo OK vytvor_formu( &pom_NDF, pom ); // ret do mojho zapisu strcpy( pom , K_negovane( &pom_NDF ) ); // zneguj znuluj( &pom_NDF, 1 ); // uvolni pamet // aj rekurzivne substitucie while ( substitucie( pom, okrem ) ); strcat( vysl, "(" ); // co ak je to substitucia (a+b) strcat( vysl, pom ); strcat( vysl, ")" ); } else strchar( vysl, subst[x] ); } } // end for( x=0; x< strlen( subst ); x++ ) strcpy( subst, vysl ); return( ma_subst ); } //************************************************************************// // KOLKO_VETIEV zistuje na kolko premennych sa deli primarny vstup // // i:funkcia o:pocet vetiev 22.11.1997 // //************************************************************************// int kolko_vetiev( char f_vstup[], int premenna ) { int i,poc=0; for( i=0; i< strlen( f_vstup ); i++ ) if(( f_vstup[i] == 'a' + premenna ) || ( f_vstup[i] == 224 + premenna )) poc++; return( poc ); } /*---------------------------------END--------------------------------------*/