Intercalacion de numeros pares e impares en vectores

Iniciado por angelaarousse, 19 Abril 2016, 18:35 PM

0 Miembros y 1 Visitante están viendo este tema.

angelaarousse

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:

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)

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

HardForo

#1
En si....


MIENTRAS (TRUE)
{
   SI (NO HAY DATOS) BREAK;
   next(dato)
   PUSH (dato, vector1)

   SI (NO HAY DATOS) BREAK;
   next(dato)
   PUSH (dato, vector2)

   SI (NO HAY DATOS) BREAK;
   next(dato)
   PUSH (dato, vector3)

   SI (NO HAY DATOS) BREAK;
   next(dato)
   PUSH (dato, vector4)
}


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


#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

const int elems = 20;
const int nv = 4;

int main ()
{
    int ary[] = { 1,2,3,4,
                  5,6,7,8,
                  9,10,11,12,
                  13,14,20
                };

    int* vec[nv];   
    int dl[nv]; // dimesiones logicas
    int i,j, limit;
   
    // reserva de memoria (new) e inicializaciones
    for (j=0;j<nv;j++){
        vec[j] = (int*) malloc(elems * sizeof(int));
        dl[j] = 0;
    }       
   
    limit = sizeof(ary)/sizeof(ary[0]);
   
    for (j=0;j<nv;j++)   
        for (i=j; i< sizeof(ary)/sizeof(ary[0]) ;){
       vec[j][dl[j]] = ary[i];   
   i+=nv;dl[j]++;
    }   
   
       
    // Imprimo

    for (j=0;j<nv;j++){
        cout << "V1 = ";
        for (i=0; i<dl[j]; i++)
           cout << vec[j][i] << " ";
        cout << endl;
    }   

   
    return 0;
}



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


#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

const int elems = 20;
const int nv = 4;

int main (void)
{
    int ary[] = { 1,2,3,4,
                  5,6,7,8,
                  9,10,11,12,
                  13,14,20
                };

    int* vec[nv];   
    int dl[nv]; // dimesiones logicas
    int i,j, limit;
   
    // reserva de memoria (new) e inicializaciones
    for (j=0;j<nv;j++){
        vec[j] = (int*) malloc(elems * sizeof(int));
        dl[j] = 0;
    }       
   
    limit = sizeof(ary)/sizeof(ary[0]);
   
    for (i=0;i<limit; ){   
        for (j=0;j<nv;j++){         
           vec[j][dl[j]] = ary[i];
           dl[j]++; i++;
           if (i==limit-1) goto outside;
        }   
    }

    outside:   
   
    // Imprimo

    for (j=0;j<nv;j++){
        cout << "V1 = ";
        for (i=0; i<dl[j]; i++)
           cout << vec[j][i] << " ";
        cout << endl;
    }   
   
    return 0;
}


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

Salu2
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

angelaarousse

Vale muchas gracias! voy a acomodarlo según la librería que estoy manejando  :D

crack81

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...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

HardForo

#4
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.
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *