Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C _Учебник_МОНУ

.pdf
Скачиваний:
206
Добавлен:
12.05.2015
Размер:
11.12 Mб
Скачать

Багатофайлові програми

339

14) Розтлумачте відмінності між такими задаваннями констант:

#define nom 256 const int nom = 256;

15)Що розуміють під поняттям “тривалість життя змінної”?

16)Які існують специфікатори класів пам‟яті при оголошенні змінних у програмі? Який саме специфікатор призначається за замовчуванням?

17)Назвіть правила видимості змінних і функцій.

18)Які існують категорії області дії програмних об‟єктів? Охарактеризуйте кожний з них.

19)З якою метою оголошуються іменовані області (простори імен)?

20)Охарактеризуйте використання операції доступу “::”.

Розділ 10

Типи опрацювання дати і часу

10.1 Тип дата-час у С++

Функції й типи даних, необхідні для опрацювання дати і часу, оголошено у заголовному файлі time.h. Зокрема цей файл містить визначення типів даних time_t:

typedef long time_t; typedef long clock_t;

і структури tm, оголошеної в такий спосіб: struct tm

{int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year;

int tm_wday; int tm_yday; int tm_isdst;

};

Основні з цих функцій з описом їхньої роботи наведено у табл. 10.1.

 

Таблиця 10.1

Функції опрацювання дати і часу

 

 

Синтаксис функції

Опис роботи функції

 

 

char *asctime

Перетворює дату і час time з формату структури

(struct tm time);

типу tm на символьний рядок з 26-ти символів, який

 

 

може мати вигляд

 

Mon Jan 04 02:03:55 2010\n\0

 

Функція повертає вказівник на цей рядок

clock_t clock();

Повертає процесорний час, який сплинув від почат-

 

ку виконання програми, чи –1, якщо він є невідомий

char *ctime(long *time);

Перетворює час time формату long* у символьний

 

рядок з 26 символів, який може вигляд:

 

Mon Jan 04 02:03:55 2010\n\0

 

Функція повертає вказівник на цей рядок

double difftime

Повертає різницю поміж time2 і time1 типу

(time_t time2,

time_t, тобто час у секундах, який сплине від time2

time_t time1);

до time1, як число з подвійною точністю

 

 

 

Типи опрацювання дати і часу

341

 

 

 

Закінчення табл. 10.1

 

 

 

 

 

 

Синтаксис функції

Опис

 

 

 

 

 

 

 

 

struct tm *gmtime

Перетворює time типу long* до формату

 

 

 

(long *time);

структури tm

 

 

 

 

 

 

 

struct tm *localtime

Перетворює time типу long* до формату структури

 

(long *time);

tm з урахуванням зони місцевого часу, якщо попере-

 

 

 

 

дньо було задано глобальну змінну часової зони TZ

 

time_t mktime

Перетворює час і дату time формату структури tm

 

(struct tm *time);

до формату time_t

 

 

 

 

 

 

 

char * _strdate

Перетворює поточну дату на символьний рядок time

 

(char *date);

з 9 символів формату MM/DD/YY

 

 

 

 

 

 

 

char * _strtime

Перетворює поточний час на символьний рядок time

 

(char *time);

з 9 символів формату HH:MM:SS

 

 

 

 

 

 

 

size_t strftime(char *s,

Перетворює дату і час t формату структури tm

 

 

 

size_t maxsize,

на символьний рядок s розміром maxsize

 

 

 

char *fmt, struct tm *t);

 

 

 

у форматі fmt

 

 

 

time_t time

Повертає поточний календарний час

 

 

 

(time_t *timer);

(тобто час в секундах, який сплинув з півночі

 

 

 

 

(00:00:00) 1 Січня 1970 за Грінвічем)

 

 

 

void tzset();

Функція встановлює значення глобальних змінних

 

 

daylight (ненульове значення типу int означає

 

 

 

 

дозвіл переходу на літній час), timezone (значення

 

 

типу long задає різницю в секундах поміж місцевим

 

 

часом і часом за Грінвічем (GMT)) і tzname

 

 

 

 

(рядок типу *char трилітерних часових зон)

 

 

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

#include <vcl.h> #pragma hdrstop #include <stdio.h> #include <time.h> #include <conio.h> #pragma argsused

//---------------------------------------------------------

int main(int argc, char* argv[])

{ struct tm *newtime; char *am_pm="PM";

time_t long_time;

// Оголошення змінної long_time.

time(&long_time);

// Запис поточного часу до long_time.

newtime=localtime(&long_time); // Перетворення long_time

 

// на структуру newtime.

if(newtime->tm_hour<12)

//Якщо проминуло менше за 12 годин доби,

am_pm="AM"; //відбудеться відповідне визначення рядку формату.

342 Розділ 10

if(newtime->tm_hour>12) // Якщо проминуло більше за 12 годин доби, newtime->tm_hour-=12; // відбудеться віднімання 12.

printf("%.20s %s\n", asctime(newtime), am_pm); getch(); return 0;

}

Результат виконання наведеної вище консольної програми матиме вигляд

Таке само завдання можна реалізувати дещо інакше:

#include <vcl.h> #pragma hdrstop #include <stdio.h> #include <time.h> #include <conio.h> #pragma argsused

//--------------------------------------------------------

int main(int argc, char* argv[])

{struct tm *time_now; time_t s_now;

char str[80]; tzset(); time(&s_now);

time_now = localtime(&s_now); strftime(str, 80,

"It is %M minutes after %I o'clock (%Z) %A, %B %d 20%y", time_now);

printf("%s\n",str); getch(); return 0;

}

10.2 Тип дата-час у С++ Builder

Для опрацювання дати й часу в С++ Builder існує спеціальний тип TDateTime. Змінна такого типу займає 8 байтів і за суттю є дійсним числом з фіксованою крапкою, ціла частина якого задає кількість днів, що минули починаючи з 30.12.1899, а дійсна частина цього числа – збіглу частину поточного дня, починаючи з 0 годин (час). Для роботи с даними типу TDateTime існує багато функцій і методів. У табл. 10.2 наведено функції перетворювання дати й часу на рядок та навпаки.

 

Типи опрацювання дати і часу

343

 

 

 

Таблиця 10.2

 

 

Функції перетворювання дати й часу

 

 

 

 

 

 

 

 

Синтаксис функції

Опис

 

 

 

 

 

 

 

 

AnsiString DateToStr

Перетворює дату Date на рядок

 

 

 

(TDateTime Date);

 

 

 

 

TDateTime StrToDate

Перетворює рядок S на дату

 

 

 

(AnsiString S);

 

 

 

 

AnsiString TimeToStr

Перетворює час Time на рядок

 

 

 

(TDateTime Time);

 

 

 

 

TDateTime StrToTime

Перетворює рядок S на час

 

 

 

(AnsiString S);

 

 

 

 

AnsiString DateTimeToStr

Перетворює значення dtтипу TDateTime на рядок

 

 

(TDateTime dt);

 

 

 

 

TDateTime StrToDateTime

Перетворює рядок S на дату і час типу TDateTime

 

 

(AnsiString S);

 

 

 

 

 

 

 

 

 

DateTimeToString

Перетворює значення dt типу TDateTime

 

 

 

(AnsiString &S, AnsiString

на рядок S за форматом Format

 

 

 

Format, TDateTime dt);

 

 

 

 

AnsiString FormatDateTime

Повертає рядок, як результат перетворення

 

 

 

(AnsiString Format,

значення dt типу TDateTime за форматом Format

 

 

TDateTime dt);

 

 

 

 

TDateTime StrToDateDef

Функція намагається перетворити рядок S

 

 

 

(AnsiString S,

на дату типу TDateTime. Якщо перетворення

 

 

 

TDateTime Default);

 

 

 

відбулося, функція повертає це значення,

 

 

 

 

 

 

 

 

а за випадку неможливості перетворення –

 

 

 

 

значення Default

 

 

 

TDateTime StrToDateTimeDef

Функція намагається перетворити рядок S

 

 

 

(AnsiString S,

на дату і час типу TDateTime. Якщо перетворення

 

 

TDateTime Default);

 

 

відбулося, функція повертає це значення,

 

 

 

 

 

 

 

 

