ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
МЕТОДИКА<br />
26<br />
май 2012 / ИНФОРМАТИКА<br />
Очевидно, что в окончательном варианте программы<br />
пункта 4 не будет. Он нужен исключительно<br />
для проверки правильного заполнения массива<br />
days. Начинаем программировать пункты 2–4.<br />
Часто школьники задают такой вопрос: “Зачем<br />
заполнять весь массив, если нам нужно проанализировать<br />
только 13-е число?” Ответ на вопрос: “Мы<br />
решили реализовывать алгоритм последовательного<br />
заполнения “листов календаря”. Если мы не<br />
заполним день недели последнего дня месяца, то<br />
не сможем определить день недели первого числа<br />
следующего месяца. Конечно, можно реализовать<br />
и другой алгоритм, но мы выбрали этот”.<br />
В программе используется операция mod. Но ее<br />
использование здесь естественно и не вызывает<br />
воп росов.<br />
Правильно работающая программа у большинства<br />
школьников имеет примерно такой вид:<br />
const n = 31;<br />
var days: array[1..n] of integer;<br />
i, k, p, first, md: integer;<br />
begin<br />
first := 7;<br />
for i := 1 to 12 do<br />
begin<br />
case i of<br />
1, 3, 5, 7, 8, 10, 12: md := 31;<br />
2: md := 29;<br />
4, 6, 9, 11: md := 30<br />
end;<br />
p := first;<br />
for k := 1 to md do<br />
begin<br />
days[k] := p;<br />
p := (p + 1) mod 7;<br />
{if p = 0 then p := 7}<br />
end;<br />
first := p;<br />
for k := 1 to md do write(days[k]:2);<br />
writeln;<br />
end;<br />
end.<br />
В программе использованы следующие переменные:<br />
first — день недели, на который приходится первое<br />
число текущего месяца;<br />
md — количество дней в текущем месяце;<br />
p — день недели, на который приходится очередной<br />
(k-й день) текущего месяца.<br />
Многие школьники не вставляют во вложенный<br />
оператор цикла условный оператор if (в тексте программы<br />
он заключен в комментарий). И действительно,<br />
не важно, какой цифрой мы будем отмечать<br />
воскресенье — нулем или семеркой.<br />
Замечание 2. Мы предлагаем школьникам и другой<br />
способ определения количества дней в месяце: через<br />
типизированное описание массива в блоке const. Для<br />
этого потребуется еще один массив m[1..12]. Элемент<br />
m[k] хранит число дней в k-м месяце. При использовании<br />
типизированных массивов программа выглядит короче<br />
(изящ нее). Но школьники при программировании<br />
часто забывают о такой возможности языка, и, кроме<br />
того, ребят, программирующих первый год, “смущает”<br />
следующее построение оператора цикла, которое будет<br />
использоваться в программе:<br />
for k := 1 to m[i] do (где m[i] — количество<br />
дней в текущем месяце).<br />
Но, как известно, научиться кататься на велосипеде<br />
можно только катаясь на нем.<br />
Замечание 3. Некоторые школьники для определения<br />
числа месяцев в году используют массив m[1..12] и 12<br />
операторов присваивания:<br />
m[1] := 31;<br />
m[2] := 29;<br />
…<br />
m[12] := 31;<br />
Такой способ написания программы мы называем<br />
“способом COPY-PASTE”. Программы, написанные<br />
с использованием метода COPY-PASTE, мы<br />
не принимаем к проверке и просим переделать с<br />
использованием оператора case или типизированного<br />
описания массива. Конечно, сложность<br />
алгоритма будет одна и та же, но все школьные<br />
задачи — учебные, на каждой задаче школьники<br />
отрабатывают не только способность к написанию<br />
алгоритма, но и умение использовать все<br />
возможности языка.<br />
Ниже приведен текст программы с типизированным<br />
описанием массива, который предлагается<br />
школьникам к обсуждению:<br />
const n = 31;<br />
m: array[1..12] of integer = (31,29,31,<br />
30,31,30,31,31,30,31,30,31);<br />
var days: array[1..n] of integer;<br />
i, k, p, first: integer;<br />
begin<br />
first := 7;<br />
for i := 1 to 12 do<br />
begin<br />
p := first;<br />
for k := 1 to m[i] do<br />
begin<br />
days[k] := p;<br />
p := (p + 1) mod 7;<br />
end;<br />
first := p;<br />
for k := 1 to m[i] do<br />
write(days[k]:2);<br />
writeln;<br />
end;<br />
end.<br />
Далее написание программы, решающей всю<br />
задачу целиком, не составляет труда. Правильно<br />
написанная программа должна вывести число 3.<br />
Причем школьники легко проверяют правильность<br />
своей программы: у всех ребят в мобильных телефонах<br />
есть календарь!<br />
const n = 31;<br />
m:array[1..12] of integer = (31,29,<br />
31,30,31,30,31,31,30,31,30,31);<br />
var days: array[1..n] of integer;<br />
i, k, p, black, first: integer;<br />
begin<br />
black := 0;<br />
first := 7;<br />
for i := 1 to 12 do<br />
begin<br />
p := first;<br />
for k := 1 to m[i] do<br />
begin<br />
days[k] := p;<br />
p := (p + 1) mod 7;<br />
end;<br />
first := p;