Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы.doc
Скачиваний:
48
Добавлен:
07.03.2016
Размер:
3.6 Mб
Скачать

7.4. Числові функції

Прототипом для роботи з числовими функціями є файл <math.h.> (<cmath>).

double ceil(double x) – повертає найближче більше ціле число.

double fabs(double x) – повертає абсолютне значення x.

double floor(double x) – повертає найближче менше ціле число.

double fmod(x,y) – повертає число з плаваючою точкою, що є залишком від ділення x на y, із тим же знаком, що і x. Аргумент y не може бути нулем.

На відміну від оператора обчислення модуля (%), що працює тільки з цілими числами, функція fmod дозволяє знаходити залишок від ділення чисел з плаваючою точкою.

double pow(double x, doubley) – повертає значення xy; якщо x <= 0, то y повинен бути цілим. Якщо x=0, то y не може бути від’ємним.

double sqrt(double x) – повертає значення

double exp(double x) – повертає значення eх

double log(double x) – повертає значення ln x

double log10(double x) – повертає значення lg x

Тригонометричні функції.

double cos(double x) → cos x

double sin(double x) sin x

double tan(double x) tg x

double acos(double x) → arccos x

double asin(double x) → arcsin x

double atan(double x) → arctg x

double atan2(double y, double x) → arctg (y/x)

При обчисленні тригонометричних функцій, кути (аргумент функцій cos, sin і tan, а також значення зворотних тригонометричних функцій acos, asin, atan і atan2) виражаються в радіанах.

Аргументи x, y і повертаємі значення числових функцій мають тип double.

Функції генерації випадкових чисел.

Заголовний файл <stdlib.h> (<cstdlib>).

int rand() – повертає псевдовипадкове ціле число в діапазоні від 0 до 2147483647.

Якщо потрібний інший набір псевдовипадкових чисел, використовується функція srand(unsigned int seed), де seed – ціла зміна або константа.

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

srand(time(0)).

Для реалізації даного рядку необхідно включати файл <time.h> (<ctime>).

7.5. Функції роботи з датою та часом

При розробці програмного забезпечення виникає необхідність роботи з датою та часом. Під датою будемо розуміти рік, місяць, день місяця. Під часом – години, хвилини, секунди та мілісекунди. У програмуванні виникають такі основні задачі роботи з датою, як отримання поточної дати та часу, арифметичні операції з датою та часом, використовуючи структури роботи з датою. Для роботи з датою та часом до головної програми необхідно включити хайдер <time.h>. Для розширеної роботи з функціями часу, а саме робота з мілісекундами, необхідно підключити хайдер <sys\timeb.h>.

Головна структура роботи з датою та часом – це структура tm.

struct tm

{

int tm_sec; /* Секунди */

int tm_min; /* Хвилини */

int tm_hour; /* Години (0--23) */

int tm_mday; /* День місяця (1--31) */

int tm_mon; /* Місяць (0--11) */

int tm_year; /* Рік(календарний рік мінус 1900) */

int tm_wday; /* День тижня (0--6; Неділя = 0) */

int tm_yday; /* День року (0--365) */

int tm_isdst; /* відмінний від 0, якщо світло денне */

};

Елементи цієї структури можна проініціалізувати самостійно, або заповнити її поточною датою та часом, що приведено в наступному прикладі.

# include <iostream>

# include <ctime>

using namespace std;

void main()

{

char str[50];

time_t time1;

struct tm *tm1;

time(&time1); // time1 кількість секунд з 1970 р.

printf("%ld second\n",time1);

tm1 = localtime(&time1);

printf("%d year\n",tm1->tm_year);

printf("%d hour\n",tm1->tm_hour);

printf("%d minutes\n",tm1->tm_min);

printf("%d sec\n",tm1->tm_sec);

strcpy(str, asctime(tm1));

printf("%s\n", str);

}

У даному прикладі оголошується змінна t1 типу time_t, що є еквівалентним типу даних long. Функція time(), у яку передається вказівка на структуру tm1 (тип tm), повертає кількість секунд, починаючи з 1970-го року. Функція localtime() – генерує з цієї кількості секунд структуру tm1.

Cкажімо, якщо поточна дата – 16 січня 2011 року, а час 16.47.25, тоді буде мати місце наступний результат:

1295185645 second

111 year

16 hour

47 minutes

25 sec

Sun Jan 16 16:47:25 2011

Зауважимо, що рік розраховується відносно 1900 року, тому змінна year структури tm1 дорівнюватиме 111.

Якщо необхідно отримати дату з часом у якості рядку (масиву символів char) треба використати функцію asctime(), входом у яку є структура типу tm.

Для отримання рядку з датою або з часом використовують функції, відповідно char *_strdate(char*s1), char *_strtime(char*s1).

У наступному прикладі виводиться поточна дата та час.

# include <iostream>

# include <ctime>

using namespace std;

void main()

{

char buf[15];

_strdate(buf);

cout<<"date "<<buf<<"\n";

_strtime(buf);

cout<<"time "<<buf<<"\n";

}

Існують моменти, коли треба деталізувати час, включаючи мілісекунди. Особливо це важливо, коли треба перевіряти ефективність за часом тих або інших операцій. З цією метою використовується структура _timeb.

struct _timeb

{

long time; //кількість секунд починаючи з 1970 року

short millitm; // кількість мілісекунд

short _timezone; // відмінність у хвилинах за Грінвічем та місцевим часом

short dstflag; // відмінний від 0, якщо світло денне

};

Нижче приведемо приклад аналізу, який показує скільки часу треба на те, щоб пройшов порожній цикл з 1000000000 ітерацій. Даний приклад є дуже корисним для аналізу швидкодії алгоритмів, різноманітних технологій тощо.

# include <iostream>

# include <ctime>

using namespace std;

#include <sys\timeb.h>

void main()

{

double nach, conec;

struct _timeb timebuffer;

_ftime( &timebuffer );

nach = timebuffer.time+timebuffer.millitm/1000.0;

for(long i=1;i<1000000000;i++);

_ftime( &timebuffer );

conec = timebuffer.time+timebuffer.millitm/1000.0;

printf("Kol-vo1 %f sec\n",conec - nach);

}

Функція _ftime() у даному прикладі заповнює структуру timebuffer типу _timeb. Потім у змінну nach записуємо кількість секунд з 1970 року з врахуванням мілісекунд, та зчитуємо відповідну кількість секунд після циклу в 1000000000 ітерацій в змінну conec. Різниця цих змінних і дасть нам кількість секунд на експериментальну операцію з урахуванням мілісекунд.

Якщо необхідно провести різноманітні операції з датами: віднімання дат, додавання певної кількості днів і т.і., треба перевести дати в секунди відносно 1970 року. Для цього призначена функція mktime.

Її синтаксис наступний.

time_t mktime(struct tm *t);

Для зворотного переведення секунд до структури tm використовується функція localtime() з наступним синтаксисом:

struct tm *localtime(const time_t *timer);