Dev - C++ - Elprograma deja de funcionar

 
Vista:

Elprograma deja de funcionar

Publicado por Adicto_al_codigo (1 intervención) el 24/05/2017 19:16:43
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 dejo 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#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");
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 171
Ha aumentado 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Elprograma deja de funcionar

Publicado por juanki (73 intervenciones) el 24/05/2017 22:18:50
Hola

1
2
3
4
5
6
int m=0,n=0,i,r=0; // En esta línea m vale cero
string codigo[m],nombre[m],grado[m]; // estás declarando un array de cero posiciones:
 
cin>>m; // aquí le das a m el valor que introduzca el usuario
 
for(i=0;i<m;i++){ // y en el for tienes el problema:

El array tiene 0 posiciones, como lo has declarado antes, y tu estás recorriendo el array hasta el número que haya introducido el usuario, por tanto estás accediendo a memoria que no corresponde a tu programa.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 1.440
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Elprograma deja de funcionar

Publicado por dario (27 intervenciones) el 25/05/2017 07:06:05
Tu mismo programa un poco arreglado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<iostream>
#define MAX 100
 
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;
        }
    }
 
	return 0;
}
 
void agregar() {
    // variables utilizadas en void agregar()
    int i,m,r;
    string codigo[MAX],nombre[MAX],grado[MAX];
 
	cout<<"Cuantos alumnos desea agregar? ";
    cin>>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();
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Leonardo
Val: 26
Ha disminuido su posición en 4 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Elprograma deja de funcionar

Publicado por Leonardo (11 intervenciones) el 25/05/2017 16:42:51
Las respuestas anteriores que te han dado son correctas: estas accediendo a zonas de memoria que no haz reservado.
Probablemente hayas trabajado en alguna versión de Basic donde eso sí era posible ejecutabas un Dim y la cantidad
de elementos y ya esta. En C eso no se puede, es un lenguaje de programación potente pero peligroso en cuanto a tener
cuidado con las variables, inicializaciones y sobre todo los punteros. Cualquier error en eso te puede llevar en el mejor de
los casos a un mal funcionamiento de tu programa devolviendo resultados errores o incluso puede bloquearse!!!
Por ello debes de inicializar las variables siempre y tener cuidado en las comparaciones y las asignaciones.
te pongo un ejemplo:

if (m=100) cout<<"Usted escribió el máximo de alumnos ";//Esto es incorrecto pues asigna 100 a m y evalúa siempre true
//por ese motivo independientemente del valor anterior de m(que de paso se pierde) siempre mostrará el mensaje.

lo correcto sería:

if (m==100) cout<<"Usted escribió el máximo de alumnos ";//ahora sí está comparando y sólo mostrará el mensaje si m es 100

El código que te puso dario está correcto pero presupone que no habrán más de 100 alumnos. Si fueran por ejemplo 101 te ocurriría lo mismo que te esta ocurriendo con los 2 alumnos: reservas memoria para 0 y escribes 2, reservas para 100 y escribes 101.
Dices que estás empezando y ya te hablé de lo delicado de los punteros pero la estructura ideal para este problema tuyo son las listas
enlazadas. Cuando conozcas sobre ellas verás que útiles son: pilas, colas, árboles, etc.

Espero te sirva de ayuda mi comentario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar