¿¿¿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:
#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
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!!!
// Añadimos todos los elementos al contenedor "set"
std::set contenedorTemporal;
for( int i=0; i<n1; ++i )
contenedorTemporal.insert( V1[ i ] );
for( int i=0; i<n2; ++i )
contenedorTempora.insert( V2[ i ] );
// Ahora volcamos el contenido a V3
int* ptr = V3;
for( auto it = contenedorTempora.begin( ); it != contenedorTemporal.end( ); ++it, ++ptr )
*ptr = *it;
n3 = contenedorTemporal.size( ); // Actualizamos n3 para indicar el número de elementos en V3
// 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.