//************************************************************************// // OBSLUHA.C // // Tuto su standartne rutiny pre spravu programu // 25.8.1997 // //************************************************************************// #include #include "mbooldif.h" #include "line_edit.h" #include "funkcie.h" #include "okno.h" #include "glob.h" #include "video.h" #include "menu.h" #include "util.h" #include "error.h" #include "key.h" //************************************************************************// // Znuluje polozky ak nieco ostalo v premennych. Zacneme s cistim stitom // // aj_mem urcuje ci uvolnovat pamat 25.8.1997 // //************************************************************************// void znuluj(zapis_NDF *NDFka, int aj_mem) { int i,pokial; // haus numera mozu mat zvlastny vysledok pokial=NDFka->poc_NDF; // skus tu nedat max_NDF-1 budes sa divit ako uvolni stack volania funkcii // a znenazdajky ukonci program if ( pokial>max_NDF ) pokial=max_NDF-1; if ( pokial<0 ) pokial=0; // Najprv to co sa patri for (i=0; i<=pokial; i++) { NDFka->adept[i] = 0; NDFka->t_vodic[i] = 0; NDFka->t_chyba[i] = 0; NDFka->index[i] = ' '; if (( NDFka->pNDF[i] != NULL) && (aj_mem) ) farfree( NDFka->pNDF[i] ); if (( NDFka->pSubst[i] != NULL) && (aj_mem) ) farfree( NDFka->pSubst[i] ); NDFka->pSubst[i] = NULL; NDFka->pNDF[i] = NULL; } // ostatne nastav na NULL for (i=pokial+1; iadept[i] = 0; NDFka->t_vodic[i] = 0; NDFka->t_chyba[i] = 0; NDFka->index[i] = ' '; NDFka->pNDF[i] = NULL; NDFka->pSubst[i] = NULL; } NDFka->pv_NDF=0; NDFka->poc_NDF=0; pamet(); // ukaz ako si na tom z pametou } //************************************************************************// // Zmaze znak z pozicie ktoru mu urcim // // 25.8.1997 // //************************************************************************// void strdel(char vstr[], int od) { int x; if( strlen( vstr ) != 0 ) for (x=od; x+a-invertovan˜ napr.(àbc+aáâ)"); tlac_retazec(zx+2,zy+3,atributy[39],"f="); riadkovy_editor(zx+5,zy+3,65,max_ret-1,atributy[13],atributy[12],ret_f); zatvor_okno(); return; } //************************************************************************// // Zisti ci sa dva funkcie rovnaju pri preverovacom rezime // // POZOR vynuluje premennu adept vo fnc2 // // i:funkcie v tvare NDF o:1-ok 0-nieco v neporiadku 20.10.1997 // //************************************************************************// int rovnaju_sa( zapis_NDF *fnc1, zapis_NDF *fnc2 ) { int x,y,ok=0; // najprv hruby filter if( fnc1->poc_NDF != fnc2->poc_NDF ) return(0); if( fnc1->pv_NDF != fnc2->pv_NDF ) return(0); for( x=1; x<=fnc1->poc_NDF; x++ ) for ( y=1; y<=fnc2->poc_NDF; y++ ) if ( (strcmp( fnc1->pNDF[x],fnc2->pNDF[y] ) == 0) && ( fnc2->adept[y] == 0 ) ) { fnc2->adept[y]=1; ok++; } for( x=1; x<=fnc1->poc_NDF; x++ ) fnc2->adept[y]=0; // nasiel tolko zhodnych clenov, kolko ich je v strukture if ( ok == fnc2->poc_NDF ) return(1); else return(0); } //************************************************************************// // Polozi mu otazku na spravnu odpoved a porovnava vysledky // // i:pocet chyb, pocet pokusov atd 22.9.1997 // //************************************************************************// int prever_uziv( zapis_NDF *deriv_f, int *p_chyb ) { int zx,zy; char od_uziv[max_ret]; int escape,pp=0,i; zapis_NDF uziv_fnc; zx=_stlpcov/2-36; zy=_riadkov/2; znuluj(&uziv_fnc,0); // tam a spat sa kolisem NDF_do_ret( deriv_f, od_uziv ); ret_do_NDF( od_uziv, deriv_f, TmpSubor[5] ); otvor_okno(zx,zy,zx+72,zy+5,atributy[39],atributy[40],1); tlac_retazec(zx+2,zy+1,atributy[39],"Zadaj deriv ciu, a-priamy z pis +a-invertovan˜ 1,0-logick  1,0"); tlac_retazec(zx+2,zy+2,atributy[39],"dF/"); tlac_retazec(zx+5,zy+2,atributy[39],index); tlac_retazec(zx+7,zy+2,atributy[39],"="); do { pp++;i=0; strcpy( od_uziv,"" ); if ( riadkovy_editor(zx+9,zy+2,58,max_ret-1,atributy[13],atributy[12],od_uziv) == FALSE ) { escape=ESC; } else { // tam a spat sa kolisem ret_do_NDF( od_uziv, &uziv_fnc, TmpSubor[0] ); // prelozime do nami zrozumitelnej NDF // ci sa aspon trochu podobaju if ( ((i=rovnaju_sa( deriv_f, &uziv_fnc )) == 0 ) && ( Rezim == VYUK ) ) chybove_okno(chyba[21]); } znuluj(&uziv_fnc,1); } while ( (i == 0) && ( Rezim == VYUK ) && ( pp < 3 ) && ( escape != ESC ) ); zatvor_okno(); if (( i==0 ) && ( Rezim == VYUK )) key(); if (( i!=0 ) && ( Rezim == VYUK )) hlasky(chyba[22]); if ( i==0 ) *p_chyb=*p_chyb+1; return( escape ); } //************************************************************************// // Zobrazi vysledok skusania // // i:pocet pokusov, pocet chyb 20.10.1997 // //************************************************************************// void result_skusania( int p_chyb, int p_pokusov ) { int zx,zy; char pom_r[max_ret]; zx=_stlpcov/2-36; zy=_riadkov/2-8; otvor_okno(zx,zy,zx+72,zy+13,atributy[42],atributy[43],1); tlac_retazec(zx+4,zy+2,atributy[42],"Vyhodnotenie"); sprintf(pom_r,"Po‡et v¨etk˜ch ot zok bolo : %d", p_pokusov ); tlac_retazec(zx+4,zy+4,atributy[42],pom_r); sprintf(pom_r,"Po‡et nespr vnych odpoved¡ bolo : %d", p_chyb ); tlac_retazec(zx+4,zy+6,atributy[42],pom_r); sprintf(pom_r,"Po‡et spr vnych odpoved¡ bolo : %d", p_pokusov-p_chyb ); tlac_retazec(zx+4,zy+8,atributy[42],pom_r); sprintf(pom_r,"Percentu lna £spe¨nosŸ bola : %2.0f %", 100.0*(p_pokusov-p_chyb)/p_pokusov ); tlac_retazec(zx+4,zy+10,atributy[42],pom_r); key(); zatvor_okno(); } //************************************************************************// // Zrusi veskeru diaktitiku, ked zapisuje do suboru // // i: meno suboru o:podarilo sa ? FALSE/TRUE 22.10.1997 // //************************************************************************// int anti_ascii( char odkial[], char kam[] ) // s Prahy do Brna clovece { FILE *f,*g,*fopen(); unsigned char znak; // do i nacitavam znaky int i; // devka char *diak[]={" „‡ƒ‚¡Œ¤¢¨Ÿ£˜‘€…‹œŠ¥›†—’¬úûüýþÿ","aacdeillnostuyzACDEILLNSTUYZ~K10i+0"}; if( ( g=fopen( strspoj( temp,kam) ,"wb" )) == NULL ) { chybove_okno(chyba[9]); return (FALSE); } if( ( f=fopen( strspoj( temp,odkial) ,"rb" )) != NULL ) { fscanf(f,"%c", &znak ); do { if ( je_znak( znak, nclen ) == TRUE ) znak=znak - ( 'à'-'A' );// znaky negacii if ( znak >= 128 ) for ( i=0; i <= strlen( diak[0] ); i++ ) // diakriticke znaky if ( znak == diak[0][i] ) znak=diak[1][i]; fprintf(g,"%c",znak); fscanf(f,"%c", &znak ); } while ( !feof(f) ); fclose(f); } // if f=fopen( odkial fclose(g); return ( TRUE ); } //************************************************************************// // JE_ZNAK zistuje ci danny znak je znakom a..z, alebo A..Z // // i:znak ASCII o:1-je 0-nieco ine 4.11.1997 // //************************************************************************// int je_znak( char znak, int typ ) { if ( (( znak >= 'a' ) && ( znak <= 'z' )) && ( typ == jclen )) return( TRUE ); if ( (( znak >= 'à' ) && ( znak <= 'ù' )) && ( typ == nclen )) return( TRUE ); if ( (( znak >= 'a' ) && ( znak <= 'z' )) || (( znak >= 'à' ) && ( znak <= 'ù' )) || ( znak == vstup_0[0] ) || ( znak == vstup_1[0] ) ) if ( typ == nic ) return( TRUE ); return( FALSE ); } //************************************************************************// // STRCHAR prida na koniec retazca znak nieco ako strcat // // i: retazec, znak o:retazec+znak 30.10.1997 // //************************************************************************// char *strchar( char retazec[], char znak ) { strcat( retazec, " " ); retazec[ strlen( retazec ) -1 ] = znak; return( retazec ); } //************************************************************************// // _FSTRCHAR prida na koniec retazca znak nieco ako strcat pre FAR // // i: retazec, znak o:retazec+znak 30.10.1997 // //************************************************************************// char far * _fstrchar( char far *retazec, char znak ) { strcat( retazec, " " ); retazec[ strlen( retazec ) -1 ] = znak; return( retazec ); } //************************************************************************// // Zmaze znak z pozicie ktoru mu urcim pre FAR // // 25.8.1997 // //************************************************************************// void _fstrdel(char far *vstr, int od) { int x; for (x=od; x poc_p ) poc_p=pom_poc; } pom_poc=1; for( i=0; i < poc_p; i++ ) pom_poc=pom_poc*2; poc_p=pom_poc; // teraz budem doplnat bity ako maju byt for( y=0; y < poc_p ; y++ ) { for( x=0; x < strlen( pom_f ); x++ ) {// ideme zistovat jednotlive bity vyst=y; // je znak nenegovany if( je_znak( pom_f[x], jclen ) == TRUE ) { pom_poc=1; for( i=0; i<( pom_f[x] - 'a' ); i++ ) pom_poc=pom_poc*2; if(( vyst & pom_poc ) != 0 ) pom_f[x] = vstup_1[0]; else pom_f[x] = vstup_0[0]; } // je negovany znak if( je_znak( pom_f[x], nclen ) == TRUE ) { pom_poc=1; for( i=0; i<( pom_f[x] - 'à' ); i++ ) pom_poc=pom_poc*2; if(( vyst & pom_poc ) != 0 ) pom_f[x] = vstup_0[0]; else pom_f[x] = vstup_1[0]; } } von_blbosti( pom_f ); if(( strlen( pom_f ) == 1 ) && (( doteraz == ' ' ) || (doteraz == pom_f[0] ))) doteraz=pom_f[0]; else return; // nevyskytuje sa tam nieco ine ako doteraz ??? if(( doteraz == vstup_0[0] ) && ( strpbrk( pom_f, vstup_1 ) > 0 )) return; if(( doteraz == vstup_1[0] ) && ( strpbrk( pom_f, vstup_0 ) > 0 )) return; strcpy( pom_f, pomoc ); } if(( doteraz == vstup_1[0] ) || ( doteraz == vstup_0[0] )) { retazec[0]='\0'; strchar( retazec, doteraz ); } } /*---------------------------------END--------------------------------------*/