Dev - C++ - Problema al hacer un programa con estructura modular

 
Vista:
sin imagen de perfil
Val: 9
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema al hacer un programa con estructura modular

Publicado por Jorge (5 intervenciones) el 10/11/2019 19:53:11
Bueno pues me han mandado hacer un programa que muestra por pantalla el calendario de un mes, tras escribir una fecha.
Dicho programa tiene varios módulos. En un módulo llamado fechas.cpp se encuentran muchas de las funciones que necesito para realizar el ejercicio. El problema viene cuando intento implementar algunas de esas funciones en el módulo principal (main.cpp). Cuando intento hacer eso, tras compilar, la consola se abre y después de unos segundos se cierra, sin dejarme hacer nada. Lo curioso es que esto solo me pasa con alguna de las funciones del módulo fechas.cpp. Con otras funciones del mismo módulo, el programa funciona correctamente.
Espero que me podais ayudar con esto, porque llevo unos días dándole vueltas a la cabeza y no consigo solucionarlo.
Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema al hacer un programa con estructura modular

Publicado por Alfil (1444 intervenciones) el 10/11/2019 21:06:05
¿Puedes poner el código del programa?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema al hacer un programa con estructura modular

Publicado por Jorge (5 intervenciones) el 10/11/2019 23:09:24
Este es el codigo del main.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
#include <iostream>
#include "fechas.h"
#include <math.h>
 
 
using namespace std;
 
void nombreMes (int mes, int agno){
 
    if (mes == 1){
 
        cout << "ENERO " << agno << endl;
 
    }
    else if (mes == 2){
 
        cout << "FEBRERO " << agno << endl;
 
    }
    else if (mes == 3){
 
        cout << "MARZO " << agno << endl;
 
    }
    else if (mes == 4){
 
        cout << "ABRIL " << agno << endl;
 
    }
    else if (mes == 5){
 
        cout << "MAYO " << agno << endl;
 
    }
    else if (mes == 5){
 
        cout << "JUNIO " << agno << endl;
 
    }
    else if (mes == 7){
 
        cout << "JULIO " << agno << endl;
 
    }
    else if (mes == 8){
 
        cout << "AGOSTO " << agno << endl;
 
    }
    else if (mes == 9){
 
        cout << "SEPTIEMBRE " << agno << endl;
 
    }
    else if (mes == 10){
 
        cout << "OCTUBRE " << agno << endl;
 
    }
    else if (mes == 1){
 
        cout << "NOVIEMBRE " << agno << endl;
 
    }
    else if (mes == 12){
 
        cout << "DICIEMBRE " << agno <<endl;
    }
 
 
}
 
void pedirFecha (int dia, int mes, int agno){
 
    cout << "Escriba una fecha " << endl;
 
    cin >> dia;
    cin >>mes;
    cin >>agno;
 
    while (mes < 1 || mes > 12){
 
        cout << " El mes debe estar comprendido entre 1 y 12:" << endl;
        cin >> mes;
    }
    if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12){
 
        while (dia < 1 || dia > 31){
 
            cout << "Introduzca un dia valido: " << endl;
            cin >> dia;
        }
    }
    else if (mes == 4 || mes == 6 || mes == 9 || mes == 11){
 
        while (dia < 1 || dia > 30){
 
            cout << "Introduzca un dia valido: " << endl;
            cin >> dia;
        }
    }
    else{
 
        if (esBisiesto(agno)){
 
            while (dia < 1 || dia > 29){
 
                cout <<" Introduzca un dia valido: " << endl;
                cin >> dia;
            }
        }
        else{
            while(dia < 1 || dia > 28){
 
            cout << "Introduzca un dia valido: " << endl;
            cin >> dia;
         }
      }
    }
 
    while (agno < 1900){
 
        cout << "Introduzca un agno valido: " << endl;
        cin >> agno;
    }
}
 
 
void escribirCalendario( int mes, int agno ){
 
     nombreMes(mes,agno) ;
 
    cout << "   L   M   X   J   V   S   D " << endl;
    cout << "------------------------------ " << endl;
 
}
 
 
 
int main(int argc, char **argv)
{
  int dia;
  int mes;
  int agno;
 
 
  pedirFecha(dia, mes, agno);
  escribirCalendario(mes, agno);
 
  cout <<"El dia de la semana es " << diaDeLaSemana(dia, mes, agno)<< endl;
 
    return 0;
}




Y este es el codigo de fechas.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
#include "fechas.h"
 
