рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

ДАТА. ЧАС

ДАТА. ЧАС - раздел Философия, ПРОГРАМУВАННЯ 4.1 Функції Дати І Часу   Стандартна Бібліотека С...


4.1 Функції дати і часу

 

Стандартна бібліотека С містить набір функцій для обробки дати та часу, всі вони оголошені в файлі time.h. Це такі функції:

 

time_t time(time_t *timer);

double difftime(time_t timel, time_t time2);

struct tm *gmtime(const time_t *timer);

struct tm *localtime(const time_t *timer);

char *asctime(const struct tm *timeptr);

char *ctime(const time_t *timer );
size_t strftime(char *s, size_t maxsize, const char *format,

const struct tm *timeptr);

time_t mktime(struct tm *timeptr);

clock_t clock(void);


У цих функціях застосовуються такі три типи: time_t, struct tm і clock_t. Вони будуть пояснені в ході розгляду функцій.

Функція time( ) оголошена так:

 

time_t time (time_t * timer);

 

Вона видає поточну дату і час. Тип time_t визначено як арифметичний, він здатний представляти час. Це означає, що він може бути цілим типом, таким як signed або unsigned, int або long, або типом з пересувною точкою, таким як double. В С не специфікується те, як змінна time_t представляє час. Програма не повинна вживати тип time_t безпосередньо, а лише в функціях стандартної бібліотеки.

Функція difftime() має таке оголошення:


double difftime(time_t timel, time_t time2);


Вона обчислює інтервал між двома значеннями типу time_t, даючи відповідь у секундах. Якщо час timel більш пізній, ніж time2, то результат буде додатнім, в іншому випадку – від’ємним. Функція difftime() дозволяє вимірювати часовий інтервал у секундах, навіть коли значення time_t не представлені в секундах. Цей факт демонструється в прикладі 4.1.

Приклад 4.1. – Вимірювання часових інтервалів з

використанням функцій time() і difftime()


# include <stdio.h>

# include <stdlib.h>

# include <time.h>
int main (void)

{
time_t start, end;
start = time(NULL);
if (start == (time_t)-l)

{
printf("У цій системі час недоступнийп"); exit(EXIT FAILURE);

}
printf("Зачекайте декілька секунд і натисніть клавішу ENTER / RETURN"); fflush(stdout);
getchar( );
end = time(NULL);
printf(" Інтервал часу=% .2 f секунд ", difftime(end, start));
return 0;

}

Зауважимо, що програма не задає тип і значення змінної time_t, це робиться функціями стандартної бібліотеки. Вона лише перевіряє, чи start є величиною (time_t)-l, яка є поверненим значенням функції time( ) в тих випадках, коли час недоступний.

Програма виводить результат у два десяткових розряди. Зазвичай змінна time_t представляє час у повних секундах, і в цьому випадку не має дробової частини. Однак, якщо цього недостатньо, С дозволяє реалізувати зберігання інформації про дробову частину секунди у змінній time_t.

 

4.2 Форми представлення дати і часу


Тип struct tm представляє дату і час розбитими на стандартні компоненти відповідно до Грегоріанського календара. У табл. 4.1 наведені елементи цього типу.

Покажчик літнього часу, назви елементів і діапазони їх зміни говорять самі про себе, але тут є декілька таких зауважень:

tm_sec знаходиться звичайно в діапазоні 0-59, але може приймати й значення 60 для додаткової секунди, яка іноді вставляється в цілях зберігання днів при синхронізації годин з обертанням Землі;

 

Таблиця 4.1 – Елементи структури struct tm

 

Елемент Опис
int tm_sec Секунди після хвилин (0-60)
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 День року (0 – 365)
int tm_jsdst Вказівник врахування літнього часу

 

tm_mon починається не з 1 для січня, а з 0. Тому у перетворенні дати ця величина повинна бути скоригована на 1;

tm_mday починається з 1;

tm_year представляє роки, починаючи з 1900. Це означає, що рік 2000 буде містити величину 100, яка має більше двох останніх цифр року;

tm_yday також починається з 0 на 1 січня. 31-й день грудня – це 364-й або 365-й день для високосного року;

tm_isdst вказує чи прийнято літній час у розрахунок для певного часу, він приймає такі значення:

tm_isdst > 0 – літній час враховується;

tm_isdst = 0 – літній час не враховується;

tm_isdst < 0 – інформація недоступна.

Мова С має дві функції для конвертування значення time_t в тип struct tm, це localtime( ) і gmtime( ), які оголошені так:


struct tm * gmtime (const time_t * timer);

struct tm * localtime (const time_t * timer);

 

Обидві ці функції отримують вказівник на змінну time_t, яка містить результат конвертації значення (time_t може не завжди бути типом, що гарантує можливість передачі його в якості аргумента функції). Сама змінна time_t не модифікується, але обидві функції повертають вказівник на внутрішній статичний об’єкт struct tm, що містить відповідні значення. Різниця між функціями gmtime( ) і localtime( ) полягає в тому, що lосаltime( ) дає результат, представлений у вигляді локального (місцевого) часу зони програми, в той час як gmtime ( ) – GMT або UTC.

Мова С не намагається стандартизувати вплив тимчасових зон часу, які можуть значно змінюватися від однієї системи до іншої. Загальний підхід полягає у використанні змінної TZ середовища для вказівки інформації про тимчасову зону. Зазвичай налаштування параметра TZ виконує системний адміністратор. Стандартна бібліотека не забезпечує способу установки інформації про тимчасову зону. Однак, вона дає змогу задати ім’я поточної тимчасової зони (див. опис функції strftime( ) нижче) і визначити, чи враховується літній час.


4.3 Строкове форматування часу


Просте форматування часу забезпечують функції asctime( ) і ctime( ), вони генерують рядок, перед яким ставиться конкретний час у фіксованому форматі, наприклад так:


Tue Feb 29 23:59:59 2000


Це 23 год 59 хв 59 с, вівторок 29 лютого 2000 року. Тут – відомий символ переходу на новий рядок. Цей символ у багатьох випадках доводиться згодом видаляти. Функції asctime( ) і ctime( ) оголошуються так:

 

char *asctime(const struct tm *timeptr);

char *ctime(const struct tm *timer);


Вони однакові, за винятком того, що ascthne ( ) отримує вказівник на об’єкт struct tm, тоді як ctime ( ) – на time_t. Функція ctime ( ) призначена для виведення локального часу. Звернення ctime(timer) еквівалентно зверненню asctime(localtime (timer)).

Складне форматування часу виконує функція strftime(), вона використовується для форматування рядка подібно до функції друку printf(), але з іншими специфікаторами конвертації. Оголошується функція strftime() так:

 

size_t strftime(char *s, size_t maxsize, const char *format,

const struct tm * timeptr);

Тут s – покажчик на певний масив символів, у якому буде збережений результуючий рядок. Змінна maxsize являє собою максимальне число символів, які функція strftime( ) може записати, включаючи символ нуль (зазвичай це розмір масиву). Змінна format – це рядок формату, a timeptr – вказівник на заповнену структуру struct tm.


Таблиця 4.2 – Специфікатори конвертації функції strftime()

 

Специфікатор Значення
% a * Абревіатура назви дня тижня
% А * Повна назва дня тижня
% b * Абревіатура назви місяця
% В * Повна назва місяця
% З * Повна дата і час
% D День місяця (від 01 до 31)
% Н Година (годинник на 24 години від 00 до 23)
% | Година (годинник на 12 годин від 01 до 12)
% J День року (від 001 до 366)
% Т Місяць (від 01 до 12)
% М Хвилина (від 00 до 59)
% Р * Позначення АМ / РМ для годинника на 12 годин
% S Секунди (від 00 до 59)
% U Номер тижня (за кількістю неділь)
% w Назва дня тижня (від 0 – неділя до 6 – субота)
% W Номер тижня (за кількістю понеділків)
% x * Представлення повної дати
% Х * Представлення повного часу дня
% y Рік без вказівки століття (від 00 до 99)
% У Повний рік, включаючи століття
% Z Назва або абревіатура тимчасової зони (або пробіл – у разі недоступності інформації про тимчасову зону)
%% Одиночний символ %

