Реализации алгоритмов/Вечный календарь: различия между версиями
Содержимое удалено Содержимое добавлено
оформление |
Реализация на классическом Бейсике; мелкие исправления в других разделах |
||
Строка 8:
y = год − a
m = месяц + 12 * a − 2
ДеньНедели = (число + (31 *
либо, что почти то же самое:
Строка 31:
//Глобальные переменные
//==========================================================================================
//==========================================================================================
Строка 40:
unsigned int f_div(unsigned int x, unsigned int y){
unsigned int result;
result = (x - (x % y)) / y;
return result;
}
Строка 47:
//Функция вычисления дня недели
//==========================================================================================
void
byte a = f_div((14 -
unsigned int y =
byte m =
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
}
//набирал с клавиатуры и убил вечер на тестирование - reodos
Строка 61:
==[[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">
Строка 81 ⟶ 96 :
</source>
===[[w:PowerBASIC|PowerBASIC]], [[w:QBASIC|QBASIC]], [[w:QuickBasic|QuickBasic]] версий
<source lang="vb">
Function Weekday
Dim y As Integer, m As Integer
If month < 3 Then
Else
m = month - 2
End If
Weekday = (day + 31 *
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>
Строка 102 ⟶ 133 :
Weekday weekday(Year year, Month month, Day day) {
if (month <
month += 10u;
} else
Строка 115 ⟶ 146 :
static byte Weekday(ushort year, byte month, byte day) {
if (month < 3u) {
month += 10u;
} else
Строка 123 ⟶ 154 :
</source>
==
<source lang="Pascal">
type TYear = Word;
Строка 134 ⟶ 165 :
if month < 3 then
begin
end
else
Строка 152 ⟶ 183 :
func weekday(year Year, month Month, day Day) Weekday {
if month < 3 {
year
month += 10
} else {
Строка 165 ⟶ 196 :
static byte weekday(short year, byte month, byte day) {
if (month < 3) {
month += 10;
} else
Строка 180 ⟶ 211 :
day = parseInt(day, 10);
if (month < 3) {
month += 10;
} else
Строка 209 ⟶ 240 :
AS
BEGIN
declare @a int
declare @y int
declare @m int
set @a = (14 — MONTH(@date)) / 12▼
set @y = YEAR(@date) — @a▼
▲ set @y = YEAR(@date) — @a
return (DAY(@date) + (31 * @m) / 12 + @y + @y / 4 — @y / 100 + @y / 400) % 7
END
</source>
Строка 226 ⟶ 256 :
function weekday(int $year, int $month, int $day) {
if ($month < 3) {
--$year
$month += 10;
} else
Строка 302 ⟶ 332 :
50. − 51. С/П
</source>
Использование: <год>
==Ссылки==
|