4

Saludos.

Es mi primera vez en foros, estoy aprendiendo C++, y se me ha presentado un problema; tengo que hacer un programa que en primer momento me permita agregar datos de alumnos a una arreglo.

El problema es que que no importa la cantidad de alumnos que le indique al programa que quiero ingresar; porque me permite ingresar solamente dos alumnos y luego aparece una ventana que dice que el programa dejó de funcionar.

He intentando hacerlo de dos maneras, con switch, y con switch y con funciones, y en ambos caso me sucede lo mismo; aquí les copio el código del intento de switch y funciones, desde ya gracias a quien se tome el tiempo de ayudarme.

#include<iostream>
#include<stdlib.h>

using namespace std;    
void agregar();

int main(){

    //muestra el menu, y permite ejecutar la opcion 8.(salir del programa)

    int opcion;

    cout << "Que desea hacer?" << endl;
    cout << endl;
    cout << "1.Aregar alumno" << endl;
    cout << "2.Agregar notas de alumno" << endl;
    cout << "3.modificar notas de alumno" << endl;
    cout << "4.Eliminar alumno" << endl;
    cout << "5.Mostrar lista de aprobados" << endl;
    cout << "6.Mostrar list de reprobados" << endl;
    cout << "7.Mostrar toda la lista de alumnos" << endl;
    cout << "8.Salir del programa" << endl;
    cout << endl;
    cin >> opcion;

    switch(opcion){
        case 1:{
            agregar();
            break;
        }
    }

    system ("pause");
    return 0;
}