Примітка. * – локальний специфікатор

 

Функція strftime() копіює символи з рядка формату в масив, на який вказує s, і конвертує послідовність двох символів % до полів часу. Вона повертає кількість символів, записаних у символьний масив, включаючи нульовий. Якщо вихідний рядок виявиться довшим, ніж maxsize, функція strftime( ) повертає 0 і – нічого про вміст масиву, хоча він може бути й частково заповнений. У таблиці 4.2 наведені елементи специфікаторів конвертації.

Локальні специфікатори можуть змінювати вивід залежно від того чи враховується регіон. Це дозволяє одній і тій же програмі підтримувати різні формати даних, які використовуються в різних регіонах світу.

У різних частинах світу використовуються різні формати дат. Наприклад, у США основним форматом дати є: мм/дд/рррр, тоді як у Великобританії – дд/мм/рррр. Так що 01/02/2000 у Великобританії може читатися як 1 лютого, а в США – 2 січня 2000 року. Формати дат і номерів тижня регламентуються стандартом ISO 8601. Його повний формат дати такий:


рр-мм-ддТгг:хх:сс,

 

де T – розділовий знак, який відділяє дату від часу.

Відповідно до міжнародного стандарту ISO 8601 запис дати: 2000-02-29Т12: 00:00 означає рівно опівдні 29 лютого 2000 року.

Розміри поля для локально-визначених перетворень не специфіковані. Це ускладнює визначення того який розмір символьного масиву слід прийняти для забезпечення запису в нього результату.

Специфікатори %U і %W застосовуються для номерів тижня. При використанні %U перша неділя року визначається як перший день тижня, тобто дорівнює 1. При використанні %W першим днем тижня буде перший понеділок. Будь-який день, який йому передує, розглядається як нульовий, тому у конкретному додатку слід враховувати, що номери тижнів можуть не відповідати дійсним. У прикладі 4.2 показано використання функцій localtime(), asctime( ) і ctime( ).

 

Приклад 4.2 – Приклад використання функцій часу

 

#include<stdio.h>

#include<time.h>

void seda(void)

{

time_t tt;

struct tm *ptr;

tt = time(NULL);

ptr = localtime(&tt);

printf(asctime(ptr));

return;

}

void misc_ch(void)

{

time_t tt;

tt = time(NULL);

printf(ctime(&tt));

return;

}

main( )

{

seda( );

misc_ch( );

getch( );

}

 

Thu Feb 03 12:07:59 2011

Thu Feb 03 12:07:59 2011

 

Одержані результати означають, що програма виконувалася в четвер 3 лютого 2011 року о 12 годині 7 хвилин 59 секунд.

Деякі компілятори мають функції getdate( ) і gettime( ), вони описані в файлі <dos.h>. Їх використання демонструє приклад 4.3. Крім того, показано прийом, який дозволяє видавати дату і час у будь-якому форматі (в прикладі 4.3 – державною мовою).

 

Приклад 4.3 – Застосування функцій getdate( ) і gettime( )

 

# include <stdio.h> / * Системна дата і час * /
# include <dos.h>
main( )
{

char naz [12] [10] = {"січня", "лютого", "березня", "квітня",

"травня", "червня", "липня", "серпня",

"вересня", "жовтня", "листопада", "грудня"};
struct dat{int y;
char d;
char m;};
struct tim{
char m;
char o;
char h;
char s;};
struct dat *dp;
struct tim *dt;
clrscr( );

gettime(dt);

getdate(dp);
printf("Програма виконана о %d год %d хв %d сек ", dt->o, dt->m, dt->s);
printf("Була дата: %d %s %d-го року n", dp->d, naz[dp->m-1], dp->y);
getch ( );
}

 

Програма виконана o 13 год 22 хв 8 cek

Була дата: 3 лютого 2011-го року

 

