03.11.2014 Views

Выпуск 5 - Российский государственный профессионально ...

Выпуск 5 - Российский государственный профессионально ...

Выпуск 5 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

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 / ИНФОРМАТИКА

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!