Проверка псевдокода. Проверка потребностей для присвоения

Именно с этого момента:

long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))

Из произвольного Date date:

new Date(date.getTime() - (7 * DAY_IN_MS))

Редактировать: Как указано в других ответах, переход на летнее время не учитывается время, если это фактор.

Просто чтобы прояснить это ограничение, о котором я говорил:

Для людей, пострадавших от перехода на летнее время , если под 7 days earlier, вы имеете в виду, что если это правильно теперь это 12pm noon on 14 Mar 2010, вы хотите, чтобы вычисление 7 days earlier привело к 12pm on 7 Mar 2010, тогда будьте осторожны.

Это решение находит дату / время ровно 24 часа * 7 дней = 168 часов раньше.

Однако, некоторые люди удивляются , когда это решение обнаруживает, что, например, (14 Mar 2010 1:00pm) - 7 * DAY_IN_MS может возвращать результат в (7 Mar 2010 12:00pm), где время настенных часов в вашем часовом поясе не совпадает между 2 датой / временем (1pm и 12pm). Это происходит из-за перехода на летнее время, которое начинается или заканчивается той ночью, и из-за того, что «настенные часы» теряют или набирают час.

Если летнее время не является для вас фактором или если вы действительно хотите (168 hours) точно (независимо от смещения времени настенных часов), то это решение работает отлично.

В противном случае вам может потребоваться компенсация, если ваш 7 days earlier на самом деле не означает ровно 168 часов (из-за начала или окончания летнего времени в течение этого периода).

5
задан gooddadmike 27 February 2013 в 12:34
поделиться

2 ответа

Примечание о вычислении CountDwn :

Ваше «вычитание 1 для согласования» будет, в зависимости от того, как именно цикл For работает в язык реализации, (а) генерировать ошибку типа «необъявленная переменная», (б) генерировать ошибку «индекс вне допустимого диапазона» или (в) вычесть один IFF, чтобы последняя зарплата была точно равна среднее. (Кроме того, ваш код не

1
ответ дан 14 December 2019 в 13:45
поделиться

Выглядит нормально. Единственное, что я должен предложить, - это использовать структуру do-while при чтении ввода для имени / продажи. Как видите, у вас есть та же самая логика до начала цикла и в самом цикле:

Write, "Enter Employee name and Salary."
Write, "Enter *,0 when done."
Input Name(K), Salary(K)

Кроме того, псевдокод не будет компилироваться, так как вы вызываете Calculate, а процедура называется Calculation;)

Спасибо за предложения. На самом деле, нет знаком еще с Do-While. Что бы что похоже? Я хотя возможно что-то о вводе должно изменение в цикле, но не был уверен как.

Это могло бы выглядеть примерно так:

Do 
    Write, "Enter Employee name and Salary."
    Write, "Enter *,0 when done."
    Input Name(K), Salary(K)
    If Name(K) <> "*"
        Set CountM = CountM + 1
        Set Sum = Sum + Salary
    Else
        BreakLoop
    End If
End While (true)

На самом деле это не большая разница, а скорее вопрос вкуса. Лично я считаю, что его легче читать, поскольку код написан таким образом, что вы легко понимаете, что вы должны что-то вводить, проверять ввод и что-то делать в зависимости от ввода.

В вашем цикле while Set CountM и т. Д. Идут после (в текстовом потоке) первого ввода, но перед остальной частью ввода, что означает, что вам нужно вернуться в верхнюю часть цикла, чтобы понять, что он что-то делает после предыдущего «круга» в петле. Теперь это всего лишь небольшой цикл, но если бы он был длиной 30 строк (не дай бог), вам бы пришлось прокрутить вверх, чтобы увидеть, что происходит. Если вы понимаете, о чем я :)

5
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: