Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda arrays

Estas en el tema de Ayuda arrays en el foro de C/C++ en Foros del Web. Estoy intentando hacer un programa que recoja 10 valores del teclado y los ordene de menor a mayor y luego de mayor a menor. Hasta ...
  #1 (permalink)  
Antiguo 31/07/2008, 11:56
 
Fecha de Ingreso: julio-2008
Mensajes: 9
Antigüedad: 15 años, 9 meses
Puntos: 0
Ayuda arrays

Estoy intentando hacer un programa que recoja 10 valores del teclado y los ordene de menor a mayor y luego de mayor a menor. Hasta ahora he hecho esto, que en teoria deberia funcionar pero el programa, tras recoger los 10 valores, se cierra. ¿Alguien que me pueda decir por qué?



#include <iostream>
using namespace std;

int main()
{
cout << "Introduce 10 valores:"<< endl;

//arrays necesarios.
double valores [10];
double valores2[10][10];
double valores3[10];

cin >> valores [1];
cin >> valores [2];
cin >> valores [3];
cin >> valores [4];
cin >> valores [5];
cin >> valores [6];
cin >> valores [7];
cin >> valores [8];
cin >> valores [9];
cin >> valores [10];

//variables para el bucle y la funcion .
int h;
int i=1;
int b = i+1;
int j = i-1;

//funcion que compara los dos primeros valores del primer array y los ordena de menor a mayor en el segundo de
//forma correlativa en las dos primeras posiciones.
if (valores [i] >= valores [b]) valores2 [i][b] = valores [i] , valores2 [i][i] = valores [b];
else valores2 [i][b] = valores [b] , valores2 [i][i] = valores [i];
i++;

//una vez ordenados los dos primeros valores, este bucle compara el resto de los valores en funcion del incremento
//y decremento de i,b,j guardando los valores ordenados en nuevas filas del array "valores2"
for (h = 1; h<=9; h++)
{
if (valores2 [j][i] >= valores [b]) valores2 [i][b] = valores2 [j][i] , valores2 [b][b] = valores [b];
else valores2 [i][b] = valores [b] , valores2 [b][b] = valores2 [j][i];
i++;
return 0;
}

//finalmente aqui se recogen los valores buenos en un tercer y ultimo array, tras haberse repetido el bucle
//anterior 9 veces y quedando finalmente todos los valores ordenados
valores3 [1] = valores2 [1][1];
valores3 [2] = valores2 [1][2];
valores3 [3] = valores2 [2][3];
valores3 [4] = valores2 [3][4];
valores3 [5] = valores2 [4][5];
valores3 [6] = valores2 [5][6];
valores3 [7] = valores2 [6][7];
valores3 [8] = valores2 [7][8];
valores3 [9] = valores2 [8][9];
valores3 [10] = valores2 [9][10];




//aqui se imprimen en pantalla los valores por orden de menor a mayor, tal como se han generado, y despues se
//imprime de nuevo con el orden invertido para lograr asi un orden de mayor a menor
cout <<"El orden de menor a mayor es:" <<endl;
cout <<valores3[1];
cout <<", " <<valores3[2];
cout <<", " <<valores3[3];
cout <<", " <<valores3[4];
cout <<", " <<valores3[5];
cout <<", " <<valores3[6];
cout <<", " <<valores3[7];
cout <<", " <<valores3[8];
cout <<", " <<valores3[9];
cout <<", " <<valores3[10];
cout <<"."<<endl;

cout <<endl;
cout <<"El orden de mayor a menor es:" <<endl;
cout <<valores3[10];
cout <<", " <<valores3[9];
cout <<", " <<valores3[8];
cout <<", " <<valores3[7];
cout <<", " <<valores3[6];
cout <<", " <<valores3[5];
cout <<", " <<valores3[4];
cout <<", " <<valores3[3];
cout <<", " <<valores3[2];
cout <<", " <<valores3[1];
cout <<"."<<endl;

cin.get();
cin.get();

return 0;
}
  #2 (permalink)  
Antiguo 31/07/2008, 12:29
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda arrays

debe ser:
Código:
cin >> valores [0];
cin >> valores [1];
cin >> valores [2];
cin >> valores [3];
cin >> valores [4];
cin >> valores [5];
cin >> valores [6];
cin >> valores [7];
cin >> valores [8];
cin >> valores [9];
Y así con los demás, recuerda que los arreglos son a partir de cero, excepto en la declaración (double valores [10]; eso si está bien).

También debes corregir las variables:
Código:
int i=0;
y el for:
Código:
for (h = 0;  h<10; h++)
De paso podrías usar el método de la burbuja para ordenar:
http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja
  #3 (permalink)  
