Autor
|
Tema: Ayuda para insertar de forma ordenada en un vector (Leído 3,193 veces)
|
elcentral_
Desconectado
Mensajes: 3
|
Necesito leer datos de un vector y si son superiores a una referencia dada, meterlos en otro vector de forma ordenada de menor a mayor. Este vector es de dimension maxima dada, es decir acabaré de leer datos del vector primero cuando la dimension del segundo llegue al limite o cuando se acabe el primer vector. Tengo esto, pero no está bien y no se seguir: #include <iostream> using namespace std; int main(){ const int TERMINADOR=-1; double dato, referencia; const int TAMANIO=1e5; double vector[TAMANIO], mayores_que[TAMANIO]; int utilizados_vector, k; cout << "k valores mayores que." << "\nIntroduzca reales con terminador " << TERMINADOR << "\n"; utilizados_vector=0; cout << "\nIntroduzca un número real: "; cin >> dato; while ( (dato!=TERMINADOR)&&(utilizados_vector<TAMANIO)) { vector[utilizados_vector]=dato; utilizados_vector++; cout << "\nIntroduzca un número real (ó -1 para terminar): "; cin >> dato; } cout << "\nIntroduzca el valor de referencia: "; cin >> referencia; cout << "\nIntroduzca la dimensión máxima del vector a mostrar: "; cin >> k; int cont=1; int i=1; double a_insertar, aux; while ((i<utilizados_vector)&&(cont<=k)) { if (vector[i]>=referencia) { a_insertar=vector[i]; if (cont!=1) { for (int j=1; j<=cont; j++) { if (mayores_que[j]>a_insertar) { aux=mayores_que[j]; mayores_que[j]=a_insertar; mayores_que[j++]=aux; } } } else { mayores_que[cont]=a_insertar; } cont++; } i++; } for (int i=1; i<=cont; i++) { cout << mayores_que[i] << " "; } return 0; }
MOD: El código debe ir entre etiquetas de Código GeSHi
|
|
« Última modificación: 6 Diciembre 2020, 22:32 pm por K-YreX »
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 812
¡ Hiperfoco !
|
Necesito leer datos de un vector y si son superiores a una referencia dada, meterlos en otro vector de forma ordenada de menor a mayor. Este vector es de dimension maxima dada, es decir acabaré de leer datos del vector primero cuando la dimension del segundo llegue al limite o cuando se acabe el primer vector. Yo te sugeriría terminar de ordenar el vector de mayores que al final del insertado, además no es necesario crear el método de ordenamiento cuando en C++ ya está pre-hecho con la función sort: #include <iostream> #include <vector> #include <algorithm> int main(int argc,char*argv[]) { const int TERMINADOR=-1; double dato, referencia; std::vector<double> vector,mayores_que; int i,cont,k; std::cout << "k valores mayores que." << "\nIntroduzca reales con terminador " << TERMINADOR << "\n"; do { std::cout << "\nIntroduzca un número real: "; std::cin >> dato; if(dato!=TERMINADOR) vector.push_back(dato); }while(dato!=TERMINADOR); std::cout << "\nIntroduzca el valor de referencia: "; std::cin >> referencia; do { std::cout << "\nIntroduzca la dimensión máxima del vector a mostrar: "; std::cin >> k; }while(k<0||k>vector.size()); std::cout<<std::endl; for (i=0,cont=1;i<vector.size()&&cont<=k;i++) { if(vector[i]>=referencia) { mayores_que.push_back(vector[i]); cont++; } } std::sort(mayores_que.begin(),mayores_que.end()); if(mayores_que.size()>0) { std::cout << "Los números mayores o iguales a " << referencia << " son: "; for (i=0;i<mayores_que.size();i++) std::cout << mayores_que[i] << " "; std::cout<<std::endl; } return 0; }
B#
|
|
« Última modificación: 6 Diciembre 2020, 21:53 pm por BloodSharp »
|
En línea
|
|
|
|
K-YreX
|
Cuando hay que implementar algoritmos que requieren usar un poco el coco ayuda bastante crear funciones y separar así el código. Esto ayuda a entender mejor el funcionamiento y en caso de error es más fácil saber a qué función dirigirse para corregirlo. La parte de los valores de entrada lo obviaré pues no será ningún problema. Entonces empezamos con un array <vector> lleno de números y otro <mayores> vacío donde hay que introducir los <numMayores> primeros valores de <vector> que sean mayores que <valorMinimo> ordenados. insertados := 0 // numero de elementos insertados en mayores indice := 0 MIENTRAS indice < vector.size AND insertados < numMayores HACER SI vector[indice] >= valorMinimo ENTONCES insertarOrdenado(vector[indice], mayores) // Inserta el valor indicado en el array de forma ordenada insertados := insertados + 1 // incrementa el numero de insertados en el array FIN SI FIN MIENTRAS Ya está como ves queda muy muy sencillo. Ahora obviamente hay que entrar en lo que sería la función insertarOrdenados() y ver cómo hacerla, pero ya vamos dividiendo el trabajo. En la función insertarOrdenado() tienes que ver qué índice le correspondería al valor a insertar. Si ese índice no es la primera posición libre, tendrás que mover todos los valores a la derecha de este. Necesitas conocer también el número de elementos actuales del array por lo que tendrás que pasarlo por parámetro también. Además recomiendo pasar la longitud máxima del array para comprobar que hay huecos (aunque en este caso ya lo hemos comprobado antes con: insertados < numMayores por lo que no es obligatorio) Función insertarOrdenado (valor : entero, v : array, size : entero, maxSize : entero) INICIO SI size < maxSize ENTONCES // comprobar que hay huecos. Se puede omitir en este caso pero mejor no. Asi la funcion es mas reutilizable y evita errores indiceInsercion := 0 // indice que le corresponde al elemento MIENTRAS indiceInsercion < size AND v[indiceInsercion] < valor HACER indiceInsercion := indiceInsercion + 1 FIN MIENTRAS SI indiceInsercion != size ENTONCES // si no se inserta al final, hay que mover elementos moverDerecha(v, indiceInsercion, size+1) // Mueve una posicion a la derecha desde el indiceInsercion para hacer el hueco. Los detalles los explico mas adelante FIN SI v[indiceInsercion] = valor FIN SI FIN Ahora vamos a la última función que nos falta: moverDerecha(). Esta función mueve una posición a la derecha desde el índice indicado hasta el final. Realmente hay que hacerlo en sentido inverso, es decir, empezar por el final e ir guardando en cada posición el valor de la anterior (para no sobreescribir datos y que falle). El último parámetro que he pasado (size+1) indica la longitud del array. Hay que entender que ahora ya trabajamos con un elemento más (aunque de momento haya un hueco) por lo que si ponemos size, tendremos problemas con el último valor. El pseudocódigo de esta sería: Funcion MoverDerecha (v: array, inicio : entero, longitud : entero) INICIO PARA i := longitud - 1 HASTA inicio + 1 HACER // Desde el final hasta el indice del hueco mover los elementos. En inicio ya no hace falta pues lo vamos a sobreescribir v[i] = v[i-1] FIN PARA FIN Y con esto ya estaría terminado. Si implementas cada una de las funciones que te he comentado y las juntas, funcionará correctamente. Si tienes algún problema postea tus avances para ir guiándote o corregirte los errores. Suerte
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
elcentral_
Desconectado
Mensajes: 3
|
Gracias por sus aportes... al final he dividido un poco el código y he hecho una función, pero me sigue dando problemas el primer elemento del vector, ya que no lo coge a la hora de meterlo en el nuevo vector. A ver si dan con el fallo... #include <iostream> using namespace std; void InsertarOrdenado (double valor, double v[], int size) { int indiceInsercion=0; // indice que le corresponde al elemento while ((indiceInsercion<size)&&(v[indiceInsercion]<valor)) { indiceInsercion++; } if (indiceInsercion!=size) { // si no se inserta al final, hay que mover elementos for (int i=size-1; i<=indiceInsercion+1; i++) { v[i] = v[i-1]; } } v[indiceInsercion]=valor; } int main(){ const int TERMINADOR=-1; double dato, referencia; const int TAMANIO=1e5; double vector[TAMANIO], mayores_que[TAMANIO]; int utilizados_vector, k; cout << "k valores mayores que." << "\nIntroduzca reales con terminador " << TERMINADOR << "\n"; utilizados_vector=0; cout << "\nIntroduzca un número real: "; cin >> dato; while ((dato!=TERMINADOR)&&(utilizados_vector<TAMANIO)) { vector[utilizados_vector]=dato; utilizados_vector++; cout << "\nIntroduzca un número real (ó -1 para terminar): "; cin >> dato; } cout << "\nIntroduzca el valor de referencia: "; cin >> referencia; cout << "\nIntroduzca la dimensión máxima del vector a mostrar: "; cin >> k; int cont=1; int i=1; double a_insertar; while ((i<utilizados_vector)&&(cont<=k)) { if (vector[i]>=referencia) { a_insertar=vector[i]; if (cont==1) { mayores_que[cont]=a_insertar; } else { InsertarOrdenado (a_insertar, mayores_que, cont); } cont++; } i++; } for (int i=1; i<=cont; i++) { cout << mayores_que[i] << " "; } return 0; }
MOD: El código debe estar publicado entre etiquetas de Código GeSHi
|
|
« Última modificación: 7 Diciembre 2020, 01:25 am por K-YreX »
|
En línea
|
|
|
|
K-YreX
|
Lo primero de todo: el código debe estar publicado entre etiquetas de Código GeSHi. Ya te hemos corregido los mensajes anteriores pero lo suyo es que lo hagas tú a partir de ahora. Si no sabes cómo hacerlo, encima del cuadro de texto hay un desplegable que dice "Código GeSHi". Ahí tienes que seleccionar el lenguaje correspondiente y aparecerán en el cuadro de texto dos etiquetas code. Tu código debe ir entre esas dos etiquetas. Las etiquetas también las puedes escribir a mano sin usar el desplegable.
Los problemas que veo a simple vista son: - Línea 15 -> El for() debe empezar por el final e ir hacia el principio por lo que tienes que revisar tanto la condición como la actualización (los dos últimos campos del for()).
- Línea 87 -> En C/C++ los arrays empiezan en la posición 0. Por lo tanto un array de longitud 5 tendrá como último elemento el 4 {0, 1, 2, 3, 4}. Esto es importante al trabajar con los índices de los arrays. Tienes que corregir eso pues no muestras el elemento 0 (porque empiezas en 1) y muestras el elemento cont (que ya está fuera del límite).
- Línea 57 -> Por el mismo motivo que el punto anterior, debes empezar en 0.
- Línea 61 -> Por el mismo motivo otras vez, no puedes repetir el bucle si (cont == k) porque estarás accediendo fuera del límite. Tienes que corregir la condición.
Otras cosas que puedes mejorar son: - Líneas 59 y 65 -> La variable <a_insertar> no es necesaria. Puedes utilizar directamente <vector>.
- Líneas 67 - 77 -> El if-else no es necesario. No tienes que tratar el primer caso diferente pues la función InsertarOrdenado() funciona correctamente para todos los casos.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
elcentral_
Desconectado
Mensajes: 3
|
Muchas gracias por la ayuda. Y perdon por no poner el código bien. Ya he corregido algunas cosas pero me sigue sin salir. Uno de los valores insertados en el nuevo vector, es 0, concretamente el primero... #include <iostream> using namespace std; void InsertarOrdenado (double valor, double v[], int size) { int indiceInsercion=0; // indice que le corresponde al elemento while ((indiceInsercion<size)&&(v[indiceInsercion]<valor)) { indiceInsercion++; } if (indiceInsercion!=size) { // si no se inserta al final, hay que mover elementos for (int i=size-1; i>=indiceInsercion; i--) { v[i]=v[i-1]; } } v[indiceInsercion]=valor; } int main(){ const int TERMINADOR=-1; double dato, referencia; const int TAMANIO=1e5; double vector[TAMANIO], mayores_que[TAMANIO]; int utilizados_vector, k; cout << "k valores mayores que." << "\nIntroduzca reales con terminador " << TERMINADOR << "\n"; utilizados_vector=0; cout << "\nIntroduzca un número real: "; cin >> dato; while ((dato!=TERMINADOR)&&(utilizados_vector<TAMANIO)) { vector[utilizados_vector]=dato; utilizados_vector++; cout << "\nIntroduzca un número real (ó -1 para terminar): "; cin >> dato; } cout << "\nIntroduzca el valor de referencia: "; cin >> referencia; cout << "\nIntroduzca la dimensión máxima del vector a mostrar: "; cin >> k; int cont=0; int i=0; while ((i<utilizados_vector)&&(cont<k)) { if (vector[i]>=referencia) { InsertarOrdenado (vector[i], mayores_que, cont); cont++; } i++; } for (int i=0; i<cont; i++) { cout << mayores_que[i] << " "; } return 0; }
|
|
|
En línea
|
|
|
|
K-YreX
|
Si te fijas en el pseudocódigo que te puse, en la función moverDerecha() empiezo el for() en <longitud - 1> pero cuando lo he llamado desde insertarOrdenado() lo he hecho con <size + 1>. Por lo que realmente: i = longitud - 1 longitud = size + 1 ENTONCES -> i = (size + 1) - 1 = size EDIT: Es necesario recalcar que esa función tal y como la tienes presupone que: (size < maxSize). Por lo que sólo se puede utilizar en los casos en los que esa precondición sea cierta. No es muy buena opción, por eso comenté la alternativa de pasar la longitud máxima y comprobar la condición explícitamente. PD: En la línea 15 no es necesario el = en la condición. Basta con >. Si lo pones tampoco funcionará mal pero estás copiando un valor que luego vas a sustituir por el nuevo por lo que no es necesario. Lo importante no es que funcione sino entender lo que se está haciendo.
|
|
« Última modificación: 7 Diciembre 2020, 02:44 am por K-YreX »
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Insertar gifs de forma sencilla
Diseño Gráfico
|
panaka
|
5
|
3,253
|
13 Marzo 2006, 22:57 pm
por panaka
|
|
|
una ayuda para insertar codigo
Programación Visual Basic
|
Sai-To
|
2
|
1,835
|
25 Febrero 2008, 12:43 pm
por ~~
|
|
|
Alguna manera de listar archivos de forma ordenada?
Programación Visual Basic
|
Bardick
|
2
|
2,551
|
21 Abril 2010, 16:10 pm
por Bardick
|
|
|
Ayuda para manipular imagenes con un vector en C++
Programación General
|
ThronerAXE
|
0
|
1,722
|
26 Julio 2014, 00:45 am
por ThronerAXE
|
|
|
Fallo al insertar estructura a vector de estructuras
Programación C/C++
|
Kaxperday
|
2
|
1,683
|
7 Julio 2015, 16:13 pm
por Kaxperday
|
|