Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 7hongo7 en 13 Febrero 2013, 16:29 pm



Título: Ayuda con un programailla de sumas aritmeticas
Publicado por: 7hongo7 en 13 Febrero 2013, 16:29 pm
Hola bueno soy nuevo aqui y no se muy bien programar :rolleyes: :rolleyes:, mi problema es el siguiente;tengo que hacer un programa que imprime en pantalla el numero que cae el dia de la semana osea del 1 al 7 ingresando Dia,Mes,Año.
 Mi codigo es este pero el problema es que cuando cambio de año me imprime mal, no cabe decir que el dia es de 57 dias son 12 meses y el año inicia desde el 2001.

int main()
{
    int D=0,M=0,A=0,S;
    scanf("%d %d %d",&D,&M,&A);
    S=(D+M+A)%7;
    if((D+M+A)%7==0)
    {
        S=7;
    }
    printf("%d",S);
    return 0;
}

Para dar un ejemplo 1 1 2001 es 1 8 2001 es 1 pero cuando cambia de año osea 1 1 2002 imprime 2 y deberia imprimir 6 porque el 57 12 2001 es 5.
 Muchas gracias por su ayuda espero que me entiendan no soy bueno en esto jejejeje


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: leosansan en 13 Febrero 2013, 19:24 pm
...............................tengo que hacer un programa que imprime en pantalla el numero que cae el dia de la semana osea del 1 al 7 ingresando Dia,Mes,Año.
 

Para tener el código no tienes más que mirarte este enlace:

http://es.wikipedia.org/wiki/Algoritmo_para_calcular_el_d%C3%ADa_de_la_semana


Saluditos!.

P.D: Por cierto ¿por qué le llamas al tema "programilla con sumas?. no indica nada, y lo de ayuda se sobreentiende.

Podías llamarle "entrar fecha y me dé día de la semana", es más explícito de tu problema.

Si tienes dudas no dudes  :P  en preguntar.  ;)


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: rir3760 en 14 Febrero 2013, 02:25 am
Otra opción es utilizar la función mktime (prototipo en <time.h>) para que sea esta la que calcule el día de la semana y año. Un ejemplo sencillo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(void)
  6. {
  7.   char *dia[] = {
  8.      "Domingo",
  9.      "Lunes",
  10.      "Martes",
  11.      "Miercoles",
  12.      "Jueves",
  13.      "Viernes",
  14.      "Sabado"
  15.   };
  16.   struct tm f = {0};
  17.  
  18.   srand((unsigned) time(NULL));
  19.   f.tm_year = 113;
  20.   f.tm_mon = rand() % 12;
  21.   f.tm_mday = 1 + rand() % 28;
  22.  
  23.   mktime(&f);
  24.   printf("2013/%d/%d ==> %s\n", 1 + f.tm_mon, f.tm_mday, dia[f.tm_wday]);
  25.  
  26.   return EXIT_SUCCESS;
  27. }

Un saludo


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: 7hongo7 en 14 Febrero 2013, 05:45 am
Muchas gracias a los dos me sirvio super bien los ejemplos muchas gracias!!!!!!!!!!!! ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: leosansan en 14 Febrero 2013, 14:56 pm
Y según Wikipedia:

Código
  1. #include <stdio.h>
  2. #include<locale.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6.    setlocale(LC_ALL, "Spanish");
  7.    int dia_=0,dia_semana=0,M_=0,mes_,a=0;
  8.    int M[2][12] = {0,3,3,6,1,4,6,2,5,0,3,5,
  9.    0,3,4,0,2,5,0,3,6,1,4,6 };
  10.    char dia[7][10] = {"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
  11.    while (1){
  12.      printf ("Indique el  mes (1-12): ");
  13.      fflush (stdout);
  14.      scanf("%d",&mes_);
  15.      printf ("Indique el día del mes: ");
  16.      fflush (stdout);
  17.      scanf("%d",&dia_);
  18.      printf ("Indique el año: ");
  19.      fflush (stdout);
  20.      scanf("%d",&a);
  21.      if  (a%4 ==0 && a%100!=0 ||  (a%400==0))
  22.        M_=M[1][mes_-1];
  23.      else
  24.        M_=M[0][mes_-1];
  25.      dia_semana=((a-1)%7+((a-1)/4 - 3*(((a-1)/100)+1)/4)%7+M_+dia_%7)%7;
  26.       printf("\n%s  dia de la semana %d\n\n",dia[dia_semana],dia_semana);
  27.    }
  28.    return EXIT_SUCCESS;
  29. }
  30.  
  31.  

Saluditos!.


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: rir3760 en 14 Febrero 2013, 17:32 pm
Algunos comentarios:

* Los elementos de un array pueden inicializarse mediante una lista de valores, si cada elemento es a su vez un array (como es tu caso) se deben utilizar listas anidadas, de esta forma:
Código
  1. int M[2][12] = {
  2.   {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5},
  3.   {0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}
  4. };

* El operador lógico AND tiene mayor prioridad que el operador lógico OR, por ello en esta expresión los paréntesis son superfluos (con o sin ellos el resultado es el mismo):
Código
  1. a%4 ==0 && a%100!=0 ||  (a%400==0)

* El resultado de los mentados operadores es uno si se cumple la condición y cero en caso contrario, en base a ello si revisamos el condicional:
Código
  1. if (a%4 ==0 && a%100!=0 ||  (a%400==0))
  2.   M_=M[1][mes_-1];
  3. else
  4.   M_=M[0][mes_-1];
Este se puede reducir a:
Código
  1. M_ = M[a%4 == 0 && a%100 != 0 || a%400 == 0][mes_-1];
Y (al gusto de cada quien) se puede sustituir el uso del operador "==" por paréntesis y el operador de negación "!".

Un saludo


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: leosansan en 14 Febrero 2013, 22:57 pm
Para quien nos "vea" parecería que mi código no funcionase correctamente, y todo lo contrario, hace lo que se le pide. así que sólo unos pequños comentarios, entre tú y yo:

Algunos comentarios:

* Los elementos de un array pueden inicializarse mediante una lista de valores, si cada elemento es a su vez un array (como es tu caso) se deben utilizar listas anidadas, de esta forma:
Código
  1. int M[2][12] = {
  2.   {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5},
  3.   {0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}
  4. }

Creo que aquí hablaríamos de "claridad", ya que "creo" que tan correcta es una como otra opción.
Por ejemplo, al declarar una matriz de tres por tres se me puede "apetecer" la primera o la segunda forma:


Código
  1. a[3][3]={1,2,3,4,5,6,7,8,9};
  2.  
  3. a[3][3]={{1,2,3},{4,5,6},{7,8,9};

No niego que la segunda es más ·visible" y menos expuesta a errores, pero será igual de válida que la primera.

Citar
* El operador lógico AND tiene mayor prioridad que el operador lógico OR, por ello en esta expresión los paréntesis son superfluos (con o sin ellos el resultado es el mismo):
Código
  1. a%4 ==0 && a%100!=0 ||  (a%400==0)


Superfluo no es sinónimo de mal, sino exceso de celo. Reconozco que en este caso peque del copy´pega de un código antiguo. No es que quiera disculpar ese "exceso", pero en general más vale pecar por exceso que por defecto, más estos códigos que yo al menos hago con cierta "alegría".


Citar
* El resultado de los mentados operadores es uno si se cumple la condición y cero en caso contrario, en base a ello si revisamos el condicional:]
Código
  1. if (a%4 ==0 && a%100!=0 ||  (a%400==0))
  2.   M_=M[1][mes_-1];
  3. else
  4.   M_=M[0][mes_-1];
Este se puede reducir a:
Código
  1. M_ = M[a%4 == 0 && a%100 != 0 || a%400 == 0][mes_-1];

Esto último es de veteranía. Aunque considero que el if-else es más "entendible" para quien propuso el tema, en virtud de lo que colgó, no dejo de reconocer que es algo a tener en cuenta.

Conclusión: gracias por las puntualizaciones, agudas como siempre y que me ayudan a mejorar hasta los detalles más nimios.

Saluditos!.
  :silbar:


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: 7hongo7 en 17 Febrero 2013, 01:48 am
Vientos "leosansan" me has ayudado con los codigosy me funcionan genial ;-) ;-) ;-) ;-) solamente que ahora tengo otra duda y es que como podría hacer lo mismo pero con una expresion aritmetica :huh: :huh: :huh: :huh: como me publicaste hace tiempo pero el problema es que esa formula ignora completamente el mes y no me imprime lo que requiero se desfasa por un dia el programa, muchas grax carnal la neta me estas ayudando muchisimo


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: leosansan en 17 Febrero 2013, 18:01 pm
Vientos "leosansan" me has ayudado con los codigosy me funcionan genial ;-) ;-) ;-) ;-)

Gracias, gracias.

Citar
solamente que ahora tengo otra duda y es que como podría hacer lo mismo pero con una expresion aritmetica :huh: :huh: :huh: :huh: como me publicaste hace tiempo pero el problema es que esa formula ignora completamente el mes y no me imprime lo que requiero se desfasa por un dia el programa, muchas grax carnal la neta me estas ayudando muchisimo

Lo que yo uso es una expresión aritmética, a diferencia de rir que usa funciones del sistema. Y si te fijas bien hace uso de la variable "mes_". Y el código no desfasa en un día. ¿O te estas refiriendo a otro código que has hecho tú o yo?. Aclaramelo please.

Saluditos!.


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: 7hongo7 en 20 Febrero 2013, 16:07 pm
Bueno no es que lleve otro código porque la neta no entiendo ese programa y según es el fácil  :o :o :o :o :o  jejejeje,  el problema que me da es que en la pagina que me diste de wikipedia copie la formula pero se desfasa  el mes en 1 dia osea cuando marco 1 1 2001 me marca 1 y eso esta bien pero cuando marco 1 2 2001 me vuelve a marcar 1 y me deberia de marcar 2 a eso me refiero en los demas con dias y años esta bien


Título: Re: Ayuda con un programailla de sumas aritmeticas
Publicado por: leosansan en 20 Febrero 2013, 20:43 pm
.....................................................
el problema que me da es que en la pagina que me diste de wikipedia copie la formula pero se desfasa  ..............
......................................................
Eso te pasa por copiar de la Wikipedia en lugar de copiar de mí código :laugh: :laugh:

Mejor cuelgas tú código para ver dónde puede estar el error.

Pero te insisto, el mío lo saque con la fórmula de WikiP. y no desfasa.

Saluditos!.