Base de datos en C++

Iniciado por Fastolfe, 19 Enero 2011, 16:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Fastolfe

Buenas!! He empezado con el C++ hace poco y como me aburría me he puesto a hacer una base de datos  :P

Me gustaría que le echaseis un vistazo a ver que os parece.

(Se que lo suyo sería que guardase los datos en algún archivo y permitiese hacer busquedas, pero creo que no llego a tanto por el momento)

Pido perdón por lo lioso que pueda ser el código, creo que debería haber puesto más comentarios, pero creo que en esencia se entiende lo que hace cada cosa.

Este es el código:


/* Base de datos de alumnos V.1 */
/* By F45T0LF3 */

#include <iostream>

using namespace std;

#define N_CLASES 5
#define MAX_AL 20

int last_al = 1;

// Definición del nuevo tipo de variable alumno, que es una estructura
// y contiene diversas variables con los datos de éste

struct{
string nombre;
int curso;
int notas [N_CLASES];
double media;
}alumnos [MAX_AL];
// Definición del subprograma menú

void menu();

// Definición del subprograma de elección de opciones

int opciones();

// Subprograma para añadir alumnos

void add();

// Subprograma para modificar los datos de los alumnos

void mod();

// Subprograma para eliminar alumnos

void del();

// Subprograma para ver los datos existentes

void show();

// Subprograma para elegir el número del alumno

int elegir_al();

// Limpiar pantalla

void clear(){
int i;
for (i = 0; i < 22; i++){
cout << "\n";
}
}

// Programa principal

int main(){

int choice;

while (choice != 0){
cout << "\n\n\n";
menu();
choice = opciones();
}

return 0;
}


void menu(){
clear();
cout << "1. Añadir alumno \n" << "2. Modificar datos de un alumno \n";
cout << "3. Borrar los datos de un alumno \n" << "4. Mostrar datos";
cout << "\n\n Para salir escriba 0 \n\n";
}

int opciones(){
int opcion;
cin >> opcion;

switch (opcion){
case 1:
add();
break;
case 2:
mod();
break;
case 3:
del();
break;
case 4:
show();
break;
}
if (opcion == 0){
return opcion;
}
}

int elegir_al(){
clear();
int n_al;
cout << "\n Elija el número del alumno" << endl;
cin >> n_al;

return n_al;
}

void add(){
clear();
cout << "Nombre:";
cin >> alumnos[last_al].nombre;
cout << "Curso:";
cin >> alumnos[last_al].curso;
cout << "Nota 1:";
cin >> alumnos[last_al].notas[0];
cout << "Nota 2:";
cin >> alumnos[last_al].notas[1];
cout << "Nota 3:";
cin >> alumnos[last_al].notas[2];
cout << "Nota 4:";
cin >> alumnos[last_al].notas[3];
cout << "Nota 5:";
cin >> alumnos[last_al].notas[4];
last_al++;
}

void mod(){
clear();
int elec_al = elegir_al();

cout << "Nombre:";
cin >> alumnos[elec_al].nombre;
cout << "Curso:";
cin >> alumnos[elec_al].curso;
cout << "Nota 1:";
cin >> alumnos[elec_al].notas[0];
cout << "Nota 2:";
cin >> alumnos[elec_al].notas[1];
cout << "Nota 3:";
cin >> alumnos[elec_al].notas[2];
cout << "Nota 4:";
cin >> alumnos[elec_al].notas[3];
cout << "Nota 5:";
cin >> alumnos[elec_al].notas[4];

}

void del(){
clear();
int elec_al = elegir_al();
alumnos[elec_al].nombre = '\0';
alumnos[elec_al].curso = 0;
alumnos[elec_al].notas[0] = 0;
alumnos[elec_al].notas[1] = 0;
alumnos[elec_al].notas[2] = 0;
alumnos[elec_al].notas[3] = 0;
alumnos[elec_al].notas[4] = 0;
}

void show(){
clear();
int elec_al = elegir_al();
clear();
cout << "Nombre: " << alumnos[elec_al].nombre << endl;
cout << "Curso: " << alumnos[elec_al].curso << endl;
cout << "Nota 1: " << alumnos[elec_al].notas[0] << endl;
cout << "Nota 2: " << alumnos[elec_al].notas[1] << endl;
cout << "Nota 3: " << alumnos[elec_al].notas[2] << endl;
cout << "Nota 4: " << alumnos[elec_al].notas[3] << endl;
cout << "Nota 5: " << alumnos[elec_al].notas[4] << endl;
int esperar;
cout << "\n\n Pulse cualquier número para continuar: ";
cin >> esperar;
}



