ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
if days[13] = 5 then black := black + 1<br />
end;<br />
writeln ('black friday = ', black)<br />
end.<br />
Задачи, “вынуждающие” отказаться<br />
от последовательного заполнения<br />
электронного календаря<br />
Ученикам предлагается к решению одна из следующих<br />
задач.<br />
Задача 3. Посчитать, сколько раз в XXI веке<br />
23 февраля приходится на воскресенье. Известно,<br />
что 1 января 2001 года — понедельник.<br />
Задача 4. Посчитать, сколько раз в XXI веке<br />
8 марта приходится на воскресенье. Известно, что<br />
1 января 2001 года — понедельник.<br />
Анализ решения задачи 3. Школьники по аналогии<br />
с Задачей 2 начинают решать эту задачу с использованием<br />
массивов. Но быстро понимают, что<br />
в данной задаче нет смысла заполнять электронный<br />
календарь по месяцам. Те же, кто продолжает<br />
решать задачу с последовательным заполнением<br />
электронного календаря по месяцам, получают<br />
примерно такую программу (на основе ранее написанной<br />
программы для Задачи 2):<br />
const n = 31;<br />
m:array[1..12] of integer = (31,28,<br />
31,30,31,30,31,31,30,31,30,31);<br />
var days: array[1..n] of integer;<br />
year, i, k, p, f_23, first,<br />
md: integer;<br />
begin<br />
f_23 := 0;<br />
first := 1;<br />
for year := 2001 to 2100 do<br />
begin<br />
for i := 1 to 12 do<br />
begin<br />
p := first;<br />
md := m[i];<br />
if (i = 2) and (year mod 4 = 0)<br />
and (year 2100)<br />
then md := m[i] + 1;<br />
for k := 1 to md do<br />
begin<br />
days[k] := p;<br />
p := (p + 1) mod 7;<br />
end;<br />
first := p;<br />
if (i = 2) and (days[23] = 0) then<br />
f_23 := f_23 + 1<br />
end;<br />
end;<br />
writeln ('febr_23 = ', f_23);<br />
readln<br />
end.<br />
При решении Задачи 3 без использования массивов<br />
достаточно знать, на какой день недели приходится<br />
54-й день очередного года: 31 день в январе +<br />
+ 23 дня в феврале. Причем при решении этим способом<br />
не важно, високосный год или нет. А при решении<br />
методом заполнения календаря (с использованием<br />
массивов) требуется знать, високосный год или<br />
нет. 2100 год високосным не является.<br />
Таким образом, задача разбивается на следующие<br />
блоки:<br />
1) определение дня недели 54-го дня очередного<br />
года;<br />
2) определение дня недели 1 января очередного<br />
года;<br />
3) выполнение первых двух пунктов для всех годов<br />
XX столетия.<br />
Сложность вызывает использование операции<br />
mod в формулах для определения дня недели 23<br />
февраля и дня недели 1 января следующего года.<br />
Для отладки программы мы предлагаем школьникам<br />
протестировать ее на годах от 2001-го до 2012-го.<br />
Ожидаемый правильный результат они могут получить<br />
опять же по календарю в своих мобильных телефонах.<br />
Для удобства чтения программы в операторе<br />
цикла по годам XXI столетия переменная цикла изменяется<br />
от 2001 до 2100 (можно и от 1 до 100). Для тестирования<br />
программы в тело цикла вставлена промежуточная<br />
отладочная печать.<br />
var year, k, febr_23, first: integer;<br />
begin<br />
first := 1;<br />
k := 0;<br />
for year := 2001 to 2012 do<br />
begin<br />
febr_23 := (first + (53 mod 7)) mod 7;<br />
if febr_23 = 0 then k := k + 1;<br />
writeln(year:6, first:3, febr_23:3);<br />
if year mod 4 = 0 then<br />
first := (first + (366 mod 7)) mod 7<br />
else first := (first + (365 mod 7)) mod 7<br />
end;<br />
writeln(k);<br />
readln<br />
end.<br />
Формулу febr_23 := (first + (53 mod 7))<br />
mod 7 можно переписать в виде<br />
febr_23 := (first + 4) mod 7,<br />
так как (53 mod 7) — это день недели, на который<br />
при ходится 23 февраля, если 1 января — понедельник.<br />
Замечание 4. Задачи 5–8 аналогичны задачам 3 и 4, но<br />
чуть сложнее.<br />
Замечание 5. После решения задач 3–6 без использования<br />
массива можно вернуться к Задаче 1 и решить ее<br />
также без использования последовательного заполнения<br />
электронного календаря.<br />
Замечание 6. Даже если школьнику тяжело решить задачи<br />
подобного типа без использования массива, способ<br />
последовательного заполнения электронного календаря<br />
вполне приемлем:<br />
• во-первых, школьник в принципе решает данную задачу<br />
(что немаловажно);<br />
• во-вторых, ему понятен алгоритм, который близок к<br />
алгоритму решения этой задачи “вручную”;<br />
• в-третьих, школьник осваивает работу с массивами;<br />
• в-четвертых, задачи типа 1–8 формируют у школьников<br />
умение выполнять декомпозицию задач, выбирать подходящую<br />
структуру данных, правильно использовать операцию<br />
mod, выполнять простейшие операции с массивами;<br />
• и, наконец, на основе этих задач можно придумать<br />
другие интересные задачи.<br />
27<br />
май 2012 / ИНФОРМАТИКА