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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ordenar un arreglo en c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ordenar un arreglo en c++  (Leído 32,543 veces)
angel91

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ordenar un arreglo en c++
« 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


« Última modificación: 12 Enero 2012, 19:57 pm por angel91 » En línea

Xandrete

Desconectado Desconectado

Mensajes: 210



Ver Perfil
Re: Ordenar un arreglo en c++
« Respuesta #1 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.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ordenar un arreglo en c++
« Respuesta #2 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|

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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Xandrete

Desconectado Desconectado

Mensajes: 210



Ver Perfil
Re: Ordenar un arreglo en c++
« Respuesta #3 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|

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:
« Última modificación: 13 Enero 2012, 20:18 pm por Xandrete » En línea

angel91

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Ordenar un arreglo en c++
« Respuesta #4 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.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ordenar un arreglo en c++
« Respuesta #5 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo en ComboBox
Programación Visual Basic
yonky_85 2 2,640 Último mensaje 28 Septiembre 2006, 18:40 pm
por CeLaYa
[ayuda][c++]ordenar arreglo
Programación C/C++
dragon_hack 4 3,742 Último mensaje 31 Julio 2010, 21:20 pm
por Littlehorse
ordenar arreglo bidimensional
Programación C/C++
jona1107 1 5,025 Último mensaje 18 Noviembre 2012, 17:37 pm
por durasno
segmentation al ordenar un arreglo de objetos
Programación C/C++
yeah_2796 0 1,786 Último mensaje 19 Mayo 2015, 22:51 pm
por yeah_2796
Ayuda en C (Arreglo, Impar y Ordenar)
Programación C/C++
ranker 5 2,919 Último mensaje 27 Mayo 2015, 22:39 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines