C: Encontrar los 2 numeros mayores

Iniciado por dmacias, 18 Enero 2014, 10:38 AM

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

dmacias

Buenas a todos, os prometi que volveria  :laugh: y aqui vuelvo con otro problemilla, os cuento.

Aclaro antes que nada que estoy siguiendo el libro de deitel y solo he estudiado if, else, while. Asi que no os salgais de ahí que ya para mi es mandarin xD

Me he atrancado en el problema que me pide ingresar unos numeros y que te imprima los dos mayores, que me diga el valor mas alto lo hago bien, pero no soy capaz de sacar el segundo mayor. Ya le he dado varias vueltas sin exito. Como siempre supongo que fallo en las mates y no en el lenguaje en si.

Os pongo el que a mi parecer seria mas lógico que funcionara:


/* Programa del libro Tema 3
* ejercicio 3.27 pagina 83
* Introduzca 10 valores y encuentre los dos mas altos*/

#include <stdio.h>

int contador = 1;
int numero;
int mayor = 0;
int segundo = 0;

int main()
{
while (contador <=5){
printf("Introduzca un numero: ");
scanf("%d", &numero);
contador += 1;

if(numero > mayor){    /*si num es mayor que mayor*/
mayor = numero;   /* asigna el valor a mayor*/
if (numero > segundo){   /*si numero es mayor que segundo*/
if (numero < mayor){  /*y mas pequeño que mayor*/
segundo = numero;  /*asigna el valor a segundo*/
}
}
}
printf("El numero mayor es %d y el segundo mayor %d\n", mayor, segundo);
return 0;

}


Viendo que no funcionaba reduje la entrada a 5, asi pruebo mas rapido, que seguro alguien me dice que el enunciado pone introduce 10 xD. El segundo valor siempre me lo deja como 0, una muestra:


edito: Le di a enviar en vez a previsualizar xD

dmacias

Vaya, si antes expongo el problema, antes encuentro la solucion en un post antiguo de leosansan.

Sorry por no usar eficientemente las busquedas antes :(

aqui la solucion:


/* Programa del libro Tema 3
* ejercicio 3.27 pagina 83
* Introduzca 10 valores y encuentre los dos mas altos*/

#include <stdio.h>

int contador = 1;
int numero;
int mayor = 0;
int segundo = 0;

int main()
{
while (contador <=5){
printf("Introduzca un numero: ");
scanf("%d", &numero);
contador += 1;

if(numero > mayor){
segundo = mayor;
mayor = numero;
}
else if (numero > segundo){
segundo = numero;
}

}
printf("El numero mayor es %d y el segundo mayor %d\n", mayor, segundo);
return 0;

}






Sherboc


Hola amigo  :P, necesito una explicación sobre este programa porfa!...Lo que paso es que yo no podia que me diera el segundo mayor numero y solo puse lo de tu código y listo quedo,  pero no entendí el como te encontró ese numero! :(.

Mi duda es en esto:

segundo = mayor;  /*Osea porque dices que es igual a mayor (lo que yo entiendo es que segundo entonces seria igual a 0 no??) */

else if ( numero > segundo )

segundo = numero;

/*Luego como hace esto para encontrar que el numero sea menor que el mayor y mayor a todos los demás números?)

Espero y me puedas dar una explicación clara de eso o aunque sea un Link que lo explique bien...saludos cordiales

DarK_FirefoX

#3
Cita de: sherboc en 18 Agosto 2015, 04:40 AM
Hola amigo  :P, necesito una explicación sobre este programa porfa!...Lo que paso es que yo no podia que me diera el segundo mayor numero y solo puse lo de tu código y listo quedo,  pero no entendí el como te encontró ese numero! :(.

Mi duda es en esto:

segundo = mayor;  /*Osea porque dices que es igual a mayor (lo que yo entiendo es que segundo entonces seria igual a 0 no??) */

else if ( numero > segundo )

segundo = numero;

/*Luego como hace esto para encontrar que el numero sea menor que el mayor y mayor a todos los demás números?)

Espero y me puedas dar una explicación clara de eso o aunque sea un Link que lo explique bien...saludos cordiales

Hola, ante todo Bienvenido.

Ahora, estás reviviendo un post de hace más de un año. (aunque esta acorde al problema)

Segundo, si vas a publicar código, asegurate de usar las etiquetas GeSHi para facilitar la lectura.




Ahora:

El código:

/* Programa del libro Tema 3
* ejercicio 3.27 pagina 83
* Introduzca 10 valores y encuentre los dos mas altos*/

#include <stdio.h>

int contador = 1;
int numero;
int mayor = 0;
int segundo = 0;

int main()
{
while (contador <=5){
printf("Introduzca un numero: ");
scanf("%d", &numero);
contador += 1;

if(numero > mayor){
segundo = mayor;
mayor = numero;
}
else if (numero > segundo){
segundo = numero;
}

}
printf("El numero mayor es %d y el segundo mayor %d\n", mayor, segundo);
return 0;

}


En el primer if, lo que hace es comprobar si el número que se inserto es mayor que el que se tiene almacenado como mayor. Por supuesto que en la primera iteración la variable mayor va a tener el valor 0, pues se inicializó así. En tal caso, si el número insertado es mayor que el que teníamos como mayor, vamos a decir que:

segundo = mayor;
mayor = numero;


Primero, asignamos a la variable segundo el valor de la variable mayor, porque supuestamente la variable mayor, tenía el mayor valor antes de haber encontrado este nuevo número que es mayor, por lo tanto ese valor que teníamos almacenado pasa a ser el segundo mayor. ¿Entendiste?

Ahora, en la segunda parte:

else if (numero > segundo){
segundo = numero;
}


Esto analiza el caso de que el número no sea mayor que el que tenemos hasta ahora como mayor, pero si sea mayor que el número que tenemos como segundo mayor, por eso se comprueba con la variable segundo y si se cumple que sea mayor que el valor de ella, se le asigna ese nuevo valor.

Espero que te haya quedado claro. Lee despacio y lo entenderás sin problema.

Nota: Es válido decir que este código es válido solo para números positivos, pues en caso de que haber números negativos, el resultado puede no ser el esperado

Salu2s

Sherboc

#4
 Muchas gracias por todo compañero ;D, ya lo entendí más. Pero no me queda claro lo de:

 "segundo = mayor"

Porque se supone que a la variable "segundo" ya se le a dado un valor inicial de 0,

osea por que  no me encuentra el segundo mayor valor sin poner esto? para

que decirle al compilador que le vuelva a dar el valor de "mayor" que es cero o

el valor seria el mayor numero que se encontró. Por ejemplo de 3 números

como 1, 2 y 3 se le daría el valor de 3 a "segundo"?? espero que me explique

bien y que entiendas la duda... saludos también


Sherboc

#5
 ;-) ::)

DarK_FirefoX

- No has doble post




Cita de: sherboc en 18 Agosto 2015, 21:21 PM
Muchas gracias por todo compañero ;D, ya lo entendí más. Pero no me queda claro lo de:

 "segundo = mayor"

Porque se supone que a la variable "segundo" ya se le a dado un valor inicial de 0,

osea por que  no me encuentra el segundo mayor valor sin poner esto? para

que decirle al compilador que le vuelva a dar el valor de "mayor" que es cero o

el valor seria el mayor numero que se encontró. Por ejemplo de 3 números

como 1, 2 y 3 se le daría el valor de 3 a "segundo"?? espero que me explique

bien y que entiendas la duda... saludos también



La verdad trato de entender, pero bueno:

La cuestión es que si, en la primera iteración a segundo se le va asignar 0 (pues así se inicializó), pero date cuenta que ya después cuando se encuentre un número mayor, la variable mayor, va a tener otro valor por lo tanto ese tienes que guardarlo en segundo

¿Entiendes?

Imagina este array:

{3, 5, 4, 6}

Y tenemos:

int mayor = 0;
int segundo = 0;


1ra iteración - mayor va a ser igual a 3 y segundo igual 0
2da iteración - mayor va a ser igual a 5 y segundo igual 3
3ra iteración - mayor va a ser igual a 5 y segundo igual 4 (aquí el flujo entro por el segundo if)
4ta iteración - mayor va a ser igual a 6 y segundo igual 5

Espero te haya quedado claro ahora, cuando tengas dudas, siempre utiliza casos de pruebas pequeños e intenta hacer un debug del algoritmo en papel y lápiz. Podrás darte cuenta de errores de implementación y entender correctamente como funciona el algoritmo.

Salu2s

Sherboc

Disculpa x la segunda publicación es que me equivoque y ya no lo pude

borrar...Gracias de nuevo por la explicación ahora ya lo tengo claro todo, no

entendía que se le tenia que dar el valor de mayor a segundo porque este tenia

que encontrar un numero igual de grande que mayor pero sin arre vasar

a "mayor" y por eso se le tiene que dar este valor para después ver si hay otro

segundo valor más grande :).

Que andes de lo mejor.

Glori4

Hola buenas, soy nueva en el foro y tengo una duda que no puedo resolver.
Necesito encontrar el menor de cuatro números y el segundo menor, vine para darme una idea de como se haria con el mayor pero no puedo :( solo puedo obtener el primer menor. Espero que puedan ayudarme, Saludos!

K-YreX

No se reabren temas antiguos (y este es de 2015...). Tenías que haber abierto un tema nuevo para tu problema y poner tu código para que podamos ver cómo lo estás haciendo. (El código entre etiquetas de Código GeSHi).
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;