Очередная конкретная история.
Вчера попросили позаниматься к сессии с человеком, который учится на первом курсе МЭСИ "Прикладная информатика в менеджменте".
Сегодня было первое занятие (оно же в силу обстоятельств и последнее). Человек оказался умным, всё "рубящим на лету", в хорошем ладу с математикой.
Касательно программирования я сразу извлёк из него следующие данные:
Чему учили? - "Паскалю". Как учили? - "Рассказали всё до массивов и давали много примеров. Нужно подготовиться к решению таких примеров на экзамене, на бумажке". Кто учил? - "У, матёрый такой, знаток, он аспирантуру МГУ закончил...".
Ладно, говорю, некоторую базу я тебе дам на втором занятии, а сейчас попробуем начать от твоих примеров. И поехали мы...
"Примеры" - это презентация с некоторым количеством разобранных задач (то, что было на парах) и уйма аналогичных для сам. решения.
ВСЕ задачи сугубо одного характера: "Дана матрица (m, n)... Исключить все строки и столбцов, в которых... OR Посчитать число строк и столбцов, в которых.... Обработку матрицы оформить в виде процедуры, вводящей-выводящей данные только через свои параметры". То ли алгоритмизация в прикладных задачах ассоциируется у людей исключительно с "матрицедроблением"...
Смотрим разбор решений. Сразу до боли знакомые вложенные for с break. "Да, нам советуют так, и мне самому break нравится, изящный такой оператор". Памятуя об ограниченности времени и конкретной задаче здачи экзамена сначала разбираю с ним логику данных решений пары задач, после чего "а... дошло...". Пробуем решить то же сами декомпозицией и пошаговым уточнением. Постоянно порываемся вместо неспешного думания сорваться на "ну, тут строим for и потом ещё внутри...". Ну, да ладно.
Далее просит объяснить алгоритм определения простоты числа. "Не понимаю" - говорит. "И почему неравенства присваиваются типу Boolean - тоже". Вижу в презентации следуюший "чистейшей прелести чистейший образец":
Код:
procedure Prost (x: Word): Boolean;
var z: Word;
begin
Prost := x > 1;
for z := 2 to x div 2 do
if x div z = 0 then Prost := false
end;
Думая про себя "хоть бы, блин, break поставил уж тогда, оптимизатор хренов", говорю: "Нет, дорогой, без линейного поиска мы далеко не уедем". Объясняю саму схему и строим определитель простоты. "Ну да, тут всё ясно". Делаю упор на связь линейного поиска и полного прохода с кванторами существования и всеобщности и на то, что условия типа "все числа в строке простые" можно обращать на противоположный квантор "в строке не найдено составного числа". Принцип схватывается "с лёту".
Переходим к разбору очередной задачи. Дана всё та же матрица. Посчитать число пар симметричных диагоналей, параллельных главной, элементы которых равны между собой. Глядя на приводимое в презентации решение, медленно выпадаю в осадок по стулу. Сначала выполняется какая-то трансформация матрицы (без поллитры не разберёшь какая) - то ли поворот на 45 градусов
Только потом пишется здоровая процедура подсчёта, с несколькими последовательными for-for блоками. Видимо, задача приводилась к такому виду, чтобы было можно применить вложенные for
Написали быстренько решение строчек в 15, с линейным поиском в i-й паре диагоналей несовпадающих элементов (офрмленным в отдельную функцию ComplemDiags(i)) и полным проходом с подсчётом по парам диагоналей. Порадовались и разошлись
Ужос. Неужели даже в солидных ВУЗах подобные случаи ближе к всеобщности, а обратные - к существованию