You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Mar 12, 2021. It is now read-only.
// mostramos la informacion de este alumno como nos la planteen
71
+
printAlumno(A, detalle);
72
+
// si tenemos mas alumnos, llamamos recursivamente con el siguiente, caso contrario, cerramos la tablita y salimos de la pila
73
+
if (A->prox) printListaAlumno(A->prox, detalle);
74
+
elseprintf("----------------------------\n");
75
+
}
76
+
77
+
intcantidadAlumnos( Alumno *A ) {
78
+
// si el alumno es nulo, regresamos 0, sino aumentamos uno a la cuenta
79
+
return A ? cantidadAlumnos(A->prox) +1 : 0;
80
+
}
81
+
82
+
voidinsertarAlumno(Alumno **P, Alumno *A) {
83
+
// si no hay Cabeza, se asigna al A alumno y regresamos
84
+
if (!*P) {
85
+
*P = A;
86
+
return;
87
+
}
88
+
89
+
// si el primer elemento de la cabeza cumple con las condiciones, reasignamos la cabeza y regresamos
90
+
if ((*P)->cedula > A->cedula) {
91
+
A->prox = *P;
92
+
*P = A;
93
+
return;
94
+
}
95
+
96
+
// empezamos a iterar
97
+
Alumno *t = *P;
98
+
while (t && t->prox) {
99
+
if (t->prox->cedula > A->cedula) {
100
+
// si encontramos uno mayor que la cedula, lo insertamos
101
+
A->prox = t->prox;
102
+
t->prox = A;
103
+
return;
104
+
}
105
+
else
106
+
t = t->prox;
107
+
}
108
+
109
+
// si no hemos insertado hasta este punto, es el ultimo.
110
+
t->prox = A;
111
+
}
112
+
113
+
Alumno *obtenerAlumnoPorCedula(Alumno *A, int cedula) {
114
+
// Como los alumnos deben estar insertados por cedula (menor-mayor), podemos salir si no hay elemento actual o si la cédula actual es mayor a la cédula a buscar
115
+
if ( ( ! A ) || A->cedula > cedula ) returnNULL;
116
+
117
+
// si no regresamos null, entonces comparemos la cedula. Si hay coincidencia regresamos el alumno, caso contrario vamos con el siguiente
// comparamos el nombre en minúsculas del alumno actual con el nombre en minúsculas a buscar
129
+
// si está, lo insertamos en la lista de coincidencias
130
+
if ( strstr( minusculas( A->nombre ), nombre ) ) insertarAlumno( &coincidencias, extraerAlumno(P, A->cedula) );
131
+
// vamos al siguiente alumno de la lista
132
+
A = A->prox;
133
+
}
134
+
135
+
// regresamos lo que sea que hayamos encontrado
136
+
return coincidencias;
137
+
}
138
+
139
+
Alumno *crearAlumno(void) {
140
+
// declaramos el nuevo alumno a insertar, y un auxiliar para saber si el alumno existe
141
+
Alumno *A = new Alumno, *existe = NULL;
142
+
143
+
miflush(); // limpiamos el buffer de entrada
144
+
145
+
// solicitamos el nombre del alumno
146
+
printf( "Nombre del alumno: " );
147
+
gets_s( A->nombre );
148
+
149
+
// solicitamos el apellido del alumno
150
+
printf( "Apellido del alumno: " );
151
+
gets_s( A->apellido );
152
+
153
+
// solicitamos la cedula del alumno hasta que esta sea una cedula unica (No este en el sistema)
154
+
do {
155
+
printf( "Cédula de identidad del alumno: " );
156
+
scanf( "%i", &(A->cedula) );
157
+
existe = obtenerAlumnoPorCedula( Al, A->cedula );
158
+
if ( existe )
159
+
printf("El alumno con la cédula \"%i\" ya existe, pertence a %s\n Por favor ingrese otro número de cédula\n", existe->cedula, existe->nombre);
160
+
} while( existe );
161
+
162
+
miflush(); // despues de una llamada a scanf, hay que limpiar el buffer
163
+
164
+
// solicitamos la direccion del alumno
165
+
printf( "Dirección: " );
166
+
gets_s( A->direccion );
167
+
168
+
// solicitamos el numero telefonico del alumno
169
+
printf( "Teléfono: " );
170
+
gets_s( A->telefono );
171
+
172
+
// solicitamos los datos de la fecha de nacimiento del alumno
173
+
printf( "Fecha Nacimiento: " );
174
+
A->fechaNac = crearFecha();
175
+
176
+
miflush(); // despues de una llamada a scanf, hay que limpiar el buffer
177
+
178
+
// solicitamos el correo electronico del alumno
179
+
printf( "Correo Electrónico: " );
180
+
gets_s( A->correo );
181
+
182
+
// inicializamos el proximo elemento de este alumno como nulo
183
+
A->prox = NULL;
184
+
185
+
// devolvemos
186
+
return A;
187
+
}
188
+
189
+
voidmodificarAlumno(Alumno **P) {
190
+
// nada mas actuamos si no tenemos un puntero a nulo
191
+
if (*P) {
192
+
int opt = -1, cedula = -1;
193
+
Alumno *existe = NULL;
194
+
195
+
// salimos cuando la opcion sea 0
196
+
do {
197
+
// mostramos el encabezado
198
+
impCabezado();
199
+
printAlumno(*P);
200
+
impMenu(
201
+
"Estas son las opciones disponibles para los alumnos.\nMarque la opción de acuerdo a la operación que desea realizar",
202
+
6,
203
+
"Editar número de cédula",
204
+
"Editar el nombre del alumno",
205
+
"Editar la dirección del alumno",
206
+
"Editar número de teléfono",
207
+
"Editar fecha de nacimiento",
208
+
"Editar correo electrónico"
209
+
);
210
+
scanf("%i", &opt);
211
+
miflush();
212
+
switch ( opt ) {
213
+
case0: break;
214
+
case1:
215
+
do {
216
+
printf("Introduzca el nuevo número de cédula para %s. Actual: %d: ", (*P)->nombre, (*P)->cedula);
217
+
scanf("%i", &(cedula));
218
+
if (existe = obtenerAlumnoPorCedula(Al, cedula))
219
+
printf("Error al cambiar el numero de cédula: Un alumno con esa cédula ya existe en el sistema: %s %s\n", existe->nombre, existe->apellido);
220
+
} while ( existe );
221
+
printf("Cédula cambiada con éxito\n");
222
+
system("pause");
223
+
break;
224
+
case2:
225
+
printf("Introduzca un nuevo nombre para %s: ", (*P)->nombre);
226
+
gets_s( (*P)->nombre );
227
+
printf("Introduzca un nuevo apellido para %s. Actual: %s: ", (*P)->nombre, (*P)->apellido);
228
+
gets_s( (*P)->apellido );
229
+
printf("Nombres y apellido cambiados con éxito\n");
230
+
system("pause");
231
+
break;
232
+
case3:
233
+
printf("Introduzca una nueva dirección para %s. Actual: %s: ", (*P)->nombre, (*P)->direccion);
234
+
gets_s( (*P)->direccion );
235
+
printf("Dirección cambiada con éxito\n");
236
+
system("pause");
237
+
break;
238
+
case4:
239
+
printf("Introduzca un nuevo número de teléfono para %s. Actual: %s: ", (*P)->nombre, (*P)->telefono);
240
+
gets_s( (*P)->telefono );
241
+
printf("Número de teléfono cambiado con éxito\n");
242
+
system("pause");
243
+
break;
244
+
case5:
245
+
printf("Introduzca una nueva fecha de nacimiento para %s. Actual: %hi/%hi/%hi: ", (*P)->nombre, (*P)->fechaNac.ano, (*P)->fechaNac.mes, (*P)->fechaNac.dia);
246
+
(*P)->fechaNac = crearFecha();
247
+
printf("Fecha de nacimiento cambiada con éxito\n");
248
+
system("pause");
249
+
break;
250
+
case6:
251
+
printf("Introduzca un nuevo correo electrónico para %s. Actual: %s: ", (*P)->nombre, (*P)->correo);
252
+
gets_s( (*P)->correo );
253
+
printf("Correo electrónico cambiado con éxito\n");
254
+
system("pause");
255
+
break;
256
+
default:
257
+
printf("Opción no reconocida. Vuelva a intentar\n");
258
+
}
259
+
} while ( opt );
260
+
}
261
+
}
262
+
263
+
voidelimAlumno(Alumno **P, int cedula) {
264
+
if (! *P) return; // regresamos si el listado esta vacio
265
+
if ((*P)->cedula > cedula) return; // como estan ordenados, podemos salir si la cedula a buscar es mas pequeña que la primera
266
+
Alumno *del; // declaramos un auxiliar de eliminacion
267
+
if ((*P)->cedula == cedula) {
268
+
// si la cedula coincide con el primer elemento, tenemos que eliminar la cabeza
269
+
del = *P;
270
+
*P = (*P)->prox;
271
+
if (impSiNo("Seguro que desea eliminar este alumno?"))
272
+
delete del;
273
+
return;
274
+
}
275
+
276
+
// ayudante para iterar
277
+
Alumno *alumno = *P;
278
+
// iteramos hasta el ultimo elemento
279
+
while ( alumno && alumno->prox ) {
280
+
// podemos salir temprano si la cedula del proximo es mayor que la cedula a buscar
281
+
if (alumno->prox->cedula > cedula) break;
282
+
283
+
if (alumno->prox->cedula == cedula) {
284
+
// si la cedula del proximo en la lista coincide, entonces tenemos que eliminarlo
285
+
del = alumno->prox;
286
+
alumno->prox = del->prox;
287
+
if (impSiNo("Seguro que desea eliminar este alumno?"))
0 commit comments