[C++] Ayuda para ejercicio de un calendario usando arrays.

Iniciado por nadales56, 11 Septiembre 2019, 20:26 PM

0 Miembros y 1 Visitante están viendo este tema.

nadales56

Hola, buenas a todos, tengo una pequeña duda sobre el siguiente ejercicio, les dejo el enunciado en negrita.

Defina el tipo Matriz como un array de 6x7 números enteros, y diseñe un subprograma para crear un calendario de un mes genérico en una matriz que se devolverá como parámetro de salida.
El subprograma se denominará calendario.  El primer parámetro (m), de salida, es de tipo Matriz.  El segundo parámetro (ndias), de entrada, es de tipo int y representa el número total de días del mes del calendario (28, 29, 30 o 31). El tercer parámetro (pds), de entrada, es de tipo int y representa el índice del día de la semana donde comienza el primer día del mes (donde 0 corresponde a Lunes, 1 a Martes, y así sucesivamente hasta 6 que representa al Domingo).


El código que he implementado es el siguiente:
Código (cpp) [Seleccionar]

void calendario(Tipo_Matriz &m, const int ndias,const int pds){
//Iniciar calendario me pone todos los valores de la matriz a 0
   iniciar_calendario(m);
   
   int dia = 1;
   int j;
   for(int i = 0; i < 6; i++){
       if(i == 0){
           j = pds;
       }else{
           j = 0;
       }
       while(dia <= ndias && (j >= 0 && j < 7)){
           m[i][j] = dia;
           dia++;
           j++;
       }
   }
   //mostrar calendario
   cout << endl;
   for(int i = 0; i < 6; i++){
       for(int j = 0; j < 7; j++){
           cout << m[i][j] << " ";
       }
       cout << endl;
   }
}


Cuando introduzco dias = 30 y pds = 2 (por ejemplo), el resultado que obtengo es:
0 0 1 2 3 4 6
6 7 8 9 10 11 13
13 14 15 16 17 18 20
20 21 22 23 24 25 27
27 28 29 30 0 0 0
0 0 0 0 0 0 0
me como una serie de números y no sé exactamente donde está el error, por lo que si pudiesen ayudarme, me sería de gran ayuda.
Muchas gracias!





Mod: No escribir titulos en mayusculas.

engel lex

#1
Código (cpp) [Seleccionar]
for(int i = 0; i < 6; i++){
       if(i == 0){
           j = pds;
       }else{
           j = 0;
       }
       while(dia <= ndias && (j >= 0 && j < 7)){
           m[i][j] = dia;
           dia++;
           j++;
       }


uno de tus errores (si es que hay mas) está aqui...
en el while
ciclo 1: j=2, dia=1 -> j=4, dia=2
ciclo 1: j=3, dia=2 -> j=5, dia=3
ciclo 1: j=4, dia=3 -> j=6, dia=4
ciclo 1: j=5, dia=4 -> j=7, dia=5
el ciclo se rompe porque  porque j pasa a ser 7 ergo no llega al dia 5

pero no estoy seguro por que se salta los siguientes dias

para ser sincero yo lo habría hecho linearmente con division y modulo

Código (cpp) [Seleccionar]
for(i=0; <=ndias; i++){
 int x = (i+pds) % 7
 int y = (i+pds) / 7
 m[y][x] = i+1;

}


y te ahorrar andar trabajando con mas de 1 dimensión gracias a la magia de las matemáticas XD
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

nadales56

Muchas gracias por la respuesta!
He probado el código que me has puesto, me ha parecido muy interesante y es una forma que no me hubiese planteado nunca, por lo que te agradezco mucho el aporte.

Tengo una pregunta al respecto, en qué tipo de situaciones (aparte de esta claro está) se ultiliza?, lo digo por si puedo aplicarlo en otro tipo de ejercicios, por tener esa opción en cuenta.

Por otra parte, el resultado que obtengo es el mismo que obtenía antes, me hace ese salto de número cuando llego a m[y][6].

Lo que he visto, que me ha parecido curioso es lo siguiente:
Código (cpp) [Seleccionar]


for(int i = 0; i < ndias; i++){
            int x = (i+pds) % 7;
            int y = (i+pds) / 7;
            m[y][x] = i+1;
            cout << m[0][6] << " "; // linea nueva para comprobar el estado de la matriz en esa posicion

}



el resultado es este:
0 0 0 0 5 6 6 6 6 6 6 6 6 6...
de manera que llega a poner el 5, pero luego me pasa al 6 y se queda con ese último valor.

iré echandole un vistazo a lo largo del dia, a ver si llego solo a la solución. En cuanto la consiga la postearé.

Repito, muchas gracias por el aporte! =)

K-YreX

Cita de: nadales56 en 11 Septiembre 2019, 20:26 PM
Hola, buenas a todos, tengo una pequeña duda sobre el siguiente ejercicio, les dejo el enunciado en negrita.

Defina el tipo Matriz como un array de 6x7 números enteros, y diseñe un subprograma para crear un calendario de un mes genérico en una matriz que se devolverá como parámetro de salida.
El subprograma se denominará calendario.  El primer parámetro (m), de salida, es de tipo Matriz.  El segundo parámetro (ndias), de entrada, es de tipo int y representa el número total de días del mes del calendario (28, 29, 30 o 31). El tercer parámetro (pds), de entrada, es de tipo int y representa el índice del día de la semana donde comienza el primer día del mes (donde 0 corresponde a Lunes, 1 a Martes, y así sucesivamente hasta 6 que representa al Domingo).


El código que he implementado es el siguiente:
Código (cpp) [Seleccionar]

void calendario(Tipo_Matriz &m, const int ndias,const int pds){
//Iniciar calendario me pone todos los valores de la matriz a 0
   iniciar_calendario(m);
   
   int dia = 1;
   int j;
   for(int i = 0; i < 6; i++){
       if(i == 0){
           j = pds;
       }else{
           j = 0;
       }
       while(dia <= ndias && (j >= 0 && j < 7)){
           m[i][j] = dia;
           dia++;
           j++;
       }
   }
   //mostrar calendario
   cout << endl;
   for(int i = 0; i < 6; i++){
       for(int j = 0; j < 7; j++){
           cout << m[i][j] << " ";
       }
       cout << endl;
   }
}


Cuando introduzco dias = 30 y pds = 2 (por ejemplo), el resultado que obtengo es:
0 0 1 2 3 4 6
6 7 8 9 10 11 13
13 14 15 16 17 18 20
20 21 22 23 24 25 27
27 28 29 30 0 0 0
0 0 0 0 0 0 0
me como una serie de números y no sé exactamente donde está el error, por lo que si pudiesen ayudarme, me sería de gran ayuda.
Muchas gracias!





Mod: No escribir titulos en mayusculas.

Después de estar un buen rato buscando dónde podía estar el fallo, he terminado por probar el código personalmente y... Esta es la salida que he obtenido:

0 0 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 0 0 0
0 0 0 0 0 0 0

Por lo que no hay ningún error. No sé si es que lo has escrito manualmente y entonces has "corregido" el error sin darte cuenta o es que has modificado algo y lo estás ejecutando sin volver a compilarlo pero ya ves que funciona. Obviamente se puede mejorar como ya te han demostrado pero correcto es. Por ejemplo esta parte:
Código (cpp) [Seleccionar]

if(i == 0)
    j = pds;
else
    j = 0;

La condición del <if> va a ser cierta una vez (en la primera iteración). Por lo que se puede poner directamente el valor de <pds> a la <j> antes del bucle.
Código (cpp) [Seleccionar]

int dia = 1;
int j = pds;
for(...){
    while(...){
        // el cuerpo del while
    }
    j = 0; // actualizamos siempre a 0 despues de la primera iteracion
}



Y respecto a la solución que te ha dado @engel lex, también es correcta. El resultado es el mismo que he mostrado antes. Comprueba que estés guardando y recompilando el código con cada modificación o si estás usando un IDE prueba a cerrarlo y volver a abrirlo.

Ya nos contarás si consigues solucionarlo y cuál era el problema al final. Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

engel lex

efectivamente como te dicen tienes algo malo y no en tu codigo...

sobre la solucion, es basicamente como el programa aplica una matriz, en realidad una matriz no deja de ser unidimensional (porque en general la ram lo es), lo que hace es calcular los saltos para saber donde debe estar al acceder, yo hice lo mismo,  se que cada sección tiene 7 de largo, ergo divido sin resto entre 7, los elementos está dentro de los 7 contiguos que es el resto de la division
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

nadales56

Buenas señor@s,
estaban ustedes en lo cierto, he descargado otro editor de texto y he actualizado la versión del compilador y no me da ningún problema.

Gracias igualmente por la ayuda que me habéis prestado. Un saludo!! =)