/* Prog 1 - Appello del 17.XI.15 */ /* Soluzione completa */ #include #include #include #include #define MAXEL 64 int inBase(int, int, char *, int); int nextN(char *, int *, int ); int main(int argc, char *argv[]) { int pos,n,lun,bin,bout; if (argc==5) { pos=0; bin = nextN(argv[1],&pos,10); //riuso nextN pos=0; bout= nextN(argv[2],&pos,10); FILE *in=fopen(argv[3],"r"); FILE *out=fopen(argv[4],"w"); if ( (in==NULL) || (out==NULL) ) { printf("ERRORE: apertura di uno dei file %s, %s fallita.\n",argv[3],argv[4]); return -1; } char riga[BUFSIZ]; while ( fgets(riga, BUFSIZ, in)!=NULL ) { char *s=NULL; pos=0; while ( ( n=nextN(riga,&pos,bin) )!=-1 ) { fprintf(out,"%d\t",n); if (n==0) lun=1; else lun=(int) floor((log(n)/log(bout))+1); s=malloc((lun+1)*sizeof (char)); s[lun]='\0'; inBase(n,bout,s,lun); fprintf(out,"%s\n",s); free(s); } } fclose(in); fclose(out); } else if (argc==4) { pos=0; bin = nextN(argv[2],&pos,10); pos=0; bout = nextN(argv[3],&pos,10); char *s=NULL; pos=0; while ( ( n=nextN(argv[1],&pos,bin) )!=-1 ) { printf("%d\t",n); if (n==0) lun=1; else lun=(int) floor((log(n)/log(bout))+1); s=malloc((lun+1)*sizeof (char)); s[lun]='\0'; inBase(n,bout,s,lun); printf("%s\n",s); free(s); } } else { printf("ERRORE: numero argomenti errato.\n"); return -1; } return 0; } /* Restituisce prossimo naturale contenuto in s a partire */ /* dall'indice pos. */ /* Il naturale e' espresso in s in base b, con 2<=b<=10, */ /* a partire dall'indice pos di s. */ /* Si ferma al primo carattere non numerico. Restituisce -1 */ /* se la stringa e' NULL, o vuota, o contiene il solo '\n', */ /* o non contiene alcun carattere numerico, o se incontra */ /* qualche cifra che non e' =b) return -1; i++; } for (int j=i-1; j>=0; j--) sum += (int) (pow(b,i-j-1)*ar[j]); *pos+=i; return sum; } /* Computa in s la stringa che codifica il naturale n in base b. */ /* Se non vale 2<=b<=10 restituisce -1. Assume che s sia */ /* stata correttamente allocata con lun posizioni, pari al */ /* numero di cifre di n in base b, piu' una posizione per s[lun] */ /* ='\0'. */ int inBase(int n, int b, char *s, int lun) { if (b<2 || b>10) return -1; for (int i=lun-1; i>=0; i--) { s[i]=(n%b)+'0'; n=n/b; } return 0; }