
Problema en programa de calendario
Publicado por Daniel (2 intervenciones) el 14/01/2024 02:54:44
Buenas estoy en 1º año de carrera y me han pedido una práctica de hacer el calendario de un mes. Pero tengo un problema en el cálculo de la variable primerDia que calcula el primer día del mes. Falla cuando la semana empieza en domingo (es decir día 1 en domingo). El fallo está seguro en esa variable pero no consigo arreglarlo de ninguna forma y todas las fórmulas que encuentro tienen en cuenta el domingo como el primer día del calendario y ya no sé qué hacer. (También al final del mes en lugar de espacios deberían imprimirse puntos pero no me he puesto todavía a ello aunque tampoco logré mucho cuando lo intenté). Por cierto si veis algo raro es porque el lenguaje que uso se lo han inventado y lo han llamado C+- como una supuesta mezcla entre C y C++, mejor no preguntéis. Este es el código:
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
#include <stdio.h>
#include <string.h>
/* Función para saber si un año es bisiesto o no*/
bool esBisiesto(int anno) {
return(((anno % 4 == 0) && (anno % 100 != 0)) || (anno % 400 == 0));
}
int determinarPrimerDia(int anno, int mes){
int primerDia;
int d1, d2, d3;
d1 = (anno - 1)/ 4;
d2 = (anno - 1)/ 100;
d3 = (anno - 1)/ 400;
primerDia = (anno + d1 - d2 + d3) %7;
// Calcular días acumulados de los meses anteriores
for (int i = 1; i < mes; i++) {
switch (i) {
case 4: case 6: case 9: case 11:
primerDia = (primerDia + 30) % 7;
break;
case 2:
if (esBisiesto(anno)) {
primerDia = (primerDia + 29) % 7;
} else {
primerDia = (primerDia + 28) % 7;
}
break;
default:
primerDia = (primerDia + 31) % 7;
}
}
if (primerDia < 1) {
primerDia++;
return primerDia;
} else {
return primerDia;
}
}
/* Función para imprimir el calendario*/
void imprimirCalendario(int anno, int mes) {
const int NumeroMeses = 13;
typedef int TipoMes[NumeroMeses];
const char nombresMeses[NumeroMeses][15] = {"","ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTURBRE", "NOVIEMBRE", "DICIEMBRE"};
int primerDia;
TipoMes diasEnMes = {0};
int contadorBarra = 1;
primerDia = determinarPrimerDia(anno, mes) - 1;
if (esBisiesto(anno)) {
diasEnMes[2] = 29;
} else {
diasEnMes[2] = 28;
}
diasEnMes[1] = 31;
diasEnMes[3] = 31;
diasEnMes[4] = 30;
diasEnMes[5] = 31;
diasEnMes[6] = 30;
diasEnMes[7] = 31;
diasEnMes[8] = 31;
diasEnMes[9] = 30;
diasEnMes[10] = 31;
diasEnMes[11] = 30;
diasEnMes[12] = 31;
printf("\n%s %4d\n", nombresMeses[mes], anno);
printf("==============================\n");
printf(" LU MA MI JU VI | SA DO\n");
printf("==============================\n ");
for (int i = 0; i < primerDia; i++) {
contadorBarra++;
printf(" . ");
if (contadorBarra == 6) {
printf("| ");
}
}
/* */
for (int dia = primerDia + 1; dia <= diasEnMes[mes]+(primerDia); dia++ ) {
if (dia <= diasEnMes[mes]+primerDia) {
printf("%3d", dia-primerDia);
if(contadorBarra == 5) {
printf(" |");
}
} else {
printf(" . ");
if(contadorBarra == 5) {
printf(" |");
}
}
contadorBarra++;
/* Imprimir los espacios entre días y el salto de fila al final de la semana */
if ( dia % 7 > 0 ) {
printf(" ");
} else {
printf("\n " );
contadorBarra = 1;
}
}
}
int main() {
int anno, mes;
/* Solicitar al usuario que ingrese un año */
printf("Mes (1...12)? \n");
scanf("%d", &mes);
printf("Año (1601...3000)? \n");
scanf("%d", &anno);
/* Validar si el año está en el rango permitido */
if (anno > 1600 && anno < 3001) {
imprimirCalendario(anno, mes);
} else {
printf("Por favor, ingrese un año válido.\n");
}
return 0;
}
Valora esta pregunta


0