Здесь будут описаны стандартные функции для языков C/C++, которые не вошли в другие темы.
Для работы с функциями этого вида необходимо подключать заголовочный time.h. В этом файле определены три типа данных, которые связаны с вычислением времени:
time_t — дата в виде целого значения (в сек.), измеряется от 1 января 1970г;
clock_t — время в виде целого значения (в сек.), измеряется от начала работы программы;
tm — структурный тип, предназначенный для хранения даты и времени. Структура tm состоит из следующих полей:
int tm_hour — часы (0...23);
int tm_isdst — индикатор летнего времени;
int tm_mday — день месяца (1...31);
int tm_min — минуты (0...59);
int tm_mon — месяц (0...11);
int tm_sec — секунды (0...59);
int tm_wday — день, начиная с воскресенья (0...6);
int tm_yday — день, начиная с 1 января (0...365);
int tm_year — год, начиная с 1900.
Ещё имеется макрос CLOCKS_PER_SEC, который содержит количество тактов (часто говорят — количество тиков) системных часов в секунду.
Рассмотрим наиболее важные функции для работы с датой и временем.
1.time() — получение текущего календарного времени:
time_t;
t = time(NULL); // так
time(&t); // или так
здесь в переменной t будет сохранено время в секундах, прошедшее с 1 января 1970г по текущий момент.
2.gmtime() — получение детальной характеристики текущей даты (время даётся по Гринвичу):
time_t; tm *x;
time(&t);
x=gmtime(&t);
здесь в полях структуры x типа tm будет детально расписаны все характеристики текущей даты.
3.localtime() — получение детальной характеристики текущей даты (время тут будет задано местное(!)):
time_t; tm *x1;
time(&t);
x1=localtime(&t);
4.ctime() — получение текущей даты в виде символьной строки:
time_t; char *s;
s=new char[20];
time(&t);
s=ctime(&t);
5.asctime() — ещё один вариант получения текущей даты в виде символьной строки:
time_t; tm *x;
time(&t);
x=gmtime(&t);
cout << asctime(x) << endl;
6.clock() — вычисление времени с начала работы программы до момента вызова данной функции (в тиках). Для перевода в секунды необходимо полученное значение делить на количество тиков в секунду, например так:
clock_t cl;
cl = clock();
cout << cl/CLOCKS_PER_SEC << endl;
7.difftime() — данная функция позволяет вычислить время работы какого-то участка программы:
time_t;
time(&t);
// Какой-то участок программы, например, вызов некой функции:
f();
time_t t1=time(NULL);
double dt=difftime(t1,t);
здесь t — начало работы функции f(), t1 — окончание работы функции f(), dt — время работы функции f(). Результат dt получается в секундах.
Пример использования рассмотренных функций:
#include <iostream>
#include <time.h>
#include <stdio.h>
using namespace std;
int main()
{
cout << "Tect Time:" << endl;
time_t t;
clock_t cl;
char *s;
s=new char[20];
tm *x;
tm *x1;
time(&t);
cout << "t=" << t << endl;
x=gmtime(&t);
cout << "Vsemirnoe vremja detalno:\n";
cout << "hour=" << x->tm_hour << " leto=" << x->tm_isdst
<< " mday=" << x->tm_mday << " min=" << x->tm_min
<< " mon=" << x->tm_mon << " sec=" << x->tm_sec
<< " wday=" << x->tm_wday << " yday=" << x->tm_yday
<< " year=" << x->tm_year << endl;
cout << "Vsemirnoe vremja=" << asctime(x) << endl;
x1=localtime(&t);
cout << "Mestnoe vremja detalno:\n";
cout << "hour=" << x1->tm_hour << " leto=" << x1->tm_isdst
<< " mday=" << x1->tm_mday << " min=" << x1->tm_min
<< " mon=" << x1->tm_mon << " sec=" << x1->tm_sec
<< " wday=" << x1->tm_wday << " yday=" << x1->tm_yday
<< " year=" << x1->tm_year << endl;
cout << "Mestnoe vremja=" << asctime(x1) << endl;
t=time(NULL);
cout << "t=" << t << endl;
s=ctime(&t);
cout << s << endl;
getchar(); // задержка времени до нажатия на какую-либо клавишу.
// Используется для того, чтобы время работы программы было > 0 сек
// (иначе нечего измерять!)
cl = clock();
cout << cl/CLOCKS_PER_SEC << endl;
time_t t1=time(NULL);
double dt=difftime(t1,t);
cout << "dt="<<dt << endl;
return 0;
}
Результаты работы программы:
Tect Time:
t=1333894615
Vsemirnoe vremja detalno:
hour=14 leto=0 mday=8 min=16 mon=3 sec=55 wday=0 yday=98 year=112
Vsemirnoe vremja=Sun Apr 08 14:16:55 2012
Mestnoe vremja detalno:
hour=18 leto=0 mday=8 min=16 mon=3 sec=55 wday=0 yday=98 year=112
Mestnoe vremja=Sun Apr 08 18:16:55 2012
t=1333894615
Sun Apr 08 18:16:55 2012
40
dt=40
Process returned 0 (0x0) execution time : 41.527 s
Press any key to continue.
Существует целый ряд задач, в которых требуется формировать последовательность случайных чисел. Например, для игры Нарды необходимо смоделировать случайное выпадание чисел в диапазоне от 1 до 6 (бросание костей). Стандартно ни в одном языке программирования нет действительно хорошего датчика случайных чисел, а есть так называемый датчик псевдослучайных чисел. Псевдослучайность означает то, что если не инициализировать такой датчик некоторым числом, то мы всегда будем получать одну и ту же последовательность чисел.
Для работы с таким датчиком необходимо подключать заголовочный файл stdlib.h.
Необходимые функции:
1.srand() — инициализация датчика псевдослучайных чисел каким либо числом. Лучше всего инициализировать от таймера, т.е. в качестве параметра задаём текущее время:
time_t t;
time(&t);
srand(t);
2.rand() — формирование очередного случайного числа (полученное число лежит в диапазоне от 0 до RAND_MAX):
int x;
x = rand();
Полезная константа, используемая при работе с датчиком псевдослучайных чисел:
RAND_MAX
Как, правило, она равна 32767.
Пример использование датчика псевдослучайных чисел:
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
int main()
{
time_t t;
time(&t); // текущее время в секундах. Берётся от таймера
cout << "t=" << t << endl;
srand(t); // инициализация датчика псевдослучайных чисел.
// Выполняем её с использованием текущего времени, полученного от таймера
// Если не делать инициализацию датчика,
// то будет получаться одна и та же последовательность чисел
int x;
cout << "RAND_MAX="<<RAND_MAX<< endl;
for(int i=0; i < 20; i++)
{
x = rand(); // очередное псевдослучайное число
cout << x << " ";
}
cout << endl;
return 0;
}
Результаты работы:
t=1333980373
RAND_MAX=32767
7941 22692 24643 25887 6093 16048 17711 22634 8707 5383 32636 7375 31030 10126 28619 888 4275 10219 7800 23398
Process returned 0 (0x0) execution time : 0.458 s
Press any key to continue.
Кстати. Если потребуется получать случайные числа в каком-то диапазоне, например, от 1 до 6, как это требуется для игры в Нарды, то число x можно вычислять так:
x = (6*rand())/RAND_MAX + 1;
Если в приведённой здесь программе именно так вычислять переменную x, то получим следующие результаты:
t=1333981197
RAND_MAX=32767
2 6 6 6 4 2 5 1 3 4 2 2 4 3 6 1 4 4 2 2
Process returned 0 (0x0) execution time : 0.671 s
Press any key to continue.
Естественно, что при последующих запусках программы каждый раз будет получаться другая последовательность чисел.
|
|
|