Стандартные функции различного назначения

Здесь будут описаны стандартные функции для языков C/C++, которые не вошли в другие темы.

Дата, время

Для работы с функциями этого вида необходимо подключать заголовочный time.h. В этом файле определены три типа данных, которые связаны с вычислением времени:

Ещё имеется макрос 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.

Естественно, что при последующих запусках программы каждый раз будет получаться другая последовательность чисел.



Назад
На верх
Вперёд
Hosted by uCoz