Enrere Mòdul 7
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Obtenció del dia de la setmana d'una data determinada

Amb aquesta pràctica que completa les dues anteriors aprendrem a fer operacions amb dates i hores. 

 

Desenvolupament de la pràctica

La funció mktime() converteix l'estructura, el punter de la qual es passa com argument, a una estructura completa amb valors normals. A més, aquesta funció torna un valor long int corresponent a la data i hora amb el mateix tipus que el valor de retorn de la funció time().

Els valors dels camps tm_wday i tm_yday de la variable d'estructura original són ignorats, tots els altres camps són obligatoris i els valors d'aquests altres camps poden ser de valor superior al rang permès, és a dir, és possible que  el camp tm_hour sigui igual a 30. En aquest cas, la funció mktime() ajusta els valors dels camps per tal que quedin dintre del rang permès.

Aquesta funció és molt útil si es vol fer operacions amb dates i hores. Aquest programa demanarà una data determinada i mostrarà el dia de la setmana corresponent.

Definiu un projecte nou anomenat m7p05 i afegiu-li un arxiu de font C/C++ anomenat m7p05.cpp. Escriviu el següent codi:

/*m7p05.cpp:Obtenció del dia de la setmana d'una data determinada*/

#include <time.h>
#include <stdio.h>
void main( void ){
    struct tm st;
    long temps;
    char *dia_set[]={"diumenge", "dilluns", "dimarts",
             "dimecres", "dijous", "divendres", "dissabte"
    };
    printf("introduïu data en format dd/mm/aaa ");

    temps=time(NULL);
    st=*localtime(&temps);
    scanf("%d/%d/%d",&st.tm_mday, &st.tm_mon, &st.tm_year);
    
    st.tm_year=st.tm_year-1900;
    st.tm_mon--;

    
    if( (mktime( &st)) != -1 )
        printf("\nEl dia %d/%d/%d és %s\n",st.tm_mday,
              st.tm_mon+1, st.tm_year+1900,
              dia_set[st.tm_wday]);


    else printf( "la funció mktime va fallar\n");


}

Explicació del programa

En aquest programa es declara una variable d'estructura tm anomenada st a la qual s'assigna inicialment l'hora actual amb l'última d'aquestes quatre línies:

 
    struct tm st;
    long temps;
    ..............

    temps=time(NULL);
    st=*localtime(&temps);
    ................

La funció localtime() té com argument un punter a una variable long int i retorna un punter a una estructura tm

Amb la següent línia es demana a l'usuari tres dades: el dia, el mes i l'any, aquestes tres dades seran emmagatzemades en els tres camps corresponents de la variable d'estructura st.

 
scanf("%d/%d/%d",&st.tm_mday, &st.tm_mon, &st.tm_year);

Per tal d'adaptar les dades que necessita aquesta variable es fan els següents ajusts:

 
 st.tm_year=st.tm_year-1900;
    st.tm_mon--;

El primer dels ajusts és degut a que el camp tm_year emmagatzema l'any començant a comptar en l'any 1900 i el segon dels ajusts és degut a que al primer mes (gener) se l'assigna el número 0 en lloc de l'1.

El càlcul del dia de la setmana es fa amb la funció mktime() d'aquesta forma:

 
 if( (mktime( &st)) != -1 )
        printf("\nEl dia %d/%d/%d és %s\n",st.tm_mday,
              st.tm_mon+1, st.tm_year+1900,
              dia_set[st.tm_wday]);


    else printf( "la funció mktime va fallar");

Si la funció torna el valor -1 indica que no ha pogut completar l'estructura. Pot ser degut a que hem entrat una data anterior a 1970.