[C++] Problema con Arrays..

Iniciado por Wazzp, 11 Enero 2011, 20:31 PM

0 Miembros y 2 Visitantes están viendo este tema.

Wazzp

Recien empece a ver Arrays luego de dejar por un tiempo C++ por razones personales.. escribi este programa el cual crea un array de 10 espacios, los llena con introducciones por teclado, y luego deberia ordenarlo y mostrarlo.. Pero devuelve cualquier cosa.. Cual es mi error?
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdio.h>

using namespace std;
int main()
{
    int array[10],i,j;

    for (i=0; i<10; i++)
    cin>>array[i];
    cout<<endl;
    for (i=0; i<10; i++)
    cout<< array[i]<<" ";
    cout<<endl;

    for (i=0; i<10; i++)
    {
        for (j=0; j<10-1; j++)
        {
            if (array[j]>array[j+1])
            {
                int temp = array[j];
                array[j+1] = array[j];
                array[j+1] = temp;
            }

        }

        cout<<array[i]<<endl;
    }

  getchar();
  return 0;
}

mr.blood

No seria
Código (cpp) [Seleccionar]
    for (i=0; i<10; i++)
    {
        for (j=0; j<10-1; j++)
        {
            if (array[j]>array[j+1])
            {
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }

        }

        cout<<array[i]<<endl;
    }


Te respondi de cabeza y sin saber C++ asi que puede que este mal, pero me parece ilogico eso que haces de asignar 2 veces a array[j+1] array[j] ;).

Sa1uDoS

Khronos14

Sería algo así:

Código (cpp) [Seleccionar]

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
    int array[10], i, j;

    for (i=0; i<10; i++)
        cin >> array[i];

    cout << endl;

    for (i = 0; i < 10; i++)
        for (j = i + 1; j < 10; j++)
        {
            if (array[j] > array[i])
            {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }

        }

    for (i=0; i<10; i++)
        cout << array[i] << endl;

  system("pause>nul");
  return 0;
}


Saludos.

Wazzp

Cita de: Khronos14 en 11 Enero 2011, 20:42 PM
Sería algo así:

Código (cpp) [Seleccionar]

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
int array[10], i, j;

for (i=0; i<10; i++)
cin >> array[i];

cout << endl;

for (i = 0; i < 10; i++)
for (j = i + 1; j < 10; j++)
{
if (array[j] > array[i])
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}

}

for (i=0; i<10; i++)
cout << array[i] << endl;

system("pause>nul");
return 0;
}


Saludos.

Algo entendi pero estoy siguiendo un libro y supuestamente es un ejercicio que se puede hacer.. pero hay cosas que usaste que no vi tdv.. (Ej: int main(int argc, char *argv[]) )

mr.blood

#4
xDD, eso es para pasar parametros, solo que Khronos14 se ve que acostumbra a ponerlo aunque no trabaje con parametros ;).

Sa1uDoS

Khronos14

Código (cpp) [Seleccionar]
int main(int argc, char *argv[])

argc es el número de parámetros y argv es un array que contiene los parámetros de entrada del programa. No hace falta ponerlo, es como dice mr. blood, mera costumbre.

Si haces un:

Código (cpp) [Seleccionar]

cout << argv[0] << endl;


Se imprimirá en pantalla la ruta completa de tu programa, argv[1] sería el primer parámetro (si tuviera, lo compruebas con argc).

Saludos.

Wazzp

Khronos14 mr.blood gracias por la ayuda.
Khronos, tu programa lo ordena de mayor a menor, para ordenarlo de menor a mayor solo deberia cambiar el signo ">" por "<" aki--> if (array[j] > array) ??
No puedo hacer la prueba yo mismo en este momento por eso pregunto..
Graciaas!!  ;D

Khronos14

Si, para ordenar el array de menor a mayor, cambias > por < en la condición.

Saludos.

Wazzp

#8
Listoo! Muchisimas gracias! ahora tengo que completar el programa.. si quieren una vez terminado lo posteo a ver que piensan :)

Aca lo tengo terminado.. me falta solo una cosa.. Con el ultimo else.. como hago para que vuelvan a intentar? Se me ocurren varias opciones pero cual es la mejor manera de hacerlo?

Código (cpp) [Seleccionar]
//Metodo de la burbuja..

#include <iostream>
#include <stdio.h>

