
Семинар №7
Подготовка к лабораторной работе 4.
Разработать программу, которая определяет день недели по любой заданной дате календаря от 12.12.1901 до 19.01.2038. Требуемая дата должна передаваться программе в формате dd.mm.yyyy в качестве аргумента командной строки. Латинская аббревиатура дня недели должна отображаться строкой стандартного вывода. Код возврата – порядковый номер дня недели или -1 при ошибке формата даты.
Для работы необходим tim.h
Содержит три типа данных:
используется
для представления -
даты в виде чисел (<sys/types.h>)
структура (шаблон) – tm
struct tm {
int tm_sec; //0÷60
int tm_min; //0÷59
int tm_hour; //0÷23
int tm_mday; //1÷31
int tm_mon; //0÷11
int tm_year; //y-1900
int tm_wday; //0÷6, 0 – sun, 6 – sat
int tm_yday; //0÷365
int tm_isdst; /*-1 – не определено
… 0/1 – был переход на летнее время или нет */
}
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
int day=1;
int mon=1;
int year=1970;
struct tm drec;
static char week[4];
if (argc>1)
{ sscanf(argv[1],”%d%*[.]%d%*[.]%d,&day,&mon,&year);/*%*[.] – чтобы считать из строки символ (в данном случае для точки)*/
}
drec.tm_mday=day;
drec.tm_mon=mon;
drec.tm_year=year-1900;
drec.tm_sec=drec.tm_min=drec.tm_hour=0;
if (mktime(&drec)==-1) //time_t mktime
return (-1); //(struct tm* time);
//time_t time(time_t*t);
strftime(week,4,”%a”,&drec); //в соответствии с форматом %а
puts(week); //записывает аббревиатуру для
return(drec.tm_wday); //недели в week длиной не более 4 сим.
} //main
Проверка: $cal 1 2012
Для shell понадобится команда date
Date [OPTION] … [+FORMAT]
%a -> weekday (sun)
%b -> month (Jan)
%e -> day of month (_1÷3 1)
%Y -> year (xxxx)
%w -> day of week (0÷6) 0 – Sunday
%n -> day of week (1÷7) 1 – Monday
%d -> day of month (0 1÷3 1)
%m -> month (01÷12)
%y -> year (xx)
$date +”%Y” –d “MM/DD/YYYY”
#!/bin/sh
now=`date + “%d.%m.%Y”`
other=${1:-0} #если первая позиционная переменная
#задана, то other =1, иначе равна 0
dmy=`expr $other \| $now`
set `echo $dmy | tr “.” “_”` #$1=DD $2=MM $3=YYYY
case $# in
3)mdy=$2/$1/$3;;
2)mdy=$2/$1;;
*)echo Usage:`basename $0` DD.MM.YYYY
exit 255 #аварийное завершение
;;
esac
date –d “$mday” &>/dev/null
if [ $? –ne 0 ] # $? – результат выполнения последней команды
then echo `basename $0`: Invalid data $dmy 2>$1
exit 255
fi
date +”%a” –d “$mdy”
exit `date +”%u” –d “$mdy”`
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[])
{ int delta=0;
char* strdat; //адрес симв. записи даты
struct tm* ptrdat;
time_t now; //текущая дата в секундах
if (argc>1)
delta=atoi(argv[1]);//преобразует символы в числа, если
now=time(&now); //будут буквы, то вернет 0
strdat=ctime(&now); //char* ctime(const time_t* time);
printf(“now:%s”,strdat); //Fri Apr 15 10:10:10 2012\n\0
//ctime возвращает строку в соответствии с датой
ptrdat=gmtime(&now); //struct tm* gmtime(const time.t *time);
//аналог –localtime
// мы даем календарный эквивалент
//времени, возвращает адрес заполненной
//соответственно структурой
ptrdat->tm_year+=delta;
ptrdat->tm_hour+=4;
if (mktime(ptrdat)==-1)
return (-1);
strdat=asctime(ptrdat); //дает заполненную структуру
//получает готовую строку
printf(“%+d Year: %s”,delta,strdat);
return (ptrdat->tm_wday);
}