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

tomarMayor

Estas en el tema de tomarMayor en el foro de C/C++ en Foros del Web. Hola buenos días. Estoy haciendo un programa, el cual hace lo siguiente: El usuario mete una cierta cantidad de números y de esos números me ...
  #1 (permalink)  
Antiguo 20/01/2014, 03:42
 
Fecha de Ingreso: abril-2012
Ubicación: Malaga
Mensajes: 46
Antigüedad: 12 años, 1 mes
Puntos: 0
tomarMayor

Hola buenos días.
Estoy haciendo un programa, el cual hace lo siguiente:
El usuario mete una cierta cantidad de números y de esos números me dice cual es el mayor.
Lo estoy haciendo con arrays y funciones.
Os dejo el código para que le echéis un vistazo:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. float num[10];
  4. float mayor;
  5. float tomarMayor(float num[10]);
  6.  
  7. int main() {
  8.     float i=0;
  9.     for(i=0;i<=num[10];i++)
  10.     {
  11.         cout << "Introduzca un numero para introducir en el array:";
  12.         cin >>num[i];
  13.     }
  14.     cout<<tomarMayor;
  15.  
  16.     return 0;
  17. }
  18.  
  19. float *tomarMayor(float num)
  20. {
  21.     float w=0;
  22.     for(w=0;w<=num;w++)
  23.     {
  24.         if(num[w]>=num[w-1])
  25.         {
  26.             mayor = num[w];
  27.         }
  28.         else
  29.         {
  30.             mayor = num[w-1];
  31.         }
  32.     }
  33.     return mayor;
  34. }

El caso es que en el if me pone error, "invalid types 'float[float]' for array subcript",
en return mayor me pone "cannot convert float to float in return", y en cin>>num[i] me pone "invalid types `float[10][float]' for array subscript".

Alguien me podría ayudar.

Muchas gracias
  #2 (permalink)  
Antiguo 20/01/2014, 04:25
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 4 meses
Puntos: 606
Respuesta: tomarMayor

El motivo es que en la declaración del parámetro de la función lo defines como un float, no como un array de floats:

Código C++:
Ver original
  1. float *tomarMayor(float num)

Por eso cuando haces:

Código C++:
Ver original
  1. if(num[w]>=num[w-1])

Se queja porque lo estas accediendo como un array cuando no lo has declarado como tal.

También he de decir que en tu código, en la linea 5 defines la función de una manera y en la 19 de otra...
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 20/01/2014, 04:38
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: tomarMayor

Hola:

El programa tiene bastantes fallos:

Por un lado estás intentando acceder a los índices del array así:
Código C++:
Ver original
  1. cin >>num[i];
Cuando i es un float.
Los índices del array son int. No se puede acceder a array[4.5], por ejemplo (en rigor sí se podría, pero sobrecargando el operador y en todo caso ya estamos hablando de otra cosa)

Otro fallo:
Código C++:
Ver original
  1. for(i=0;i<=num[10];i++)
Estas intentando que el bucle vaya desde float = 0 (error comentado arriba) a float = num[10]. No tiene sentido, querrás que el bucle vaya hasta el índice 10 (realmente 9, ya que un array de 10 elementos va de 0 a 9), pero no hasta el valor que haya en num[10];

Por otro lado, en la declaración de la función tienes:
Código C++:
Ver original
  1. float tomarMayor(float num[10]);
y en la implementación:
Código C++:
Ver original
  1. float *tomarMayor(float num){}
La función retorna un puntero a float*, pero tú retornas mayor, que es float (no float*)

Por otro lado, el propio algoritmo de la función no te va a funcionar correctamente, porque haces comparaciones 2 a 2, por lo que realmente sólo te va a retornar el mayor de los últimos dos números comparados. Suponiendo que el blucle estuviera bien, te compararía el valor del índice 8 y del índice 9 (valores 9 y 10 del array)
Además ten cuidado porque cuando haces:

Código C++:
Ver original
  1. for(w=0;w<=num;w++)
  2.     {
  3.         if(num[w]>=num[w-1])
  4. .......................

En la primera iteración te estás saliendo fuera del array, ya que si w=0, w-1=-1, o sea que estás intentando acceder a la posición -1 del array. Si te compilase, lo siguiente que tendrías probablemente fuera un error de segmentación.

Bueno, además, haces uso de variables globales que no tienen mucho sentido.
Con respecto a recorrer el array en la función, puedes definir el tamaño del mismo con una constante, así puedes usar esa constante para recorrer el bucle, y con sólo cambiar su valor te valdrá para cualquier tamaño de array:

Te pongo una propuesta sin los errores:
Código C++:
Ver original
  1. #include <iostream>
  2.     using namespace std;
  3.  
  4.     const int tam_array=10;
  5.     float tomarMayor(float M[tam_array]);
  6.  
  7.     int main() {
  8.         float A[tam_array];
  9.         int i=0;
  10.         for(i=0;i<tam_array;i++)
  11.         {
  12.             cout << "Introduzca un numero para introducir en el array:";
  13.             cin >>A[i];
  14.         }
  15.         cout<<tomarMayor(A);
  16.  
  17.         return 0;
  18.     }
  19.  
  20.     float tomarMayor(float M[tam_array])
  21.     {
  22.         float mayor=0;
  23.         for(int w=0;w<tam_array;w++)
  24.         {
  25.             if(M[w]>=mayor)
  26.             {
  27.                 mayor = M[w];
  28.             }
  29.         }
  30.         return mayor;
  31.     }
  #4 (permalink)  
Antiguo 20/01/2014, 04:53
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: tomarMayor

hmmmm...no había visto que ya te habían respondido.
Además veo que mi código tiene un fallo

En la función mejor así:

Código C++:
Ver original
  1. float tomarMayor(float M[tam_array])
  2.     {
  3.         float mayor=M[0];//----esta es la variación, donde estaba el fallo
  4.         for(int w=1;w<tam_array;w++)//---como el valor de M[0] ya lo tienes, te ahorras una iteración y empiezas el bucle en M[1]
  5.         {
  6.             if(M[w]>=mayor)
  7.             {
  8.                 mayor = M[w];
  9.             }
  10.         }
  11.         return mayor;
  12.     }
  #5 (permalink)  
Antiguo 20/01/2014, 07:10
 
Fecha de Ingreso: abril-2012
Ubicación: Malaga
Mensajes: 46
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: tomarMayor

Muchísimas gracias a ambos por ayudarme, gracias a vuestra ayuda tengo más esperanzas para aprobar jajaja

Etiquetas: funcion, int, numero, programa
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 22:16.