Задание
Если 7-ое число месяца приходится на вторник, то этот день является счастливым. Сколько счасливых дней будет между заданными датами. Нужно написать программу, которая подсчитает количество счастливых дней между начальной и конечной датами. Известно, что начальная дата приходится на понедельник.
Формат входных данных:
Первая строка входного файла содержит начальную дату в следующем формате: dd/mm/yyyy, где dd-день, mm-месяц, уууу-год (01<=dd<=31,01<=mm<=12, 0001<=yyyy<=9999). Год Y является високосным, если Y делится на 4 и не делится на 100, или делится на 400.
Во второй строке задаётся конечная дата в таком же формате. Гарантируется, что начальная дата хронологически меньше конечной даты.
BigBen вне форума Ответить с цитированием
Другие языки программирования и технологии
помогите решить задачку, как её писать в паскале?
вот пара функций, которые Вам пригодятся в Паскале:
Код:
function IsLeapYear(Year : Integer) : Boolean;
{-Return True if Year is a leap year}
begin
IsLeapYear := (Year mod 4 = 0) and (Year mod 4000 <> 0) and
((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
function DaysInMonth(Month, Year : Integer) : Integer;
{-Return the number of days in the specified month of a given year}
begin
if Word(Year) < 100 then begin
Inc(Year, 1900);
if Year < Threshold2000 then
Inc(Year, 100);
end;
case Month of
1, 3, 5, 7, 8, 10, 12 :
DaysInMonth := 31;
4, 6, 9, 11 :
DaysInMonth := 30;
2 :
DaysInMonth := 28+Ord(IsLeapYear(Year));
else
DaysInMonth := 0;
end;
end;
ну дальше просто. вводите начальную дату.
и отсчитваете вторники (учитывая переходы на следующий месяц) пока не превысите конечную дату.
в процессе отсчёта проверяете, если вторник - 7-е число - увеличиваете счётчик.
всё.
Код:
function IsLeapYear(Year : Integer) : Boolean;
{-Return True if Year is a leap year}
begin
IsLeapYear := (Year mod 4 = 0) and (Year mod 4000 <> 0) and
((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
function DaysInMonth(Month, Year : Integer) : Integer;
{-Return the number of days in the specified month of a given year}
begin
if Word(Year) < 100 then begin
Inc(Year, 1900);
if Year < Threshold2000 then
Inc(Year, 100);
end;
case Month of
1, 3, 5, 7, 8, 10, 12 :
DaysInMonth := 31;
4, 6, 9, 11 :
DaysInMonth := 30;
2 :
DaysInMonth := 28+Ord(IsLeapYear(Year));
else
DaysInMonth := 0;
end;
end;
ну дальше просто. вводите начальную дату.
и отсчитваете вторники (учитывая переходы на следующий месяц) пока не превысите конечную дату.
в процессе отсчёта проверяете, если вторник - 7-е число - увеличиваете счётчик.
всё.
Вот всё решение:
const
MonthDays : array [1..12] of Byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
function DaysInMonth(M : Byte; Y : Word) : Byte;
begin
if M <> 2 then DaysInMonth := MonthDays[M]
else if Y mod 100 = 0 then
if (Y div 100) mod 4 = 0 then DaysInMonth := 29 else DaysInMonth := 28
else if Y mod 4 = 0 then DaysInMonth := 29 else DaysInMonth := 28;
end;
function CurrentDate(D, M : Byte; Y : Word) : Boolean;
begin
if (Y < 1) or (Y > 9999) then CurrentDate := False
else if (M < 1) or (M > 12) then CurrentDate := False
else if (D < 1) or (D > DaysInMonth(M, Y)) then CurrentDate := False
else CurrentDate := True;
end;
function StoDate(S : String; var D, M : Byte; var Y : Word) : Boolean;
var
N : String; P : Byte; E : Integer;
begin
P := Pos('/', S);
if P > 1 then
begin
N := Copy(S, 1, P - 1); Val(N, D, E);
if E > 0 then StoDate := False;
Delete(S, 1, P);
P := Pos('/', S);
if P > 1 then
begin
N := Copy(S, 1, P - 1); Val(N, M, E);
if E > 0 then StoDate := False;
Delete(S, 1, P);
Val(S, Y, E);
if E > 0 then StoDate := False;
StoDate := CurrentDate(D, M, Y);
end
else
StoDate := False;
end
else
StoDate := False;
end;
function LikeDay(D, W : Byte): Boolean;
begin
LikeDay := (D = 7) and (W = 1);
end;
var
S1, S2 : String;
D1, M1 : Byte; Y1 : Word;
D2, M2 : Byte; Y2 : Word;
W, D, M : Byte; Y : Word;
EndDay : Boolean; K : Word;
begin
S1 := '03/01/2011';
S2 := '31/12/2012';
if Not StoDate(S1, D1, M1, Y1) then
begin
WriteLn('Ошибка формата даты ', S1);
Halt;
end;
if Not StoDate(S2, D2, M2, Y2) then
begin
WriteLn('Ошибка формата даты ', S2);
Halt;
end;
K := 0; W := 0; D := D1; M := M1; Y := Y1; EndDay := False;
repeat
if LikeDay(D, W) then begin Inc(K); WriteLn(D, '/', M, '/', Y); end;
Inc(D); Inc(W); if W = 7 then W := 0;
if D > DaysInMonth(M, Y) then
begin
D := 1; Inc(M);
if M > 12 then
begin
M := 1; Inc(Y);
end;
end;
if Y >= Y2 then EndDay := True;
until EndDay;
WriteLn('Счастливых дней: ', K);
end.
Только переделать на чтение из файла!
const
MonthDays : array [1..12] of Byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
function DaysInMonth(M : Byte; Y : Word) : Byte;
begin
if M <> 2 then DaysInMonth := MonthDays[M]
else if Y mod 100 = 0 then
if (Y div 100) mod 4 = 0 then DaysInMonth := 29 else DaysInMonth := 28
else if Y mod 4 = 0 then DaysInMonth := 29 else DaysInMonth := 28;
end;
function CurrentDate(D, M : Byte; Y : Word) : Boolean;
begin
if (Y < 1) or (Y > 9999) then CurrentDate := False
else if (M < 1) or (M > 12) then CurrentDate := False
else if (D < 1) or (D > DaysInMonth(M, Y)) then CurrentDate := False
else CurrentDate := True;
end;
function StoDate(S : String; var D, M : Byte; var Y : Word) : Boolean;
var
N : String; P : Byte; E : Integer;
begin
P := Pos('/', S);
if P > 1 then
begin
N := Copy(S, 1, P - 1); Val(N, D, E);
if E > 0 then StoDate := False;
Delete(S, 1, P);
P := Pos('/', S);
if P > 1 then
begin
N := Copy(S, 1, P - 1); Val(N, M, E);
if E > 0 then StoDate := False;
Delete(S, 1, P);
Val(S, Y, E);
if E > 0 then StoDate := False;
StoDate := CurrentDate(D, M, Y);
end
else
StoDate := False;
end
else
StoDate := False;
end;
function LikeDay(D, W : Byte): Boolean;
begin
LikeDay := (D = 7) and (W = 1);
end;
var
S1, S2 : String;
D1, M1 : Byte; Y1 : Word;
D2, M2 : Byte; Y2 : Word;
W, D, M : Byte; Y : Word;
EndDay : Boolean; K : Word;
begin
S1 := '03/01/2011';
S2 := '31/12/2012';
if Not StoDate(S1, D1, M1, Y1) then
begin
WriteLn('Ошибка формата даты ', S1);
Halt;
end;
if Not StoDate(S2, D2, M2, Y2) then
begin
WriteLn('Ошибка формата даты ', S2);
Halt;
end;
K := 0; W := 0; D := D1; M := M1; Y := Y1; EndDay := False;
repeat
if LikeDay(D, W) then begin Inc(K); WriteLn(D, '/', M, '/', Y); end;
Inc(D); Inc(W); if W = 7 then W := 0;
if D > DaysInMonth(M, Y) then
begin
D := 1; Inc(M);
if M > 12 then
begin
M := 1; Inc(Y);
end;
end;
if Y >= Y2 then EndDay := True;
until EndDay;
WriteLn('Счастливых дней: ', K);
end.
Только переделать на чтение из файла!
Почему не будут? Будут и придумают
пиши в агент или icq 452371863
пиши в агент или icq 452371863
Я так думаю за тебя здесь ни кто думать не будет.. . Берешь книгу алгоритмы по паскалю и пишешь...
неверное последнее решение....
Похожие вопросы
- Люди помогите решить задачку!!!на паскале
- Знатоки Турбо Паскаля, помогите решить задачки для 7-го класса. Дочке очень нужно.
- помогите решить задачку по информатике на паскале. найти минимальный и максимальный элемент двухмерного массива
- Помогите решить задачку в паскале на циклы. Вычисоить: y=cos(1+cos(2+...+cos(39+cos40)...))
- Помогите решить задачку по программированию в Паскале!
- Помогите решить задачку в паскале!!!
- Помогите решить задачку простенькую.
- помогите решить задачку, на VBA для Excel
- Кто разбирается в программировании? помогите решить задачку!
- Пожалуйста, помогите решить задачку по информатике...