]> git.llucax.com Git - z.facultad/75.06/jacu.git/commitdiff
* Modifico el main para que acepte el modo Luca y el modo Gazer :-)
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sun, 20 Jun 2004 18:51:53 +0000 (18:51 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sun, 20 Jun 2004 18:51:53 +0000 (18:51 +0000)
* Agrego qsort para ordenar en el BS (tengo que revisar, algo falla un poquito)

otros/blocksorting/bs.c
otros/blocksorting/bs.h
otros/blocksorting/main.c

index bf39971012a9e72b11718c2fe7b923d792104700..b7caa543106a13e3088c3b787aec23be9ffb51fe 100644 (file)
@@ -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; k<bs->len; 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; i<bs->len; i++) {
+/*     for(i=0; i<bs->len; i++) {
                min = -1;
                for(j=0; j<bs->len; 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; i<bs->len; 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);
index b2742c4513f76dc0f803eff5df889ac960b5c9bb..099acb2fccab9fed78f6a4d923eb261521c6d599 100644 (file)
@@ -6,18 +6,24 @@
 #include <stdlib.h>
 #include <stdio.h>
 
+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
  *
index 5f36f541a9f1aacd84d38d13df06a7616e0d4888..70280179c3566d737aa10619d90cc66c48f5a830 100644 (file)
@@ -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 <archivo datos> <tamaƱo pagina>\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;