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.

МЕТОДИКА<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;

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

Saved successfully!

Ooh no, something went wrong!