0% encontró este documento útil (0 votos)
150 vistas5 páginas

Calendario CPP

Este documento describe las funciones y procedimientos de un módulo de calendario para imprimir calendarios y manejar fechas. Incluye funciones para comprobar si una fecha es válida, determinar si un año es bisiesto, obtener el número de días de un mes y el día de la semana de una fecha. También incluye procedimientos para imprimir un calendario completo para un mes y año determinados, incluyendo la verificación de películas asociadas a cada fecha.

Cargado por

laura.alba
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
150 vistas5 páginas

Calendario CPP

Este documento describe las funciones y procedimientos de un módulo de calendario para imprimir calendarios y manejar fechas. Incluye funciones para comprobar si una fecha es válida, determinar si un año es bisiesto, obtener el número de días de un mes y el día de la semana de una fecha. También incluye procedimientos para imprimir un calendario completo para un mes y año determinados, incluyendo la verificación de películas asociadas a cada fecha.

Cargado por

laura.alba
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

/*********************************************************************

* Módulo: calendario
*
* Descripción:
* Procedimientos y funciones para la impresión de un
* calendario, y manejo de fechas
*********************************************************************/

#include <stdio.h>
#include <string.h>
#include "Calendario.h"
int annoMenor = 2000;

/*=================================================================
Procedimiento para comprobar si una fecha es correcta.
Si no lo es, imprime mensaje de error
================================================================*/
bool TipoCalendario::EsCorrecta( int dia, int mes, int anno ) {
bool correcto = true;
if ((anno < annoMenor) || (dia<=0) || (mes<=0)) {
correcto = false;
} else {
switch (mes) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
correcto = (dia<=31);
break;
case 4:
case 6:
case 9:
case 11:
correcto = (dia<=30);
break;
case 2:
if (EsBisiesto( anno )) {
correcto = (dia<=29);
} else {
correcto = (dia<=28);
}
break;
default:
correcto = false;
}
}
if (correcto) {
return true;
} else {
printf( "\nIntroduzca una fecha correcta\n" );
return false;
}
}
/*=================================================================
Función para ver si es bisiesto el año pasado como parámetro
Son bisiestos los múltiplos de 4, salvo si son también mútiplos
de 100, que han de ser múltiplos de 400;
================================================================*/
bool TipoCalendario::EsBisiesto( int anno) {
if (anno%4 != 0) {
return false;
} else if ((anno%100 == 0) && (anno%400 != 0)) {
return false;
} else {
return true;
};
}
/*=================================================================
Función que devuelve el número de días de un mes
================================================================*/
int TipoCalendario::DiasDelMes( TipoNombreMes mes, int anno ) {
int dias;
switch (mes) {
case ENERO:
case MARZO:
case MAYO:
case JULIO:
case AGOSTO:
case OCTUBRE:
case DICIEMBRE:
dias = 31;
break;
case ABRIL:
case JUNIO:
case SEPTIEMBRE:
case NOVIEMBRE:
dias = 30;
break;
case FEBRERO:
if (EsBisiesto( anno )) {
dias = 29;
} else {
dias = 28;
}
break;
}
return dias;
}