а за випадку неможливості перетворення –

 

 

 

 

значення Default

 

 

 

TDateTime StrToTimeDef

Функція намагається перетворити рядок S на час

 

 

(AnsiString S,

типу TDateTime. Якщо перетворення відбулося,

 

 

TDateTime Default);

 

 

функція повертає це значення, а за випадку

 

 

 

 

 

 

 

 

неможливості перетворення – значення Default

 

 

bool TryStrToDate

Перетворює рядок S на дату dt типу TDateTime.

 

 

(AnsiString S,

Якщо перетворення відбулося, функція повертає

 

 

TDateTime &dt);

true, інакше повертає false

 

 

 

 

 

 

 

bool TryStrToTime

Перетворює рядок S на час dt типу TDateTime.

 

 

(AnsiString S,

Якщо перетворення відбулося, функція повертає

 

 

TDateTime &dt);

true, інакше повертає false

 

 

 

 

 

 

 

bool TryStrToDateTime

Перетворює рядок S на дату і час dt типу

 

 

 

(AnsiString S,

TDateTime. Якщо перетворення відбулося,

 

 

 

TDateTime &dt);

 

 

 

функція повертає true, інакше повертає false

 

 

 

 

344 Розділ 10

У функціях DateTimeToString та FormatDateTime з табл. 10.2, викорис-

товується рядок форматування дат. У табл. 10.3 наведено значення специфікаторів формату дат.

 

Таблиця 10.3

 

Специфікатори формату дат

 

 

Специфікатор

Опис

 

 

C

Виведення дати і часу за заданою глобальною змінною

 

ShortDateFormat

d

Виведення дня без початкових нулів (1 – 31)

dd

Виведення дня з початковим нулем (01 – 31)

ddd

Виведення дня у вигляді позначення (пн – нд)

dddd

Виведення дня у вигляді повної назви дня тижня

 

(понеділок – неділя)

m

Виведення місяця без початкових нулів (1 – 12)

mm

Виведення місяця з початковими нулями (01 – 12)

mmm

Виведення місяця у вигляді позначень (січ – грд)

mmmm

Виведення повної назви місяця (січень – грудень)

yy

Виведення двох останніх цифр року (00 – 99)

yyyy

Виведення року у повному форматі (0000 – 9999)

h

Виведення годин без початкового нуля (0 – 23)

hh

Виведення годин з початковим нулем (00 – 23)

n

Виведення хвилин без початкового нуля (0 – 59)

nn

Виведення хвилин з початковим нулем (00 – 59)

s

Виведення секунд без початкового нуля (0 – 59)

ss

Виведення секунд з початковим нулем (00 – 59)

am/pm

Використання 12-годинної шкали та символів am або pm

a/p

Використання 12-годинної шкали і символів a або p

У табл. 10.4 подано деякі поширені у застосуванні методи для роботи з даними типу TDateTime. Слід звернути увагу на синтаксис при використанні методів:

<змінна>.<метод>;

Наприклад: d.TimeString();

Таблиця 10.4

 

Деякі методи роботи з датою та часом

 

 

 

Методи

 

Опис

 

 

 

CurrentDate()

 

Повертає поточну дату

CurrentTime()

 

Повертає поточний час

CurrentDateTime()

 

Повертає поточні дату і час

operator int

 

Перетворює TDateTime на ціле число

operator -

 

Дозволяють зі значення дати (часу) віднімати,

operator +

 

додавати дати, числа типу double чи int

DateString()

 

Перетворює дату TDateTime на AnsiString рядок

TimeString()

 

Перетворює час TDateTime на AnsiString рядок

Типи опрацювання дати і часу

345

У табл. 10.5 в алфавітному порядку подано функції заголовних файлів DateUtils.hpp та SysUtils.hpp, поширені у застосовуванні при роботі з даними типу дати і часу.

 

Таблиця 10.5

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

 

 

Функції

Опис

int CompareDate

Порівнює дві дати А та В і повертає:

(TDateTime А, TDateTime В);

значення 0, якщо дати є однакові;

 

–1, якщо значення А є менше за В;

 

1, якщо значення А є більше за В

intCompareDateTime

Порівнює два значення дати і часу А та В типу

