Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: angel91 en 12 Enero 2012, 19:33 pm



Título: Ordenar un arreglo en c++
Publicado por: angel91 en 12 Enero 2012, 19:33 pm
Hola, soy nuevo en esto de programar y me dejaron de tarea en la universidad hacer un programa de ordenar un arreglo, y estamos viendo el tema de punteros este es el codigo que hice:

Citar
#include <stdio.h>
 #include <conio.h>
 #include <iostream.h>
 #define tam 10
 using namespace std;
 void ordenar (int arreglo[])
 {
 int i, j, temporal;
 int arreglo[tam];
 for(j=1;j<=tam;j++)
 {
 for(i=0;i<tam-1;i++)
 {
 if(arreglo>arreglo[i+1])
 {
 temporal=arreglo;
 arreglo=arreglo[i+1];
 arreglo[i+1]=temporal;
 }
 }
 }
 }

 void imprimir(int arreglo[])
 {
 int i, j;
 int arreglo[tam];
 cout<<"\nArreglo ordenado de menor a mayor\n";
 for (i=0;i<tam;i++)
 {
 cout<<arreglo<<" ";
 cout <<endl;
 }
 }

 int main()
 {
 int arreglo[tam];
 int i,j, temporal;
 for (i=0;i<tam;i++)
 {
 cout<<"Ingrese el numero "<<i+1<<":";
 cin>>arreglo;
 }

 ordenar(arreglo);
 imprimir(arreglo);
 cout<<endl;
 imprimir(arreglo);
 getch();
 system("PAUSE");
 return 0;
 }

ESPERO PUEDAN AYUDARME PORQUE ME URGE


Título: Re: Ordenar un arreglo en c++
Publicado por: Xandrete en 12 Enero 2012, 23:24 pm
Aunque ya a estas horas no puedo ayudarte mucho, porque tengo pendientes algunas tareas, si puedo decirte algunas cosillas...

Código
  1. #include <iostream>
  2. #include <vector> /*Tal vez quieras incluir esta libreria y usar vectores en lugar de arrays... son mas comodos para muchas tareas, pero bueno, tampoco hacen falta*/
  3. /*#include <conio.h> Si, comenta esta linea y tambien la del getch()... Usa otra cosa de la libreria estandar. No entiendo porque los profes prefieren que sus alumnos usen conio, pero no vector -.- */
  4. using namespace std;
  5.  
  6. int main() {
  7.     cout << "Utiliza el \"cuadrao\" dedicado a los codigos, no a las citas" << endl;
  8. }

Aparte de eso, mezclas los punteros con los valores que referencian, cosa mala... Ejemplo:
Código
  1. (...)if(arreglo>arreglo[i+1])(...)

Ten en cuenta que un array es, en el fondo, un puntero al primer elemento: arreglo es un puntero a int, mientras que arreglo[i+1] es un int!!

Además, el mismo array que rellenas en el main, al pasarselo a la función ordenar lo machacas por otro nuevo!! (La función ordenar tiene como parámetro arreglo, y dentro declaras otra vez arreglo).

Ya se ha criticado suficiente el SYSTEM("PAUSE")... dentro de las cosas malas no es lo peor y además, no hay nada nuevo que pueda decir yo.

La función ordenar aplica una especie de Bubblesort mal implementado... míratelo bien.

Ya habrá alguién que tenga más tiempo de ayudar que yo (o yo mismo, mañana por la noche (peninsular  :D)).

¡Saludos, jefe!

P.S. Tal vez me haya equivocado en alguna de mis correcciones, me lo he mirado demasiado rápido.


Título: Re: Ordenar un arreglo en c++
Publicado por: rir3760 en 13 Enero 2012, 19:03 pm
Un problema (común, me temo) es aprender C++ sin sacar provecho de las facilidades que provee su biblioteca estándar. Como ya comento Xandrete lo mejor seria utilizar la clase "vector" (y de pasadita la función "sort").

Pero si la idea es practicar con el uso de arrays y punteros hay errores que corregir empezando por los nombres de los encabezados. Por favor revisa el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

En lo general el programa no funcionara correctamente por lo ya comentado: la declaración de una variable con el mismo nombre que un parámetro no es valida y el algoritmo tiene limites incorrectos.

La función de ordenación corregida es:
Código
  1. void ordenar (int arreglo[])
  2. {
  3.   int i, j, temporal;
  4.  
  5.   for (i = tam - 1; i > 0; i--)
  6.      for (j = 0; j < i; j++)
  7.         if (arreglo[j] > arreglo[j + 1]) {
  8.            temporal = arreglo[j];
  9.            arreglo[j] = arreglo[j + 1];
  10.            arreglo[j + 1] = temporal;
  11.         }
  12. }

