#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int main() {
int N,A;
int Calificaciones [N][A];
int cont5,cont4,cont3,cont2,cont;
int notas[cont3];
cout << "Ingrese numero de alumnos."<<endl;
cin>>A;
cout<< "Ingrese numero de notas por cada alumno"<<endl;
cin>>N;
for(cont = 0; cont <N;cont++){
cout<< endl;
for(cont2 = 0;cont2<A;cont2++){
cout<<"Alumno " <<cont2<<" Nota "<<cont<<":"<<endl;
cin>> Calificaciones[cont][cont2];
}
cout<<"-------------------------------"<<endl;
}
for(cont=0;cont<N;cont++){
for(cont2=0;cont2<A;cont2++){
printf("%5.2d ", Calificaciones[cont][cont2] );
}
cout<<endl;
}
system("pause");
return 0;
}
2 Answers
La solución propuesta por danielpmsv seguramente te vaya a funcionar si utilizas un compilador como g++. Esto es debido a que dicho compilador soporta lo que se conoce como "arrays de longitud variable" (VLA, en inglés), lo cual es propio del lenguaje C. Sin embargo, este tipo de arrays no han sido adoptados en el estandar de C++, y como ya indique, algunos compiladores lo soportan, como una extensión. Por ejemplo, si intentas usar el compilador del Visual Studio, éste te marcará un error.
La razón es sencilla, en C++ los arreglos tienen que tener un tamaño estático que sea conocido en tiempo de compilación y no de ejecución. Vale decir, que al momento de declarar un arreglo, tienes que indicar cual es su tamaño:
int arre[n]
// ~~~~~~~~ <--- ERROR. El tamaño del arreglo es una variable.
int arre[10]
// ~~~~~~~~ <--- CORRECTO. En este caso el tamaño del arreglo es una constante: 10.
Del mismo modo sucede con los arreglos bidimensionales (también conocidos como matrices). Es por eso que las declaraciones int Calificaciones [N][A];
y int notas[cont3];
son incorrectas debido a que tanto N
, A
y cont3
son todas variables y no expresiones constantes.
Y pues bien, entonces como soluciono todo esto?
Hay dos maneras: la antigua (al estilo C) que consiste en usar punteros y los operadores new
y delete
, o al estilo C++, la cual se basa en hacer uso del contenedor vector
, el cual esta definido en la librería <vector>
, que es justamente la última cabecera que has incluido en tu programa.
Debido a eso, voy a proponer la solución más "moderna" (entre comillas, porque la librería <vector>
existía ya desde el estandar de 1998).
Para empezar, la declaración es distinta:
vector<T> nombreVector(tam)
// ~~~~~~~~ <--- Aquí T representa el tipo de variable que quieres almacenar en el vector.
// Puede ser un tipo primitivo como int o un tipo definido a partir de un Struct/Class creada por el programador.
En tu ejercicio, en lugar de int notas[cont3]
, con vector
lo haríamos de la siguiente manera: vector<int> notas(cont3)
. Para la matriz int Calificaciones [N][A]
, tendríamos:
vector<vector<int>> calificaciones(N, vector<int>(A))
Volviendo a tu ejercicio, noto que el arreglo notas
nunca es utilizado en tu programa. Tampoco haces uso de la cabecera <math.h>
. Por otro lado, creas de manera innecesaria contadores. Es mejor crearlos a la hora utilizarlos en el bucle for
. Y por último, evita mezclar cout/cin
con printf/scanf
.
Con las correcciones indicadas tu programa debería quedar así:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N, A;
cout << "Ingrese numero de alumnos: ";
cin >> A;
cout << "Ingrese numero de notas por cada alumno: ";
cin >> N;
vector<vector<int>> calificaciones(N, vector<int>(A));
for (int cont = 0; cont < N; cont++)
{
cout << endl;
for (int cont1 = 0; cont1 < A; cont1++)
{
cout << "Alumno " << cont1 + 1 << " Nota " << cont + 1 << ": " << endl;
cin >> calificaciones[cont][cont1];
}
cout << "-------------------------------" << endl;
}
for (int cont = 0; cont < N; cont++)
{
for (int cont1 = 0; cont1 < A; cont1++)
{
cout << calificaciones[cont][cont1] << '\t';
}
cout << endl;
}
system("pause");
return 0;
}
Otras cosas a tener en cuenta:
- 834
- 3
- 13
- 21
-
Gracias por la explicacion. Se que habian variables sin utilizar en mi desesperacion me olvide de borrarlar antes de formular mi pregunta. Gracias! – Berly2j May 02 '18 at 02:29
El problema está en la inicialización de la matriz, ya que las variables N
y A
no está inicializadas y el compilador no sabe las dimensiones reales de la matriz. Puedes realizar la creación matriz después quee leas N
y A
, es decir poner int Calificaciones [N][A];
después de leer N
.
...
int N,A;
int cont5,cont4,cont3,cont2,cont;
int notas[cont3];
cout << "Ingrese numero de alumnos."<<endl;
cin>>A;
cout<< "Ingrese numero de notas por cada alumno"<<endl;
cin>>N;
int Calificaciones [N][A];
...
- 412
- 2
- 8
-
1
-
2En C++ los tamaños de las matrices deben ser conocidos en tiempo de compilación, si se usan valores de tiempo de ejecución entonces hablamos de un [VLA](https://en.wikipedia.org/wiki/Variable-length_array) que no es estándar y por tanto podría dejar de funcionar en otros compiladores o en otras versiones del mismo compilador. – PaperBirdMaster May 02 '18 at 05:35