(TDateTime А, TDateTime В);

TDateTime і повертає значення, подібне

 

до результату функції CompareDate()

intCompareTime

Порівнює два значення часу А та В типу

(TDateTime А, TDateTime В);

TDateTime і повертає значення, подібне

 

до результату у функції CompareDate()

Word CurrentYear();

Повертає поточний рік (чотири цифри)

TDateTime Date();

Повертає поточну системну дату

Word DayOf(TDateTime dt);

Повертає номер дня місяця дати dt

 

(значення від 1 до 31). Функція є подібною до

 

DayOfTheMonth()

 

 

Word DayOfTheMonth

Повертає номер дня місяця дати dt. Функція є

(TDateTime dt);

подібною до функції DayOf()

 

Word DayOfTheWeek

Визначає по dt день тижня від 1 (понеділок)

(TDateTime dt);

до 7 (неділя)

int DayOfWeek

Визначає по dt день тижня від 1 (неділя)

(TDateTime dt);

до 7 (субота)

int DaysBetween (TDateTime

Повертає цілу кількість днів поміж

Now, TDateTime Athen);

датами Now і Athen

Word DaysInAMonth

Повертає кількість днів у місяці Month року

(Word Year, Word Month);

Year

 

 

Word DayOfTheYear

Повертає кількість днів поміж датою dt і

(TDateTime dt);

31 грудня попереднього року

Word DaysInYear

Повертає кількість днів зазначеного у даті dt

(TDateTime dt);

року

double DaySpan

Повертає дійсне значення кількості днів поміж

(TDateTime Now,

Now і Athen (з урахуванням частини години)

TDateTime Athen)

 

 

 

DecodeDate (TDateTime Date,

Виокремлює з дати Date рік Year, місяць Month і

Word &Year, Word &Month,

день Day

Word &Day);

 

 

 

DecodeDateDay

Виокремлює з Date рік Year, і кількість днів

(TDateTime Date, Word &Year,

DayOfYear цього року

Word &DayOfYear);

 

346

Розділ 10

 

 

 

Продовження табл. 10.5

 

 

 

 

 

 

Синтаксис функції

Опис

 

 

 

 

bool DecodeDateFully (TDateTime

Виокремлює з Date рік Year, місяць Month,

 

Date, Word &Year, Word &Month,

день Day і день тижня DayOfWeek;

 

Word &Day, Word &DayOfWeek);

 

якщо рік високосний, повертає true

 

 

 

 

DecodeDateMonthWeek

Виокремлює з дати Date рік Year, місяць

 

(TDateTime Date, Word &Year,

Month, тиждень місяця WeekOfMonth, день

 

Word &Month, Word &WeekOfMonth,

 

тижня DayOfWeek (1 – понеділок)

 

Word &DayOfWeek);

 

 

DecodeDateTime(TDateTime dt,

Виокремлює з dt рік Year, місяць Month,

 

Word &Year, Word &Month, Word

день Day, годину Hour, хвилину Minute,

 

&Day, Word &Hour, Word &Minute,

 

секунду Second, мілісекунду MSec

 

Word &Second, Word &MSec);

 

 

DecodeDateWeek (TDateTime

Виокремлює з дати Date рік Year, тиждень

 

Date, Word &Year, Word

року WeekOfYear і день тижня DayOfWeek

 

&WeekOfYear, Word &DayOfWeek);

 

(1 – понеділок)

 

 

 

 

DecodeDayOfWeekInMonth

Виокремлює з Date рік Year, місяць Month,

 

(TDateTime Date, Word &Year,

котрий раз NthDayOfWeek зустрічається

 

Word &Month, Word &NthDayOfWeek,

 

в місяці цей день тижня, день тижня

 

Word &DayOfWeek);

DayOfWeek (1 – понеділок)

 

 

 

 

DecodeTime(TDateTime Time,

Виокремлює з Time години Hour,

 

Word &Hour, Word &Min, Word

хвилини Min, секунди Sec

 

&Sec, Word &MSec);

 

і мілісекунди Msec

 

 

 

 

TDateTime EncodeDate

Формує значення типу TDateTime по року

 

(Word Year, Word Month,Word Day);

