Ayuda con un programailla de sumas aritmeticas

Iniciado por 7hongo7, 13 Febrero 2013, 16:29 PM

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

7hongo7

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

leosansan

#1
Cita de: 7hongo7 en 13 Febrero 2013, 16:29 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.  ;)

rir3760

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:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
   char *dia[] = {
      "Domingo",
      "Lunes",
      "Martes",
      "Miercoles",
      "Jueves",
      "Viernes",
      "Sabado"
   };
   struct tm f = {0};
   
   srand((unsigned) time(NULL));
   f.tm_year = 113;
   f.tm_mon = rand() % 12;
   f.tm_mday = 1 + rand() % 28;
   
   mktime(&f);
   printf("2013/%d/%d ==> %s\n", 1 + f.tm_mon, f.tm_mday, dia[f.tm_wday]);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

7hongo7

Muchas gracias a los dos me sirvio super bien los ejemplos muchas gracias!!!!!!!!!!!! ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)

leosansan

#4
Y según Wikipedia:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include<locale.h>
#include <stdlib.h>
int main()
{
   setlocale(LC_ALL, "Spanish");
   int dia_=0,dia_semana=0,M_=0,mes_,a=0;
   int M[2][12] = {0,3,3,6,1,4,6,2,5,0,3,5,
   0,3,4,0,2,5,0,3,6,1,4,6 };
   char dia[7][10] = {"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
   while (1){
     printf ("Indique el  mes (1-12): ");
     fflush (stdout);
     scanf("%d",&mes_);
     printf ("Indique el día del mes: ");
     fflush (stdout);
     scanf("%d",&dia_);
     printf ("Indique el año: ");
     fflush (stdout);
     scanf("%d",&a);
     if  (a%4 ==0 && a%100!=0 ||  (a%400==0))
       M_=M[1][mes_-1];
     else
       M_=M[0][mes_-1];
     dia_semana=((a-1)%7+((a-1)/4 - 3*(((a-1)/100)+1)/4)%7+M_+dia_%7)%7;
      printf("\n%s  dia de la semana %d\n\n",dia[dia_semana],dia_semana);
   }
   return EXIT_SUCCESS;
}



Saluditos!.

rir3760

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:
int M[2][12] = {
   {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5},
   {0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}
};


* 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):
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:
if (a%4 ==0 && a%100!=0 ||  (a%400==0))
   M_=M[1][mes_-1];
else
   M_=M[0][mes_-1];

Este se puede reducir a:
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

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:

Cita de: 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 (cpp) [Seleccionar]
int M[2][12] = {
   {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5},
   {0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}
}


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 (cpp) [Seleccionar]
a[3][3]={1,2,3,4,5,6,7,8,9};

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):
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:]
if (a%4 ==0 && a%100!=0 ||  (a%400==0))
   M_=M[1][mes_-1];
else
   M_=M[0][mes_-1];

Este se puede reducir a:
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:

7hongo7

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

leosansan

Cita de: 7hongo7 en 17 Febrero 2013, 01:48 AM
Vientos "leosansan" me has ayudado con los codigosy me funcionan genial ;-) ;-) ;-) ;-)

Gracias, gracias.

Citarsolamente 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!.

7hongo7

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