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

 
Manipulació de temps. L'estructura tm de la llibreria estàndard

En aquesta pràctica aprendrem a fer servir una estructura ja definida a la llibreria estàndard C/C++, coneixerem una funció que torna un punter a una estructura i aprendrem a referenciar valors apuntats per punters a estructures.

 

Desenvolupament de la pràctica

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

 
//m7p04.cpp: Manipulació de temps.

#include <time.h>
#include <stdio.h>

void main( void ){
    long temps;
    struct tm *st;
    char *mes[]={"gener", "febrer", "març", "abril", "maig",
        "juny", "juliol", "agost", "setembre","octubre",
        "novembre","desembre"};

    char *dia_set[]={"diumenge","dilluns","dimarts",
                   "dimecres","dijous",
                   "divendres","dissabte"};


    time( &temps);

    printf( "Data i hota: %s\n", ctime( &temps ) );

    st=localtime(&temps);

    printf("\ncontingut de (tm_year): %d",st->tm_year);
    printf("\tcorrespon a l'any %d\n", 1900+st->tm_year);

    printf("\ncontingut de (tm_mon) : %d",st->tm_mon);
    printf("\tcorrespon al mes %s\n", mes[st->tm_mon]);

    printf("\ncontingut de (tm_mday) : %d\n",st->tm_mday);

    printf("\ncontingut de (tm_wday) : %d",st->tm_wday);
    printf("\tcorrespon al dia %s\n",  dia_set[st->tm_wday]);

    printf("\ncontingut de (tm_hour) : %d",st->tm_hour);
    printf("\ncontingut de (tm_min) : %d",st->tm_min);
    printf("\ncontingut de (tm_sec) : %d\n",st->tm_sec);


}

Explicació del programa

En aquest programa es declara una variable punter a una estructura tm. L'estructura tm està definida a l'arxiu de capçalera time.h de la forma que es mostra a continuació. Si recupereu aquest arxiu i busqueu la definició de l'estructura trobareu aquest codi:

/***
*time.h - definitions/declarations for time routines

.................

struct tm {
    int tm_sec; /* seconds after the minute - [0,59] */
    int tm_min; /* minutes after the hour - [0,59] */
    int tm_hour; /* hours since midnight - [0,23] */
    int tm_mday; /* day of the month - [1,31] */
    int tm_mon; /* months since January - [0,11] */
    int tm_year; /* years since 1900 */
    int tm_wday; /* days since Sunday - [0,6] */
    int tm_yday; /* days since January 1 - [0,365] */
    int tm_isdst; /* daylight savings time flag */
};

.................

Aquesta estructura té 9 camps, tots ells enters. Els comentaris del codi, encara que estan en anglès, són suficientment aclaridors. Només comentar que els mesos de l'any comencen en 0 (gener), i acaben en 11 (desembre), i els dies de la setmana comencen en 0 (diumenge) i acaben en 6 (dissabte). 

Comentarem també que:

  • el camp tm_yday és el dia de l'any començant en 0 (1 de gener).
  • el camp tm_isdst és una variable que torna 1 si es vol que es tingui en compte el canvi d'horari d'estiu o 0 si no es vol.

En aquest programa, la funció time() es fa servir de forma diferent al programa anterior. La sentència:

   time( &temps);

fa que a la variable temps s'emmagatzemi el nombre de segons des de les 00:00:00 de l'1 de gener de 1970. Aquesta línia seria equivalent que:

   temps=time(NULL);

La funció ctime() de la sentència:

 
printf( "Data i hora: %s\n", ctime( &temps ) );

té com argument un punter a una variable long que conté un nombre de segons i torna una cadena de caràcters amb la data i l'hora.

La funció localtime() de la sentència:

 
    st=localtime(&temps);

té com argument una variable long que conté un nombre de segons i torna un punter a una estructura tm. Els diferents camps de la variable estructura apuntat pel punter st es referencia amb l'operador fletxa (->).