Se desea ingresar los números de padrón y calificaciones en un examen de los alumnos de un curso. Realizar un programa que permita cargar esta información e indique al finalizar qué alumno ha obtenido la nota más alta y su calificación.
Lo primero que podemos ver es que debemos realizar un ciclo en el que se vayan cargando los datos de entrada. No se sabe la cantidad de alumnos, así que será un ciclo con valor centinela. Como valor centinela podría usarse un valor de cero en el padrón, pero vamos a preguntar al usuario luego de cada carga si desea agregar otro dato, con una variable específica.
En cada vuelta del ciclo, se va a compara la nota ingresada con la mayor nota hasta ahora (que está en la variable notamax). Si la nota ingresada es mayor, se reemplaza la nota máxima y el padrón correspondiente. Así, al terminar el ciclo habremos comparado todas las notas con la mayor nota hasta ese momento. Luego de la última comparación, la "mayor hasta ahora" es la máxima de todas.
Para que esto funcione, la variable notamax se debe inicializar con un valor menor que cualquier valor posible de nota (En este ejemplo, -1). Así cuando se ingrese la primer nota, se reemplazará dicho valor.
#include
"stdafx.h"
#include
<iostream>
using
namespace std;
void
main()
{
int nota,padron,notamax,padronmax;
char otra;
notamax
= -1; //Menor
valor posible, cambiar para mínimo
cout<<"Desea ingresar otra nota(S/N)?";
cin>>
otra;
while (otra =='s'
|| otra =='S')
{
cout<<"Ingrese el padrón:";
cin>>padron;
cout<<"Ingrese la nota:";
cin>>nota;
if (nota>notamax) //
Cambiar el signo para mínimo
{
notamax=nota;
padronmax=padron;
}
cout<<"Desea ingresar otra nota(S/N)?";
cin>>
otra;
}
cout<<"La mejor nota es "<<notamax<<
" y es del alumno "<<padronmax;
cin>>otra;
}
Si en lugar de un máximo se busca un mínimo, sólo se debe dar vuelta el signo de la comparación y cambiar el valor inicial de notamax a un valor mayor que cualquier nota posible (por ejemplo, 11 ó 101).
Noten que si hay varios alumnos que empatan en la calificación máxima, el programa sólo guarda el padrón del primero. Reemplazando la condición (nota>notamax) por (nota>=notamax) se consigue guardar el padrón del último.
Modificando un poco el programa, se puede obtener la cantidad de alumnos que tienen dicha nota:
#include
"stdafx.h"
#include
<iostream>
using
namespace std;
void
main()
{
int nota,padron,notamax,padronmax;
int cantmax; // Cantidad de
alumnos que empatan el máximo
char otra;
notamax
= -1;
cout<<"Desea ingresar otra nota(S/N)?";
cin>>
otra;
while (otra =='s'
|| otra =='S')
{
cout<<"Ingrese el padrón:";
cin>>padron;
cout<<"Ingrese la nota:";
cin>>nota;
if (nota==notamax)
{
cantmax=cantmax+1;
// Si hay uno que empata el maximo, lo cuento
}
else if
(nota>notamax) // Cambiar el signo para mínimo
{
notamax=nota;
padronmax=padron;
cantmax=1;
//reinicio el contador de máximos
}
cout<<"Desea ingresar otra nota(S/N)?";
cin>>
otra;
}
cout<<"La mejor nota es "<<notamax<<
" y es del alumno "<<padronmax<<endl;
cout<<"un total de "<<cantmax<< " alumnos sacaron el máximo";
cin>>otra;
}
El cambio realizado consiste en agregar otra pregunta: si la nota actual es igual al máximo hasta ahora, sumar el contador. Si la nota actual es mayor, por lo tanto es un nuevo máximo y el contador vuelve a 1;
No se pueden guardar las notas de todos los máximos, porque se necesitarían tantas variables como datos vamos a ingresar (potencialmente, todos podrían se máximos) . Para resolver este problema guardando los padrones de todos los máximos, se deben usar vectores.
Por último, otra variante posible es que no se pueda saber qué valor inicial darle a notamax. Por ejemplo si se quieren comparar los saldos de cuentas bancarias sin límites de descubierto; teóricamente dichos valores pueden ser muy altos o muy bajos, sin un límite marcado de antemano.
En esos casos, se puede modificar un poco el programa, leyendo el primer dato fuera del ciclo, guardándolo como máximo y entrando al ciclo a partir del segundo elemento:
#include
"stdafx.h"
#include
<iostream>
using
namespace std;
void
main()
{
int nota,padron,notamax,padronmax;
char otra;
cout<<"Ingrese el padrón:";
cin>>padron;
cout<<"Ingrese la nota:";
cin>>nota;
notamax=nota;
padronmax=padron;
cout<<"Desea ingresar otra nota(S/N)?";
cin>>
otra;
while (otra =='s'
|| otra =='S')
{
cout<<"Ingrese el padrón:";
cin>>padron;
cout<<"Ingrese la nota:";
cin>>nota;
if (nota>notamax)
{
notamax=nota;
padronmax=padron;
}
cout<<"Desea ingresar otra nota(S/N)?";
cin>>
otra;
}
cout<<"La mejor nota es "<<notamax<<
" y es del alumno "<<padronmax;
cin>>otra;
}
No hay comentarios:
Publicar un comentario