Antiguo 31/07/2008, 12:59
 
Fecha de Ingreso: julio-2008
Mensajes: 9
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ayuda arrays

Gracias por contestar, pero creo que te equivocas, donde hay que empezar con 0 es en las cadenas de caracteres, aun asi lo he probado cambiandolo todo lo que corresponde y nada, de todas formas en este otro programa que calcula la suma, la media y el valor mayor y menor, utilizo el array de la misma forma y funciona a la perfección:


#include <iostream>
using namespace std;

int main()
{
cout << "Introduce 10 valores: " <<endl;

double valores [10];

cin >> valores [1];
cin >> valores [2];
cin >> valores [3];
cin >> valores [4];
cin >> valores [5];
cin >> valores [6];
cin >> valores [7];
cin >> valores [8];
cin >> valores [9];
cin >> valores [10];

double x = valores [1] + valores [2] + valores [3] + valores [4] + valores [5] + valores [6] + valores [7] + valores [8] + valores [9] + valores [10];

cout << "La suma de los valores es: " << x <<endl;

cout << "El valor medio es: " << x/10 <<endl;



double y;
int z=3;
int m=7;

if (valores [1] >= valores [2]) y = valores [1];
else y = valores [2];

do
{
if (y <= valores [z]) y=valores [z];
z++;
m--;

}
while (m>=0);

cout << "El valor mayor es: " << y <<endl;




double y2;
int z2=3;
int m2=7;

if (valores [1] <= valores [2]) y2 = valores [1];
else y2 = valores [2];

do
{
if (y2 >= valores [z2]) y2=valores [z2];
z2++;
m2--;

}
while (m2>=0);

cout << "El valor menor es: " << y2 <<endl;



cin.get();
cin.get();

return 0;
}



P.D: crei que estaba usando el metodo de la burbuja, quiza me haya equivocado xD
  #4 (permalink)  
Antiguo 31/07/2008, 18:10
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda arrays

Discúlpame por no haber revisado tu código con más atención, el error no solo está en el incorrecto uso de los arreglos, sino que también está en otros puntos:
Código:
cout << "Introduce 10 valores:"<< endl;

//arrays necesarios.
double valores [10];
double valores2[10][10];
double valores3[10];

cin >> valores [0];  // He corregido el uso de los arreglos en todo el código.
cin >> valores [1];
cin >> valores [2];
cin >> valores [3];
cin >> valores [4];
cin >> valores [5];
cin >> valores [6];
cin >> valores [7];
cin >> valores [8];
cin >> valores [9];

//variables para el bucle y la funcion .
int h;
int i=0;
int b = i+1;
int j = i-1;

//funcion que compara los dos primeros valores del primer array y los ordena de menor a mayor en el segundo de
//forma correlativa en las dos primeras posiciones.
if (valores [i] >= valores [b]) valores2 [i][b] = valores [i] , valores2 [i][i] = valores [b];
else valores2 [i][b] = valores [b] , valores2 [i][i] = valores [i];
i++;

//una vez ordenados los dos primeros valores, este bucle compara el resto de los valores en funcion del incremento
//y decremento de i,b,j guardando los valores ordenados en nuevas filas del array "valores2"
for (h = 0; h<10; h++)
{
// En este punto j tiene siempre el mismo valor en este bucle lo que es incorrecto
if (valores2 [j][i] >= valores [b]) valores2 [i][b] = valores2 [j][i] , valores2 [b][b] = valores [b];
else valores2 [i][b] = valores [b] , valores2 [b][b] = valores2 [j][i];
i++;
//return 0; // Esta instrucción termina el programa por lo que la he comentado (supongo que estabas haciendo pruebas y se te olvido quitarla)
}
// A partir de este punto no he hecho más cambios, porque los anteriores afectan demasiado al resto del código. El bucle no está ordenando nada.
Cita:
donde hay que empezar con 0 es en las cadenas de caracteres
Tal vez sea así en algún otro lenguaje de programación, pero en C/C++ todos los arreglos sin importar lo que contengan se operan de la misma forma, pueden ser arreglos de char, int, long, wchar_t, objetos, etc, siempre seguirán siendo arreglos.

Cita:
de todas formas en este otro programa que calcula la suma, la media y el valor mayor y menor, utilizo el array de la misma forma y funciona a la perfección
Lo que pasa es que cuando te pasas en un arreglo más allá de su limite, el compilador no lo reporta como error, el acceso se realiza igualmente, pero se está saliendo de su sector de memoria, casualmente en ese programa nada se ha visto afectado, pero hay ocasiones en que otras variables pueden verse afectadas, o incluso causar la terminación del programa por mal acceso a memoria.

Cita:
P.D: crei que estaba usando el metodo de la burbuja, quiza me haya equivocado xD
Revisando mejor tu código me he dado cuenta que ciertamente has intentado implementar el método de la burbuja, pero me temo que está mal, como veo que no has revisado el URL que te he dado ( Wikipedia ) te dejo aquí mismo el programa que ordena los elementos usando el correcto método de la burbuja:

Este código es el mismo de la Wikipedia pero adaptado a tu propio código:
Código:
cout << "Introduce 10 valores:"<< endl;

//arrays necesarios.
double valores [10];

cin >> valores [0];
cin >> valores [1];
cin >> valores [2];
cin >> valores [3];
cin >> valores [4];
cin >> valores [5];
cin >> valores [6];
cin >> valores [7];
cin >> valores [8];
cin >> valores [9];

int j, i;
double temp;
    for(i = 9; i >= 0; i--)
    {
      for(j = 1; j <= i; j++)
      {
        if(valores[j-1] > valores[j])
        {
          /* Intercambio de numeros*/
          temp = valores[j-1];
          valores[j-1] = valores[j];
          valores[j] = temp;
        }
      }
    }
cout <<"El orden de menor a mayor es:" <<endl;
cout <<valores[0];
cout <<", " <<valores[1];
cout <<", " <<valores[2];
cout <<", " <<valores[3];
cout <<", " <<valores[4];
cout <<", " <<valores[5];
cout <<", " <<valores[6];
cout <<", " <<valores[7];
cout <<", " <<valores[8];
cout <<", " <<valores[9];
cout <<"."<<endl;
  #5 (permalink)  
Antiguo 01/08/2008, 08:43
 
Fecha de Ingreso: julio-2008
Mensajes: 9
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ayuda arrays

Bueno, he hecho varios cambios para dejar el codigo más claro ya que los nombres de los arreglos despistaban bastante. He cambiado todo lo que me decias y he revisado todo desde el principio, y el resultado es este:


http://img380.imageshack.us/my.php?image=ordenbl1.jpg

Como veras, un tanto extraño.
Así a quedado el codigo:

Código:
#include <iostream>
using namespace std;

int main() 
{
    cout << "Introduce 10 valores:"<< endl; 
      
    double A [10]; 
    double B [10][10];
    double C [10];
    
    cin >> A [0];        
    cin >> A [1];
    cin >> A [2];
    cin >> A [3];
    cin >> A [4];
    cin >> A [5];
    cin >> A [6];
    cin >> A [7];
    cin >> A [8];
    cin >> A [9];
   
int h;    
int i=0;
int b = i+1;  
int j = i-1;
    
        if (A [i] >= A [b])  B [i][b] = A [i] , B [i][i] = A [b];
        else                 B [i][b] = A [b] , B [i][i] = A [i];
        i++;

//a menos que este muy equivocado, el valor de j sí cambia, pues j va en funcion de i, y al final del bucle, i++

        for (h = 0; h<=7; h++)
        {    
        if (B [j][i] >= A [b])  B [i][b] = B [j][i] , B [b][b] = A [b];
        else                    B [i][b] = A [b]    , B [b][b] = B [j][i];
        i++;
        }


    C [0] = B [0][0];
    C [1] = B [0][1];
    C [2] = B [1][2];
    C [3] = B [2][3];
    C [4] = B [3][4];
    C [5] = B [4][5];
    C [6] = B [5][6];
    C [7] = B [6][7];
    C [8] = B [7][8];
    C [9] = B [8][9];
    
         
           cout <<"El orden de menor a mayor es:" <<endl; 
cout << C[0]; 
cout <<", " << C[1]; 
cout <<", " << C[2]; 
cout <<", " << C[3]; 
cout <<", " << C[4]; 
cout <<", " << C[5]; 
cout <<", " << C[6]; 
cout <<", " << C[7]; 
cout <<", " << C[8]; 
cout <<", " << C[9]; 
cout <<"."<<endl;        

cout <<endl;   

          cout <<"El orden de mayor a menor es:" <<endl; 
cout << C[9]; 
cout <<", " << C[8]; 
cout <<", " << C[7]; 
cout <<", " << C[6]; 
cout <<", " << C[5]; 
cout <<", " << C[4]; 
cout <<", " << C[3]; 
cout <<", " << C[2]; 
cout <<", " << C[1]; 
cout <<", " << C[0]; 
cout <<"."<<endl;    
        
cin.get();
cin.get();
              
    return 0;
}
Revisando el codigo he visto que realmente esta mal implementado el metodo de la burbuja, como decias, pero al margen de eso el programa deberia funcionar, aunque no ordene del todo los numeros.
La URL que me pasaste si la he ojeado y realmente es un metodo mucho mas sencillo, pero este es un programa didáctico, por eso me he empeñado en hacerlo así que fue como se me ocurrio :P
Muchas gracias por tomarte las molestias de revisar todo esto y contestar, un saludo.
  #6 (permalink)  
Antiguo 01/08/2008, 14:12
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda arrays

Cita:
a menos que este muy equivocado, el valor de j sí cambia, pues j va en funcion de i, y al final del bucle, i++
El valor de j no cambia en función de i, j es una variable independiente de i, aquí te paso el código corregido, le he puesto muchos comentarios para que se vea que valor tiene cada variable:

Código:
#include <iostream>
using namespace std;

int main() 
{
    cout << "Introduce 10 valores:"<< endl; 
      
    double A [10]; 
    double B [10][10];
    double C [10];
    
    cin >> A [0];        
    cin >> A [1];
    cin >> A [2];
    cin >> A [3];
    cin >> A [4];
    cin >> A [5];
    cin >> A [6];
    cin >> A [7];
    cin >> A [8];
    cin >> A [9];
   
// Mis cambios comienzan aquí
int h;
int i=0; // i vale cero
int b = i+1;  // b vale 1
int j = i-1; // j vale -1
    
        if (A [i] >= A [b])  B [i][b] = A [i] , B [i][i] = A [b];
        else                 B [i][b] = A [b] , B [i][i] = A [i];
        i++; // Ahora i vale 1
        b=i+1; // Hay que actualizar el valor de b en función de i, ahora b es 2
        j=j+1; // Hay que actualizar el valor de j en función de i, ahora j es 0

        for (h = 0; h<=7; h++)
        {    
        if (B [j][i] >= A [b])  B [i][b] = B [j][i] , B [b][b] = A [b];
        else                    B [i][b] = A [b]    , B [b][b] = B [j][i];
        i++; // A partir de este punto los valores de i serán 2, 3, 4, 5, 6, 7, 8, llegará a 9 pero en ese punto termina el for.
        b=i+1; // Hay que actualizar el valor de b en función de i, sus valores serán 3, 4, 5, 6, 7, 8, 9, llegará a 10 pero en ese punto termina el for.
        j=j+1; // Hay que actualizar el valor de j en función de i, sus valores serán 1, 2, 3, 4, 5, 6, 7, llegará a 8 pero en ese punto termina el for.
        }
// A partir de este punto no he cambiado nada.

    C [0] = B [0][0];
    C [1] = B [0][1];
    C [2] = B [1][2];
    C [3] = B [2][3];
    C [4] = B [3][4];
    C [5] = B [4][5];
    C [6] = B [5][6];
    C [7] = B [6][7];
    C [8] = B [7][8];
    C [9] = B [8][9];
    
         
           cout <<"El orden de menor a mayor es:" <<endl; 
cout << C[0]; 
cout <<", " << C[1]; 
cout <<", " << C[2]; 
cout <<", " << C[3]; 
cout <<", " << C[4]; 
cout <<", " << C[5]; 
cout <<", " << C[6]; 
cout <<", " << C[7]; 
cout <<", " << C[8]; 
cout <<", " << C[9]; 
cout <<"."<<endl;        

cout <<endl;   

          cout <<"El orden de mayor a menor es:" <<endl; 
cout << C[9]; 
cout <<", " << C[8]; 
cout <<", " << C[7]; 
cout <<", " << C[6]; 
cout <<", " << C[5]; 
cout <<", " << C[4]; 
cout <<", " << C[3]; 
cout <<", " << C[2]; 
cout <<", " << C[1]; 
cout <<", " << C[0]; 
cout <<"."<<endl;    
        
cin.get();
cin.get();
              
    return 0;
}
Aún no está ordenando correctamente, pero el código actual está bien, no debería producirse errores inesperados, lo que queda es corregir la forma en que ordena para que lo haga bien.

Cita:
Muchas gracias por tomarte las molestias de revisar todo esto y contestar
No hay de qué, es un placer poder ayudar.
  #7 (permalink)  
Antiguo 02/08/2008, 09:32
 
Fecha de Ingreso: julio-2008
Mensajes: 9
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ayuda arrays

Vaya, así que era eso, tenía la extraña idea de que al asignar el valor i+1 a la constante b, por ejemplo, tomaría un valor basado en i que se actualizaría en función de i para el resto del programa. Ya he aprendido algo nuevo xD
Muchas gracias por todo yackcae, ahora funciona como debería.
Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:49.