/*
 * Pre:  La terna de parámetros «dia», «mes» y «agno» definen una fecha
 *       válida del calendario gregoriano, la fecha «dia/mes/agno».
 * Post: El valor del parámetro «f», al ser escrito en base 10, tiene un
 *       formato de ocho dígitos «aaaammdd» que representa
 *       la fecha «dia/mes/agno» donde los dígitos «aaaa» representan el
 *       año de la fecha, los dígitos «mm», el mes y los dígitos «dd», el
 *       día.
 */
void componer(int dia, int mes, int agno, int& f) {
    // Completar
}
 
 
/*
 * Pre:  El valor de «f» escrito en base 10 tiene la forma «aaaammdd»
 *       donde los dígitos «aaaa» representan el año de una fecha válida
 *       del calendario gregoriano, los dígitos «mm», el mes y los dígitos
 *       «dd», el día.
 * Post: Los valores de los parámetros «dia», «mes» y «agno» son iguales,
 *       respectivamente, al día, al mes y al año de la fecha «f».
 */
void descomponer(int f, int& dia, int& mes, int& agno) {
    // Completar
}
 
 
/*
 * Pre:  Los valores de los parámetros «f1» y «f2» escritos en base 10
 *       tienen la forma «aaaammdd», donde los dígitos «aaaa» representan
 *       el año, los dígitos «mm», el mes y los dígitos «dd» el día de
 *       sendas fechas del calendario gregoriano.
 * Post: Ha devuelto true si y solo si la fecha representada por el valor
 *       del parámetro «f1» es anterior a la representada por «f2».
 */
bool esAnterior(int f1, int f2) {
    // Completar
}
 
 
/*
 * Pre:  agno > 1582.
 * Post: Ha devuelto true si y solo si el año «agno» es bisiesto de
 *       acuerdo con las reglas del calendario gregoriano.
 */
bool esBisiesto(int agno) {
    bool multiplo4   = (agno %   4 == 0);
    bool multiplo100 = (agno % 100 == 0);
    bool multiplo400 = (agno % 400 == 0);
    return multiplo400 || (multiplo4 && !multiplo100);
}
 
 
/*
 * Pre:  1 ≤ mes ≤ 12 y agno > 1582.
 * Post: Ha devuelto el número de días del mes correspondiente al parámetro «mes»
 *       del año correspondiente al parámetro «agno».
 *       Por ejemplo: diasDelMes(10, 2018) devuelve 31,
 *                    diasDelMes(2, 2018) devuelve 28 y
 *                    diasDelMes(2, 2020) devuelve 29.
 */
int diasDelMes(int mes, int agno) {
    if (mes == 2) {
        if (esBisiesto(agno)) {
            return 29;
        }
        else {
            return 28;
        }
    }
    else if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
        return 30;
    }
    else {
        return 31;
    }
}
 
 
/*
 * Pre:  agno > 1582.
 * Post: Ha devuelto el número de días que tiene el año «agno».
 *       Por ejemplo: diasDelAgno(2018) devuelve 365 y
 *                    diasDelAgno(2020) devuelve 366.
 */
int diasDelAgno(int agno) {
    if (!esBisiesto(agno)){
        return 366;
    }
 
    if(esBisiesto(agno) ){
 
        return 365;
    }
 
}
 
 
/*
 * Pre:  1 ≤ dia ≤ 31, 1 ≤ mes ≤ 12 y agno > 1582 y la fecha formada por
 *       «dia/mes/agno» es una fecha válida del calendario gregoriano.
 * Post: Ha devuelto el número de día del año de la fecha formada por
 *       «dia/mes/agno».
 *       Por ejemplo: diaEnElAgno(1, 1, 2019) devuelve 1;
 *                    diaEnElAgno(31, 12, 2018) devuelve 365;
 *                    diaEnElAgno(1, 2, 2019) devuelve 32 y
 *                    diaEnElAgno(31, 12, 2020) devuelve 366.
 */
