Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como hago esta cuenta en c

Estas en el tema de Como hago esta cuenta en c en el foro de C/C++ en Foros del Web. primero aclaro , como siempre cada vez que posteo una duda, que no es para que me hagan el ejercicio que tengo que hacer yo, ...
  #1 (permalink)  
Antiguo 15/08/2013, 21:24
 
Fecha de Ingreso: septiembre-2010
Mensajes: 101
Antigüedad: 13 años, 7 meses
Puntos: 0
Como hago esta cuenta en c

primero aclaro , como siempre cada vez que posteo una duda, que no es para que me hagan el ejercicio que tengo que hacer yo, esto lo hago cuando necesito la opinion de alguien mas, o la vision sobre el problema

el tema es asi

tengo una función
que que recibe 3 parametrs
que serian dia mes año
chekea si es bisiesto y toda la bola esa, esto YA ESTA HECHO

pero ahora
le tengo que agregar OTRO entero como parametro

que seria una cantidad de dias MAS

osea si el usuario ingresa

20 de enero 2000

y despues ingresa 20 en el otro entero que se acaba de agregar

LA FUNCION AHORA DEBE SUMAR ESOS 20 DIAS AL 20 DE ENERO DEL 2000
pero no tiene que solo sumar , osea NO tiene que hacer 40 de enero del 2000
sino tiene que sumar en dias gregorianos

osea quedaria si no fallo 9 de febrero del 2000...

mi pregunta es

COMO HAGO PARA QUE cuando la sume pase al mes siguiente!!
tengo que hacer una cuenta?

aclaro que tengo que hacerlo todo a mano, estoy en el primer año de la facu, nada de funciones extras.
  #2 (permalink)  
Antiguo 16/08/2013, 13:07
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Como hago esta cuenta en c

La idea es facil: vas añadiendo dias hasta que se terminen los dias a sumar, mientras controlas que el dia no sea mayor que el nº de dias del mes con el que trabajas.

Lo que seguramente mas te interesa: como sabes los dias de cada mes si cada cuatro años hay uno que tiene un dia mas? Una minifuncion de ayuda (puedes encontrar mil variantes de esta misma en cualquier sitio):

Código C:
Ver original
  1. int dias_al_mes(int m, int a) {
  2.     int fdxm[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  3.  
  4.     return (m == 1 && a%4 == 0 && (a%100 != 0 || a%400 == 0))? fdxm[m]+1 : fdxm[m];
  5. }

Basicamente esta funcion retorna el nº de dias de todos los meses, excepto para los años bisiestos que incrementa 1 para el mes de febrero.

Con esto ya puedes comenzar a trabajar

Saludos
vosk
  #3 (permalink)  
Antiguo 16/08/2013, 13:52
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Como hago esta cuenta en c

Bueno, una pequeña ayuda :)

Código C:
Ver original
  1. typedef struct {
  2.     int d, m, a;
  3. } FECHA;
  4.  
  5.  
  6. int dias_al_mes(int m, int a) {
  7.     int fdxm[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  8.     return (m == 1 && a%4 == 0 && (a%100 != 0 || a%400 == 0))? fdxm[m]+1 : fdxm[m];
  9. }
  10.  
  11.  
  12. void suma_dias(FECHA *fecha, int dias) {
  13.     int dxm;
  14.    
  15.     //situacion inicial
  16.     dxm = dias_al_mes(fecha->m, fecha->a);
  17.    
  18.     //manos a la obra
  19.     while(dias > 0) {
  20.         //incremento dia
  21.         fecha->d++;
  22.         printf("Dia %02d (max %02d) ", fecha->d, dxm);
  23.        
  24.         //compruebo que no sea mayor que el maximo de dias del mes
  25.         if(fecha->d > dxm) {
  26.             printf(", ojo que aqui salto de mes\n");
  27.            
  28.             //incremento mes
  29.             fecha->m += 1;
  30.            
  31.             //compruebo que no sea mayor que 12 (basado en 0, por eso pongo 11)
  32.             if(fecha->m > 11) {
  33.                 //reinicio mes
  34.                 fecha->m = 0;
  35.                 //incremento año
  36.                 fecha->a++;
  37.             }
  38.             //reinicio dia
  39.             fecha->d = 1;
  40.             //redefino situacion inicial
  41.             dxm = dias_al_mes(fecha->m, fecha->a);
  42.             printf("Es decir, que ahora es dia %02d (max %02d) ", fecha->d, dxm);
  43.         }
  44.        
  45.         //adelanto trabajo
  46.         dias--;
  47.         printf("y aun quedan %d dias a sumar\n", dias);
  48.     }
  49. }
  50.  
  51.  
  52. int main() {
  53.     FECHA fecha = {20, 0, 2000};
  54.  
  55.     suma_dias(&fecha, 20);
  56.     printf("\n\n%02d/%02d/%d", fecha.d, fecha.m, fecha.a);
  57.    
  58.     return 0;
  59. }


Ojo, no está optimizado solo es para ver paso a paso lo que hay. Lo ideal sería agrupar los dias a sumar segun el maximo de dias sumables (dia actual - dias maximos), dejando un remanente que se usaría en el siguiente bucle, de forma que se va repitiendo hasta que el remanente sea <= 0

Otra cosa, he puesto los meses basados en 0 para ir rapido pero puedes pasarlo a 1 (en el ejemplo 0->ene, 1->feb,...,11->dic)

Creo que no olvido nada; el algoritmo para calcular años bisiestos es la propia definicion:

Código C:
Ver original
  1. Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100
  2. y además es divisible entre 400, también resulta bisiesto. Obviamente, esto elimina los años finiseculares (últimos de
  3. cada siglo, que ha de terminar en 00) divisibles sólo entre 4 y entre 100.

Espero que sirva de ayuda
Saludos
vosk
  #4 (permalink)  
Antiguo 17/08/2013, 12:45
 
Fecha de Ingreso: septiembre-2010
Mensajes: 101
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Como hago esta cuenta en c

lo de los años bisiesto y la cantidad de meses de cada uno lo tengo resuelto

solo no sabia como hacer "el pase" de mes al sumarle dias


muchas gracias por sus respuestas, ahora estoy en el celular, a la noche en casa me pongo a verificar la ayuda que me dieron, a primera vista creo que me servira.

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:51.