Sin título de diapositiva
Transcripción
Sin título de diapositiva
Codificación C++ 1. Tipos de datos 2. Declaración de funciones y procedimientos 3. Programa principal 4. Definición de funciones y procedimientos Tipos de datos (1) char char long TPersona nombre tfno email sig TPersona personas citas TAgenda TPersona int int int int int int int d m a h m h m fecha hini hfin persona char TCita lugar sig TCita Tipos de datos (2) enum TRes { Bien, ErrExistePersona, ErrNoPersonas, ErrNoExistePersona, ErrExisteCita, ErrNoCitas, ErrNoExisteCita, ErrMem }; enum TOp {OpAgregarPersona=1, OpConsultarPersona, OpEliminarPersona, OpAgregarCita, OpConsultarCita, OpEliminarCita, OpSalir}; struct TPersona{ char * nombre; long telefono; char *email; TPersona * sig; }; Declaración de funciones Tipos de datos (3) struct TFecha { int dia, mes, anno; }; struct THora { int horas, minutos; }; struct TCita { TFecha fecha; THora hinicio; THora hfin; TPersona *persona; char * lugar; TCita * sig; }; struct TAgenda { TPersona *personas; TCita *citas; }; Declaración de funciones Agenda Tratar personas m err da n age e age rrm nda p da p da en doa reta gen ag a retcp Tratar personas toc do ita age cita nda agenda docp er top er dop nda age do age age re ep nd nd tep a a Tratar Citas Agregar persona TRes TratarPersonas (TAgenda &agenda, TOp tp, char * nombre, long telefono, char *email); TRes TratarCitas ( TAgenda &agenda, TOp tp, TFecha fecha, THora hinicio, THora hfin, char * nombre, char *lugar); Consulta persona Eliminar persona TRes AgregarPersona (TAgenda &agenda, char * nombre, long telefono, char *email); TRes ConsultarPersona (TAgenda &agenda, char * nombre); TRes EliminarPersona (TAgenda &agenda, char * nombre); 1 Declaración de funciones Programa Principal (1) Agenda Tratar Citas BLOCK retcc c da c da en doa reta gen ag a agenda docc agenda Vacía DOUNTIL do age age re ec nd nd tec a a BLOCK tipo_operación = 7 IFTHEN Agregar cita Consulta cita errm Eliminar cita falso CASE OF Pedir tipo_operación errm TRes AgregarCita (TAgenda &agenda, TFecha fecha, THora hinicio, THora hfin, char * nombre, char *lugar); =1 tipo_operación TRes ConsultarCita (TAgenda &agenda, TFecha fecha); Pedir nombre, teléfono, email TRes EliminarCita (TAgenda &agenda, TFecha fecha, THora hinicio); Programa Principal (2) // Programa principal void main(int argc, char **argv) { // Variables TAgenda agenda={NULL, NULL}; // La agenda vacía TOp tp; // Operación que desea realizar el usuario int cod; // Código de operación (entero) char nombre[50]; // Para leer un nombre completo long telefono; // Para leer un número de teléfono char email[50]; // Para leer dirección de correo electrónico TFecha fecha; // Para leer una fecha THora hinicio,hfin; // Para leer hora inicial y final de la cita char lugar[50]; // Para leer el lugar de una cita Tres res; // Retorno de los módulos errm TratarPersonas (tipo_operación, agenda, nombre, teléfono, email) =3 BLOCK Pedir nombre errm TratarPersonas (tipo_operación, agenda, nombre, NULL, NULL) =4 BLOCK Pedir nombre errm TratarPersonas (tipo_operación, agenda, nombre, NULL, NULL) =5 BLOCK Pedir fecha, hini, hfin, lugar, nombre errm TratarCitas (tipo_operacion, agenda, fecha, hini, hfin, lugar, nombre) "No hay memoria suficiente" =6 =otro BLOCK Pedir fecha BLOCK errm TratarCitas (tipo_operacion, agenda, fecha, NULL, NULL, NULL, NULL) Pedir fecha, hini "Comando desconocido" errm TratarCitas (tipo_operacion, agenda, fecha, hini, NULL, NULL, NULL) Programa Principal (3) // Bucle mientras el usuario no desee salir do { // Mostrar menú de opciones y leer opción del usuario cout<<endl<<"AGENDA PERSONAL"<<endl; cout<<"---------------"<<endl; cout<<"Indique la operacion que desea realizar:"<<endl<<endl; cout<<" 1 agregar persona"<<endl; cout<<" 2 consultar los datos de una persona"<<endl; cout<<" 3 eliminar de la agenda una persona"<<endl; cout<<" 4 agregar a la agenda una cita"<<endl; cout<<" 5 consultar en la agenda una cita"<<endl; cout<<" 6 eliminar de la agenda una cita"<<endl; cout<<" 7 Salir del programa"<<endl<<endl; cin >> cod; top = Top(cod); while (cin.get()!='\n') ; cout << endl; Programa Principal (4) // Leer datos en función de lo que quiera hacer el usuario y realizar // el trabajo switch (tp) { case OpAgregarPersona: // Leer todos los datos de una persona cout << "Nombre completo: "; cin.getline(nombre,50); cout << "Número de teléfono: "; cin >> telefono; while (cin.get()!='\n') ; cout << "Email: "; cin.getline(email,50); // Realizar el trabajo res = TratarPersonas(agenda,tp,nombre,telefono,email); if (res == ErrMem) cout << "Agenda llena. Pruebe a eliminar datos" << endl; break; ... BLOCK =2 Programa Principal (5) case OpSalir: // Despedirse cout << "Adiós" << endl; break; default: // No es una operación válida. No hacer nada cout << "Código de operación no válido: " << int(tp); } // Pausa después de cada operación (excepto al salir) if (tp != OpSalir) { cout << "ENTER para continuar ..."; while (cin.get()!='\n'); } } while (tp != OpSalir); } 2 Definición de funciones (1) TRes AgregarCita (TAgenda &agenda, TFecha fecha, THora hinicio, THora hfin, char * nombre, char *lugar) { TPersona *persona; // Persona con la que se tiene la cita TCita * ptractual, *ptranterior; // Para recorrer la lista de citas TCita *nueva; // Nueva cita que se meterá en la lista TRes res; // Resultado que se devolverá bool encontrado = false; // Si se encuentra el sitio en la lista int comp; // Resultado de comparar fechas y horas retac AgregarCita (&agenda, datos_op_alta_cita) BLOCK IFTHEN agenda.personas = vacía existe ComprobarExistePersona (agenda, nombre_completo) Retornar ErrNoPersonas existe IFTHENELSE BLOCK existe ComprobarExisteCita (agenda, datos_op_alta_cita) existe Retornar ErrNoExistePersona IFTHENELSE Retornar ErrExisteCita BLOCK errm CrearNuevaCita(datos_op_alta_cita, cita) errm Definición de funciones (2) // Si no hay personas no se pueden agregar citas if (agenda.personas == NULL) { return ErrNoPersonas; } IFTHENELSE Retornar ErrMem BLOCK MeterAgendaNuevaCita(agenda, cita) Retornar Bien Definición de funciones (3) Definición de funciones (4) // Comprobar si existe la persona. En caso negativo terminar persona = agenda.personas; while (persona && !encontrado) { if (strcmp(persona->nombre, nombre) == 0) encontrado = true; else persona = persona->sig; } if (!encontrado) { return ErrNoExistePersona; } // Crear una cita nueva y rellenar sus datos (controlando memoria) try { nueva = new TCita; nueva->fecha = fecha; nueva->hinicio = hinicio; nueva->hfin = hfin; nueva->persona = persona; nueva->lugar = new char[strlen(lugar)+1]; strcpy(nueva->lugar, lugar); nueva->sig = NULL; } catch (std::bad_alloc) { // Aquí habría que liberar aquella memoria reservada con éxito return ErrMem; } Definición de funciones (5) Definición de funciones (6) // Caso sencillo: no hay citas todavía. Se mete la nueva y se termina if (agenda.citas == NULL) { agenda.citas = nueva; res = Bien; } else { // Recorrer la agenda hasta encontrar la posición de la cita encontrado = false; ptractual = agenda.citas; while (ptractual && !encontrado) { // Comparar las citas (fecha y hora de inicio) comp = CompararCitas(*ptractual, *nueva); if (comp == 0) { // Son iguales: ya existe cita el mismo día a la misma hora res = ErrExisteCita; encontrado = true; } else if (comp > 0) { // La cita nueva va antes que la actual, ya se ha // encontrado // su sitio res = Bien; encontrado = true; } else { // Avanzar al siguiente ptranterior = ptractual; ptractual = ptractual->sig; } } 3 Definición de funciones (7) // Hacer lo que corresponda if (encontrado) { if (res == Bien) { // Caso especial, toca meterla la primera if (ptractual == agenda.citas) { nueva->sig = agenda.citas; agenda.citas = nueva; } else { ptranterior->sig = nueva; nueva->sig = ptractual; } } else { // Hay que borrar la cita nueva, porque no se puede insertar delete [] nueva->lugar; delete nueva; }} Definición de funciones (8) else // No se ha encontrado -> meterla la última { ptranterior->sig = nueva; res = Bien; } } return res; } 4