-
Notifications
You must be signed in to change notification settings - Fork 0
/
calendar.cpp
225 lines (208 loc) · 5.85 KB
/
calendar.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/************************************
* NOMBRE: #Ivan#
* PRIMER APELLIDO: #Lopez#
* SEGUNDO APELLIDO: #Ripoll#
* EMAIL: #[email protected]#
*************************************/
#include <stdio.h>
//Devuelve 1 si el año i es bisiesto y 0 si no lo es.
int anyo_bisiesto(int i)
{
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0))
{return 1;}
else
{return 0;}
}
/**
* Esta función devuelve qué día fue el 1 de enero del año anyo.
* Para lunes devuelve 0.
* Para martes devuelve 1.
* Para miércoles devuelve 2.
* Para jueves devuelve 3.
* Para viernes devuelve 4.
* Para sábado devuelve 5.
* Para domingo devuelve 6.
*/
int uno_enero_anyo(int anyo)
{
int dias = 0;
int j = 1601;
while(j<anyo){
if (anyo_bisiesto(j))
{
dias = dias +2;
}
else
{
dias = dias+1;
}
j++;
}
return (dias % 7);
}
// Devuelve el numero de dias que tienes el mes <mes> del año <anyo> siendo(0-ENERO-....11-DICIEMBRE-).
int dias_que_tiene_mes(int mes, int anyo)
{
switch(mes)
{
// Meses con 31 dias.
case 0:
case 2:
case 4:
case 6:
case 7:
case 9:
case 11:
return 31;
break;
// Caso especial de febrero.
case 1:
if(anyo_bisiesto(anyo))
{return 29;}
else
{return 28;}
break;
// Resto de meses: los que tienen 30 dias.
default:
return 30;
}
}
/*
* Devuelve el día (de 0 -lunes- a 6 -domingo-) en que comienza el mes mes en
* el anyo anyo, sabiendo que el día 1 de enero del anyo anyo fue comienzo.Y teniendo en cuenta que si un mes
* empieza en el dia_mes 2 -miercoles-, si hacemos la operación (dia_mes + dias_del_mes)%7 te da el día en que
* comienza el mes siguiente.
*/
int dia_comienzo_mes(int comienzo, int mes, int anyo)
{
int dia_mes = comienzo;
int dias_del_mes;
for (int i = 0; i < mes; i++)
{
dias_del_mes = dias_que_tiene_mes(i, anyo);
dia_mes = (dia_mes+dias_del_mes)% 7;
}
return dia_mes;
}
// Escribe el nombre del mes, dejando un nuúmero de espacios fijo para, más tarde escribir el año.
void escribir_mes(int mes)
{
switch(mes)
{
case 0:printf("ENERO ");break;
case 1:printf("FEBRERO ");break;
case 2:printf("MARZO ");break;
case 3:printf("ABRIL ");break;
case 4:printf("MAYO ");break;
case 5:printf("JUNIO ");break;
case 6:printf("JULIO ");break;
case 7:printf("AGOSTO ");break;
case 8:printf("SEPTIEMBRE ");break;
case 9:printf("OCTUBRE ");break;
case 10:printf("NOVIEMBRE ");break;
case 11:printf("DICIEMBRE ");break;
}
}
//Pinta el calendario.
void pintar_calendario(int anyo, int mes, int dia_comienzo, int dias_del_mes)
{
//Como hay que dejar un espacio a la izquierda en cada linea, lo dejamos en esta parte que será fija.
printf("");escribir_mes(mes);printf("%d\n",anyo);
printf("===========================\n");
printf("LU MA MI JU VI | SA DO\n");
printf("===========================\n");
printf(" ");
//Pintamos los puntos hasta llegar al día de comienzo del mes.
for(int k = 0; k < dia_comienzo; k++)
{
// Si el día en cuestión, es el cuarto, pintamos la |.
if(k==4)
{
printf(". | ");
}else{
printf(". ");}
}
for(int i = 0; i< dias_del_mes; i++)
{
//Si el número del dia a pintar, i+1, es menor que nueve dejamos un espacio en blanco más que si no lo fuera.
if(i+1<9)
{
//Si el número de dia a pintar mas el día de comienzo es igual a 4, o el mismo día de la siguiente semana, 4+7, 4+7+7, 4+7+7+7, 4+7+7+7+7,
// entonces pintamos la |.
if((i+dia_comienzo)==4 || (i+dia_comienzo)==11 || (i+dia_comienzo)==18 || (i+dia_comienzo)==25 || (i+dia_comienzo)==32)
{
printf("%d | ", i+1);
}else{
printf("%d ", i+1);}
//Si hemos pintado 7 dias, incluyendo los puntos, entonces hacemos un salto de linea.
if((i+dia_comienzo+1)%7==0)
{
printf("\n ");
}
}
////Si el número del dia a pintar, i+1, es mayor o igual que nueve dejamos un espacio en blanco menos que si no lo fuera.
else
{
if((i+dia_comienzo)==4 || (i+dia_comienzo)==11 || (i+dia_comienzo)==18 || (i+dia_comienzo)==25 || (i+dia_comienzo)==32)
{
printf("%d | ", i+1);
}else{
printf("%d ", i+1);}
if((i+dia_comienzo+1)%7==0)
{
printf("\n");
}
}
}
//Pintamos los puntos en los dias que sobren para acabar el mes.
//Si el mes ocupa 5 semanas. Y ademas vemos que el mes no sea febrero y comience por lunes, porque ocuparía 4 semanas.
if(dia_comienzo+dias_del_mes<=35 && (dia_comienzo!=0 || dias_del_mes!=28)){
for(int j = 0; j < (35-dia_comienzo - dias_del_mes); j++)
{
if(j==(35-dia_comienzo - dias_del_mes-3))
{
printf(" . | ");
}else
{
printf(" . ");
}
}
}
//Si el mes ocupa 6 semanas y no 4.
else if(dia_comienzo+dias_del_mes<=42 && (dia_comienzo!=0 || dias_del_mes!=28))
{
for(int j = 0; j < (42-dia_comienzo - dias_del_mes); j++)
{
if(j==(42-dia_comienzo - dias_del_mes-3))
{
printf(" . | ");
}
else
{
printf(" . ");
}
}
}
}
int main()
{
int anyo;
int mes;
int dia;
printf ("¿Mes (1..12)?");
scanf ("%d", &mes);
if(mes<1 || mes>12)
{
return -1;
}
mes--;
printf ("¿Año (1601..3000)?");
scanf ("%d", &anyo);
if(anyo<1601 || anyo>3000)
{
return -1;
}
dia = uno_enero_anyo(anyo);
pintar_calendario(anyo, mes, dia_comienzo_mes(dia, mes, anyo), dias_que_tiene_mes(mes, anyo));
return 0;
}