Un saludo


Título: Re: Ordenar un arreglo en c++
Publicado por: Xandrete en 13 Enero 2012, 20:14 pm
Un problema (común, me temo) es aprender C++ sin sacar provecho de las facilidades que provee su biblioteca estándar. Como ya comento Xandrete lo mejor seria utilizar la clase "vector" (y de pasadita la función "sort").

Pero si la idea es practicar con el uso de arrays y punteros hay errores que corregir empezando por los nombres de los encabezados. Por favor revisa el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

En lo general el programa no funcionara correctamente por lo ya comentado: la declaración de una variable con el mismo nombre que un parámetro no es valida y el algoritmo tiene limites incorrectos.

La función de ordenación corregida es:
Código
  1. void ordenar (int arreglo[])
  2. {
  3.   int i, j, temporal;
  4.  
  5.   for (i = tam - 1; i > 0; i--)
  6.      for (j = 0; j < i; j++)
  7.         if (arreglo[j] > arreglo[j + 1]) {
  8.            temporal = arreglo[j];
  9.            arreglo[j] = arreglo[j + 1];
  10.            arreglo[j + 1] = temporal;
  11.         }
  12. }

Un saludo

Yai!! Te adelantaste  ;)

Hay otras cosas que no comprendo. ¿Por qué en el main imprimes dos veces el vector arreglo? Otra cosa (aunque parezca una tontería): ¿por qué imprimes un espacio si después vas a poner un salto de línea? Me refiero a...

Código
  1. cout<<arreglo<<" "
  2. cout<<endl

Otra cosa, no hagas el cin ni cout sobre arreglo, porque es un puntero. Poder, SE PUEDE escribir un puntero, porque al fin y al cabo, no es más que un valor numérico, pero no es lo que pretendes. Me imagino que lo que querías hacer es cin >> arreglo[ i] (o lo propio con cout)

Hay muchos errores no algorítmicos... ¿no crees que has sido muy precipitado a la hora de escribir el código? Es una tarea para la uni, dices. Pues yo me inclino a pensar algo de lo siguiente:

1) O no te lo has tomado con suficiente seriedad.
2) O andas perdidísimo en la asignatura donde te hayan mandado esto. O por lo menos, te falta aclarar un poco el tema de los punteros.
3) O te estabas cayendo de sueño  ;)

Bueno, bueno, ¡saludos y a ver si lo haces con más calma!

EDITO: Me acabo de dar cuenta que lo de la falta de [ i] es porque usas el recuadro de las citas y no el del código... y claro, [ i] es la etiqueta usada para poner cursivas. Fallo mío por esta parte    :silbar:


Título: Re: Ordenar un arreglo en c++
Publicado por: angel91 en 14 Enero 2012, 02:22 am
Gracias, por su ayuda y "Xandrete" la verdad es que estoy muy perdido en esta materia (la estoy recursando porque ya la reprobe), y aparte lo hice muy noche, mi profe ya me ayudo con el programa pero gracias por ayudarme.

Y eso de la libreria vector jamas lo e visto en la clase, el profesor jamas nos a enseñado a usar esta libreria.

Gracias y un saludo desde Mexico.


Título: Re: Ordenar un arreglo en c++
Publicado por: rir3760 en 14 Enero 2012, 14:38 pm
Ventajas hay varias, por ejemplo el manejo de memoria para almacenar el numero de elementos es cortesía de la clase, otra ventaja es tratar al vector como si fuera un array.

Un ejemplo de ello basado en tu programa (leer N números y ordenarlos) es:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <vector>
  7. using std::vector;
  8. typedef vector<int>::size_type vector_sz;
  9.  
  10. #include <algorithm>
  11. using std::sort;
  12.  
  13. int main()
  14. {
  15.   cout << "Indica el numero de elementos: ";
  16.   vector_sz num_elem;
  17.   if (! (cin >> num_elem) || num_elem < 1)
  18.      return 1;
  19.  
  20.   cout << "Introduce los numeros" << endl;
  21.   vector<int> v(num_elem);
  22.   for (vector_sz i = 0; i != num_elem; i++) {
  23.      cout << "v[" << i << "] == ";
  24.      cin >> v[i];
  25.   }
  26.  
  27.   sort(v.begin(), v.end());
  28.  
  29.   cout << "Vector ordenado" << endl;
  30.   for (vector_sz i = 0; i != num_elem; i++)
  31.      cout << ' ' << v[i];
  32.   cout << endl;
  33.  
  34.   return 0;
  35. }

Un saludo