From: Ricardo Markiewicz Date: Sun, 20 Jun 2004 18:51:53 +0000 (+0000) Subject: * Modifico el main para que acepte el modo Luca y el modo Gazer :-) X-Git-Tag: svn_import~128 X-Git-Url: https://git.llucax.com/z.facultad/75.06/jacu.git/commitdiff_plain/86626b07ef6c182f6594bc0b398b0065cefe4aed?ds=inline * Modifico el main para que acepte el modo Luca y el modo Gazer :-) * Agrego qsort para ordenar en el BS (tengo que revisar, algo falla un poquito) --- diff --git a/otros/blocksorting/bs.c b/otros/blocksorting/bs.c index bf39971..b7caa54 100644 --- a/otros/blocksorting/bs.c +++ b/otros/blocksorting/bs.c @@ -8,6 +8,8 @@ typedef struct _bs_decode_t_ { unsigned long int pos; } t_BlockSortDecode; +char es_menor(char *data, t_BlockSort *bs, int i, int j); + int _compare(const void *d1, const void *d2) { t_BlockSortDecode *s1, *s2; @@ -17,13 +19,22 @@ int _compare(const void *d1, const void *d2) { return (s1->c - s2->c); } +int __compare(const void *d1, const void *d2) { + t_BlockSortData *s1, *s2; + + s1 = (t_BlockSortData *)d1; + s2 = (t_BlockSortData *)d2; + + return es_menor(s1->bs->data, s1->bs, s1->pos_inicial, s2->pos_inicial); +} + char es_menor(char *data, t_BlockSort *bs, int i, int j) { unsigned long int pi, pj, k; for(k=0; klen; k++) { - pi = (bs->array[i].pos_inicial+k)%bs->len; - pj = (bs->array[j].pos_inicial+k)%bs->len; + pi = (i+k)%bs->len; + pj = (j+k)%bs->len; if (data[pi] > data[pj]) return 0; if (data[pi] < data[pj]) return 1; @@ -39,15 +50,16 @@ void generar_array(char *data, t_BlockSort *bs) bs->array[i].pos_inicial = i; bs->array[i].pos_final = (i+bs->len-1)%bs->len; bs->array[i].pos_orden = 0; - bs->array[i].ord = 0; + bs->array[i].ord = (i==1)?1:0; + bs->array[i].bs = bs; } } void ordenar_array(char *data, t_BlockSort *bs) { - unsigned long int i, j, min; + /*unsigned long int i, j, min;*/ - for(i=0; ilen; i++) { +/* for(i=0; ilen; i++) { min = -1; for(j=0; jlen; j++) { if (bs->array[j].ord) continue; @@ -59,7 +71,8 @@ void ordenar_array(char *data, t_BlockSort *bs) bs->array[min].pos_orden = i; bs->ord[i] = min; - } + }*/ + qsort(bs->array, bs->len, sizeof(t_BlockSortData), __compare); } int generar_salida(char *data, t_BlockSort *bs, char *salida) @@ -67,8 +80,8 @@ int generar_salida(char *data, t_BlockSort *bs, char *salida) unsigned long int i, k; k=-1; for(i=0; ilen; i++) { - salida[i] = data[bs->array[bs->ord[i]].pos_final]; - if (bs->array[bs->ord[i]].pos_inicial == 0) k = i; + salida[i] = data[bs->array[i].pos_final]; + if (bs->array[i].ord == 1) k = i; } return k; } @@ -79,7 +92,8 @@ void bs_solve(char *in, char *out, t_BlockSort *bs, unsigned long int *k, unsign l = bs->len; /* Hack para pedasos menores a la pagina */ if (leido < bs->len) bs->len = leido; - + bs->data = in; + generar_array(in, bs); ordenar_array(in, bs); (*k) = generar_salida(in, bs, out); diff --git a/otros/blocksorting/bs.h b/otros/blocksorting/bs.h index b2742c4..099acb2 100644 --- a/otros/blocksorting/bs.h +++ b/otros/blocksorting/bs.h @@ -6,18 +6,24 @@ #include #include +typedef struct _bs_t_ t_BlockSort; + typedef struct _bs_data_t_ { unsigned long int pos_inicial; unsigned long int pos_final; unsigned long int pos_orden; char ord; /* indica si esta ordenada */ + + /* Guardo el puntero al padre */ + t_BlockSort *bs; } t_BlockSortData; -typedef struct _bs_t_ { +struct _bs_t_ { + char *data; t_BlockSortData *array; unsigned long int *ord; unsigned long int len; -} t_BlockSort; +}; /** Inicializa un BlockSorting * diff --git a/otros/blocksorting/main.c b/otros/blocksorting/main.c index 5f36f54..7028017 100644 --- a/otros/blocksorting/main.c +++ b/otros/blocksorting/main.c @@ -5,18 +5,21 @@ int main(int argc, char *argv[]) { char *data; char *salida; - unsigned long int len, i, k; + unsigned long int len, i, k, total; FILE *fp; char c; t_BlockSort *bs; -/* if (argc != 3) { - printf("Modo de uso : %s \n", argv[0]); - return 0; + if (argc == 3) { + fp = fopen(argv[1], "r"); + len = atoi(argv[2]); + } else if (argc == 2) { + fp = stdin; /*fopen(argv[1], "r");*/ + len = atoi(argv[1]); + } else { + printf("no, no\n"); + return 1; } -*/ - fp = stdin; /*fopen(argv[1], "r");*/ - len = atoi(argv[1]); data = malloc(sizeof(char)*len); salida = malloc(sizeof(char)*(len+1)); @@ -24,21 +27,27 @@ int main(int argc, char *argv[]) salida[len] = '\0'; bs = bs_create(len); - while ((c = fgetc(fp)) != EOF) { + c = fgetc(fp); + total = 0; + while (!feof(fp)) { i = 0; - while ((c!=EOF) && (i < len)) { + while ((!feof(fp)) && (i < len)) { data[i++] = c; c = fgetc(fp); + total++; } bs_solve(data, salida, bs, &k, i); /* XXX ACA SALIDA DEBERIA PASAR A LA SIGUIENTE ETAPA XXX */ - /*printf("%s -> %ld\n", salida, k);*/ - printf("%s", salida); + if (argc == 3) + printf("%s -> %ld\n", salida, k); + else + printf("%s", salida); } fclose(fp); bs_destroy(bs); + printf("Total bytes : %ld\n", total); free(data); free(salida); return 0;