Реализации алгоритмов/Вечный календарь: различия между версиями
Содержимое удалено Содержимое добавлено
м исправление (убран вводящий в заблуждение комментарий) |
Нет описания правки |
||
Строка 1:
{{wikipedia|Вечный календарь}}
=
Существует довольно простой '''алгоритм вычисления дня недели''' для любой даты [[w:Григорианский календарь|григорианского календаря]], начиная с первого дня его действия — 15 октября [[w:1583|1583]] года. (Предыдущим днём было 4 октября, числа с 5 по 14 октября включительно были пропущены для устранения 11‑дневного отставания от фактической даты, накопившегося за время использования [[w:Юлианский календарь|юлианского календар]]).
Положим, дата задана так: ''год'' — год (от 1583), ''месяц'' — номер месяца (1…12), ''число'' — число месяца (1…31, согласно числу дней в соответствующем месяце), тогда:
a = (14 − месяц) / 12
y = год − a
m = месяц + 12 * a − 2
ДеньНедели = (
либо, что почти то же самое:
если месяц = 1 или месяц = 2: // январь или февраль
год = год − 1
месяц = месяц + 10
иначе:
месяц = месяц − 2
всё
ДеньНедели = (число + (31 * месяц) / 12 + год + год / 4 − год / 100 + год / 400) ОСТАТОК 7
Деление производится нацело (с отбрасыванием остатка).
Результат: 0 — воскресенье, 1 — понедельник и т. д.
=Реализации=
==[[Arduino IDE]]==
<source lang="C">
//==========================================================================================
//Глобальные переменные
Строка 53 ⟶ 60 :
</source>
==
===[[w:GW-BASIC|GW-BASIC]] и совместимые диалекты===
<source lang="basic">
10 INPUT "Year", Y%: INPUT "Month", M%: INPUT "Day", D%
20 IF M% < 3 THEN Y% = Y% - 1: M% = M% + 10: ELSE M% = M% - 2
30 PRINT "Weekday: "; (D% + 31 * M% \ 12 + Y% + Y% \ 4 - Y% \ 100 + Y% \ 400) MOD 7
</source>
===[[w:QuickBasic|QuickBasic]] версий < 4.0, [[w:Turbo Basic|Turbo Basic]]===
<source lang="basic">
DEF FNWD%(Y%, M%, D%)
IF M% < 3 THEN
Y% = Y% - 1
M% = M% + 10
ELSE
END IF
FNWD% = (D% + 31 * M% \ 12 + Y% + Y% \ 4 - Y% \ 100 + Y% \ 400) MOD 7
END DEF
</source>
===[[w:PowerBASIC|PowerBASIC]], [[w:QBASIC|QBASIC]], [[w:QuickBasic|QuickBasic]] версий ≥ 4.0, [[w:Visual Basic|Visual Basic]]===
<source lang="vb">
Function Weekday (year As Integer, month As Integer, day As Integer) As Integer
If month < 3 Then
year = year - 1
month = month + 10
Else
month = month - 2
End If
Weekday = (day + 31 * month \ 12 + year + year \ 4 - year \ 100 + year \ 400) Mod 7 ' Для VB.NET следует заменить Weekday = на Return
End Function
</source>
==[[Язык Си в примерах|C]], [[C++]]==
<source lang="C">
typedef unsigned short Year;
typedef unsigned char Month;
typedef unsigned char Day;
typedef unsigned char Weekday;
Weekday weekday(Year year, Month month, Day day) {
if (month < 3) {
year -= 1u;
month += 10u;
} else
}
</source>
==
<source lang="csharp">
static byte Weekday(ushort year, byte month, byte day) {
if (month < 3u) {
year -= 1u;
month += 10u;
} else
month -= 2u;
return (byte)(((ushort)day + 31u * (ushort)month / 12u + year + year / 4u - year / 100u + year / 400u) % 7u);
}
</source>
==[[Delphi]], [[w:Паскаль (язык программирования)|Pascal]]==
<source lang="Pascal">
type TYear = Word;
type TMonth = 1..12;
type TDay = 1..31;
type TWeekday = 0..6;
function Weekday(year: TYear; month: TMonth; day: TDay): TWeekday;
begin
if month < 3 then
begin
year := year - 1
end
else
month := month + 10;
Weekday := (day + 31 * month div 12 + year + year div 4 - year div 100 + year div 400) mod 7
end;
</source>
==[[w:Go (язык программирования)|Go]]==
<source lang="Go">
type Year = uint16
type Month = uint8
type Day = uint8
type Weekday = uint8
func weekday(year Year, month Month, day Day) Weekday {
if month < 3 {
year -= 1
month += 10
} else {
month -= 2
}
return Weekday((Year(day) + 31 * Year(month) / 12 + year + year / 4 - year / 100 + year / 400) % 7)
}
</source>
==
<source lang="java">
static byte weekday(short year, byte month, byte day) {
if (month < 3) {
year -= 1;
month += 10;
} else
month -= 2;
return (byte)(((short)day + 31 * (short)month / 12 + year + year / 4 - year / 100 + year / 400) % 7);
}
</source>
==[[JavaScript]]==
<source lang="JavaScript">
function weekday(year, month, day) {
year = parseInt(year, 10);
month = parseInt(month, 10);
day = parseInt(day, 10);
if (month < 3) {
year -= 1;
month += 10;
} else
month -= 2;
return (day + 31 * month / 12 + year + year / 4 - year / 100 + year / 400) % 7;
}
</source>
==[[Microsoft Excel]]==
А2 — ячейка, содержащая дату.
<source lang="html4strict">
(English): =WEEKDAY(A2;2)
(Русский): =ДЕНЬНЕД(A2;2)
</source>
ЛИБО:
<source lang="html4strict">
=ОКРВНИЗ(ОСТАТ((ДЕНЬ(A2)+(ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/4;1)-ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/100;1)+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/400;1)+ОКРВНИЗ(31*(МЕСЯЦ(A2)+12*ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1)-2)/12;1));7);1)
</source>
==[[w:MS SQL|MS SQL]]==
<source lang="mysql ">
CREATE FUNCTION [dbo].[getDay](
Строка 144 ⟶ 222 :
</source>
==
<source lang="PHP">
function weekday($year, $month, $day) {
$year = (int)year;
$month = (int)$month;
$day = (int)$day;
if (month < 3) {
$year -= 1;
$month += 10;
} else
$month -= 2;
return ($day + 31 * $month / 12 + $year + $year / 4 - $year / 100 + $year / 400) % 7;
}
</source>
==[[Python]]==
<source lang="python">
def weekday(year: int, month: int, day: int) -> int:
if month < 3:
year -= 1
month += 10
else:
month -= 2
return (day + 31 * month // 12 + year + year // 4 - year // 100 + year // 400) % 7
</source>
==[[Ruby]]==
<source lang="ruby">
def weekday(year, month, day)
if month < 3
year -= 1
month += 10
else
month -= 2
end
return (day + 31 * month / 12 + year + year / 4 - year / 100 + year / 400) % 7
end
</source>
==[[w:Rust (язык программирования)|Rust]]==
<source lang="Rust">
type Year = u16;
type Month = u8;
type Day = u8;
type Weekday = u8;
fn weekday(mut year: Year, mut month: Month, day: Day) -> Weekday {
if month < 3 {
year -= 1;
month += 10;
} else {
month -= 2;
}
((day as Year + 31 * month as Year / 12 + year + year / 4 - year / 100 + year / 400) % 7) as Weekday
}
</source>
==[[w:Cmd.exe|Командная строка Windows (cmd.exe)]]==
<source lang="C">
@echo off
set /a год = %date:~6,4%
set /a месяц = %date:~3,2%
set /a число = %date:~0,2%
set /a a = ((14 - %месяц%) / 12)
set /a y = (%год% - %a%)
set /a m = (%месяц% + (12 * %a%) - 2)
set /a ДеньНедели = (((%
echo %ДеньНедели%
</source>
==Программируемые микрокалькуляторы «Электроника»==
===МК-52 / 61 / 152 / 161 / 163 / 1152===
В вычислениях участвуют только регистры стека.
<source
00. ↔ 01. 3 02. − 03. 1 04. ↔ 05. Fx<0 06. 15 07. F🔃 08. ↔ 09. F🔃
10. − 11. 1 12. 3 13. ↔ 14. F🔃 15. + 16. 3 17. 1 18. × 19. 1
20. 2 21. ÷ 22. К[x] 23. + 24. + 25. ↔ 26. 4 27. ÷ 28. К[x] 29. +
30. ↔ 31. 2 32. F10ˣ 33. ÷ 34. ↔ 35. FВx 36. К[x] 37. − 38. ↔ 39. 4
40. ÷ 41. К[x] 42. + 43. В↑ 44. В↑ 45. 7 46. ÷ 47. К[x] 48. 7 49. ×
50. − 51. С/П
</source>
Использование: <год> В↑ <месяц> В↑ <число> В/О С/П (номер дня недели на индикаторе).
==
* [http://algolist.manual.ru/misc/yearweek.php Примеры программ для вычисления дня недели]
|