pabloliva87

Test FuDePan

Jul 21st, 2011
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.55 KB | None | 0 0
  1. /* Examen de tesinas para FuDePAN */
  2.  
  3. /** TADs usados en la resolucion */
  4.  
  5. typedef enum {FALSE=0, TRUE=!0} Boolean;
  6.  
  7. typedef struct {
  8.     unsigned int index;     /* El indice del arreglo que estamos recorriendo */
  9.     Boolean ended;      /* Flag para indicar si llegamos al final del arreglo */
  10. } ArrayIndex;  
  11.  
  12. /** Funciones Auxiliares */
  13.  
  14. /* Rutina de inicializacion para el TAD arriba definido */
  15. ArrayIndex ArrIndInit (void) {
  16.     ArrayIndex result;
  17.    
  18.     result.index = 0;
  19.     result.ended = FALSE;
  20.    
  21.     return result;
  22. }
  23.  
  24. /* Assignandcheck coloca el valor de array[arrindex.index] en res[place], aumenta arrindex.index en 1,
  25.    y verifica si se ha llegado al final de array; si es asi, le da el valor 1 a arrindex.ended;
  26.    devuelve el nuevo valor de arrindex */
  27. void assignandcheck (ArrayIndex * arrindex, const int place, const unsigned int size, const int array[], int * res) {
  28.     res[place] = array[arrindex->index];
  29.     arrindex->index ++;
  30.     if (arrindex->index == size) { 
  31.         arrindex->ended = TRUE;
  32.     }
  33. }
  34.  
  35. /* Arraychunkcopy toma copyamount elementos desde la posicion arrindex de array,
  36.    y los va colocando en res a partir de la posicion resindex */
  37. void arraychunkcopy (const unsigned int arrindex, const unsigned int copyamount, const unsigned int resindex, const int array [], int * res) {
  38.     unsigned int i;
  39.     for (i=0; i<copyamount; i++) {
  40.         res[resindex+i] = array[arrindex+i];
  41.     }
  42. }
  43.  
  44. /** La funcion requerida en el enunciado */
  45.  
  46. unsigned int merge(const int array1[], unsigned int size1, const int array2[], unsigned int size2, int result[])
  47.     {
  48.  
  49.     ArrayIndex fstindex, sndindex; /* Indices para recorrer el primero y segundo arreglos, respectivamente */
  50.  
  51.     unsigned int i;
  52.  
  53.     const unsigned int size_result = size1 + size2;
  54.    
  55.     fstindex = ArrIndInit();
  56.     sndindex = ArrIndInit();
  57.    
  58.     i = 0;
  59.     while (i<size_result && ! fstindex.ended && ! sndindex.ended ) {   
  60.         /* Si no se llego al final de ninguno de los arreglos, comparamos el primer elemento de cada arreglo */
  61.         if (array1[fstindex.index] <= array2[sndindex.index]) {
  62.             assignandcheck (&fstindex, i, size1, array1, result);
  63.         } else {
  64.             assignandcheck (&sndindex, i, size2, array2, result);
  65.         }
  66.         i++;
  67.     }
  68.    
  69.     /* Si el ciclo termino, pero no recorrimos ambos arreglos... */
  70.     /*... entonces falta copiar size_result - i elementos de un arreglo */
  71.     if (i<size_result && sndindex.ended) {
  72.         arraychunkcopy (fstindex.index, size_result-i, i, array1, result); 
  73.     }
  74.     if (i<size_result && fstindex.ended) {
  75.         arraychunkcopy (sndindex.index, size_result-i, i, array2, result);
  76.     }
  77.  
  78.     return size_result;
  79. }
Add Comment
Please, Sign In to add comment