pabloliva87

Test FuDePan

Jul 22nd, 2011
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.07 KB | None | 0 0
  1. /* Examen de tesinas para FuDePAN */
  2.  
  3. /** Funciones Auxiliares */
  4.  
  5. /* Assignandcheck coloca el valor de array[arrindex] en res[place], aumenta arrindex en 1, y verifica si se ha llegado
  6.  * al final de array; devuelve 1 si se llego al final de array, 0 en caso contrario */
  7. unsigned int assignandcheck (unsigned int * arrindex, const int place, const unsigned int size, const int array[], int * res) {
  8.     unsigned int result;
  9.    
  10.     res[place] = array[*arrindex];
  11.     *arrindex = *arrindex+1;
  12.  
  13.     if (*arrindex == size) {
  14.         result = 1;
  15.     } else {
  16.         result = 0;
  17.     }
  18.     return result;
  19. }
  20.  
  21. /* Arraychunkcopy toma copyamount elementos desde la posicion arrindex de array,
  22.    y los va colocando en res a partir de la posicion resindex */
  23. void arraychunkcopy (const unsigned int arrindex, const unsigned int copyamount, const unsigned int resindex, const int array [], int * res) {
  24.     unsigned int i;
  25.     for (i=0; i<copyamount; i++) {
  26.         res[resindex+i] = array[arrindex+i];
  27.     }
  28. }
  29.  
  30. /** La funcion requerida en el enunciado */
  31.  
  32. unsigned int merge(const int array1[], unsigned int size1, const int array2[], unsigned int size2, int result[])
  33.     {
  34.  
  35.     unsigned int fstindex[1];
  36.     unsigned int sndindex[1]; /* Indices para recorrer el primero y segundo arreglos, respectivamente */
  37.  
  38.     unsigned int i;
  39.     unsigned int reached_end;   /* Flag para indicar si se llego al final de alguno de los arreglos */
  40.  
  41.     const unsigned int size_result = size1 + size2;
  42.  
  43.     *fstindex = 0;
  44.     *sndindex = 0;
  45.    
  46.     reached_end = 0;
  47.     i = 0;
  48.     while (i<size_result && !reached_end ) {
  49.         /* Si no se llego al final de ninguno de los arreglos, comparamos el primer elemento de cada arreglo */
  50.         if (array1[*fstindex] <= array2[*sndindex]) {
  51.             reached_end = assignandcheck (fstindex, i, size1, array1, result);
  52.         } else {
  53.             reached_end = assignandcheck (sndindex, i, size2, array2, result);
  54.         }
  55.         i++;
  56.     }
  57.     /* Puede faltar copiar size - index elementos de un arreglo */
  58.     arraychunkcopy (*fstindex, size1 - *fstindex, i, array1, result);
  59.     arraychunkcopy (*sndindex, size2 - *sndindex, i, array2, result);
  60.  
  61.     return size_result;
  62. }
Add Comment
Please, Sign In to add comment