Смекни!
smekni.com

Структуры и функции времени (стр. 2 из 2)

unsigned _bios_timeofday(unsigntd service, long *timeval)

{

union REGS inregs, outregs;

inregs.h.ah = service;

if(service)

{

inregs.x.cx = *timeval >> 0x10; /*старший байт*/

inregs.x.dx = *timeval; /*младший байт*/

}

int86(0x1A, &inregs, &outregs);

if(!service)

*timeval = outregs.x.dx + (outregs.x.cx << 0x10);

return outregs.h.al;

}

Отметим, что для перевода тиков в секунды необходим множитель 1l93180L/65536, обратный частоте генерации тиков. Итого в минуте 1092 тиков, а в часе - 65 543.

1.9. Получение/установка системной даты

void getdate(struct date *pdate);

void setdate(struct date *pdate);

В обоих случаях структура *pdate должна быть подготовлена заранее.

1.10. Получение/установка системного времени

void gettime(struct date *ptime);

void setdate(struct date *ptime);

В обоих случаях структура *ptime должна быть подготовлена заранее.

1.11. Установка системной даты и времени по секундам

int stime(time_t *t);

Секунды *t считаются после 01/01/1970, 00:00:00. Функция возвращает 0.

1.12. Функциизадержки

void delay(unsigned msec);

Задерживает работу исполняемой программы на msec миллисекунд. Функция работает с точностью до миллисекунды. Максимальное время задержки примерно 65

void sleep(unsigned sec);

Задерживает работу исполняемой программы на sec секунд. Максимальное время задержки 65535 сек, около 18 часов.


1.13. Схема взаимодействия функций времени

Поясним на рисунке, как связаны между собой функции времени.

Рис. Взаимодействие функций времени

1.14. Пример. В какой день недели вы родились?

#include <stdio.h>

#include <time.h>

char *wday[] = {"Sunday", "Monday", "Tuesday", "Wednesday",

"Thursday", "Friday", "Saturday", "Unknown"};

int main(void)

{

struct tm time_check;

int year, month, day;

/* Введите год, месяц и день для определения дня недели*/

printf("Год: ");

scanf("%d", &year);

printf("Месяц: ");

scanf("%d", &month);

printf("День: ");

scanf("%d", &day);

/* Заполнение структуры time_check данными */

time_check.tm_year = year - 1900;

time_check.tm_mon = month - 1;

time_check.tm_mday = day;

time_check.tm_hour = 0;

time_check.tm_min = 0;

time_check.tm_sec = 1;

time_check.tm_isdst = -1;

/* вызов mktime для заполнения поля weekday структуры time_check с проверкой даты на корректность */

if (mktime(&time_check) == -1 || time_check.year != year || time_check.mon != mon || time_check.day != day)

time_check.tm_wday = 7;

/* Печать дня недели */

printf("День недели: %s&bsol;n", wday[time_check.tm_wday]);

return 0;

}


2. Контрольные вопросы и задания

1. Какую максимальную дату можно установить в качестве системного времени в DOS?

2. Как измерить приближенное время выполнения цикла

for(int i=0; i<100; i++)

;

3. Как определить количество дней между двумя датами?

4. Как определить количество секунд которые прожил человек до настоящего времени.

5. Напишите функцию

char * asctimerus(structtm *timeptr);

которая по структуре *timeptr возвращает строку с датой и временем на русском языке в формате “17 августа 2007 14:47:12”


3. Лабораторные задания

3.1. День недели

Написать функцию, которая получает дату из стандартного диапазона, и возвращает номер дня недели этой даты. Организовать проверку корректности введенной даты.

3.2. Не думай о секундах свысока …

Написать программу, в которой вводится дата рождения студента из стандартного диапазона, и на экран выводится количество прожитых этим студентом секунд. Информация должна выводиться в графическом режиме и обновляться ежесекундно. Организовать проверку корректности введенной даты.

3.3. Профилирование кода

Определить время выполнения цикла, в котором производится вычисление суммы целых чисел от 1 до 1000.


4. Дополнительные задания

1. Определите день недели произвольной даты в пределах от -32 000 – го до нашей эры до 32 000 – го года нашей эры. Использовать правило «4-100-400» определения високосного года.

2. Программа выводит системную дату и системное время. В случае некорректных данных системная информация изменяется.

3. Нарисуйте циферблат с тремя стрелками, который показывает текущее системное время.

4. Напишите функцию, которая возвращает строку с русским обозначением даты. Например «5 августа 2006г., пнд».


Библиографический список

1. Керниган Б., Ритчи Д., Фьюэр А. Язык программирования Си: Задачи по языку Си. М.: Финансы и статистика, 1985. – 192с.

2. Керниган Б., Ритчи Д. Язык программирования Си. М.:Финансы и статистика, 1992. - 272с.

3. Подбельский В. В., Фомин С. С. Программирование на языке Си. Учеб.пособие. М.: Финансы и статистика, 2004. 600 с.