1

Intento hacer un control academico de 3 alumnos con 4 calificaciones y sacar su promedio. Pero recibo este error:

Error invalid types 'int[int]for array subscript.

Este es mi código:

 #include <cstdlib> 
 #include<iostream>
 using namespace std;
 int main()
 {
int control[3][4];
int calif;


for(int i=0; i<3;i++)
{
    cout<<"Ingresa la calificacion:\n";
    cin>>calif[i];
}
for(int i=0; i<3;i++)
{
    cout<<control[i];
}

}
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179

3 Answers3

4

Como han respondido más arriba calif es un entero y no vector de enteros. Pero dado que trabajas con arreglos bidimensionales puedes almacenar los valores en la matriz(arreglo bidimensional) control

Las matrices trabajan con el formato n x m en donde n en este caso serían los alumnos y m serían las calificaciones. Representado tu matriz se vería de la siguiente forma:

Estudiante 1: [90, 97, 80, 85]
Estudiante 2: [80, 98, 75, 50]
Estudiante 3: [60, 56, 70, 85]

Así se vería tu variable control con las notas almacenadas. Te dejo este código para que pruebes como funciona y se recorren arreglos bidimensionales:

for(int i=0; i<3;i++)
{
    cout<<"Estás trabajando con el alumno "<< i+1<<endl;

    for(int j = 0; j < 4; j++)
    {
        cout<<"Ingresa la calificacion "<< j + 1<<" :";
        cin>>control[i][j]; 
    }

    cout<<endl;

}


for(int i=0; i<3;i++)
{
    cout<<"Estás viendo las notas del alumno "<< i+1<<endl;

    for(int j = 0; j < 4; j++)
    {
        cout<<"Nota "<< j + 1<<" : "<<control[i][j]<<endl;
    }

    cout<<endl;
} 
Dionicio
  • 316
  • 1
  • 7
  • Apenas voy empezando con este lenguaje, me sirvió mucho de ayuda, ¡gracias! – Daniela Torres Nov 18 '18 at 15:54
  • Evita abusar de [`std::endl`](https://en.cppreference.com/w/cpp/io/manip/endl) (pues puede causar problemas de rendimiento) y favorece el uso del salto de línea explícito (`\n`). Lee [este hilo](https://es.stackoverflow.com/q/47839/2742) para saber por qué. – PaperBirdMaster Nov 19 '18 at 10:45
2

El problema es que calif se define como un entero, pero se pretende en el bucle for introducir 3 valores en calif, como si fuera un array. Habría que ver la lógica de la aplicación, pero con simplemente poner

int calif[3];

en la declaración de calif ya se arregla ese problema al que se hace referencia

2

Las respuestas de Dionicio y Ciri Gonzalez son muy buenas, pero me gustaría complementarlas con información que no han mencionado:

  • <cstdlib> es la adaptación a C++ de la cabecera de C <stdlib.h> , esta es una cabecera que incluye utilidaes generales como manejo de memoria, conversiones de cadenas de caracteres y generación de números pseudoaleatorios, no estás usando nada de esto en tu programa por lo que no deberías incluir esa cabecera.
  • No hay obligación de usar la cláusula using namespace std; pues es sólo es una ayuda a la escritura de código; si decides usar esta cláusula no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.
  • Favorece el pre-incremento frente al post-incremento, lee este artículo para saber por qué.
  • El lenguaje C++ es multiparadigma, así que a priori no estás limitado a un paradigma concreto; pero uno de los puntos fuertes del lenguaje es su soporte a la programación orientada a objetos así que te aconsejo que realmente crees un objeto para gestionar alumnos.
  • No deberías finalizar la función main sin devolver un valor. Consulta este hilo para saber por qué.

Teniendo en cuenta los consejos anteriores, tu código podría parecerse a esto:

Propuesta.

// Alumno con 4 calificaciones
struct Alumno
{
    float calificacion[4]{}; // Por defecto todas las calificaciones son 0.f
};

En general, en C++ se usan los flujos (stream) de datos para leer o escribir información, si creamos una sobrecarga del operador de inyección (>>) de std::istream y Alumno podremos leer objetos Alumno desde cualquier flujo compatible (por ejemplo consola o archivo) y lo mismo con el operador para inyectar en flujo de salida (<<):

std::istream &operator >>(std::istream &i, Alumno &a)
{
    for (auto &c : a.calificacion)
        i >> c;

    return i;
}

std::ostream &operator <<(std::ostream &o, const Alumno &a)
{
    for (auto &c : a.calificacion)
        o << c << ' ';

    return o;
}

De esta manera, tu función main podría parecerse a esto:

int main()
{
    Alumno alumno[3]; // 3 alumnos con 4 calificaciones cada uno

    // Pedir datos de los alumnos
    for (auto &a : alumno)
        std::cin >> a;

    // Mostrar datos de los alumnos
    for (const auto &a : alumno)
        std::cout << a << '\n';

    return 0;
}

Puedes ver el código funcionando aquí.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82