Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: angelaarousse en 19 Abril 2016, 18:35 pm



Título: Intercalacion de numeros pares e impares en vectores
Publicado por: angelaarousse en 19 Abril 2016, 18:35 pm
Hola! Me gustaría poder intercalar números de un vector T en 4 (o más) subvectores tx. Ya logré intercalar pares e impares usando "mod" en 2 subvectores pero no he podido completar la secuencia, por ejemplo:

Código:
T = 12; 
tx0    tx1    tx2    tx3
 0       1      2      3
 4       5      6      7   y así sucesivamente hasta completar el total de las posiciones de T.
El código que les voy a mostrar esta en C++ usando la librería IT++ que es para telecomunicaciones  :xD (La sintaxis es similar a MATLAB en el manejo de arrays)

Código:
 int f = 0, h = 0, i = 0;
    for(i = 0; i < Long_simbolos_qam; i++)
       {
          if (mod(i, 2) == 0)
            {
              tx0(f) = simbolos_qam(i); //Num par
      f = f+1;
            }
          else
            {
              tx1(h) = simbolos_qam(i); //Num impar
      h = h+1;
            }
        }
Es una simple intercalación de números pares e impares. Si alguien sabe hacer esto en C++ agradecería mucho su ayuda!!  :D


Título: Re: Intercalacion de numeros pares e impares en vectores
Publicado por: HardForo en 19 Abril 2016, 19:12 pm
En si....

Código
  1. MIENTRAS (TRUE)
  2. {
  3.    SI (NO HAY DATOS) BREAK;
  4.    next(dato)
  5.    PUSH (dato, vector1)
  6.  
  7.    SI (NO HAY DATOS) BREAK;
  8.    next(dato)
  9.    PUSH (dato, vector2)
  10.  
  11.    SI (NO HAY DATOS) BREAK;
  12.    next(dato)
  13.    PUSH (dato, vector3)
  14.  
  15.    SI (NO HAY DATOS) BREAK;
  16.    next(dato)
  17.    PUSH (dato, vector4)
  18. }
  19.  

Puedes hacer un solo bucle o dividirlo en N bucles si tienes N-vectores o arreglos, ejemplo en C:

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. using namespace std;
  5.  
  6. const int elems = 20;
  7. const int nv = 4;
  8.  
  9. int main ()
  10. {
  11.    int ary[] = { 1,2,3,4,
  12.                  5,6,7,8,
  13.                  9,10,11,12,
  14.                  13,14,20
  15.                };
  16.  
  17.    int* vec[nv];    
  18.    int dl[nv]; // dimesiones logicas
  19.    int i,j, limit;
  20.  
  21.    // reserva de memoria (new) e inicializaciones
  22.    for (j=0;j<nv;j++){
  23.        vec[j] = (int*) malloc(elems * sizeof(int));
  24.        dl[j] = 0;
  25.    }      
  26.  
  27.    limit = sizeof(ary)/sizeof(ary[0]);
  28.  
  29.    for (j=0;j<nv;j++)    
  30.        for (i=j; i< sizeof(ary)/sizeof(ary[0]) ;){
  31.       vec[j][dl[j]] = ary[i];  
  32.   i+=nv;dl[j]++;
  33.    }    
  34.  
  35.  
  36.    // Imprimo
  37.  
  38.    for (j=0;j<nv;j++){
  39.        cout << "V1 = ";
  40.        for (i=0; i<dl[j]; i++)
  41.           cout << vec[j][i] << " ";
  42.        cout << endl;
  43.    }    
  44.  
  45.  
  46.    return 0;
  47. }
  48.  
  49.  

Y la otra forma que te comentaba (siempre en C)

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. using namespace std;
  5.  
  6. const int elems = 20;
  7. const int nv = 4;
  8.  
  9. int main (void)
  10. {
  11.    int ary[] = { 1,2,3,4,
  12.                  5,6,7,8,
  13.                  9,10,11,12,
  14.                  13,14,20
  15.                };
  16.  
  17.    int* vec[nv];    
  18.    int dl[nv]; // dimesiones logicas
  19.    int i,j, limit;
  20.  
  21.    // reserva de memoria (new) e inicializaciones
  22.    for (j=0;j<nv;j++){
  23.        vec[j] = (int*) malloc(elems * sizeof(int));
  24.        dl[j] = 0;
  25.    }      
  26.  
  27.    limit = sizeof(ary)/sizeof(ary[0]);
  28.  
  29.    for (i=0;i<limit; ){    
  30.        for (j=0;j<nv;j++){        
  31.           vec[j][dl[j]] = ary[i];
  32.           dl[j]++; i++;
  33.           if (i==limit-1) goto outside;
  34.        }  
  35.    }
  36.  
  37.    outside:    
  38.  
  39.    // Imprimo
  40.  
  41.    for (j=0;j<nv;j++){
  42.        cout << "V1 = ";
  43.        for (i=0; i<dl[j]; i++)
  44.           cout << vec[j][i] << " ";
  45.        cout << endl;
  46.    }    
  47.  
  48.    return 0;
  49. }
  50.  

No uso vector y menos una libreria como T++ pero creo se puede ver la logica de cualquiera de los ejemplos.

Salu2


Título: Re: Intercalacion de numeros pares e impares en vectores
Publicado por: angelaarousse en 21 Abril 2016, 02:41 am
Vale muchas gracias! voy a acomodarlo según la librería que estoy manejando  :D


Título: Re: Intercalacion de numeros pares e impares en vectores
Publicado por: crack81 en 21 Abril 2016, 04:57 am
boctulus Hola companero, muy buenos tus ejemplos solo mecionaria unos detalles a tener en cuenta.


Si estas trabajando en C++ evita importar bibliotecas de C como stdlib.h o stdio.h y utiliza sus equivalencias como cstdio y cstdlib, tambien procura liberar siempre la memoria allocada con malloc usando la funcion free(); ya que en tus dos ejemplos reservas memoria en el heap pero nunca la liberas.

Por ultimo aunque esto es mas bien en gustos, procura reservar la memoria dinamica usando NEW en lugar de malloc  ya que la primera es la nativa de C++ no olvidar igualmente liberar la memoria usando delete[] si es un arreglo o delete a secas si es un puntero.


Saludos...


Título: Re: Intercalacion de numeros pares e impares en vectores
Publicado por: HardForo en 21 Abril 2016, 05:02 am
Crack: tienes toda la razón, se me olvidó liberar la memoria y es muy importante hacerlo  ;)

En cuanto la forma de reservar la memoria (y liberarla) es propia de C como dices porque intenté hacer los ejemplos en C y no C++ para obligar a quien pregunta a "extraer" el concepto y no copiar código (que le serviría en C++)  >:D


Citar
Si estas trabajando en C++ evita importar bibliotecas de C como stdlib.h o stdio.h y utiliza sus equivalencias como cstdio y cstdlib, tambien procura liberar siempre la memoria allocada con malloc usando la funcion free(); ya que en tus dos ejemplos reservas memoria en el heap pero nunca la liberas.

Por ultimo aunque esto es mas bien en gustos, procura reservar la memoria dinamica usando NEW en lugar de malloc  ya que la primera es la nativa de C++ no olvidar igualmente liberar la memoria usando delete[] si es un arreglo o delete a secas si es un puntero.