C++ – Declarar múltiples variables en un bucle y utilizarlas para realizar cálculos

publicado por: Anonymous

Necesito hacer un programa [de consola] que obtenga el nombre completo de cinco personas, al igual que sus tres calificaciones para calcular su promedio.
En lugar de declarar variable por variable

string nom1, nom2 //...
int cal1, cal2 //...

quiero hacer un bucle for (o el que se requiera) para poder declarar cinco variables de nombre y tres variables de calificación y utilizarlas para mostrarlas en pantalla, al igual que para realizar cálculos.

Para ello, creé esta atrocidad para intentar hacerme tan siquiera una idea:

#include<math.h>
#include<iostream>
#include<string>
//Actualizado porque tenía errores.

using namespace std;
int main()
{
        int lims = 5; //límite de estudiantes
        for (int nsx = 1; nsx < lims; ++nsx) //nsx: núm. de estudiante
        {
            cout << "Introduzca el nombre del " << nsx << "° alumno: ";
            string ns;
            cin >> ns;

            int limc = 3; //límite de calificaciones
            for (int cx = 1; cx < limc; ++cx) // cx: número de calificación
                cout << "Introduzca la calificación no. " << cx << " de " << ns << ": ";
                double c;
                cin >> c;

            switch (nsx) // Si se deja fuera del bucle for, no va a
                         // reconocer uno o más identificadores.
            {
            case 5:
                cout << "Alumno/atCalificaciontPromedio";
                for (int nsx = 1, cx = 1; cx < limc, nsx < lims; ++nsx, ++cx)
            //Aquí quería hacer una tabla pero no logro hacer un formato adecuado :b
                    cout << "n" << ns << "t" << cx << ". " << c << "nt";
                break;
            }
        }
}

Sin embargo, no he conseguido lo que esperaba. Cuando introduzco un nombre, me muestra “Introduce la calificación no. 1 de [nombre]: Introduce la calificación no. 2 de [nombre]: “. Esto puede ser porque está en el mismo bucle for, pero si lo separo no puedo mostrar los datos introducidos al final debido a que “no están definidos los identificadores”.

¿Es posible lograr esto, o es algo que ni la magia puede lograr?

solución

Estás teniendo un problema con los bucles for.

Cuando se utiliza un bucle, todas las acciones que se van a realizar dentro de él deben estar dentro de llaves ({ }) a menos que el bucle for ejecute una sola accion por iteración.

En tu caso, tienes lo siguiente:

for (int cx = 1; cx < limc; ++cx) // cx: número de calificación
   cout << "Introduzca la calificación no. " << cx << " de " << ns << ": ";
   double c;
   cin >> c;

El programa aquí está interpretando que sólo debe iterar la primera de las tres líneas que deberían estar dentro del bucle; es decir, sólo está ejecutando la línea:

cout << "Introduzca la calificación no. " << cx << " de " << ns << ": ";

La ejecuta la primera vez y muestra: “Introduce la calificación no. 1 de [nombre]:”, y automáticamente vuelve a comenzar el ciclo porque al no haber llaves intepreta que debe ejecutar esa línea únicamente. Es por esto que acto seguido imprime en pantalla: “Introduce la calificación no. 2 de [nombre]:.

La solución a este problema es simplemente encerrar las tres líneas de código entre llaves, como se muestra a continuación:

for (int cx = 1; cx < limc; ++cx)
{
    cout << "Introduzca la calificación no. " << cx << " de " << ns << ": ";

    double c;

    cin >> c;
}

Ahora el bucle for se comportará tal y como debería.

Otras cosas…

En tu función main te está faltando el retorno que, por defecto, es return 0; o return EXIT_SUCCESS;.
Podrías, además, considerar trabajar este problema con funciones, ya que esto hará que tu código sea más legible, entendible y facilite el proceso de depuración del programa.

Por otro lado, dentro del case 5 de tu switch estás teniendo un bucle for que está queriendo hacer uso de la variable c que fue declarada y usada en el bucle que ingresa las calificaciones de los alumnos. Cuando hayas corregido lo de las llaves, verás que el compilador te tirará un error precisamente allí, cuando quieres volver a usar la variable c, y esto se debe a que el alcance de una variable se ve limitado por las llaves en las que esté “encerrada”.

Es decir, si tú haces lo siguiente:

for (int cx = 1; cx < limc; ++cx) // cx: número de calificación
{
    cout << "Introduzca la calificación no. " << cx << " de " << ns << ": ";
    double c;
    cin >> c;
}

Fuera de este bucle no podrás acceder a la variable c, porque su alcance está delimitado por las llaves del bucle for, y una vez que este bucle finalice, no habrá forma de acceder a la variable c. Será eliminada.

Para solucionarlo, puedes considerar trabajar con un arreglo unidimensional de variables de tipo float o int para almacenar las calificaciones de cada estudiante, o también trabajar con estructuras que puedan tener como parámetros el nombre del alumno y un vector con sus notas. Esto ya es encarar para la programación orientada a objetos (POO), por si te interesa.

Finalmente, en cuanto al formato de la tabla, intenta darle un aspecto agradable con funciones como setw(). Eso te puede servir.

¡Espero haber sido de ayuda! Un saludo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *