Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

10.2.2. Приклад використання покажчиків на структури

Використання покажчиків на структури можна розглянути на прикладі функцій часу і дати, які часто використовується у мові С++, призначена для зчитування значення поточного системного часу і дати. Для цього у програму необхідно включити заголовок <ctime>, який підтримує два типи дати, що вимагаються згаданими функціями. Один з цих типів, time_t призначений для представлення системного часу і дати у вигляді довгого цілочисельного значення, яке використовується як календарний час. Другий тип є структурою tm, яка містить окремі елементи дати і часу. Таке представлення часу називають поелементним. Структура tm має такий формат:

struct tm { // Оголошення типу структури часу і дати

int tm_sec; /* секунди, 0-61 */

int tm_min; /* хвилини, 0-59 */

int tm_hour; /* годинник, 0-23 */

int tm_mday; /* день місяця, 1-31 */

int tm_mon; /* місяць, починаючи з січня, 0-11 */

int tm_year; /* рік після 1900 */

int tm_wday; /* день, починаючи з неділі, 0-6 */

int tm_yday; /* день, починаючи з 1-го січня, 0-365 */

int tm_isdst /* індикатор літнього часу */

};

Значення індикатора tm_isdst є позитивним, якщо діє режим літнього часу (Daylight Saving Time), дорівнює нулю, якщо не діє, і є негативним, якщо інформація про це недоступна.

Основним засобом визначення часу і дати у мові C++ є функція time(), яка має такий прототип:

time_t time(time_t *curtime);

Функція time() повертає поточний календарний час системи. Якщо в системі відлік часу не виконується, повертається значення -1. Функцію time() можна викликати або з нульовим покажчиком, або з покажчиком на змінну curtime типу time_t. У останньому випадку цій змінній буде присвоєне значення поточного календарного часу.

Щоб перетворити календарний час в по-елементний, необхідно використати функцію localtime(), яка має такий прототип:

struct tm *localtime(const time_t *curtime);

Функція localtime() повертає покажчик на поелементну форму параметра curtime, представленого у вигляді структури tm. Значення curtime вказує на локальний час. Його зазвичай отримують за допомогою функції time().

Структура, що використовується функцією localtime() для зберігання часу в поелементній формі, розміщується в пам'яті статично і перезаписується під час кожного виклику цієї функції. Якщо потрібно зберегти вміст цієї структури, потрібно скопіювати його в яку-небудь іншу область пам'яті.

Наведений нижче код програми демонструє використання функцій time() і localtime() для відображення на екрані поточного системного часу.

Код програми 10.5. Демонстрація механізму використання функцій time() і localtime()для відображення поточного системного часу

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <ctime> // Для використання системного часу і дати

using namespace std; // Використання стандартного простору імен

int main()

{

struct tm *ptr;

time_t lt;

lt = time('\0');

ptr = localtime(&lt);

cout << ptr->tm_hour << ":" << ptr->tm_min;

cout << ":" << ptr->tm_sec << "\n";

getch(); return 0;

}

Ось|от| один з можливих результатів виконання цієї програми:

20:32:44

Незважаючи на те, що у наведеному вище коді програми може використовуватися поелементна форма представлення часу і дати, найпростіше згенерувати рядок часу і дати за допомогою функції asctime(), прототип якої має такий вигляд:

char *asctime(const struct tm *ptr);

Функція asctime() повертає покажчик на рядок, який містить результат перетворення інформації, яка зберігається в ptr структурі, що адресується покажчиком, і має такий формат:

день місяць число час:хвилини:секунди рік\n\0

Покажчик на структуру, що передається функції asctime(), часто отримують за допомогою функції localtime().

Область пам'яті, яка використовується функцією asctime() для зберігання форматованого рядка результату, є символьним масивом (що статично виділяється в пам'яті), який перезаписується під час кожного виклику цієї функції. Якщо потрібно зберегти вміст цього рядка, то необхідно скопіювати його в яку-небудь іншу область пам'яті.

У наведеному нижче коді програми продемонстровано механізм використання функції asctime() для відображення системного часу і дати.

Код програми 10.6. Демонстрація механізму використання функції asctime() для відображення системного часу і дати

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <ctime> // Для використання системного часу і дати

using namespace std; // Використання стандартного простору імен

int main()

{

struct tm *ptr;

time_t lt;

lt = time('\0');

ptr = localtime(&lt);

cout << asctime(ptr);

getch(); return 0;

}

Ось один з можливих результатів виконання цієї програми.

Sun Sep 28 17:20:35 2006

У мові C++ передбачені і інші функції дати і часу, з якими можна познайомитися, звернувшись до документації, що додається до Вашого компілятора.