int diaEnElAgno(int dia, int mes, int agno) {
 
    int mesdia[]=
    {31,28,31,30,31,30,31,31,30,31,30,31};
    int diasTranscurridos = 0;
 
    for(int i=1; i <= mes, i++;){
 
        diasTranscurridos += mesdia[i-1];
    }
    diasTranscurridos += dia;
 
    if(esBisiesto(agno) && mes > 2){
 
        diasTranscurridos += 1;
    }
    return diasTranscurridos;
}
 
 
/*
 * Pre:  1 ≤ dia ≤ 31, 1 ≤ mes ≤ 12, agno > 1582 y la fecha formada por
 *       «dia», «mes» y «agno» representan una fecha válida del calendario
 *       gregoriano.
 * Post: Tras la ejecución de la función, los parámetros «fecha», «dia», «mes» y
 *       «agno» representan la fecha correspondiente al día siguiente al que
 *       representaban al iniciarse la ejecución de la función.
 * 
 *       Por ejemplo, si d, m y a son variables de tipo entero y d = 17, m = 10 y
 *       a = 2019, tras la invocación diaSiguiente(d, m, a) los valores de las
 *       variables serían d = 18, m = 10 y a = 2019.
 *       Si los valores fueran d = 29, m = 2 y a = 2020, tras la invocación
 *       diaSiguiente(d, m, a) los valores serían d = 1, m = 3 y a = 2020.
 *       Si los valores fueran d = 31, m = 12 y a = 2022, tras la invocación
 *       diaSiguiente(d, m, a) los valores serían d = 1, m = 1 y a = 2023.
 */
void diaSiguiente(int& dia, int& mes, int& agno) {
 
 
        if ( mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12 && dia == 31){
 
            if (mes == 12 && dia == 31){
 
                dia = 1;
                mes = 1;
                agno = agno + 1;
            }
 
            else{
            dia = 1;
            mes = mes + 1;
 
            }
        }
 
        else if (mes == 4 || mes == 6 || mes == 9 || mes == 11 && dia == 30){
 
            dia = 1;
            mes = mes + 1;
        }
 
        else if (mes == 2){
 
            if (esBisiesto(agno) && dia == 29){
 
                dia = 1;
                mes = mes + 1;
            }
            else if (dia == 28){
 
                dia = 1;
                mes = mes + 1;
            }
        }
        else{
 
            dia = dia + 1;
        }
 
 
}
 
 
/*
 * Pre:  Los valores de los parámetros «dia», «mes» y «agno» representan
 *       conjuntamente una fecha válida del calendario gregoriano igual o
 *       posterior al 1 de enero de 1900.
 * Post: Ha devuelto un entero que codifica el día de la semana de la fecha
 *       representada por los valores de los parámetros «dia», «mes» y «agno», de
 *       acuerdo con la siguiente codificación: el 0 codifica el lunes, el 1
 *       codifica martes y así sucesivamente hasta el 6, que codifica el domingo.
 */
int diaDeLaSemana(int dia, int mes, int agno) {
 
     int diasTotales = diaEnElAgno(dia,mes,agno);
    int agnoTotal;
    int diaSemana;
    int total = 0;
 
    agnoTotal = (agno - 1900) + 1;
    diasTotales +=  (agnoTotal * 365 ) + (agnoTotal / 4);
    diaSemana = diasTotales % 7;
 
    const int dS[7]={0,1,2,3,4,5,6};
 
    return dS[(diaSemana+6) % 7];
 
}

Por último estaría fechas.h

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
#ifndef FECHAS_H_INCLUDED
 
#define FECHAS_H_INCLUDED
 
/*
 * Año a partir del cual la función «diaDeLaSemana» va a poder ser invocada,
 * aprovechando el dato de que el 1 de enero de 1900 fue lunes.
 */
const int AGNO_INICIAL = 1900;
 
 
/*
 * Pre:  La terna de parámetros «dia», «mes» y «agno» definen una fecha
 *       válida del calendario gregoriano, la fecha «dia/mes/agno».
 * Post: El valor del parámetro «f», al ser escrito en base 10, tiene un
 *       formato de ocho dígitos «aaaammdd» que representa
 *       la fecha «dia/mes/agno» donde los dígitos «aaaa» representan el
 *       año de la fecha, los dígitos «mm», el mes y los dígitos «dd», el
 *       día.
 */
void componer(int dia, int mes, int agno, int& f);
 
 
/*
 * Pre:  El valor de «f» escrito en base 10 tiene la forma «aaaammdd»
 *       donde los dígitos «aaaa» representan el año de una fecha válida
 *       del calendario gregoriano, los dígitos «mm», el mes y los dígitos
 *       «dd», el día.
 * Post: Los valores de los parámetros «dia», «mes» y «agno» son iguales,
 *       respectivamente, al día, al mes y al año de la fecha «f».
 */
void descomponer(int f, int& dia, int& mes, int& agno);
 
 
/*
 * Pre:  Los valores de los parámetros «f1» y «f2» escritos en base 10
 *       tienen la forma «aaaammdd», donde los dígitos «aaaa» representan
 *       el año, los dígitos «mm», el mes y los dígitos «dd» el día de
 *       sendas fechas del calendario gregoriano.
 * Post: Ha devuelto true si y solo si la fecha representada por el valor
 *       del parámetro «f1» es anterior a la representada por «f2».
 */
bool esAnterior(int f1, int f2);
 
 
/*
 * Pre:  1 ≤ dia ≤ 31, 1 ≤ mes ≤ 12, agno > 1582 y la fecha formada por
 *       «dia», «mes» y «agno» representan una fecha válida del calendario
 *       gregoriano.
 * Post: Tras la ejecución de la función, los parámetros «fecha», «dia», «mes» y
 *       «agno» representan la fecha correspondiente al día siguiente al que
 *       representaban al iniciarse la ejecución de la función.
 * 
 *       Por ejemplo, si d, m y a son variables de tipo entero y d = 17, m = 10 y
 *       a = 2019, tras la invocación diaSiguiente(d, m, a) los valores de las
 *       variables serían d = 18, m = 10 y a = 2019.
 *       Si los valores fueran d = 29, m = 2 y a = 2020, tras la invocación
 *       diaSiguiente(d, m, a) los valores serían d = 1, m = 3 y a = 2020.
 *       Si los valores fueran d = 31, m = 12 y a = 2022, tras la invocación
 *       diaSiguiente(d, m, a) los valores serían d = 1, m = 1 y a = 2023.
 */
void diaSiguiente(int& dia, int& mes, int& agno);
 
 
/*
 * Pre:  agno > 1582.
 * Post: Ha devuelto true si y solo si el año «agno» es bisiesto de
 *       acuerdo con las reglas del calendario gregoriano.
 */
bool esBisiesto(int agno);
 
 
/*
 * Pre:  1 ≤ mes ≤ 12 y agno > 1582.
 * Post: Ha devuelto el número de días del mes correspondiente al
 *       parámetro «mes» del año correspondiente al parámetro «agno».
 *       Por ejemplo: diasDelMes(10, 2018) devuelve 31,
 *                    diasDelMes(2, 2018) devuelve 28 y
 *                    diasDelMes(2, 2020) devuelve 29.
 */
int diasDelMes(int mes, int agno);
 
 
/*
 * Pre:  agno > 1582.
 * Post: Ha devuelto el número de días que tiene el año «agno».
 *       Por ejemplo: diasDelAgno(2018) devuelve 365 y
 *                    diasDelAgno(2020) devuelve 366.
 */
int diasDelAgno(int agno);
 
 
/*
 * Pre:  1 ≤ dia ≤ 31, 1 ≤ mes ≤ 12 y agno > 1582 y la fecha formada por
 *       «dia/mes/agno» es una fecha válida del calendario gregoriano.
 * Post: Ha devuelto el número de día del año de la fecha formada por
 *       «dia/mes/agno».
 *       Por ejemplo: diaEnElAgno(1, 1, 2019) devuelve 1;
 *                    diaEnElAgno(31, 12, 2018) devuelve 365;
 *                    diaEnElAgno(1, 2, 2019) devuelve 32 y
 *                    diaEnElAgno(31, 12, 2020) devuelve 366.
 */
int diaEnElAgno(int dia, int mes, int agno);
 
/*
 * Pre:  Los valores de los parámetros «dia», «mes» y «agno» representan
 *       conjuntamente una fecha válida del calendario gregoriano igual o
 *       posterior al 1 de enero de 1900.
 * Post: Ha devuelto un entero que codifica el día de la semana de la fecha
 *       representada por los valores de los parámetros «dia», «mes» y «agno», de
 *       acuerdo con la siguiente codificación: el 0 codifica el lunes, el 1
 *       codifica martes y así sucesivamente hasta el 6, que codifica el domingo.
 */
int diaDeLaSemana(int dia, int mes, int agno);
 
 
 
#endif  // FECHAS_H_INCLUDED




No se si se entiende bien pero no me dejaba adjuntar los archivos directamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema al hacer un programa con estructura modular

Publicado por Rodrigo (539 intervenciones) el 11/11/2019 22:11:33
Las variables que defines en el main, al parecer, requieren ser leidas y modificadas por la funcion pedirFecha, pero tal como esta, no se van a modificar, pues las pasas por valor. Pasalas por referencia para lograr ese objetivo.

void pedirFecha (int dia, int mes, int agno){
se cambia por
void pedirFecha (int &dia, int &mes, int &agno){
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar