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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda para insertar de forma ordenada en un vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda para insertar de forma ordenada en un vector  (Leído 2,869 veces)
elcentral_

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda para insertar de forma ordenada en un vector
« en: 6 Diciembre 2020, 17:05 pm »

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:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(){
  5.  
  6.  const int TERMINADOR=-1;
  7.  double dato, referencia;
  8.  const int TAMANIO=1e5;
  9.  double vector[TAMANIO], mayores_que[TAMANIO];
  10.  int utilizados_vector, k;
  11.  
  12.  cout << "k valores mayores que."
  13.       << "\nIntroduzca reales con terminador "
  14.       << TERMINADOR << "\n";
  15.  
  16.  utilizados_vector=0;
  17.  
  18.  cout << "\nIntroduzca un número real: ";
  19.  cin >> dato;
  20.  
  21.  while ( (dato!=TERMINADOR)&&(utilizados_vector<TAMANIO)) {
  22.  
  23.     vector[utilizados_vector]=dato;
  24.     utilizados_vector++;
  25.     cout << "\nIntroduzca un número real (ó -1 para terminar): ";
  26.     cin >> dato;
  27.  
  28.  }
  29.  
  30. cout << "\nIntroduzca el valor de referencia: ";
  31.  cin >> referencia;
  32.  cout << "\nIntroduzca la dimensión máxima del vector a mostrar: ";
  33.  cin >> k;
  34.  
  35.  int cont=1;
  36.  int i=1;
  37.  double a_insertar, aux;
  38.  
  39. while ((i<utilizados_vector)&&(cont<=k)) {
  40.  
  41.  if (vector[i]>=referencia) {
  42.  
  43.  a_insertar=vector[i];
  44.  
  45.  if (cont!=1) {
  46.  
  47.  for (int j=1; j<=cont; j++) {
  48.  
  49.      if (mayores_que[j]>a_insertar) {
  50.  
  51.        aux=mayores_que[j];
  52.        mayores_que[j]=a_insertar;
  53.        mayores_que[j++]=aux;
  54.  
  55.        }
  56.  
  57.  }
  58.  
  59.  }
  60.  else {
  61.  mayores_que[cont]=a_insertar;
  62.  }
  63.      cont++;
  64.     }
  65.     i++;
  66.  }
  67.  
  68.  for (int i=1; i<=cont; i++) {
  69.     cout << mayores_que[i] << " ";
  70.  }
  71.  return 0;
  72. }


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 Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: Ayuda para insertar de forma ordenada en un vector
« Respuesta #1 en: 6 Diciembre 2020, 21:51 pm »

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:

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. int main(int argc,char*argv[])
  6. {
  7.    const int TERMINADOR=-1;
  8.    double dato, referencia;
  9.    std::vector<double> vector,mayores_que;
  10.    int i,cont,k;
  11.  
  12.    std::cout << "k valores mayores que."
  13.        << "\nIntroduzca reales con terminador "
  14.        << TERMINADOR << "\n";
  15.  
  16.    do
  17.    {    
  18.        std::cout << "\nIntroduzca un número real: ";
  19.        std::cin >> dato;
  20.        if(dato!=TERMINADOR)
  21.            vector.push_back(dato);
  22.    }while(dato!=TERMINADOR);
  23.  
  24.    std::cout << "\nIntroduzca el valor de referencia: ";
  25.    std::cin >> referencia;
  26.  
  27.    do
  28.    {
  29.        std::cout << "\nIntroduzca la dimensión máxima del vector a mostrar: ";
  30.        std::cin >> k;
  31.    }while(k<0||k>vector.size());
  32.  
  33.    std::cout<<std::endl;
  34.  
  35.    for (i=0,cont=1;i<vector.size()&&cont<=k;i++)
  36.    {
  37.        if(vector[i]>=referencia)
  38.        {
  39.            mayores_que.push_back(vector[i]);
  40.            cont++;
  41.        }
  42.    }
  43.  
  44.    std::sort(mayores_que.begin(),mayores_que.end());
  45.  
  46.    if(mayores_que.size()>0)
  47.    {
  48.        std::cout << "Los números mayores o iguales a " << referencia << " son: ";
  49.        for (i=0;i<mayores_que.size();i++)
  50.            std::cout << mayores_que[i] << " ";
  51.        std::cout<<std::endl;
  52.    }
  53.  
  54.    return 0;      
  55. }


B#



« Última modificación: 6 Diciembre 2020, 21:53 pm por BloodSharp » En línea



K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda para insertar de forma ordenada en un vector
« Respuesta #2 en: 7 Diciembre 2020, 00:07 am »

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.
Código:
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)
Código:
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:
Código:
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 :-X
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
elcentral_

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda para insertar de forma ordenada en un vector
« Respuesta #3 en: 7 Diciembre 2020, 01:12 am »

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...

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void InsertarOrdenado (double valor, double v[], int size) {
  5.  
  6.   int indiceInsercion=0; // indice que le corresponde al elemento
  7.  
  8.   while ((indiceInsercion<size)&&(v[indiceInsercion]<valor)) {
  9.  
  10.      indiceInsercion++;
  11. }
  12.  
  13. if (indiceInsercion!=size) { // si no se inserta al final, hay que mover elementos
  14.  
  15.      for (int i=size-1; i<=indiceInsercion+1; i++) {
  16.  
  17.   v[i] = v[i-1];
  18.  
  19.   }
  20. }
  21.  
  22.    v[indiceInsercion]=valor;
  23.  
  24. }
  25.  
  26. int main(){
  27.  
  28.   const int TERMINADOR=-1;
  29.   double dato, referencia;
  30.   const int TAMANIO=1e5;
  31.   double vector[TAMANIO], mayores_que[TAMANIO];
  32.   int utilizados_vector, k;
  33.  
  34.   cout << "k valores mayores que."
  35.        << "\nIntroduzca reales con terminador "
  36.        << TERMINADOR << "\n";
  37.  
  38.   utilizados_vector=0;
  39.  
  40.   cout << "\nIntroduzca un número real: ";
  41.   cin >> dato;
  42.  
  43.   while ((dato!=TERMINADOR)&&(utilizados_vector<TAMANIO)) {
  44.  
  45.      vector[utilizados_vector]=dato;
  46.      utilizados_vector++;
  47.      cout << "\nIntroduzca un número real (ó -1 para terminar): ";
  48.      cin >> dato;
  49.  
  50.   }
  51.  
  52. cout << "\nIntroduzca el valor de referencia: ";
  53.   cin >> referencia;
  54.   cout << "\nIntroduzca la dimensión máxima del vector a mostrar: ";
  55.   cin >> k;
  56.  
  57.   int cont=1;
  58.   int i=1;
  59.   double a_insertar;
  60.  
  61. while ((i<utilizados_vector)&&(cont<=k)) {
  62.  
  63.   if (vector[i]>=referencia) {
  64.  
  65.   a_insertar=vector[i];
  66.  
  67.   if (cont==1) {
  68.  
  69.   mayores_que[cont]=a_insertar;
  70.  
  71.   }
  72.  
  73.   else {
  74.  
  75.   InsertarOrdenado (a_insertar, mayores_que, cont);
  76.  
  77.   }
  78.  
  79.       cont++;
  80.  
  81.      }
  82.  
  83.      i++;
  84.  
  85.   }
  86.  
  87.   for (int i=1; i<=cont; i++) {
  88.  
  89.      cout << mayores_que[i] << " ";
  90.  
  91.   }
  92.  
  93.   return 0;
  94.  
  95. }

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
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda para insertar de forma ordenada en un vector
« Respuesta #4 en: 7 Diciembre 2020, 01:38 am »

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

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
elcentral_

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda para insertar de forma ordenada en un vector
« Respuesta #5 en: 7 Diciembre 2020, 01:57 am »

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...

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void InsertarOrdenado (double valor, double v[], int size) {
  5.  
  6.   int indiceInsercion=0; // indice que le corresponde al elemento
  7.  
  8.   while ((indiceInsercion<size)&&(v[indiceInsercion]<valor)) {
  9.  
  10.      indiceInsercion++;
  11. }
  12.  
  13. if (indiceInsercion!=size) { // si no se inserta al final, hay que mover elementos
  14.  
  15.      for (int i=size-1; i>=indiceInsercion; i--) {
  16.  
  17.   v[i]=v[i-1];
  18.  
  19.   }
  20. }
  21.  
  22.    v[indiceInsercion]=valor;
  23.  
  24. }
  25.  
  26. int main(){
  27.  
  28.   const int TERMINADOR=-1;
  29.   double dato, referencia;
  30.   const int TAMANIO=1e5;
  31.   double vector[TAMANIO], mayores_que[TAMANIO];
  32.   int utilizados_vector, k;
  33.  
  34.   cout << "k valores mayores que."
  35.        << "\nIntroduzca reales con terminador "
  36.        << TERMINADOR << "\n";
  37.  
  38.   utilizados_vector=0;
  39.  
  40.   cout << "\nIntroduzca un número real: ";
  41.   cin >> dato;
  42.  
  43.   while ((dato!=TERMINADOR)&&(utilizados_vector<TAMANIO)) {
  44.  
  45.      vector[utilizados_vector]=dato;
  46.      utilizados_vector++;
  47.      cout << "\nIntroduzca un número real (ó -1 para terminar): ";
  48.      cin >> dato;
  49.  
  50.   }
  51.  
  52. cout << "\nIntroduzca el valor de referencia: ";
  53.   cin >> referencia;
  54.   cout << "\nIntroduzca la dimensión máxima del vector a mostrar: ";
  55.   cin >> k;
  56.  
  57.   int cont=0;
  58.   int i=0;
  59.  
  60. while ((i<utilizados_vector)&&(cont<k)) {
  61.  
  62.   if (vector[i]>=referencia) {
  63.  
  64.   InsertarOrdenado (vector[i], mayores_que, cont);
  65.  
  66.       cont++;
  67.  
  68.      }
  69.  
  70.      i++;
  71.  
  72.   }
  73.  
  74.   for (int i=0; i<cont; i++) {
  75.  
  76.      cout << mayores_que[i] << " ";
  77.  
  78.   }
  79.  
  80.   return 0;
  81.  
  82. }
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda para insertar de forma ordenada en un vector
« Respuesta #6 en: 7 Diciembre 2020, 02:28 am »

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:
Código:
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

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Insertar gifs de forma sencilla
Diseño Gráfico
panaka 5 2,977 Último mensaje 13 Marzo 2006, 22:57 pm
por panaka
una ayuda para insertar codigo
Programación Visual Basic
Sai-To 2 1,711 Último mensaje 25 Febrero 2008, 12:43 pm
por ~~
Alguna manera de listar archivos de forma ordenada?
Programación Visual Basic
Bardick 2 2,399 Último mensaje 21 Abril 2010, 16:10 pm
por Bardick
Ayuda para manipular imagenes con un vector en C++
Programación General
ThronerAXE 0 1,578 Último mensaje 26 Julio 2014, 00:45 am
por ThronerAXE
Fallo al insertar estructura a vector de estructuras
Programación C/C++
Kaxperday 2 1,444 Último mensaje 7 Julio 2015, 16:13 pm
por Kaxperday
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines