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

Documentos relacionados