Реализации алгоритмов/Вечный календарь: различия между версиями

Реализация на классическом Бейсике; мелкие исправления в других разделах
(оформление)
(Реализация на классическом Бейсике; мелкие исправления в других разделах)
y = год − a
m = месяц + 12 * a − 2
ДеньНедели = (число + (31 * mмесяц) / 12 + yгод + yгод / 4 − yгод / 100 + yгод / 400) ОСТАТОК 7
 
либо, что почти то же самое:
//Глобальные переменные
//==========================================================================================
byte denday = 7; //число
byte mesmonth = 7; //месяц
unsigned int godyear = 2017; //год
 
//==========================================================================================
unsigned int f_div(unsigned int x, unsigned int y){
unsigned int result;
result = (x - (x % y)) / y;
return result;
}
//Функция вычисления дня недели
//==========================================================================================
void nedelyaweekday(){
byte a = f_div((14 -mes month), 12);
unsigned int y = godyear - a;
byte m = mesmonth + 12 * a - 2;
unsigned int y4 = f_div(y, 4);
byte y100 = f_div(y, 100);
byte y400 = f_div(y, 400);
byte x = f_div(31 * m, 12);
byte nedwd = (denday + y + y4 - y100 + y400 + x) % 7; //результат в переменной "nedwd"
}
//набирал с клавиатуры и убил вечер на тестирование - reodos
 
==[[w:Бейсик|BASIC]]==
===Классический===
<source lang="basic">
10 PRINT "Year";: INPUT Y
20 PRINT "Month";: INPUT M
30 PRINT "Day";: INPUT D
40 IF M < 3 THEN LET Y = Y - 1: LET M = M + 12
50 LET M = M - 2
60 LET W = (D + INT(31 * M / 12) + Y + INT(Y / 4) - INT(Y / 100) + INT(Y / 400))
70 LET W = W - INT(W / 7) * 7
80 PRINT "Weekday: "; W
90 END
</source>
 
'''Примечание:''' При выполнении условия <code>M < 3</code> в строке 40 значение M увеличивается на 12, а в строке 50 уменьшается на 2, т. е. в итоге увеличивается на 10. При невыполнении же условия значение M просто уменьшается на 2. Таким образом удаётся избежать использования оператора <code>GOTO</code>.
 
===[[w:GW-BASIC|GW-BASIC]] и совместимые диалекты===
<source lang="basic">
</source>
 
===[[w:PowerBASIC|PowerBASIC]], [[w:QBASIC|QBASIC]], [[w:QuickBasic|QuickBasic]] версий 4.0X, [[w:Visual Basic|Visual Basic]]===
<source lang="vb">
Function Weekday (year As Integer, month As Integer, day As Integer) As Integer
Dim y As Integer, m As Integer
If month < 3 Then
yeary = year - 1
monthm = month + 10
Else
monthy = month - 2year
m = month - 2
End If
Weekday = (day + 31 * monthm \ 12 + yeary + yeary \ 4 - yeary \ 100 + yeary \ 400) Mod 7 ' Для VB.NET следует заменить Weekday = на Return
End Function
</source>
'''Примечание:''' Параметры в <code>Sub</code> и <code>Function</code> передаются по ссылке, и изменение значений <code>year</code> и <code>month</code> внутри функции могло бы иметь побочные эффекты в вызывающей программе. Для предотвращения этого использованы локальные переменные <code>y</code> и <code>m</code>.
 
===[[w:Visual_Basic_.NET|Visual Basic .NET]]===
<source lang="vb">
Function Weekday(ByVal year As UShort, ByVal month As Byte, ByVal day As Byte) As Byte
If month < 3 Then
year -= 1
month += 10
Else
month -= 2
End If
Return (day + 31 * month \ 12 + year + year \ 4 - year \ 100 + year \ 400) Mod 7
End Function
</source>
 
Weekday weekday(Year year, Month month, Day day) {
if (month < 33u) {
year -= 1u-year;
month += 10u;
} else
static byte Weekday(ushort year, byte month, byte day) {
if (month < 3u) {
year -= 1u-year;
month += 10u;
} else
</source>
 
==[[Delphi]], [[w:Паскаль (язык программирования)|Pascal]], [[Delphi]]==
<source lang="Pascal">
type TYear = Word;
if month < 3 then
begin
monthyear := monthyear - 21;
yearmonth := yearmonth - 12
end
else
func weekday(year Year, month Month, day Day) Weekday {
if month < 3 {
year -= 1-
month += 10
} else {
static byte weekday(short year, byte month, byte day) {
if (month < 3) {
year -= 1-year;
month += 10;
} else
day = parseInt(day, 10);
if (month < 3) {
year -= 1-year;
month += 10;
} else
AS
BEGIN
declare @a int
declare @y int
declare @m int
 
set @a = (14 — MONTH(@date)) / 12
set @y = YEAR(@date) — @a
set @m = MONTH(@date) + 12*@a-2
 
returnset (DAY(@date)a += @y + @y / 4(14 — @y / 100 + @y / 400 + MONTH(31 * @mdate)) / 12) % 7
set @y = YEAR(@date) — @a
set @am = (14 — MONTH(@date)) /+ 12*@a-2
 
return (DAY(@date) + (31 * @m) / 12 + @y + @y / 4 — @y / 100 + @y / 400) % 7
END
</source>
function weekday(int $year, int $month, int $day) {
if ($month < 3) {
--$year -= 1;
$month += 10;
} else
50. − 51. С/П
</source>
Использование: <год> В↑→ регистр Z, <месяц> В↑→ регистр Y, <число> → регистр X, В/О, С/П (номер дня недели на индикаторе).
 
==Ссылки==
74

правки