2

Es en verdad muy sencillo, solo que estoy comenzando y se me dificulta, este es el codigo que llevo de momento:

#include <iostream>
#include <conio.h>
char nom[20];
float prom,cal,may;
int alumnos,x,suma;
void main()
{
    cout<<"Cantidad de alumnos:";cin>>alumnos;
    for(x=0;x<alumnos;x++)
    {
        cout<<"Nombre:";cin>>nom;
        cout<<"Calificacion:";cin>>cal;
        suma=suma+cal;
    }
    prom=suma/alumnos;
    cout<<"El promedio es:"<<prom;
    getch();
}

Que debo de agregar para que me de la calificación mayor?

gbianchi
  • 19,675
  • 11
  • 38
  • 58
  • Mira [ask] – gbianchi May 01 '18 at 22:26
  • el promedio o la calificacion? el codigo para el promedio esta ahi.. la calificacion basta con que vayas comprobando a medida que se vayan ingresando si es mayor a la ultima o no – gbianchi May 01 '18 at 22:27
  • la calificación mayor, quiero que se muestre al final, después de completar el registro, que se muestre junto con el promedio general del grupo (el cual ya se muestra). Gracias por responder – David Higuera May 01 '18 at 22:32
  • y no te animas a probar con lo que te dije? – gbianchi May 01 '18 at 22:36
  • Disculpa si no te entiendo, pero soy nuevo en el tema, tengo 2 días programando recién. Quizás no me estoy explicando de forma correcta, pero no se como hacer para colocar el algoritmo que diga si la calificación ingresada es mayor a la anterior. Gracias – David Higuera May 01 '18 at 23:49

2 Answers2

2

Como te dijo gbianchi en los comentarios, una manera sencilla de determinar el mayor elemento, es que vayas ingresando cada nota y compares si es mayor o igual que la nota ingresada previamente.

Para tal fin haremos uso de una variable auxiliar, a la cual nombraremos aux. Esta variable nos servirá para ir almacenando de manera temporal cada nota que ingresemos mientras recorremos el bucle for. Por otro lado, inicializaremos la variable may a cero: may = 0. De esta forma tenemos el siguiente pequeño algoritmo:

 aux = cal;
 if (aux >= may)
 {
    may = aux;
 }

Nota que al ser el valor inicial de may cero, entonces garantizamos que se pueda acceder al cuerpo del if en la primera iteración de modo que podamos asignar el valor de aux, que es el primer valor de cal, a may. Luego, ya se irá comparando sucesivamente cada valor nuevo de aux con el valor previo de may para encontrar finalmente la mayor nota. Todo esto se hace dentro del bucle for.

A parte de eso, hay pequeños errores como no inicializar la variable suma al momento de declarar. Siempre es bueno inicializar las variables que van a trabajar como contadores o acumuladores. En este caso, es conveniente asignar inicialmente el valor de 0 a suma. Otro error es que la división suma / alumnos siempre te va a devolver un valor entero. Si quieres que sea de tipo float debes hacer que al menos uno de los operandos sea de dicho tipo. Esto se consigue con un simple casteo: float(suma).

Luego está el hecho de que no especificas el espacio de nombres de los objetos cout y cin. Esto se resuelve haciendo uso de la instrucción using namespace std;, si bien esta no es considerada una buena práctica, creo que un pequeño ejercicio como este no tiene nada de malo. Alternativamente puedes escribir std::cout y std::cin cada vez que uses dichos objetos.

Finalmente, aunque aceptado por diferentes compiladores, es mejor que declares la función main de la forma int main() y al final utilices la instrucción return 0; para garantizar que tu programa ha funcionado correctamente. Más sobre esto en este enlace.

Después de todas estas correciones tu codigo debería quedar algo así:

#include <iostream>

using namespace std;

char nom[20];
float prom, cal, may = 0, aux;
int alumnos, x, suma = 0;

int main()
{
    cout << "Cantidad de alumnos: ";
    cin >> alumnos;

    for(x = 0; x < alumnos; x++)
    {
        cout << "Nombre: ";
        cin >> nom;
        cout << "Calificacion: ";
        cin >> cal;     
        suma = suma + cal;        
        aux = cal;
        if (aux >= may)
        {
            may = aux;
        }                                         
    }
    prom = (float)suma / alumnos;
    cout <<"El promedio es: " << prom << "\n";
    cout << "La mayor calificacion es: " << may;

    return 0;
}

Hay otro pequeños detalles que se pueden mejorar, como hacer uso de cin.getline() en lugar de cin, pero creo que eso daría para otra pregunta. Como recomendación te diría que experimentes ingresando un nombre con sus apellidos respectivos y veas que sucede con tu programa.

Xam
  • 834
  • 3
  • 13
  • 21
1

¿Qué debo de agregar para que me de la calificación mayor?

Para obtener el valor mayor de una secuencia de valores, simplemente almacena el valor mayor que tengas hasta el momento y substitúyelo por el valor nuevo si éste es mayor que el que tenías ya almacenado:

#include <iostream>
#include <string>

int main()
{
    std::string nombre{};
    float calificacion{}, suma{}, mayor{std::numeric_limits<float>::min()};
    int alumnos{};

    std::cout << "Cantidad de alumnos:";
    std::cin >> alumnos;

    for(int x = 0; x < alumnos; ++x)
    {
        std::cout << "Nombre:";
        std::cin >> nombre;

        std::cout << "Calificacion:";
        std::cin >> calificacion;

        suma += calificacion;
        mayor = std::max(mayor, calificacion);
    }

    std::cout << "El promedio es: " << (suma / alumnos) << '\n'
              << "La mayor calificación es: " << mayor;
    return 0;
}

En el código de ejemplo he hecho varios cambios:

  • Nombres auto-explicativos: En los años 80 y 90, teníamos que programar en pantallas de 80 caracteres de ancho y 25 líneas de alto, hacer que el código fuese escueto, conciso y apelotonado era una necesidad. Esos tiempos han quedado (por fortuna) atrás, así que llama las cosas por su nombre evitando abreviaturas y dejando espacio a tus variables para respirar.
  • Ámbitos pequeños: Se aconseja que el ámbito de las variables sea lo más pequeño posible; esto facilita seguir el código (pues no hay que retroceder continuamente a una definición varias líneas atrás para saber la historia de una variable) y evita tener que batallar contra variables de ámbitos más grandes colisionando con variables de ámbitos más pequeños. Por ello las variables que tenías en el ámbito global las he movido al ámbito de main, y la variable x de indizado del bucle existe sólo para el bucle.
  • Inicialización: He inicializado todas las variables, usando la inicialización uniforme (las llaves {} tras el nombre) para que éstas obtengan su valor por defecto (si se dejan las llaves vacías) o un valor determinado (como el valor asignado a mayor). Es una buena práctica acostumbrarse a inicializar pues evita errores, estás usando tu variable suma con valores que no conoces lo cuál puede dar lugar a comportamientos inesperados.
  • Estás programando en C++: Así que olvida las formaciones de caracteres para almacenar texto ¡usa std::string!. Por otro lado <conio.h> además de ser una cabecera de C (no de C++) no es una cabecera estándar.
  • No pagues por lo que no usas: Estás pidiendo datos al usuario que no usas para nada ¿seguro que debes pedirlos?, el nombre no lo muestras y el promedio lo almacenas pero no usas el valor almacenado... revisa tu algoritmo.
  • No abuses de using namespace std: Lee este hilo para saber más al respecto.
  • mayor tiene un valor: Asigno a mayor el menor valor almacenable en un float para que, sea cual sea la calificación introducida, siempre sea mayor a la presente.
  • suma ahora es float: si tanto suma como alumnos son de tipo entero (int) la división será entera y perderás los decimales. Por otro lado, suma se usa para acumular calificacion que es de tipo flotante (float) por lo que no tiene sentido que sea un entero.
  • main no puede devolver void: Tu compilador ni siquiera debería aceptarlo, no está permitido que la función main tenga una firma diferente a int main(int, char**) o int main().
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82