void agregar(){

    // variables utilizadas en void agregar()
    int m = 0, n = 0, i, r = 0;
    string codigo[m], nombre[m], grado[m];

    cout << "Cuantos alumnos desea agregar? ";
    cin >> m;
    n = n + m;

    cout << "ingrese los datos: " << endl;
    for(i = 0; i < m; i++){
        cout << "nombre del alumno " << i + 1 << ": ";
        cin >> nombre[i];

    }

    cout << "Desea ingresar mas alumnos? ";
    cout << "1.SI";
    cout << "2.No";
    cin >> r;

    if(r = 1){
        m = 0;
        void agregar();
    }else{
        m = 0;
        int main();
    }
    system ("pause");
}
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
Codigo
  • 41
  • 1
  • sera que te permite ingresar solo uno.. el vector de nombres esta definido como nombre[m] y m = 0 entonces tu vector siempre tiene 0 elementos... – gbianchi May 24 '17 at 18:17
  • gracias por tomarse el tiempo de responder, aquí le cambia el valor: cout << "Cuantos alumnos desea agregar? "; cin >> m; – Codigo May 24 '17 at 18:20
  • 1
    no.. en esa linea estas cambiando el valor de la variable m. El vector esta definido antes, y cambiar ese valor no implica cambiar el tamaño del vector previamente definido. – gbianchi May 24 '17 at 18:28
  • Gracias ya me funciono muy amable usted tenia razón ese era el problema, ahora no se si tengo que poner una clasificación de "solucionado" o "cerrado" a este tema? – Codigo May 24 '17 at 19:04
  • @Codigo podrías responder tu propia pregunta mostrando como lo solucionaste – Mariano May 24 '17 at 19:14
  • ok, al realizar el cambio que me indico @Arie CwHat; el progrma quedo asi: – Codigo May 24 '17 at 19:35
  • El error estaaba een esta parte del codigo, declaraba el areglo asignandole el tamaño de una variable en lugar de iniciarlo con unnumero y luego modificarlo con una variable. void agregar(){ int m=0,n=0,i,r=0; string codigo[100],nombre[100],grado[100]; cout<>m; n=n+m; cout<>nombre[i]; cout< – Codigo May 24 '17 at 19:42
  • eso que escribiste sigue estando no del todo bien.. anda, pero no es correcto del todo.. ahi la respondo y te explico.. – gbianchi May 24 '17 at 19:46

2 Answers2

2

Arreglos de tamaño variable (VLA en Inglés).

Tal y como ha mencionado gbianchi tu problema reside en la declaración de los arreglos, por lo tanto, cambiar el orden en que se pide el tamaño de los arreglos y su definición puede resolver el problema, siempre y cuando tu compilador soporte Arreglos de tamaño Variable (AtV).

Los AtV no pertenecen al C++ estándar si no que son una extensión del compilador (Lee sobre la extensión en el compilador GCC). Cada compilador tiene sus propias extensiones de manera que si el código te compila es que tu compilador dispone de esta extensión, pero en otros compiladores podría estar esta extensión desactivada o no existir y te mostraría un error. Así pues: tu código no sería portable.

Propuesta.

Usa std::vector, esta plantilla de la librería estándar de C++ puede ser usada como un arreglo y se le puede modificar el tamaño en tiempo de ejecución:

using vector_string = std::vector<string>;

// variables utilizadas en void agregar()
int m = 0, n = 0, i, r = 0;
vector_string codigo, nombre, grado;

std::cout << "Cuantos alumnos desea agregar? ";
std::cin >> m;
n = n + m;

codigo.resize(n);
nombre.resize(n);
grado.resize(n);

El método std::vector::resize cambia el tamaño del vector para que sea capaz de almacenar la cantidad de elementos indicada. Después, la inserción de datos queda sin cambios:

std::cout << "ingrese los datos: " << std::endl;
for(i = 0; i < m; ++i){
    std::cout << "nombre del alumno " << i + 1 << ": ";
    std::cin >> nombre[i];
}

Otras cosas a tener en cuenta.

  • No se aconseja usar using namespace std, lee esta pregunta para saber por qué.
  • Tampoco se aconseja usar std::endl ya que hace flush del stream, pudiendo causar problemas de rendimiento, lee esta pregunta para tener más detalles.
  • Usa el pre-incremento en lugar del post-incremento, este artículo te explica el por qué.
  • Esta instrucción:

    if(r = 1){
    

    Siempre será verdadera, porque estás asignando el valor 1 a la variable r. Tras asignar, se evalúa r como dato booleano. En C++ cualquier valor diferente a cero (0) se considera verdadero (true). Si quieres hacer una comparación usa el doble igual (==):

    if(r == 1){
    
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
1

El error esta en la inicializacion de los vectores:

// variables utilizadas en void agregar()
    int m = 0, n = 0, i, r = 0;
    string codigo[m], nombre[m], grado[m];

    cout << "Cuantos alumnos desea agregar? ";
    cin >> m;
    n = n + m;

    cout << "ingrese los datos: " << endl;
    for(i = 0; i < m; i++){
        cout << "nombre del alumno " << i + 1 << ": ";
        cin >> nombre[i];

    }

el vector nombre donde tratas de guardar los nombres esta inicializado en 0 (con 0 elementos), por lo tanto, cuando preguntas cuantos alumnos quiere ingresar, eso no modifica el tamaño del vector porque el mismo fue inicializado antes.

Deberias iniacializar el vector cuando sepas realmente cuantos alumnos se desean ingresar.. basta con modificar el orden de tu codigo.

// variables utilizadas en void agregar() int m = 0, n = 0, i, r = 0;

    cout << "Cuantos alumnos desea agregar? ";
    cin >> m;
    n = n + m;
    string codigo[m], nombre[m], grado[m];
    cout << "ingrese los datos: " << endl;
    for(i = 0; i < m; i++){
        cout << "nombre del alumno " << i + 1 << ": ";
        cin >> nombre[i];

    }

En ningun caso, igual, estoy mirando el resto del codigo, donde hay varios errores mas.

fijate por ejemplo aqui:

if(r = 1){
        m = 0;
        void agregar();
    }else{
        m = 0;
        int main();
    }

Estas llamando recursivamente a agregar, pero ya estas dentro de esa funcion.. todas estas llamadas deberian estar estructuradas de otra forma. por ejemplo dentro de un while que sepa cuando terminar la ejecucion de todos los puntos. tambien estas haciendo m = 0 sin ningun sentido aparente, porque al volver a llamar a la funcion, la m es otra, porque esta en otro scope.

Mi consejo es que leas un poco mas de como funciona el lenguaje.

gbianchi
  • 19,675
  • 11
  • 38
  • 58
  • Muchas gracias me sera de mucha ayuda, gracias muy amables – Codigo May 24 '17 at 21:22
  • Si te sirvio por favor acepta la respuesta para que podamos dar la pregunta por cerrada. – gbianchi May 24 '17 at 21:59
  • 1
    Por desgracia este código no es del todo correcto, pues estás usando [VLA](https://es.stackoverflow.com/questions/36389/error-expression-must-have-a-constant-value/36392#36392) los cuales no son C++ estándar. – PaperBirdMaster May 25 '17 at 06:31