elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Java / Consulta calculo de horas, entre dos fechas en: 26 Abril 2012, 15:57 pm
Hola,

Estoy realizando parte de una aplicacion que se encarga de calcular, pasadas 2 fechas completas, el periodo transcurrid en horas.
Estoy utilizando la libreria joda-time, para calcular horas totales, el problema lo tengo cuando en el calculo se debe contemplar el horario laboral de 9 a 18, sabados, domingos y feriados.


El algoritmo que hice primero evalua si las fechas suministradas son del mismo dia, en tal caso se deberia contabilizar las horas que estan dentro de las 9 y las 18, menos la hora de almuerzo.

Si las fechas suministradas difieren (siempre la segunda fecha es posterior) primero suma la diferencia entre la fecha inicial y una fecha del mismo dia pero con horario de 18:00:00, e incrementa 1 dia a esa fecha inicial.
Luego evalua si la fecha inicial es del mismo dia que la final, si no lo es, sumo 8 horas. Si son del mismo dia suma la diferencia entre la fecha final y una fecha del mismo dia pero con horario de 9:00:00.

En teoria deberia funcionar, de hecho la segunda parte funciona bien, el problema esta cuando lasfechas inicial y fin son del mismo dia, y la verdad no quiero seguir agregando condiciones porque es una cagada....

si ayuda en algo pego codigo:

Código
  1.  
  2. private final int ENTRADA = 9;
  3. private final int SALIDA = 18;
  4. private final int ALMUERZO_INICIO = 13;
  5. private final int ALMUERZO_FIN = 14;
  6.  
  7.  
  8. private Date fechaInicio;
  9. private Date fechaFin;
  10.  
  11.  
  12.  
  13. public int tiempoRealEnHoras(){
  14. int horas = 0;
  15. inicio.setTime(this.fechaInicio);
  16. fin.setTime(this.fechaFin);
  17.  
  18. if(this.mismoDia(inicio, fin)){
  19. horas += this.sumarHorasDelDia(inicio, fin);
  20. }else{
  21. horas += this.sumarHoras(this.SALIDA, inicio);
  22. inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);
  23.  
  24. while(!this.mismoDia(inicio, fin)){
  25. if(this.diaHabil(inicio) && this.diaFeriado(inicio))
  26. horas += 8;
  27. inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);
  28. }
  29.  
  30. horas += this.sumarHoras(this.ENTRADA, fin);
  31. }
  32. return horas;
  33. }
  34.  
  35. private int sumarHoras(int hora, GregorianCalendar cal){
  36. int horasParciales = 0;
  37.  
  38. if(this.diaHabil(cal) && this.diaFeriado(cal)){
  39. Date dt = cal.getTime();
  40. dt.setHours(hora);
  41. dt.setMinutes(0);
  42. dt.setSeconds(0);
  43.  
  44. if(hora == this.ENTRADA) //calculo de horas finales ( de 9hs a Xhs)
  45. if(cal.get(GregorianCalendar.HOUR_OF_DAY) > this.ENTRADA)
  46. if(cal.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
  47. horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours() - 1;
  48. else
  49. horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours();
  50. else //calculo de horas iniciales ( de Xhs a 18hs)
  51. if(cal.get(GregorianCalendar.HOUR_OF_DAY) < this.SALIDA)
  52. if(cal.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO)
  53. horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours() - 1;
  54. else
  55. horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours();
  56. }
  57. return horasParciales > 8? 8 : horasParciales;
  58. }
  59.  
  60. private int sumarHorasDelDia(GregorianCalendar inicio, GregorianCalendar fin){
  61. int horasParciales = 0;
  62.  
  63. if(this.diaHabil(inicio) && this.diaFeriado(inicio)){
  64. if(inicio.get(GregorianCalendar.HOUR_OF_DAY) < this.ENTRADA || inicio.get(GregorianCalendar.HOUR_OF_DAY) > this.SALIDA){
  65. int diferenciaHoras = Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
  66. inicio.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA);
  67. fin.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA + diferenciaHoras);
  68. }
  69.  
  70. if(inicio.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO && fin.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
  71. horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours() - 1;
  72. else
  73. horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
  74. }
  75. return horasParciales > 8? 8 : horasParciales;
  76. }
  77.  

Se parece mas a codig C que a java pero bueno...me piden eso y tiene que ser muy preciso. Si se les cae alguna idea, bien barbaro jaaja.

Gracias.
2  Programación / Programación General / Problemas con eclipse en: 5 Noviembre 2010, 19:59 pm
Estoy programando aplicaciones para Android con eclipse y me acabo de dar cuenta que cada vez que ejecuto mi aplicacion, aumenta el consumo de memoria del eclipse, tanto que se pone toda la maquina lenta y necesita usar memoria virtual. Dudo mucho que sea mi aplicacion la que genere este problema porque....es el Hello World de android jajaj asi que si alguno le paso? o sabe como solucionarlo, joya.
3  Programación / Programación C/C++ / no ce termina de cerrar mi programa en: 6 Agosto 2010, 00:37 am
Hola estoy haciendo un jueguito con SDL y C++ con el IDE VS2008 y me arme una clase Game que tiene los metodos init(), loopGame() y end(). supuestamente en el main se ejecutan los 3, cuando el loop termina se ejecuta end() y despues de eso el respectivo return del main. Bueno nose que pasa pero cuando apreto ESC o el boton de salir, de mi pantalla de SDL, se cierra la ventana pero el procesos sigue corriendo, a que se puede deber esto??

Si, en el main, pongo exit(1) en vez de return 1, la ejecucion termina joya.

Lh: No hagas doble post, utiliza el botón modificar.

ya lo resolvi, en vez de poner atexit(SDL_Quit); solamente ponia SDL_Quit;
Ahora tengo otra pregunta: cuales son las desventajas de manejar los errores con IFs, osea a cada funcion que quiero usar chekeo el valor que retorna.
4  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 1 Junio 2010, 20:54 pm
Te tengo otra pregunta, mi programa recive de un servidor una estructura compuesta por 4 char* de longitud (los primeros 3) menor a 512 bytes y la 4ta de tamaño variable entre 1 y nose.... 9999999..muchos bytes, depende de la persona que haya cargado la informacion en esa estructura, no importa. Y como ultima transferencia recibe un ".". El hecho es que mi programa hace un recv, un malloc y un strcpy para el 1er, 2do y 3er campo. Para el 4to hago algo asi:

Código
  1. memset(buffer, 0 ,512);
  2. i = recv(buffer);
  3. buffer[i]='\0';
  4. while(strcmp(buffer, "."))
  5. {
  6.    estructura.m_cuerpo = (char*)realloc(estructura.m_cuerpo,  SIZEOF(CHAR)*STRLEN(BUFFER) +1);
  7.    if(strlen(estructura.m_cuerpo) > 0)strcat(estructura.m_cuerpo, buffer);
  8.    else strcpy(estructura.m_cuerpo, buffer);
  9.    memset(buffer, 0, 512);
  10.    i =recv(buffer);
  11.    buffer[i]='\0';
  12. }

Lo que estoy preguntando es, de que forma puedo hacer ese WHILE para que vaya agrandando la variable hasta que reciba del socket un ".". Y esta mal el tamaño del realloc, lo se jajaj.
Todo esto forma parte de un sistema que estoy haciendo para un trabajo practico, es un servidor de noticias que utiliza el protocolo nntp (un toke simplificado) esos 4 campos serian los campos de un articulo de noticias ID, groupname, head y body. Los primeros 3 basta con 512 bytes (1 lectura de socket) y el body puede llegar a ser mas grande, el tema es como agrando correctamente el body de mi estructura?
5  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 30 Mayo 2010, 19:59 pm
Si, el codigo tiene que ser enteramente en C ansi pero me es mas facil para mostrarselo a ustedes en c++.
6  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 30 Mayo 2010, 19:54 pm
ahi le reste 1, funciona bien pero esta bien hecho el codigo? no estoy desperdiciando memoria en algun lado?
7  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 30 Mayo 2010, 19:47 pm
ahhh yo crei que vos le pasabas cuanto querias agrandar el bloque de memoria, entonces lo correcto seria algo asi:
Código
  1. char** obtenerLista(int *contador)
  2. {
  3.       int cont = 0;
  4.       char buf[50], **lista = NULL;
  5.  
  6.       for(int i = 0; i < 10; i++)
  7.       {
  8.               printf("Ingresa cadena: ");
  9.               fgets(buf, 50, stdin);
  10.               buf[strlen(buf)-1] = '\0';
  11.  
  12.               if(strlen(buf) > 0){
  13.                   ++cont;
  14.                   lista = (char**)realloc(lista, sizeof(char*)*cont);
  15.                   if(lista == NULL) abort();
  16.                   lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
  17.                   if(lista[cont]==NULL) abort();
  18.                   strcpy(lista[cont], buf);
  19.               }
  20.       }
  21.       *contador = cont;
  22.       return lista;
  23. }

De esta forma estaria diciendo que el puntero se agrande sizeof(char*) cada vez que quiero agregar un nuevo string?

Código
  1. char** obtenerLista(int *contador)
  2. {
  3.       int cont = 0;
  4.       char buf[50], **lista = NULL;
  5.  
  6.       for(int i = 0; i < 10; i++)
  7.       {
  8.               printf("Ingresa cadena: ");
  9.               fgets(buf, 50, stdin);
  10.               buf[strlen(buf)-1] = '\0';
  11.  
  12.               if(strlen(buf) > 0){
  13.                   ++cont;
  14.                   lista = (char**)realloc(lista, sizeof(char*)*cont);
  15.                   if(lista == NULL) abort();
  16.                   lista[cont-1]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
  17.                   if(lista[cont-1]==NULL) abort();
  18.                   strcpy(lista[cont-1], buf);
  19.               }
  20.       }
  21.       *contador = cont;
  22.       return lista;
  23. }
con este codigo me funciones de 10! pero es correcto o e n que la estoy pifiando?
8  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 30 Mayo 2010, 18:19 pm
es que no hay que hacer calculos, es sencillo a vos te van a venir en varios strings, nose cuantos y lo que quiero hacer es: si me viene un string, reservo memoria para el puntero al string y reservo memoria para el string en si. Entonces no entiendo cual es el problema.

Código
  1.  lista = (char**)realloc(lista, sizeof(char*));
se supone que con eso cada vez que lo invoque genero una posicion mas de la lista de punteros


que tengo que hacer para que funcioneeeeeeeeee????? jajajja
9  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 30 Mayo 2010, 17:37 pm
claro porque la idea es que, si hay una nue3va cadena a agregar se reserve memoria para un nuevo puntero a string y despues se reserve memoria para ese string. Segun entendi si el puntero no tienen memoria asiganada el realloc funciona como un malloc. Y que decis que lo tengo que inicializar con NULL a lista?
10  Programación / Programación C/C++ / Re: reservar memoria para punteros en C en: 30 Mayo 2010, 16:43 pm
estoy haciendo una prueba y calculo que esta vez hice bien el tema de la lista pero hay algo que me esta fallando en el programa y no me doy cuenta que es, porque al finalizar me salta un mensaje del visual studio preguntando si quiero debuggearlo. A ver que me decin ustedes.
Código
  1. char** obtenerLista(int *contador)
  2. {
  3.       int cont = 0;
  4.       char buf[50], **lista;
  5.  
  6.       for(int i = 0; i < 10; i++)
  7.       {
  8.               printf("Ingresa cadena: ");
  9.               fgets(buf, 50, stdin);
  10.               buf[strlen(buf)-1] = '\0';
  11.  
  12.               if(strlen(buf) > 0){
  13.                   lista = (char**)realloc(lista, sizeof(char*));
  14.                   lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
  15.                   strcpy(lista[cont], buf);
  16.                    ++cont;
  17.               }
  18.       }
  19.       *contador = cont;
  20.       return lista;
  21. }

Código
  1. int main(){
  2. char **lista;
  3.    int contador;
  4.  
  5.    lista = obtenerLista(&contador);
  6.  
  7.    for(int i =0; i < contador; i++){
  8.        printf("grupo %d: %s\n", i, lista[i]);
  9.        }
  10.  
  11.  
  12.  
  13.    for(int i=0; i<contador; i++){
  14.            free(lista[i]);
  15.            }
  16.    free(lista);
  17.  
  18.    system("pause");
  19.    return 0;
  20. }
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines