elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Array elementos repetidos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Array elementos repetidos  (Leído 2,939 veces)
LGG

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Array elementos repetidos
« en: 5 Mayo 2015, 16:44 pm »

¿¿¿Como se hace para que un array formado a partir de otros, y ordenado de forma creciente, no tenga ningún valor repetido???

El ejercicio es el siguiente:

"Escribir un programa al que se le dé como entrada dos arrays de enteros
ordenados de forma creciente, y devuelva como salida un array ordenado de
forma creciente formado por los elementos de las entradas y sin incluir los elementos repetidos."


Éste es el código que tengo hasta ahora, pero se me repiten los valores:

Código:
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main()
{
int V1[100],V2[100],V3[200];
int n1,n2,n3,i,j,k,l;

cout<<"Ingrese la dimension del vector 1: "<<endl;
cin>>n1;
cout<<endl;
cout<<"Ingrese los elementos del vector 1: "<<endl;
for(i=0;i<n1;i++){
cin>>V1[i];
}

cout<<endl;
cout<<"Ingrese la dimension del vector 2: ";
cin>>n2;
cout<<endl; 
cout<<"Ingrese los elementos del vector 2: "<<endl;
for(i=0;i<n2;i++){
    cin>>V2[i];
}

j=0;//indice para el primer vector
k=0;//indice para el segundo vector
l=0;//indice para el tercer vector

while ((j<n1)&&(k<n2)){
      if(V1[j]<V2[k]){
           V3[l]=V1[j];     
           j++;
      }
      else{
           V3[l]=V2[k];
           k++;
      }
           l++;

 
for(i=j;i<n1;i++){
       V3[l]=V1[i];
       l++;
}

for(i=k;i<n2;i++){
       V3[l]=V2[i];
       l++;
}

n3=l;// tamaño del vector tres
cout<<endl;
cout<<"El Vector 3 es: "<<endl;
cout<<endl;
for(i=0;i<n3;i++){
     cout<<"|"<<V3[i];
}
cout<<"|"<<endl;

cout<<endl;
system("pause"); 
return 0;
}


Si saben cómo, me haríais un gran favor! Gracias

LGG


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Array elementos repetidos
« Respuesta #1 en: 5 Mayo 2015, 17:32 pm »

Tienes varias opciones. La primera se vale únicamente de tu código, el resto (lo he pensado mejor y solo pongo dos formas: la primera que será la que tengas que aplicar ahora y la segunda es más para que veas que no es necesario reinventar la rueda) usan funcionalidades de la STL

1. Paso a paso: Como los vectores originales están ordenados, puedes rellenar el vector final con el siguiente algoritmo:

  1. Partes de dos vectores iniciales, V1 y V2 y de un vector final V3.
  2. Inicializas los 'i' y 'j' a 0. 'i' iterará sobre el vector 'V1' y 'j' sobre el vector 'V2'
  3. Si el elemento V1[ i ] < V2[ j ]:
  3.1. añades V1[ i ] a V3
  3.2. incrementas 'i'
  3.3. Verificas que 'i' < n1:
  3.3.1. Si se cumple saltas al punto 3.
  3.3.2. Si no se cumple, añades todos los elementos que falten en V2 y sales
  4. En caso contrario, puede suceder que V1[ i ] == V2[ j ] o que V1[ i ] > V2[ j ]. A efectos prácticos las operaciones a realizar son las mismas. Básicamente repite los pasos comentados a partir de 3.1 pero para V2[ j ] y n2


2. usa el contenedor "set". Este contenedor tiene dos propiedades fundamentales:

* Sus elementos están siempre ordenados
* No admite duplicados

Después de almacenar todos los elementos en el set, vuelcas su contenido al vector resultado y... magia!!!

Código
  1. // Añadimos todos los elementos al contenedor "set"
  2. std::set contenedorTemporal;
  3. for( int i=0; i<n1; ++i )
  4.  contenedorTemporal.insert( V1[ i ] );
  5. for( int i=0; i<n2; ++i )
  6.  contenedorTempora.insert( V2[ i ] );
  7.  
  8. // Ahora volcamos el contenido a V3
  9. int* ptr = V3;
  10. for( auto it = contenedorTempora.begin( ); it != contenedorTemporal.end( ); ++it, ++ptr )
  11.  *ptr = *it;
  12. n3 = contenedorTemporal.size( ); // Actualizamos n3 para indicar el número de elementos en V3
  13. // En este punto, V3 tiene una lista de elementos ordenados y sin duplicados

Notas finales:

Acostúmbrate a usar nombres que signifiquen algo: n1, n2, n3, V1, V2, ... no dicen gran cosa y no ayudan demasiado en la lectura del código. No tengas miedo de usar nombres más largos... lo acabarás agradeciendo.


« Última modificación: 5 Mayo 2015, 17:37 pm por eferion » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines