Mayor valor de un vector en C

Iniciado por estudiante_1, 25 Julio 2015, 17:34 PM

0 Miembros y 1 Visitante están viendo este tema.

estudiante_1

Escribir una función que busque en un vector de números el máximo valor, e indique
su valor y posición. Se supone que el vector está desordenado.
No me sale, esto es lo que hecho, ayuda por favor. Gracias :huh:





#include<stdio.h>
#include<stdlib.h>
#include<time.h>









int main(void){
int v[10];
int i;
int mayor=0;
srand(time(NULL));
for(i=0;i<10;i++){
v[i]=(1+rand()%10);

printf("%d\n",v[i]);
}
for(i=0;i<10;i++){
   if(v[i]>mayor){

       mayor=v[i];
       printf("%d es el mayor. Su posicion es %d\n",mayor,i);
   }
   }










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

Orubatosu

Especifica el lenguaje si puedes, porque C++ tiene la clase <vector>

No he mirado mucho el programa, pero tal y como está se imprimirá cada valor que sea mayor que el anterior.

La posición no te la guarda, porque el valor i llegará siempre al final y siempre será 9. Debes de crear otra variable de tipo entero para almacenar la posición del mismo modo que guardas el mayor

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

estudiante_1

 Es en C, y cómo hago entonces para saber la posición, no lo entiendo.

DarK_FirefoX

#3
Tienes este código:

for(i=0;i<10;i++){
   if(v[i]>mayor){
       mayor=v[i];
       printf("%d es el mayor. Su posicion es %d\n",mayor,i);
   }
   }


Coje la linea con el printf y ponla después del ciclo, o sea fuera del ámbito del for, porque como lo tienes estás imprimiendo cada vez que encuentras un elemento mayor que el mayor que ya habías almacenado. Además para guardar la posición, crea otra variable y cuando encuentres un elemento mayor que el mayor que ya tenias guardado, guarda en esa variable su posición.

O sea, sería algo así:


int mayor = v[0];
int posMayor = 0;

for(i=1;i<10;i++){
   if(v[i]>mayor){
       mayor=v[i];
       posMayor = i;
   }
   }
       printf("%d es el mayor. Su posicion es %d\n",mayor,posMayor);



Otro consejo, no debes inicializar la variable mayor en 0, porque puedes tener números negativos en un array y este puede no devolverte el mayor como tal del array, lo que debes hacer es inicializar la variable con el valor del primer elemento y por ende la posición de ese elemento (que sería el mayor a priori) es 0:

int mayor = v[i];
int posMayor = 0;


Salu2s

PD: Utiliza las GeSHi si vas a publicar código

estudiante_1

Al hacerlo me sigue dando que la posición es 10.

DarK_FirefoX

#5
Cita de: estudiante_1 en 25 Julio 2015, 18:05 PM
Al hacerlo me sigue dando que la posición es 10.

Ya modifiqué mi mensaje con lo de la posición pues lo había olvidado.

:silbar:

Salu2s

Orubatosu

No basta que "te salga", debes de entender cual es el error

En primer lugar, necesitabas 2 variables. Una donde almacenar el número mas grande del array, y otro que te indique la posición.

Esos valores deben de mostrarse tras salir del bucle, no dentro del mismo. Si lo haces dentro, aparecerán cada vez que se cumpla la condición que hay dentro del if

Te recomiendo al margen de todo esto, que te acostumbres a la hora de acometer la creación de cualquier código el uso de diagramas de flujo. Antes de picar una sola línea de código plantea sobre papel que vas a hacer y como

¿Porque no funcionaba la primera versión de tu programa?

Veamos este trozo:

for(i=0;i<10;i++){
    if(v[i]>mayor){

        mayor=v[i];
        printf("%d es el mayor. Su posicion es %d\n",mayor,i);
    }
    }


Tienes un bucle que usa el valor 1 desde 0 hasta 9. Mientras el valor sea menor, permanecerás dentro.

Luego preguntas si el número que está en la posición "i" es mayor que el almacenado. Ya has visto que lo conveniente es inicializar ese valor con el del primer valor del array en lugar de con cero, por si hay negativos. Poco mas que añadir

Si se cumple esa condición, almacenas en "mayor" el contenido de v[1], pero ¿que ocurre despues?

Pues que lo imprimes, con lo cual imprimirá siempre un valor cada vez que se cumpla la condición.

Es decir: Deberías de hacer como te señalan, usar el bucle para recorrer todos los valores almacenados en v, y en caso de que su valor sea mayor que el anterior cambiar el valor de "mayor" y de "posMayor". Y una vez terminado el bucle, estarás seguro de tener los valores correctos.
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

estudiante_1

Gracias,ya me salió el problema y lo entendí.