Зчитування дати і часузабезпечує функція mktime( ). За своєю суттю вона протилежна функції localtime( ). Ця функція приймає заповнений struct tm і конвертує його в значення time_t. Крім того, вона модифікує елементи struct tm так, що ті опиняються в потрібних діапазонах. Оголошення функції mktime() виглядає так:


time_t mktime (struct tm *timeptr);


Ця функція приймає вказівник на об’єкт struct tm, який вона може зчитувати та модифікувати, і повертає значення time_t.

 

4.4 Визначення часу виконання програми


Останньою функцією в переліку бібліотеки time.h, поданому на початку цього розділу, є функція clock( ). На відміну від інших, вона не має відношення до дат і призначена для визначення часу роботи центрального процесора. Ця функція оголошується так:


clock_t clock (void);


Файл time.h додатково визначає також тип clock_t і макрос CLOCKS_PER_SEC. Змінна clock_t часто є 32-бітовою. Це дозволяє мати максимальне значення, яке дорівнює 2147483647. Оскільки компілятор не контролю переповнення цілочислових даних під час виконання довготривалих програм, цей контроль повинна виконувати прикладна програма.

Функція clock( ) повертає значення, яке, будучи поділеним на CLOCKS_PER_SEC, дорівнює часу в секундах. Іншими словами: для конвертації інтервалу між двома викликами функції clock( ) в секунди потрібно поділити різницю на число CLOCKS_PER_SEC. Значення цього макроса залежить від технічних характеристик комп’ютера і в різних системах буде різним. Деякі ранні версії С мають подібний макрос CLK_TCK.

Функція clock( ) корисна для визначення часу роботи CPU при виконанні тієї чи іншої програми. У прикладі 4.4 показано спосіб її використання.

 

Приклад 4.4 – Використання функції clock( )

 

# include<stdio.h>

# include<time.h>
int main (void)

{
clock_t start, end;

start = clock( );
/ * Текст програми, час виконання якої визначається * /

end = clock( );
printf([dbl] Interval =%f seconds .2 [dbl], (double) (end-start)/

(Double) CLOCKS_PER_SEC);
return 0;

}


Слід звернути увагу на те, що єдине значення clock( ) не має сенсу, корисною може бути тільки різниця між двома значеннями, що видаються функцією clock( ). У прикладі 4.4 ця різниця дорівнює end-start.


 

 

– Конец работы –

Эта тема принадлежит разделу:

ПРОГРАМУВАННЯ

Івано Франківський національний технічний університет нафти і газу... В М Юрчишин Б В Клим В Б Кропивницька...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: ДАТА. ЧАС

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

СОРТУВАННЯ
  1.1 Методи сортування   Сортувати можна дані будь-якого базового типу, представлені в довільному вигляді, однак найчастіше сортувати потрібно масиви та зв’яза

ОБРОБКА ЛІТЕРНИХ РЯДКІВ
  Роботу з рядками символів забезпечують стандартні функції. Всі вони описані у відповідних файлах з розширенням *.h. Розглянемо деякі найбільш вживані функції. Функц

Кількість машинного масла, тис. т.
  Рекомендації до створення структур:   1 – Регіон: код регіону, назва регіону; 2 – Область: код регіону, код області, назва о

Запаси: код родовища, видобувні запаси, дата представлення даних.
  Задача 2. Підготувати і занести в структури контрольні дані. Задача 3. Створити зв’язані списки із масивів структур. Задача 4. Виготовити звіт про розподіл кількос

Видобування: код родовища, дата представлення даних, видобуток нафти за добу.
  Задача 2. Підготувати і занести в структури контрольні дані. Задача 3. Створити зв’язані списки із масивів структур. Задача 4. Виготовити звіт про розподіл сумарно

ПЕРЕЛІК РЕКОМЕНДОВАНИХ ДЖЕРЕЛ
  1. Кочан, Стефан. Программирование на языке С, 3-е издание. : Пер. с англ.–М.: ООО “И.Д.Вильямс”, 2007 2. Хэзфилд Ричард, Кирби Лоуренс и др. Искусство программирования на

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги