Programación General > C/C++
Vector compuesto de dos vectores...
ermiguel1979:
Buenas tardes a todos. Hoy tengo un (otro) superproblema con un ejercicio que no me sale 'ni palante ni patrás'. El enunciado dice así:
Esctribir un programa al que se le de 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.
Bueno, he probado muchas cosas, ninguna con éxito, para intentar que a la vez que almaceno los dos arrays de forma independiente, se guarden en el array conjunto... ese es un problema. El otro es que no se como hacer que se eliminen los elementos repetidos. Ordenarlos de forma creciente se hará con un ordenamiento burbuja (p. ej.) y lo de eliminar los repetidos, con alun tipo de comparación y contador...
El principal obstáculo lo encuentro en almacenas los datos de los dos primeros arrays en el array de salida.
En el código que mando, intento hacerlo con dos bucles for, pero luego me muestra un chorrazo de números de más...
Éste es el código que llevo hecho:
--- Código: C --- #include <stdio.h>#include <stdlib.h> #define TAMA 50#define LONG 100 int main (void){ int array_a[TAMA]; int array_b[TAMA]; int array_c[LONG]; int a, b; int longitud_a, longitud_b, longitud_c; printf("'Introduzca numero de elementos del array_a (hasta 50)': "); scanf("%i", &longitud_a); printf("'Introduzca numero de elementos del array_b (hasta 50)': "); scanf("%i", &longitud_b); longitud_c=longitud_a+longitud_b; printf("n"); printf("'Introduzca elementos del array_a'n"); for(a=0; a<longitud_a; a++){ printf("elemento %i array_a: ", a); scanf("%i", &array_a[a]); } printf("n"); printf("'Introduzca elementos del array_b'n"); for(b=0; b<longitud_b; b++){ printf("elemento %i array_b: ", b); scanf("%i", &array_b[b]); } printf("n"); printf("array_a: "); for(a=0; a<longitud_a; a++){ printf("%i", array_a[a]); } printf("n"); printf("array_b: "); for(a=0; a<longitud_b; a++){ printf("%i", array_b[a]); } printf("n"); /*Aqui intento llenar el array_c con los elementos de los otros dos pero..*/ for(a=0; a<longitud_a; a++){ array_c[a]=array_a[a]; } a=a+1; b=0; for(b=0; b<longitud_b; b++, a++){ array_c[a]=array_b[b]; } /*al mostrarlo, no está como debiera*/ printf("array_c: "); for(a=0; a<longitud_c; a++){ printf("%i", array_c[a]); } printf("n"); return 0;}
Ojalá podasi orientarme un poco, porque no se como segir.
Gracias. Un saludo!
Miguel.
ProfesorX:
Hola ermiguel1979, te dire que vas bien con tu algoritmo solo tienes un error en la linea 49:
--- Código: C++ --- a=a+1; b=0; 1
No necesitas incrementar "a", ya que al salir del ciclo anterior, "a" ya tiene el valor de la siguiente posicion del vector, cuando lo incrementas en esta linea te estas saltando una posicion del vector_c, y esa posicion es probable que contenga basura, por eso al imprimir vector_c te muestra ese valor basura. Tampoco necesitas hacer b = 0 ya que en la siguiente linea en tu ciclo for ya tienes b = 0. Ademas deberias colococar un espacio vacio en tus printf despues del %i de la siguiente manera:
--- Código: C++ --- printf("%i ", array_c[a]);
para que los numeros no te aparezcan pegados y parezcan que son un mismo numero cuando en realidad son varios numeros.
Ahora, para eliminar los duplicados, una vez que ya tengas ordenado el vector, necesitas un ciclo que recorra todo el vector, comparando cada elemento con el siguiente (array_c == array_c[i+1]), cuando sean iguales, haces un corrimiento de todo el vector hacia adelante (array_c = array_c[i+1]), mediante otro ciclo, para que elimines el elemento, cuando termines el corrimiento, disminuyes la variable que te guarda el total de elementos de vector_c (o sea si el total de elementos de tu vector es de 10, le quitas 1 para que quede en 9, ya que eliminaste un elemento al hacer el corrimiento) y vuelves a hacer la comparacion desde el principio de cada elemento con el siguiente, asi hasta que no encuentres elementos iguales.
Atento al tamaño del vector, para que al hacer la comparacion no sobrepases sus indices, o sea, si tu vector tiene 10 elementos, no puedes hacer una comparacion del elemento 10 con el 11, ya que el 11 no existe. Si le quitas un elemento es lo mismo, cuidado con pasarte de los indices, en este ejemplo, si quitas 1, te queda 9, entonces ya no puedes compara el elemento 9 con el 10 porque el 10 ya no existe (aunque fisicamente si exsita, pero tu deberas hacer como si no existiera).
Con esas pistas supongo que lo podras terminar.
Saludos :)
Aragorn_montaraz:
Aprovechando que los vectores array_a y array_b deberian estar ordenados ascendientemente, abria una forma más eficiente de hacerlo que juntar los dos vectores y luego ordenarlos.
Sería ir recorriendo los dos vectores elemento a elemento y eligiendo el menor elemento de los dos, que siempre estará en la primera posición, para colocarlo en el array_c.
Seria algo así:
--- Código: C --- int ele;for(a = 0, b = 0, c = 0; c < longitud_c; c++) { if (array_a[a] < array_b[b]) { //Copiamos el menor elemento. array_c[c] = array_a[a]; ele = array_a[a]; while (array_a[a] == ele) a++; //"Eliminamos" ese elemento de a y los repetidos. } else if (array_a[a] > array_b[b]) { //Copiamos el menor elemento. array_c[c] = array_b[b]; ele = array_b[b]; while (array_b[b] == ele) b++; //"Eliminamos" ese elemento de b y los repetidos. } else { //Los dos elementos son iguales. Copiamos uno y eliminamos repetidos de los dos. array_c[c] = array_b[b]; ele = array_b[b]; while (array_b[b] == ele) b++; while (array_a[a] == ele) a++; }}
Es más dificil de entender, pero mucho más eficiente.
ermiguel1979:
ProfesorX, he corregido lo del contador y he podido seguir con el ejercicio. He almacenado los valores de los dos arrays de entrada en el tercero y lo he ordenado de forma creciente con la "burbuja", pero a la hora de hacer lo que dices de recorrer el vector desplazando los repetidos para ehcarlos fuera, no logro hacerlo.
Lo he solucionado de dos formas: una es mostrando solamente los elementos no repetidos.
--- Código: C --- /*Mostrar array_c SIN elementos repetidos (opción 'imprimir')*/ printf("array_c SIN elementos repetidos: "); //no modifica array en memoria for(a=0; a<longitud_c; a++){ if(array_c[a]!=array_c[a+1]){ printf("%i ", array_c[a]); }else{ continue; } } printf("n"); return 0;}
Cosa de no deja de resultarme bastante chapucera...
La otra, es volver a hacerle la "burbuja" al array de salida... tampoco de gusta mucho, pero al menos sí modifica el array en memoria:
--- Código: C --- /*Mostrar array_c SIN elementos repetidos (opción 'burbuja')*/ for(a=0; a<longitud_c; a++){ if(array_c[a]==array_c[a+1]){ posicion=a; for(b=posicion+1; b<longitud_c; b++){ aux=array_c[b+1]; array_c[b+1]=array_c[b]; array_c[b]=aux; } longitud_c=longitud_c-1; } }
Que me deja algo más contento, pero no creo que se parezca a lo que comentabas.
Si puedes indicarme algo más sobre esa forma en que dices que puede hacerse...
Gracias ProfesorX :good:
ermiguel1979:
Hola Aragorn_montaraz. Sobre la solución que comentas, he estado trabajando y, aunque no entiendo muy bien como funciona...
... parece tener un problema a la hora de mostrar el vector resultante.
La cosa es que cuando lo muestra, añade basura al quedar sin machacar varias direcciones correspondientes a los elementos repetidos en los arrays de entrada.
Intento solucionarlo con un contador que debería incrementarse en uno cada vez que se guarda un valor en el array de salida. Más tarde, este contador será usado a modo de dimensión del array de salida, a la hora de mostrarlo en pantalla.
El problema está, supongo, en que como no se bien como trabaja el código, no se donde colocar los incrementos del contador.
Te envío el código para ver si puedes decirme dónde irían los incrementos del contador, o de que manera solucionarlo sin él.
--- Código: C --- /*Escribir el array_c con los elementos de los arrrays 'a' y 'b'*/ for(a = 0, b = 0, c = 0; c < longitud_c; c++) { if (array_a[a] < array_b[b] && a<longitud_a) { //Copiamos el menor elemento. array_c[c] = array_a[a]; ele = array_a[a]; contador=contador+1; while (array_a[a] == ele) a++; //"Eliminamos" ese elemento de a y los repetidos. } else if (array_a[a] > array_b[b] && b<longitud_b) { //Copiamos el menor elemento. array_c[c] = array_b[b]; ele = array_b[b]; contador=contador+1; while (array_b[b] == ele) b++; //"Eliminamos" ese elemento de b y los repetidos. } else { //Los dos elementos son iguales. Copiamos uno y eliminamos repetidos de los dos. array_c[c] = array_b[b]; ele = array_b[b]; while (array_b[b] == ele) b++; while (array_a[a] == ele) a++; } } printf("%in", contador);printf("array_c: "); //mostrar array_c for(a=0; a<=contador+1; a++){ printf("%i ", array_c[a]); }
Gracias por la ayuda.
Un saludo!
Navegación
[#] Página Siguiente
Ir a la versión completa