Programación General > C/C++
Vector compuesto de dos vectores...
Aragorn_montaraz:
Wolas de nuevo ermiguel1979.
Primero decirte, que el algoritmo que te e puesto antes, solo funciona si los vectores array_a y array_b ya estan ordenados. En el enunciado del problema te dicen que es así, pero si los metes "a mano" debes de asegurarte de que sea así.
Respecto a lo del contador que has añadido, decirte que en realidad no haría falta. En el ejemplo que yo te e puesto, por cada iteración del bucle for, se almacena un elemento en el array_c, por lo que la variable "c" que se inicializa al principio del bucle a 0, y que se incrementa con cada iteración al acabar el bucle sería el valor del contador que estas buscando.
Si aún así quisieras usar otra variable como contador, la que tu as situado esta bien, solamente te faltaria otro incremento dentro del else.
Una ultima cosa, en algún momento, uno de los vectores a o b se quedarán sin elementos, y el bucle for dejará de funcionar. Tu has intentado paliar esto añadiendo el && a<longitud_a y el && b<longitud_b, pero conforme esta puesto no funcionaría.
La mejor solución es terminar el bucle cuando uno de los vectores se quede sin elementos. Modificando el bucle así:
--- Código: C --- for(a = 0, b = 0, c = 0; c < longitud_c && a < longitud_a && b < longitud; c++)
Y despues del for, como abrá algun vector que aún tenga elementos añadir esto:
--- Código: C --- while (b < longitud_b) { array_c[c] = array_b[b]; b++; c++}while (a < longitud_a) { array_c[c] = array_a[a]; a++; c++}
De los que siempre se ejecutará solo uno y volcará el vector que aún este lleno.
Espero haber sido de ayuda, no se que nivel tienes, alomejor es un algoritmo muy rebuscado para ti aún, si no te piden que optimizes centraté en la solución que entiendas más.
Un saludo. :hola:
ProfesorX:
Bueno, la solucion que te mencionaba antes seria algo como:
--- Código: C++ --- b = 0; a = 1; while (a < longitud_c) { while (array_c[b] == array_c[a] && a < longitud_c) { for (int i = a; i < longitud_c - 1; i++) { array_c[i] = array_c[i+1]; } longitud_c--; } b++; a++; }
Ahora, debo decir que este algoritmo no es muy eficiente, ya que en el peor de los casos, (que los repetidos esten al principio) tienes que recorrer casi todos los elementos del vector.
La solucion que plantea Aragorn_montaraz de ir juntado los dos vectores en unos solo, pero pasando solamente los no repetidos, realmente creo que es mas eficiente, aun cuando su implementacion es mas compleja.
En programacion siempre te encontraras casos asi, ya que casi siempre hay mas de una forma de resolver un mismo problema. La solucion que elijas dependera de que es mas importante para ti, la eficiencia o la simplicidad. Habra casos en que no requieras ser muy eficiente, y te vayas por la solucion mas simple de entender e implementar, otros en que la eficiencia es lo primordial, entonces deberas hacer un esfuerzo para hacerlo mas eficiente. Eso es lo bonito de la programacion, solo eso queria añadir ;)
Saludos :)
ermiguel1979:
Buenos días Aragorn_montaraz. Como se puede apreciar, mi nivel deja mucho que desear...
...pero que no se diga que no pongo empeño.
He probado lo que dices, aunque no me queda claro dónde hay que poner los "while". Como dices que van despues del "for", los he colocado aquí. Te envío esa parte del código para que me comentes, porque sigue sin funcionar correctamente. También he tenido que retocarlos un poco, porque tal y como los posteaste no hacían nada.
--- 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 && a<longitud_a && b<longitud_b; 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++; } } //y si algun array entrada aun tiene elementos por añadir... while(b<longitud_b){ if(array_b[b]>array_c[c]){ array_c[c]=array_b[b]; c++; } b++; } while(a<longitud_a){ if(array_a[a]>array_c[c]){ array_c[c]=array_a[a]; c++; } a++; } printf("array_c: "); for(a=0; a<=c; a++){ printf("%i ", array_c[a]); }printf("n");return 0;}
Gracias por tu ayuda; a ver si pillo como se hace...la cosa es que el array_c empieza bien, pero le faltan números por mostrar...
Un saludo!
ermiguel1979:
ProfesorX, gracias por el código. Ya lo he aplicado y funciona OK. Es mas sencillo de implementar, aunque no se me habría ocurrido hacerlo así.
Está muy bien cuando recorres el vector desde la segunda posición comparándola con la anterior y luego, en caso de que sean identicas, igualas el resto del vectro a su posición siguiente...
Vaya máquinas estasi hechos.
Gracias a todos por vuestra atención!!!
Un saludo.
Navegación
[*] Página Anterior
Ir a la versión completa