Year, місяцю Month і дню Day

 

TDateTime EncodeDateDay (Word

Формує значення TDateTime по року Year і

 

AYear, Word DayOfYear);

дню року DayOfYear

 

TDateTime EncodeDateMonthWeek

Формує значення TDateTime по року Year,

 

(Word Year, Word Month, Word

місяцю Month, тижню місяця WeekOfMonth і

 

WeekOfMonth, Word DayOfWeek);

дню тижня DayOfWeek

 

 

 

 

TDateTime EncodeDateTime (Word

Формує значення типу TDateTime

 

Year, Word Month, Word Day,

по року Year, місяцю Month, дню Day,

 

Word Hour, Word Minute, Word

 

годині Hour, хвилині Minute,

 

Sec, Word MSec);

 

секунді Sec, мілісекунді MSec

 

 

 

 

TDateTime EncodeDateWeek

Формує значення TDateTime по року Year,

 

(Word Year, Word WeekOfYear,

дню тижня DayOfWeek і тижню року

 

Word DayOfWeek);

 

WeekOfYear

 

 

 

 

 

 

 

TDateTime

Формує значення типу TDateTime

 

EncodeDayOfWeekInMonth

по року Year, місяцю Month, дню тижня

 

(Word Year, Word Month,

 

DayOfWeek і номера, котрий раз цей день

 

Word NthDayOfWeek,

 

тижня зустрічається в цьому місяці

 

Word DayOfWeek);

 

NthDayOfWeek

 

 

 

 

 

 

 

 

 

Типи опрацювання дати і часу

347

 

 

 

Продовження табл. 10.5

 

 

 

 

 

 

 

Синтаксис функції

Опис

 

 

 

 

 

 

TDateTime EncodeTime

Формує час типу TDateTime по заданим

 

 

(Word Hour, Word Min,

значенням години Hour, хвилини Min,

 

 

Word Sec, Word MSec)

секунди Sec, милісекунди MSec

 

 

 

 

 

 

TDateTime EndOfADay(Word

Повертає час завершення заданого дня року

 

 

Year, Word DayOfYear);

DayOfYear певного року Year

 

 

TDateTime EndOfADay(Word

Повертає час завершення дня Day місяця Month

 

Year, Word Month, Word Day);

року Year

 

 

TDateTime EndOfAMonth

Повертає час завершення останнього дня

 

 

(Word Year, Word Month);

місяця Month року Year

 

 

TDateTime EndOfAWeek

Повертає час завершення дня тижня DayOfWeek

 

(Word Year,Word WeekOfYear,

тижня року WeekOfYear року Year

 

 

Word DayOfWeek);

 

 

 

TDateTime EndOfAYear

Повертає час завершення року Year

 

 

(Word AYear);

 

 

 

TDateTime EndOfTheDay

Повертає час завершення дати Date

 

 

(TDateTime Date);

 

 

 

TDateTime EndOfTheMonth

Повертає час завершення місяця

 

 

(TDateTime Date);

зазначеної дати Date

 

 

TDateTime EndOfTheWeek

Повертає час завершення тижня

 

 

(TDateTime Date);

зазначеної дати Date

 

 

TDateTime EndOfTheYear

Повертає час завершення року зазначеної

 

 

(TDateTime Date);

дати Date

 

 

Word HourOf(TDateTime dt);

Повертає значення години (від 0 до 23) заданого

 

 

 

часу dt. Функція є подібною до HourOfTheDay()

 

Word HourOfTheDay

Повертає значення години (від 0 до 23) заданого

 

(TDateTime dt);

часу dt. Функція є подібною до HourOfDay()

 

 

Word HourOfTheMonth

Повертає кількість годин від початку місяця

 

 

(TDateTime dt);

зазначеної дати dt

 

 

Word HourOfTheWeek

Повертає кількість годин від початку тижня

 

 

(TDateTime dt);

зазначеної дати dt

 

 

Word HourOfTheYear

Повертає кількість годин від початку року

 

 

(TDateTime dt);

зазначеної дати dt

 

 

int HoursBetween

Повертає цілу кількість годин поміж

 

 

(TDateTime Now,

Now і Athen

 

 

TDateTime Athen)

 

 

 

double HourSpan

Повертає дійсне значення кількості годин поміж

 

(TDateTime Now,

Now і Athen (з урахуванням частини години)

 

 

TDateTime Athen)

 

 

 

 

 

 

 

 

void IncAMonth(Word &Year,

Збільшує значення року, місяця і дня на задану

 

Word &Month, Word &Day,

кількість місяців NumbOfMonths; значення

 

 

int NumbOfMonths);

 

 

NumbOfMonths може бути від‟ємним

 

 

 

 

 

 

TDateTime IncDay

Збільшує дату dt на кількість днів NumbOfDays;

 

(TDateTime dt,

значення NumbOfDays може бути і від‟ємним

 

 

int NumbOfDays);

 

 

 

 

 

 

 

 

 

 

348

Розділ 10

 

 

 

Продовження табл. 10.5

 

 

 

 

 

 

Синтаксис функції

Опис

 

 

 

 

TDateTime IncHour

Збільшує дату і час dt на кількість годин

 

(TDateTime dt,

NumbOfHours. Значення NumbOfHours може бути

 

int NumbOfHours);

 

і від‟ємним

 

 

 

 

TDateTime IncMilliSecond

Збільшує дату і час dt на кількість NumbOfMSec.

 

(TDateTime dt,

Значення NumbOfMSec може бути і від‟ємним

 

int NumbOfMSec);

 

 

 

TDateTime IncMinute

Збільшує дату і час dt на кількість хвилин

 

(TDateTime dt,

NumbOfMinutes. Значення NumbOfMinutes

 

int NumbOfMinutes);

 

може бути і від‟ємним

 

 

 

 

TDateTime IncMonth

Збільшує дату dt на кількість місяців

 

(TDateTime dt,

NumbOfMonths. Значення NumbOfMonths може бути

 

int NumbOfMonths);

 

і від‟ємним

 

 

 

 

TDateTime IncSecond

Збільшує дату і час dt на кількість секунд

 

(TDateTime dt,

NumbOfSec. Значення NumbOfSec може бути

 

int NumbOfSec);

 

і від‟ємним

 

 

 

 

TDateTime IncWeek

Збільшує дату dt на кількість тижнів NumbOfWeeks.

 

(TDateTime dt,

Значення NumbOfWeeks може бути і від‟ємним

 

int NumbOfWeeks);

 

 

 

TDateTime IncYear

Збільшує дату dt на кількість років NumbOfYears.

 

(TDateTime dt,

Значення NumbOfYears може бути і від‟ємним

 

int NumbOfYears);

 

 

 

 

 

 

bool IsInLeapYear

Визначає належність дати Date

 

(TDateTime Date);

до високосного року

 

bool IsLeapYear

Визначає належність року Year

 

(Word Year);

до високосного року

 

bool IsPM(TDateTime dt);

Визначає належність часу dt

 

 

 

до другої половини дня

 

bool IsSameDay(TDateTime

Повертає true, якщо обидві дати dt1 і dt2 (день,

 

dt1, TDateTime dt2);

місяць і рік) збігаються

 

bool IsToday

Повертає true, якщо дата dt є сьогоднішнім днем

 

(TDateTime dt);

 

 

 

 

 

bool IsValidDate

Визначає допустимість значень року, місяця та дня

 

(Word Year, Word Month,

і повертає true, якщо Year належить діапазону

 

Word Day);

від 1 до 9999 , Month – діапазону від 1 до 12,

 

 

 

Day – діапазону від 1 до кількості днів цього

 

 

 

місяця; інакше повертає false

 

bool IsValidDateDay

Подібно до функції IsValidDate() визначає

 

(Word Year,

допустимість значень року Year і дня року

 

Word DayOfYear);

 

DayOfYear

 

 

 

 

 

 

 

bool IsValidDateMonthWeek

Подібно до функції IsValidDate() визначає допу-

 

(Word Year, Word Month,

стимість значень року Year, місяця Month, номера

 

Word WeekOfMonth,

тижня цього місяця WeekOfMonth і дня тижня

 

Word DayOfWeek);

DayOfWeek (від 1 до 7)

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]