Este es el enunciado del ejercicio:
Spoiler:
Universidad escribió:2.- Escribir un programa que trabaja con fechas de nacimiento de personas. Para guardar cada fecha se utilizará una estructura donde los tres campos, día, mes y año se declaran como enteros o enteros sin signo. Para guardar los datos de las personas se usa un vector del tipo anterior. La definición del tipo se hace global, pero la declaración del vector se hace en la función main. El número de fechas a leer se pide en la función main. La lectura de cada fecha se hace en una función. La escritura en pantalla de una fecha se hace también en una función, indicando el mes como una cadena de caracteres, (como ayuda, se supone que está
declarado a nivel global el siguiente vector de cadenas de caracteres).
#define SIZEMESES 11
#define NMESES 12
char meses[NMESES][SIZEMESES] = {"enero", "febrero", "marzo", “abril”, “mayo”,
“junio”, “julio”, “agosto”, “septiembre”, “octubre”, “noviembre”, “diciembre”};
Implementar una función para calcular las fechas de nacimiento menor y mayor, que serán
calculadas por la función como índices del vector de fechas. Dicha función devolverá los índices
mediante una struct.
Este es el código que tengo ahora mismo:
Spoiler:
Código: Seleccionar todo
#include <stdio.h>
#define SIZEMESES 11
#define NMESES 12
#define MAX 10
char meses[NMESES][SIZEMESES] = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio",
"agosto", "septiembre", "octrubre", "noviembre", "diciembre"};
//Estructura para almacenar las fechas
typedef struct{
int day;
int month;
int year;
}Tfecha;
//Estructura para almacenar los índices
typedef struct{
int mayor;
int menor;
}Tindicador;
//Función para leer las fechas
int leerfecha(int i, Tfecha personas[]){
printf("Introduzca el dia: ");
scanf("%d" , &personas[i].day);
printf("Introduzca el mes: ");
scanf("%d" , &personas[i].month);
printf("Introduzca el año: ");
scanf("%d" , &personas[i].year);
printf("--------------------------------\n");
}
//Mostrar por pantalla las fechas
int printfecha(int i, Tfecha personas[]){
personas[i].month -= 1;
printf("---Persona %d---\n",i+1);
printf("%d de %s de %d\n",personas[i].day,meses[personas[i].month],personas[i].year);
}
//Función para comparar las fechas
Tindicador compfechas(Tfecha personas[], int num){
Tindicador indicadores;
int i;
int highyear, highmonth, highday, lessyear, lessmonth, lessday;
//La fechas mayor y menor debe ser, como mínimo, las almacenada en personas[0]
highyear = personas[0].year;
highmonth = personas[0].month;
highday = personas[0].day;
lessyear = personas[0].year;
lessmonth = personas[0].month;
lessday = personas[0].day;
for(i=1 ; i < num ; i++){
/* -INICIO COMPARACION FECHA MAYOR */
if(highyear < personas[i].year){ /*Si el año es mayor a 'highyear' cambiamos el valor de 'highyear'
y guardamos la posición*/
highyear = personas[i].year;
highmonth = personas[i].month;
highday = personas[i].day;
indicadores.mayor = i;
} else if(highyear == personas[i].year){ //Si el año es igual, comparamos los meses
if (highmonth < personas[i].month){ /*Si el mes es mayor a 'highmonth', modificamos 'highyear', 'highmonth' y 'highday'
y guardamos la posicion*/
highyear = personas[i].year;
highmonth = personas[i].month;
highday = personas[i].day;
indicadores.mayor = i;
} else if (highmonth == personas[i].month){ //Si el mes es igual a 'highmonth', comparamos el día
if (highday > personas[i].day){ /*Si el dia es menor a 'highday', modificamos 'highyear', 'highmonth' y 'highday'
y guardamos la posicion*/
highyear = personas[i].year;
highmonth = personas[i].month;
highday = personas[i].day;
indicadores.mayor = i;
}
}
}
/* -FINAL COMPARACION FECHA MAYOR */
/* -INICIO COMPARACION FECHA MENOR */
if(lessyear > personas[i].year){ /*Si el año es menor a 'lessyear' cambiamos el valor de 'lessyear'
y guardamos la posición*/
lessyear = personas[i].year;
lessmonth = personas[i].month;
lessday = personas[i].day;
indicadores.menor = i;
}else if(lessyear == personas[i].year){ //Si son iguales, comparamos meses
if (lessmonth > personas[i].month){ //Si es menor, modificamos las variables y guardamos posición
lessyear = personas[i].year;
lessmonth = personas[i].month;
lessday = personas[i].day;
indicadores.menor = i;
}else if (lessmonth == personas[i].month){ //Si son iguales, comparamos día
if (lessday < personas[i].day){ //Si es menor, modificamos las variables y guardamos posición
lessyear = personas[i].year;
lessmonth = personas[i].month;
lessday = personas[i].day;
indicadores.menor = i;
}
}
}
}
/* -FINAL COMPARACION FECHA MENOR */
return(indicadores); //Devolvemos los indicadores como un struct
}
int main (void){
int i;
int num;
Tfecha personas[MAX];
Tindicador indicadores;
//Pedimos el número de fechas
printf("--------------****----------------\n");
printf("¿Cuantas fechas desea introducir?:");
scanf ("%d" , &num);
printf("--------------****----------------\n");
//Leemos las fechas llamando a la función leerfecha()
for(i = 0; i < num; i++){
leerfecha(i, personas);
}
//Mostramos por pantalla llamando a la función printfecha()
printf("Las fechas introducidas son:\n");
for(i = 0; i < num; i++){
printfecha(i, personas);
}
//Llamamos a la funcion compfecha() y mostramos la fecha mayor y menor
indicadores = compfechas(personas, num);
printf("--------------****----------------\n");
printf("La fecha menor es %d de %s de %d\n", personas[indicadores.menor].day, meses[personas[indicadores.menor].month], personas[indicadores.menor].year);
printf("La fecha mayor es %d de %s de %d\n", personas[indicadores.mayor].day, meses[personas[indicadores.mayor].month], personas[indicadores.mayor].year);
printf("--------------****----------------\n");
}
También os dejo un Pastebin por si preferís los colorines Enlace
Al meter 4 fechas, funciona bien (creo), si meto menos o más de 4, me salta violación de segmento ('core' generado)
P.D No tenía el código comentado ni indentado...así que es posible que haya aparecido algún error de sintaxis por estar toqueteando (no puedo probar a compilarlo de nuevo ahora mismo) xDD Cualquier cosa me decís
Saludos!