/*=================================================================
Función que devuelve el día de la semana que corresonde a una fecha,
empleando el método de Zeller
================================================================*/
TipoDiaSemana TipoCalendario::DiaSemana( int mes, int anno ) {
int a,y,m;
int aux;
TipoDiaSemana dia;

a = (14 - mes) / 12;


y = anno - a;
m = mes + 12 * a - 2;

aux = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;

/*-- En nuestro calentario, el 0 es lunes, en vez de domingo --*/ {


if ( aux == 0 ) {
aux = 6;
} else {
aux--;
}
}
dia = TipoDiaSemana(aux);
return dia;
}
/*=================================================================
Función para calcular las semanas que tiene un mes
================================================================*/
TipoNumSemanasDelMes TipoCalendario::CalcularNumSemanas( int dias, int primero ) {
TipoNumSemanasDelMes semanas;
int cociente,modulo;

cociente = (dias + primero) / 7;


modulo = (dias + primero) % 7;

if (modulo == 0) {
semanas.semanas = cociente;
} else {
semanas.semanas = cociente + 1;
}
semanas.resto = (semanas.semanas*7 - (dias+primero) ); /* dias que faltan para completar la última semana */
return semanas;
}
/*=================================================================
Función para hallar el nombre de un mes
================================================================*/
TipoNombreMes_str TipoCalendario::NombreDelMes( TipoNombreMes mes ) {
TipoNombreMes_str cadena;
switch (mes) {
case ENERO:
strcpy(cadena.nombre,"ENERO");
break;
case FEBRERO:
strcpy(cadena.nombre,"FEBRERO");
break;
case MARZO:
strcpy(cadena.nombre,"MARZO");
break;
case ABRIL:
strcpy(cadena.nombre,"ABRIL");
break;
case MAYO:
strcpy(cadena.nombre,"MAYO");
break;
case JUNIO:
strcpy(cadena.nombre,"JUNIO");
break;
case JULIO:
strcpy(cadena.nombre,"JULIO");
break;
case AGOSTO:
strcpy(cadena.nombre,"AGOSTO");
break;
case SEPTIEMBRE:
strcpy(cadena.nombre,"SEPTIEMBRE");
break;
case OCTUBRE:
strcpy(cadena.nombre,"OCTUBRE");
break;
case NOVIEMBRE:
strcpy(cadena.nombre,"NOVIEMBRE");
break;
case DICIEMBRE:
strcpy(cadena.nombre,"DICIEMBRE");
break;
}
return cadena;
}
/*=================================================================
Procedimiento para pedir fecha (mes y año)
================================================================*/
void TipoCalendario::PedirFecha(TipoMesAnno & fecha) {
printf( "¿Mes (1..12)?");
scanf( "%2d", &fecha.mes );
printf( "¿Año (1601..3000)?" );
scanf( "%4d", &fecha.anno );
}
/*=================================================================
Procedimiento para imprimir un numero determinado de simbolos iguales
================================================================*/
void TipoCalendario::ImprimirLineaSimbolos (int longitud, TipoSimbolo_str simbolo) {
TipoFila_str fila = "";
for (int i=1;i<=longitud;i++) {
strcat( fila,simbolo );
}
printf( "%s",fila );
}
/*=================================================================
Procedimiento para imprimir separador
================================================================*/
void TipoCalendario::ImprimirSeparador (int & columna, int & fila, int semanas) {
if ( columna==7 ) {
if ( fila < semanas) { /* La última fila no lleva salto de línea */
printf( "\n" );
};
columna=1;
fila++;
} else if ( columna==5 ) {
printf( " | " );
columna++;
} else {
printf( " " );
columna++;
};
}

/*=================================================================
Procedimiento para imprimir hoja de calendario
================================================================*/
void TipoCalendario::ImprimirCalendario ( int mes,int anno, TipoVectorPelicula vectorPeliculas ) {

TipoNombreMes nombreTipoMes; /* Meses (tipo) */


TipoDiaSemana primerDia; /* Dia de la semana en el que empieza el mes */
TipoNombreMes_str nombreMes; /* Nombre del mes, en formato str */
TipoNumSemanasDelMes numSemanas; /* Semanas que tiene el mes que vamos a imprimir */
int dias; /* Días que tiene el mes */
int numEspacios;
int fila,columna;
bool hayPeli = false;
int ind = 0;
/*-- Inicializamos las variables
y obtenemos los datos que necesitamos --*/ {
dias = 0;
numEspacios = 0;
columna = 1;
fila = 1;
}
nombreTipoMes = TipoNombreMes(mes-1);
primerDia = DiaSemana( mes,anno );
nombreMes = NombreDelMes( nombreTipoMes );
dias = DiasDelMes( nombreTipoMes,anno);
numEspacios = longitudFila - strlen( nombreMes.nombre ) - 4;
numSemanas = CalcularNumSemanas( dias, int(primerDia) );
/*-- Imprimimos el calendario --*/ {
/*-- Cabecera --*/ {
printf( "\n" );
printf( "%s",nombreMes.nombre );
ImprimirLineaSimbolos( numEspacios," " );
printf( "%4d",anno );
printf( "\n" );
ImprimirLineaSimbolos( longitudFila,"=" );
printf( "\n" );
printf( "LU MA MI JU VI | SA DO\n" );
ImprimirLineaSimbolos( longitudFila,"=" );
printf( "\n" );
}
while ( fila<=numSemanas.semanas ) { /* Cada fila es una semana */
if ( fila==1 ) {
for ( int i=1; i<=primerDia;i++ ) { /* Primera fila: puntos iniciales*/
printf( " ." );
ImprimirSeparador( columna,fila,numSemanas.semanas );
}
}
for ( int i=1;i<=dias;i++ ) { /* Días del mes */
for (int j=0; j < maxPeliculas; j++) {
if ((vectorPeliculas[j].fecha.mes == mes) && (vectorPeliculas[j].fecha.dia == i) &&
(vectorPeliculas[j].fecha.anno == anno)) {
ind = j;
hayPeli = true;
}
}
if (hayPeli) {
if (vectorPeliculas[ind].entradas<20) {
printf( "VV" );
} else {
printf( "XX" );
}
} else {
printf( "%2d",i ); /* No hay películas para la fecha. IMprime el día */
}
hayPeli = false;
ImprimirSeparador( columna,fila,numSemanas.semanas );
}
if ( fila==numSemanas.semanas ) {
for ( int i=1; i<=numSemanas.resto;i++ ) { /* Última fila: puntos finales*/
printf( " ." );
ImprimirSeparador( columna,fila,numSemanas.semanas );
}
}
}
}
}

También podría gustarte