• Lunes 29 de Abril de 2024, 00:21

Autor Tema:  CALENDARIO EN C  (Leído 26436 veces)

Alehtokita

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
CALENDARIO EN C
« en: Miércoles 21 de Marzo de 2012, 18:22 »
0
Alguien me puede ayudar a realizar un ejercicio en lenguaje C que realice un programa con FUNCIONES que imprima cualquier mes a partir de enero de 1900. Debe tener en cuenta lo siguiente:
-Recibir el año y el mes que se desea imprimir
-Validar el año y el mes
-imprimir el mes teniendo en cuenta:
       -Mostrar el nombre del mes
       - Determinar que día es el primero del mes
       - Dar el respectivo margen para el primer día del mes
 :ayuda:

Manzanit0

  • Nuevo Miembro
  • *
  • Mensajes: 15
  • Nacionalidad: es
  • Sometimes we can’t feel the vibe of our heart...
    • Ver Perfil
    • Lapso de Imaginación
Re:CALENDARIO EN C
« Respuesta #1 en: Viernes 27 de Abril de 2012, 13:09 »
0
Éste código lo tenía guardado de cuando estudiaba... presenta cuántos días quedan para que acabe el año, puestos una fecha:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main ()
{
int dia, mes, anno;
int i;
int r = 0;
int dias_mes[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

error:printf("Introduzca un dia, mes y anno: ");
scanf("%d %d %d", &dia, &mes, &anno);

if(dia>31 || dia<1)
{
printf("\nEl dia introducido no es valido, introduzca otra fecha\n");
goto error;
}

if(mes>12 || mes <1)
{
printf("\nEl mes introducido no es valido, introduzca otra fecha\n");
goto error;
}

if(anno%4==0 || anno%4==0 && anno%100==0)
dias_mes[2] = 29;
else
dias_mes[2] = 28;

for(i = mes; i<13; i++)
{
r += dias_mes[i];
}

printf("\n\nQuedan %d dias para que acabe el anno.\n\n", r);

system("pause");

}

De todos modos, para lo que buscas plantéate un pseudocódigo tal que así:

1) Pide la fecha en cuestión
2) Analizar si el año es bisiesto o no
3) SI es bisiesto, tener en cuenta que febrero tiene 29 días, y disponerlo
4) EN CASO CONTRARIO, tener en cuenta que febrero tiene 28 días

Eso, en mi opinión, serían los cálculos más dificiles. El resto sería imprimir la información. Es decir, si has introducido la variable mes como 02, pues que imprima febrero.

En cuanto a lo de saber si el primer día es lunes o demás... ahora mismo no sé como lo puedes saber, pero mira en internet y seguro que hay algún algoritmo que sigan los días de la semana jajaja

¿A qué te refieres con "Dar el respectivo margen para el primer día del mes"?

 :suerte:

droezva

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #2 en: Sábado 28 de Abril de 2012, 21:26 »
0
Hola que tal,

checate este codigo que tenia, lo modifique un poco.

Utilizo el Algoritmo DoomsDay para obtener el dia de una fecha dada, con eso se puede saber que dia de la semana es el primer dia del mes que se quiere ver.

se validan el mes y año y se imprimen los días del mes.

bueno ahi dentro del codigo he colocado algunas explicaciones

No dudes en preguntar, Saludos  :suerte:

Código: C
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. char *meses[] = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
  7.  
  8. int agnoBisiesto(int agno)
  9. {
  10.         return !(agno%4) && (agno%100 || !(agno%400));
  11. }
  12.  
  13. int diaFecha(int dia, int mes, int agno)
  14. {       //Algoritmo de Doomsday
  15.         int modA[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}};
  16.         agno--;
  17.         return ( (agno%7) + ((agno/4)-(3*(agno/100+1))/4) +  modA[agnoBisiesto(agno+1)][mes-1]  + dia%7  )%7;
  18. }
  19.  
  20. int diaFinal(int mes, int agno)
  21. {
  22.         int dias[] = {31,28 + agnoBisiesto(agno),31,30,31,30,31,31,30,31,30,31};
  23.         return dias[mes-1];
  24. }
  25.  
  26. void mostrarMes(int mes, int agno)
  27. {
  28.         clrscr();
  29.         int diaSem = diaFecha(1,mes, agno);
  30.         int ultimoDia = diaFinal(mes, agno);
  31.         int x;
  32.         printf("%s de %d\n",meses[mes-1],agno);
  33.         printf("Dom\tLun\tMar\tMie\tJue\tVie\tSab\n");
  34.         for(x = 0; x < diaSem; x++) //Imprime la tabulacion de los dias vacios inciales del Mes
  35.                 printf("\t");
  36.         for(x = 1; x <= ultimoDia; x++)
  37.         {
  38.                 printf("%d\t",x);
  39.                 if( !( ++diaSem % 7 ) )//si el modulo de diaSem despues de incrementar es 0 inicia en una nuea linea
  40.                         printf("\n");
  41.         }
  42.         //Por si te gusta reducir el codido :D
  43.         //for(x = 0; x < diaSem; printf("\t"), x++);
  44.         //for(x = 1; x <= ultimoDia; printf("%d%s",x++, (++diaSem % 7 ) ? "\t":"\n" ) );
  45. }
  46. /*
  47. Funcion para evitar errores al ingresar un valor que no se un numero
  48. Se lee primero como cadena y despues se convierte a numero entero -> atoi
  49. si el numero es valido se convertira correctamente sino sera un cero
  50. */
  51. int leerNum()
  52. {
  53.         char valorTexto[4];
  54.         scanf("%4s",valorTexto);
  55.         return atoi(valorTexto);
  56. }
  57.  
  58. void leerMesAgno(int *mes, int *agno)
  59. {
  60.         printf("Ingrese el mes y agno para visualizarlo\n");
  61.         do{
  62.                 printf("Mes(1-12): ");
  63.                 *mes = leerNum();
  64.                 if (*mes < 1 || *mes > 12)
  65.                         printf("Ingresa un mes valido\n");
  66.                 else
  67.                         break;
  68.         }while(1);
  69.         printf("Mes Seleccionado: %s(%d)\n",meses[*mes-1],*mes);
  70.         do{
  71.                 printf("Agno(>1900): ");
  72.                 *agno = leerNum();
  73.                 if (*agno < 1900)
  74.                         printf("Ingresa un Agno valido\n");
  75.                 else
  76.                         break;
  77.         }while(1);
  78. }
  79.  
  80. void main()
  81. {
  82.         int mes, agno, resp;
  83.         do{
  84.                 clrscr();
  85.                 leerMesAgno(&mes, &agno);
  86.                 mostrarMes(mes, agno);
  87.                 printf("\nDesea ver otro mes (s/n): ");
  88.                 resp = tolower(getch());
  89.         }while(resp!='n');
  90. }

Alehtokita

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #3 en: Lunes 30 de Abril de 2012, 15:26 »
0
 :gracias:! pero ahora al profesor se le ocurrió la "grandiosa idea" de modificarlo para que reciba los parámetros de la línea de ordenes y no tengo ni idea de como hacerlo.. :ayuda:

por cierto, mi compilador es code::blocks :S

Manzanit0

  • Nuevo Miembro
  • *
  • Mensajes: 15
  • Nacionalidad: es
  • Sometimes we can’t feel the vibe of our heart...
    • Ver Perfil
    • Lapso de Imaginación
Re:CALENDARIO EN C
« Respuesta #4 en: Lunes 30 de Abril de 2012, 17:39 »
0
Para eso tienes que tener en cuenta que en la función main tienes que poner:

Código: [Seleccionar]
int main(int argc, char *argv[])
dónde argc es un entero que indica el número de argumentos pasados a través de la línea de órdenes (incluyendo el nombre del programa) y argv[] es una matriz de punteros a cadenas de caracteres. Cada elemento de argv apunta a un argumento, de manera que argv[0] contiene el nombre del programa, argv[1] el primer argumento de la linea de órdenes, argv[2] el segundo, etc.

También tienes que tener en cuenta que en este caso la función main retorna un int que expresa o no el éxito de la ejecución.

Ahora, puedes operar, por ejemplo:

Código: [Seleccionar]
main(int argc, char **argv) {
      switch(argv[1]) {
            case "-v": ....
      }
}

o

Código: [Seleccionar]
main(int argc, char **argv) {
      if(argv[1]=="-v") ....
}


Aquí te dejo un ejemplo completo:

Código: [Seleccionar]
#include <stdio.h>
#include <string.h>
void main(int argc,char *argv[],char *ent[])
{
  if(!strcmp(argv[1],"/?"))
  {
   printf("pro [/ARG]\n");
   printf("[ARG]\n");
   printf("/? : Ayuda\n");
   printf("/1 : Imprime HOLA\n");
  }
  if(!strcmp(argv[1],"/1"))
  {
   printf("HOLA\n");
  }
}
Si te sirve, me alegro, si no entendiste muy bien, pregunta. Sin embargo te recomiendo una cosa: busca un buen manual de programación y síguelo página a página. Es la manera con que más se aprende. Yo por ejemplo cuando estudié en 1º programación seguí el libro de Ceballos. Viene bien explicado y con muchos ejemplos. Aquí tienes una vista previa:
desde su página pero seguro que en amazon o en una papelería lo puedes encargar :)

Alehtokita

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #5 en: Lunes 30 de Abril de 2012, 19:57 »
0
Gracias.. algo así nos explico el profesor pero la verdad nunca le entendemos.. y para aplicarlo al programa del calendario tengo que cambiar prácticamente todo el programa?  :think:

Manzanit0

  • Nuevo Miembro
  • *
  • Mensajes: 15
  • Nacionalidad: es
  • Sometimes we can’t feel the vibe of our heart...
    • Ver Perfil
    • Lapso de Imaginación
Re:CALENDARIO EN C
« Respuesta #6 en: Lunes 30 de Abril de 2012, 20:12 »
0
Hazte a la idea de que, según me imagino yo, para ejecutarlo por linea de ordenes tendrías que introducir algo así en el terminal:

Código: [Seleccionar]
./programa dd/mm/aaaa
Siendo dd/mm/aaaa la fecha en cuestión, ¿no? En ese caso lo único que tienes que cambiar en el programa es que en vez de operar con las variables dd, mm y aaaa, que opere con argv[1],con argv[2] y con argv[3], siendo cada una dd, mm y aaaa respectivamente.

Alehtokita

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #7 en: Martes 1 de Mayo de 2012, 23:59 »
0
:O jajajaja quedé igual o peor de perdida.. que fastidio no entender..   :fire:

Manzanit0

  • Nuevo Miembro
  • *
  • Mensajes: 15
  • Nacionalidad: es
  • Sometimes we can’t feel the vibe of our heart...
    • Ver Perfil
    • Lapso de Imaginación
Re:CALENDARIO EN C
« Respuesta #8 en: Miércoles 2 de Mayo de 2012, 13:41 »
0
Uf, yo es que no soy un gran profesor  :nosweat:

De veras, los conocimientos que te vaya a dar un buen manual no te los voy a dar yo. Te dejo el que he usado yo, en serio, creo que es lo que deberías hacer. Sentarte un puñado de tardes e ir leyendo y comprendiendo los ejemplos, todos. Una vez comprendidos, sentarte y ponerte a picar código. A mi parecer es el único modo de aprender a programar bien...

C/C++ CURSO DE PROGRAMACION (3ª ED) (EN PAPEL)

Te dejo por si te interesase también un blog dónde lo explican bastante bien con ejemplos el tema de pasar argumentos por la línea de ordenes  :smartass:

Enlace al blog

Alehtokita

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #9 en: Miércoles 2 de Mayo de 2012, 19:39 »
0
 :gracias:

lo leeré :)

Alehtokita

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #10 en: Miércoles 2 de Mayo de 2012, 21:26 »
0
Oye lo que pasa es que el programa que me diste no me compila en Windows... :S

droezva

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re:CALENDARIO EN C
« Respuesta #11 en: Miércoles 2 de Mayo de 2012, 23:42 »
0
Bueno realmente es sencillo el utilizar los parametros para main
en teoria cuando compilar tu programa se crea un archivo ejecutable *.EXE en windows ;D

entonces desde consola o tambien conocido como simbolo de sistema puedes ejecutar es programa que se creo cuando compilastes y ejecutastes tu programa.

bueno digamos que estamos en consola nosotros podemos escribir lo siguiente:

c:\FECHA.EXE

o

c:\FECHA

Entonces se ejecutara nuestro programa, ahora si nosotros queremos pasarle algunos datos iniciales a nuestro programa como en este caso que le podamos pasar un numero que sea el mes y otro que sea el año lo tendriamos que hacer asi:

c:\FECHA 12 2012

o

c:\FECHA.EXE 12 2012

pero para que en nuestro programa entienda que pasamos estos valores tendriamos que colocar ciertos parametros en la funcion main()
asi:

Código: C
  1. void main(int argc,char *argv[],char *ent[])
  2. {
  3. }

Realmente los nombre pueden ser a tu gusto jejeje!! podrian ser asi:

Código: C
  1. void main(int numeroDeParametro,char *valoresDeParametro[],char *variableEntorno[])
  2. {
  3. }

ahora te explico que pasa en main cuando le colocas estos parametros y cuando pasas valores cuando ejecutas tu programa

cuando llamas tu programa a ejecutar pasas los siguiente valores de esta forma

c:\FECHA 12 2012

En main pasa lo siguiente

en argv se asignan los valores que has pasado cuando llamastes a tu programa

argv[0] tendra el valor de FECHA (siempre tendra el nombre del programa)
argv[1] tendra el valor de 12
argv[2] tendra el valor de 2012

y en la variable argc tendra el valore de 3 si pasaras mas valores el valor de argc corresponderia siempre a los valores que pasastes + 1 que es el nombre del programa

Código: C
  1. void main(int argc,char *argv[])
  2. {
  3. // asi podemos hacer uso de estos valores
  4.   int mes = atoi(argv[1]);
  5.   int agno = atoi(argv[2]);
  6. }


bueno espero que te sirva la explicación y bueno se me ha acabado el tiempo
pero te dejo el programa modificado saludos  :suerte:
Código: C
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. char *meses[] = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
  7.  
  8.  
  9. int agnoBisiesto(int agno)
  10. {
  11.         return !(agno%4) && (agno%100 || !(agno%400));
  12. }
  13.  
  14. int diaFecha(int dia, int mes, int agno)
  15. {       //Algoritmo de Doomsday
  16.         int modA[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}};
  17.         agno--;
  18.         return ( (agno%7) + ((agno/4)-(3*(agno/100+1))/4) +  modA[agnoBisiesto(agno+1)][mes-1]  + dia%7  )%7;
  19. }
  20.  
  21. int diaFinal(int mes, int agno)
  22. {
  23.         int dias[] = {31,28 + agnoBisiesto(agno),31,30,31,30,31,31,30,31,30,31};
  24.         return dias[mes-1];
  25. }
  26.  
  27. void mostrarMes(int mes, int agno)
  28. {
  29.         clrscr();
  30.         int diaSem = diaFecha(1,mes, agno);
  31.         int ultimoDia = diaFinal(mes, agno);
  32.         int x;
  33.         printf("%s de %d\n",meses[mes-1],agno);
  34.         printf("Dom\tLun\tMar\tMie\tJue\tVie\tSab\n");
  35.         for(x = 0; x < diaSem; x++) //Imprime la tabulacion de los dias vacios inciales del Mes
  36.                 printf("\t");
  37.         for(x = 1; x <= ultimoDia; x++)
  38.         {
  39.                 printf("%d\t",x);
  40.                 if( !( ++diaSem % 7 ) )//si el modulo de diaSem despues de incrementar es 0 inicia en una nuea linea
  41.                         printf("\n");
  42.         }
  43.         //Por si te gusta reducir el codido :D
  44.         //for(x = 0; x < diaSem; printf("\t"), x++);
  45.         //for(x = 1; x <= ultimoDia; printf("%d%s",x++, (++diaSem % 7 ) ? "\t":"\n" ) );
  46. }
  47. /*
  48. Funcion para evitar errores al ingresar un valor que no se un numero
  49. Se lee primero como cadena y despues se convierte a numero entero -> atoi
  50. si es numero es valido se convertira correctamente sino sera un cero
  51. */
  52. int leerNum()
  53. {
  54.         char valorTexto[4];
  55.         scanf("%4s",valorTexto);
  56.         return atoi(valorTexto);
  57. }
  58. int mesValido(int mes)
  59. {
  60.         int valido = !(mes < 1 || mes > 12);
  61.         if (!valido)
  62.                 printf("El %d no es un mes valido (1-12)\n",mes);
  63.         return valido;
  64. }
  65.  
  66. int agnoValido(int agno)
  67. {
  68.         int valido = !(agno < 1900);
  69.         if (!valido)
  70.                 printf("El %d no es un agno valido (>=1900)\n",agno);
  71.         return valido;
  72. }
  73.  
  74. void leerMesAgno(int *mes, int *agno)
  75. {
  76.         printf("Ingrese el mes y agno para visualizarlo\n");
  77.         do{
  78.                 printf("Mes(1-12): ");
  79.                 *mes = leerNum();
  80.                 if (mesValido(*mes))
  81.                         break;
  82.         }while(1);
  83.         printf("Mes Seleccionado: %s(%d)\n",meses[*mes-1],*mes);
  84.         do{
  85.                 printf("Agno(>=1900): ");
  86.                 *agno = leerNum();
  87.                 if (agnoValido(*agno))
  88.                         break;
  89.         }while(1);
  90. }
  91.  
  92. int continuar()
  93. {
  94.         printf("\nDesea ver otro mes (s/n): ");
  95.         return tolower(getch())!='n';
  96. }
  97.  
  98. int main(int argc, char *arg[])
  99. {
  100.         int mes, agno, resp=1;
  101.         if(argc==3)
  102.         {
  103.                 mes = atoi(arg[1]);
  104.                 agno = atoi(arg[2]);
  105.                 clrscr();
  106.                 printf("Mes: %d[%s]    Agno: %d[%s]\n", mes,arg[1],agno,arg[2]);
  107.                 if( (mesValido(mes) && agnoValido(agno)) )
  108.                         mostrarMes(mes, agno);
  109.                 else
  110.                         printf("Se esperaban 2 parametros: Mes(1-12) y Agno(>=1900)\nEn el Formato(mm yyyy)");
  111.                 resp = continuar();
  112.         }
  113.         while(resp)
  114.         {
  115.                 clrscr();
  116.                 leerMesAgno(&mes, &agno);
  117.                 mostrarMes(mes, agno);
  118.                 resp = continuar();
  119.         }
  120. }
  121.