Gracias por gastar vuestro tiempo en mis chapuzas!!

N0body

Tengo varias aclaraciones:



-Utiliza las etiquetas GeSHi para que el código se vea más claro (más para los otros que para mí, yo copio y pego el código siempre en mi editor xD)



-En todas las funciones tipo void no pones el return, ya sé que no es problema ponerlo al final, pero una vez me dijieron que era de buena educación xD



-Declaras el dato media, tipo double (donde supongo que pondrías el promedio de las notas) y no lo utilizas... (no lo calculas, no lo muestras)



-Inicilizas la variable last_al en 1 y usas esta variable para indicar la posicion del vector de estructuras a modificar. No estás utilizando la posición 0, la desperdicias...



-En el bucle principal (el while del main) estás comparando una variable no inicializada. Osea... ¿Qué pasaría si cuando declaras choice, esta por casualidad empieza con 0 adentro de sí?... te lo dejo a tu lógica pensar en las consecuencias... Yo utilizaría un do {}while así comparas luego del ingreso



-En la funcion opciones () en caso de que la variable ingresada opcion no sea 0, no esta puesto que valor retornará. Osea:

if (opcion == 0){
return opcion;
}

Realmente esto es totalmente inecesario, porque no directamente devuelves opcion. Osea, te fijas que opcion sea 0 para devolver opcion... Y ensima tienes el error de que cuando no es 0 no esta definido el retorno

Yo sinceramente haría una funcion que reuna a menu() y opciones(), que me desplegue el menu y me haga elegir la opcion, retorne el valor elegido y el switch lo pongo en el main... no sé, fijate vos...



-Ya que estás contando en last_al el número de alumnos agregados, por qué no hacer que no permita mas ingresos que MAX_AL?



-Restringe tus ingresos, no quieres que te introduzcan notas mayores al rango con el que estás trabajando. Del mismo modo que deberías aclararle a alguien que introduce una opción incorrecta en el menú, que la opción es inválida. Y especialmente no quieres que elegir_al() te permita elegir alumnos mas alla de MAX_AL-1... de lo contrario podrías tener errores fatales...



-No sé por qué si tu función elegir_al() tiene un clear() al principio, muchas veces que la llamas desde otras funciones haces un clear() exactamente antes de llamarla...
Además en la función mod() olvidas un clear(); entre elegir_al() y lo que sigue en la función... (en show() si lo pones)


-En la función show declaras esperar sólo para "pausar" la ejecución... podrías utilizar elec_al porque ya no lo necesitarás... Además, sería mejor que lo declarases al inicio de la función...


-Cuando tu dices "Borrar los datos de un alumno"? no sería mejor que si lleno mi base con 20 alumnos (llengando al maximo impuesto) y borro los datos del alumno 1, los datos del alumno i pasen a donde los del alumno i-1 a partir de i=2? Así, borrando uno podría volver a ingresar otro alumno a pesar de haber llegado a la máxima cantidad... podés planteartelo como un desafío personal...
Sino, tendríamos que borrar el dato de un alumno x, y para ingresar otro, tendríamos que modificar a x... Pero entonces el paso de borrar sería innecesario, porque directamente modificando ser sobreescriben los valores anteriores...



-Sigue programando y divirtiendote  ;-) me gusto tu forma de limpiar la pantalla, sin usar una llamada al sistema ni cosas de librerias no estandar... además me gusta el número 22...

Fastolfe

Estoy mirando lo del GeShi porque no tenía ni idea de lo que era xD

Tomo nota de lo de poner los return

Me he dado cuenta poco después de que no usaba media (cuando vaya a usarla la declararé)

Lo cambiaré para que use toda la matriz

No inicializaba choice precisamente para que no se saliese, gracias por la sugerencia del do while (y por todas)

También es una buena idea unir menu() y opciones()....... xD

Vale, MAX_AL es inutil... xD

Estoy poniendome a restringir los ingresos a base de if, borrando "esperar" y añadiendo el clear() que me falta

Lo de que al borrar un alumno los datos del anterior pasen a su lugar lo habia pensado, pero precisamente lo he dejado porque lo he visto dificil por el momento

Programando voy a seguir, porque me queda muchisimo por aprender aún (como queda claro por todos los fallos que le has sacado a una base de datos sencilla como ella sola)

El número 22 es porque es exactamente el que me hace falta en el netbook para que deje de verse lo anteriormente escrito xDDD

Muchas gracias por echarle un vistazo y ayudarme a mejorar con la programación!!!!! :D