/* blockcodes.c */ #include "def.h" #include "macro.h" static INT untersuchen(); static INT vergleich(); static INT herster_kandidat(); static INT neuer_vektor(); static INT hnext_kandidat(); static INT akt_perm_geord_vektor(); static INT int_in_string(); static INT itoa(); static INT reverse(); static INT next_kandidat_rec(); static INT untersuchen4(); static INT vergleich55(); static INT erster_kandidat_h(); main() { OP a; anfang(); a=callocobject(); printeingabe("Choose one of the following tasks!"); printeingabe("[1] Compute block codes recursively "); printeingabe("[2] Compute block codes from a previous computed list "); printeingabe("[3] Read computed list from file"); scan(INTEGER,a); switch(S_I_I(a)) { case 1: transversal_blockcodes_rec(); break; case 2: transversal_blockcodes_file(); break; case 3: read_blockcodes_file(); break; default: printeingabe("No proper action was chosen!"); break; } print_time(); return freeall(a); ende(); } int transversal_blockcodes_rec() { INT i,l,ibasis; OP a=callocobject(); OP n=callocobject(); OP adm=callocobject(); OP b=callocobject(); OP anz=callocobject(); OP abbr=callocobject(); OP basis=callocobject(); OP v=callocobject(); OP vv=callocobject(); OP hi=callocobject(); OP nv=callocobject(); l=0L; printeingabe("Number of letters in the alphabet"); scan(INTEGER,a); printeingabe("Length of the code words"); scan(INTEGER,n); printeingabe("Number of code words in the code"); scan(INTEGER,adm); co_sims_kette_fmon(a,n,b,anz,abbr,basis); ibasis=S_I_I(basis); m_il_v(ibasis+2L,vv); hoch(a,n,hi); m_l_nv(hi,nv); erster_kandidat_h(1L,v); for (i=0L;i0L) return(4L); /* a > b */ if (hilf==0L) return(3L); /* a = b */ i=0L; while (S_V_II(a,i)==S_V_II(b,i)) ++i; if (S_V_II(a,i)<=S_V_II(abbr,j)) return(1L); /* a < b und sie unterscheiden sich an der j-ten Stelle */ else return(2L); /* a < b */ } static INT herster_kandidat(adm,v,gelesen,fp1) OP adm,v,gelesen; FILE *fp1; { INT hilf,i; M_I_I(1L,gelesen); objectread(fp1,v); inc(v); hilf=S_V_LI(v)-1L; M_I_I(S_V_II(v,hilf-1L)+1L,S_V_I(v,hilf)); } static INT neuer_vektor(v,fp1) OP v; FILE *fp1; { INT hilf,i; freeself(v); objectread(fp1,v); inc(v); hilf=S_V_LI(v)-1L; M_I_I(S_V_II(v,hilf-1L),S_V_I(v,hilf)); } static INT hnext_kandidat(adm,v,gelesen,maxgelesen,fp1,hi) OP adm,v,gelesen,maxgelesen,hi; FILE *fp1; { INT hilf; lab: hilf=S_V_II(v,S_V_LI(v)-1L)+1L; if (hilf>S_I_I(hi)) { if ((S_I_I(adm)==1L) || (eq(gelesen,maxgelesen))) { printf("Alle Funktionen durchgetestet!\n"); return(2L); /* kein Fehler aufgetreten, alle Kandidaten aufgelistet */ } else { neuer_vektor(v,fp1); inc(gelesen); goto lab; } } else M_I_I(hilf,S_V_I(v,S_V_LI(v)-1L)); return(1L); /* kein Fehler aufgetreten */ } static INT next_kandidat_rec(i,n,m,v) OP n,m,v; INT i; { INT hilf; hilf=S_V_II(v,S_V_LI(v)-1L)+1L; if (hilf>S_I_I(n)) { if (S_V_LI(v)==1L) return(2L); /* kein Fehler aufgetreten, alle Kandidaten aufgelistet */ else { dec(v); inc(S_V_I(v,S_V_LI(v)-1L)); return (1L); } } else { if ((i==1L) && (lt(S_V_L(v),m))) inc(v); M_I_I(hilf,S_V_I(v,S_V_LI(v)-1L)); return(1L); /* kein Fehler aufgetreten */ } } static INT untersuchen4(i,vv,ibasis,b,nv,anz) int i,ibasis; OP vv,b,nv,anz; { int j,k,l; for (j=i;j0L) return(4L); /* a > b */ if (hilf==0L) return(3L); /* a = b */ i=0L; while (S_V_II(a,i)==S_V_II(b,i)) ++i; if (S_V_II(a,i)<=j+1L) return(1L); /* a < b und sie unterscheiden sich an der j-ten Stelle */ else return(2L); /* a < b */ } static INT akt_perm_geord_vektor(perm,vektor1,vektor2,nvektor) OP perm,vektor1,vektor2,nvektor; { INT i,hilf; for (i=0L;i