Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семинары по информатике.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
228.35 Кб
Скачать

Семинар №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);

}