using namespace std;
int main()
{
    int array[10],i,j,r;

    for (i=0; i<10; i++)
    {
        cin>>array[i];
    }

    cout<<endl;

    for (i=0; i<10; i++)
    {
        cout<< array[i]<<" ";
    }
    cout<<endl;
    cout<<"--------------------------------------------------------"<<endl;
    cout<<endl;

    cout<<"Elija el metodo de ordenamiento"<<endl;
    cout<<"1.-Mayor a menor. 2.-Menor a Mayor"<<endl;
    cin>>r;
    cout<<"--------------------------------------------------------"<<endl;

    if (r==1)
    {
        for (i = 0; i < 10; i++)
       for (j = i + 1; j < 10; j++)
       {
           if (array[j] > array[i])
           {
               int temp = array[i];
               array[i] = array[j];
               array[j] = temp;
           }
        }
               for (i=0; i<10; i++)
               cout << array[i] << endl;
    }

       else if (r==2)
       {
                   for (i = 0; i < 10; i++)
       for (j = i + 1; j < 10; j++)
       {
           if (array[j] < array[i])
           {
               int temp = array[i];
               array[i] = array[j];
               array[j] = temp;
           }
        }
               for (i=0; i<10; i++)
               cout << array[i] << endl;
       }

       else
       cout<<"El numero introducido no es correcto,intentelo de nuevo"<<endl;

  getchar();
  return 0;
}

N0body

#9
Bueno, para resolver tu duda en concreto te doy esta respuesta:

Podrías poner un do { } while que abarque todo desde que tiene que elegir la opción hasta el final y hacer que todo repita con la condición de que r!=1 y r!=2. Estilo

do{
Elegis opcion

Proceso de ordenamiento
} while (r!=1&&r!=2);

Obviamente que podrás decir... pero sí yo ya comprobé q r!=1 y r!=2 en el último else! Por qué tengo que poner un do {} while que vuelva comparar y no poner un GOTO!! xD... Bueno (por lo menos a veces yo pienso cosas así) la verdad es que no todo es optimización xD, y poner un do { } while contribuirá muchísimo a la lectura del código... Además, si bien matemáticamente creo q es más óptimo, no creo q se note...

Acá algunas aclaraciones que te hago:
-En vez de copiar dos veces el algoritmo de ordenamiento cambiando tan sólo < por >, lo que comúnmente se hace (especialmente cuando se usan algoritmos más complejos) es independizar el algoritmo que ORDENA del que COMPARA. Así puedes hacer una función como la siguiente (ver explicación abajo):


int funcion (int a, int b, int i)
{
 if (a>b)
    return !i;
 if (a<b)
    return i;


Explicación: esta función toma dos enteros, a y b y los compara. El entero i está para indicar sí querés ordenar ascendentemente o al revés... por qué?
Pués, porque fijate que si i=0 la función devolverá 1 cuando a>b y 0 cuando a<b y si i=1 la función devolverá 0 cuando a>b y 1 cuando a<b...
Así el valor de i dependerá del sentido de ordenamiento elegido y en el if del algoritmo de ordenamiento pondrás dicha función...


-Declaras una variable auxiliar temp cada vez que vas a intercambiar los números, creo que sería mejor ya tenerla declarada antes, en la parte que declaras todas las variables.

-El algoritmo que usaste primera vez creo que es un método burbuja de ordenamiento, en el segundo for podrías usar j<10-1-i
En dicho ordenamiento mientras ordenas vas mostrando array, cuando según el algoritmo que usaste, luego de cada iteración del bucle principal queda ordenado y listo para mostrar array[10-i] y no array...

-Espero que entiendas bien lo que estás haciendo, el error que te corrijieron al principio (en el intercambio) demuestra que no prestaste mucha atención... espero que entiendas también el método que usas. Sino has lo siguiente, recorta muchos papelitos y a cada uno le pones un número... luego los desordenas todos y te pones a ejecutar el algoritmo tu mismo como si tu fueses la computadora, te dará una mayor comprensión del algoritmo que estás utilizando y como optimizarlo

-No me gusta mucho el algoritmo que usas luego, es correcto, pero pereferiría el de incerción (tuve que buscar como se llamaba el que yo me refería pq soy malísimo para los nombres xD) bueno, o sí no el de burbuja con la optimización de que busque hasta donde se hizo el último intercambio...