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.
void getdate(struct date *pdate);
void setdate(struct date *pdate);
В обоих случаях структура *pdate должна быть подготовлена заранее.
void gettime(struct date *ptime);
void setdate(struct date *ptime);
В обоих случаях структура *ptime должна быть подготовлена заранее.
int stime(time_t *t);
Секунды *t считаются после 01/01/1970, 00:00:00. Функция возвращает 0.
void delay(unsigned msec);
Задерживает работу исполняемой программы на msec миллисекунд. Функция работает с точностью до миллисекунды. Максимальное время задержки примерно 65
void sleep(unsigned sec);
Задерживает работу исполняемой программы на sec секунд. Максимальное время задержки 65535 сек, около 18 часов.
Поясним на рисунке, как связаны между собой функции времени.
Рис. Взаимодействие функций времени
#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\n", wday[time_check.tm_wday]);
return 0;
}
1. Какую максимальную дату можно установить в качестве системного времени в DOS?
2. Как измерить приближенное время выполнения цикла
for(int i=0; i<100; i++)
;
3. Как определить количество дней между двумя датами?
4. Как определить количество секунд которые прожил человек до настоящего времени.
5. Напишите функцию
char * asctimerus(structtm *timeptr);
которая по структуре *timeptr возвращает строку с датой и временем на русском языке в формате “17 августа 2007 14:47:12”
Написать функцию, которая получает дату из стандартного диапазона, и возвращает номер дня недели этой даты. Организовать проверку корректности введенной даты.
Написать программу, в которой вводится дата рождения студента из стандартного диапазона, и на экран выводится количество прожитых этим студентом секунд. Информация должна выводиться в графическом режиме и обновляться ежесекундно. Организовать проверку корректности введенной даты.
Определить время выполнения цикла, в котором производится вычисление суммы целых чисел от 1 до 1000.
1. Определите день недели произвольной даты в пределах от -32 000 – го до нашей эры до 32 000 – го года нашей эры. Использовать правило «4-100-400» определения високосного года.
2. Программа выводит системную дату и системное время. В случае некорректных данных системная информация изменяется.
3. Нарисуйте циферблат с тремя стрелками, который показывает текущее системное время.
4. Напишите функцию, которая возвращает строку с русским обозначением даты. Например «5 августа 2006г., пнд».
1. Керниган Б., Ритчи Д., Фьюэр А. Язык программирования Си: Задачи по языку Си. М.: Финансы и статистика, 1985. – 192с.
2. Керниган Б., Ритчи Д. Язык программирования Си. М.:Финансы и статистика, 1992. - 272с.
3. Подбельский В. В., Фомин С. С. Программирование на языке Си. Учеб.пособие. М.: Финансы и статистика, 2004. 600 с.