Autor
|
Tema: Ayuda con un programailla de sumas aritmeticas (Leído 3,925 veces)
|
7hongo7
Desconectado
Mensajes: 27
|
Hola bueno soy nuevo aqui y no se muy bien programar , 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
|
|
|
En línea
|
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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}; f.tm_year = 113; f. tm_mday = 1 + rand() % 28; printf("2013/%d/%d ==> %s\n", 1 + f. tm_mon, f. tm_mday, dia [f. tm_wday]); return EXIT_SUCCESS; }
Un saludo
|
|
|
En línea
|
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
Desconectado
Mensajes: 27
|
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Y según Wikipedia:#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!.
|
|
« Última modificación: 14 Febrero 2013, 16:29 pm por leosansan »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.314
|
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: 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: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.* 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".
* 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!.
|
|
|
En línea
|
|
|
|
7hongo7
Desconectado
Mensajes: 27
|
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Gracias, gracias.solamente que ahora tengo otra duda y es que como podría hacer lo mismo pero con una expresion aritmetica 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!.
|
|
|
En línea
|
|
|
|
7hongo7
Desconectado
Mensajes: 27
|
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
4 operaciones aritmeticas en Java Eclipse
Java
|
Emili
|
4
|
9,459
|
12 Octubre 2009, 07:48 am
por forerito
|
|
|
operaciones aritmeticas en JAVA ECLIPSE
Java
|
leliCabello
|
0
|
6,921
|
12 Octubre 2009, 02:47 am
por leliCabello
|
|
|
[Source-Actualizacion 6] Operaciones aritmeticas con Hex, Oct, Binario y Decimal
Programación Visual Basic
|
BlackZeroX
|
1
|
2,349
|
26 Septiembre 2010, 09:57 am
por VanHan
|
|
|
Reducir stack con expresiones aritméticas en prefix.
Programación C/C++
|
arctic_kooks
|
0
|
2,351
|
27 Junio 2011, 03:01 am
por arctic_kooks
|
|
|
Operaciones aritmeticas de una ristra con recursividad
Java
|
Javator
|
4
|
3,533
|
25 Marzo 2014, 23:22 pm
por 1mpuls0
|
|