связный список и подход к обучению программирования

Недавно помогал ребенку подготовиться к контрольной по программированию (школьному предмету; они учат C#). Главной темой были связные списки и работа с ними, что в данном случае было работой с классами типа Node, с методами Get/SetValue(), Get/SetNext().Я увидел, что с одной стороны ребенок вроде и понимает, что такое связный список, зачем может быть нужен, что с ним делать; но конкретные задачи из старых контрольных, что им выдали, решает с трудом или вообще не. В принципе понимает, что хочет сделать, но в код это переводится с трудом, без уверенности и с постоянными ошибками.Подумав немного, я решил не разбирать пока эти старые контрольные и их решения, а подтянуть основы. Сидя рядом, просил ребенка писать код НА БУМАГЕ, решающий очень простые задачи одну за другой. Немедленно обсуждали написанное, ошибки в нем, исправляли их и шли дальше. Задачи такие (во всех случаях предполагаем переменную list типа Node, указывающую на первый элемент списка, возможно равную null, если список пустой):- проверить, пустой ли список- проверить, есть ли в списке минимум 3 элемента- проверить, есть ли в списке ровно 3 элемента- проверить, верно ли, что второй элемент списока равен 4 (не забывать проверки существования элементов)- если третий элемент списка существует, изменить его значение на 12- если есть минимум 2 элемента, удалить второй- распечатать все элементы списка- проверить, есть ли в списке элемент со значением 5- если есть хотя бы один элемент, вставить новый элемент с значением 10 на второе место в списке- удалить все элементы, равные 5, предполагая, что первый не такой- то же самое, но без предположения, что первый не такой- найти все элементы в списке, равные 2, и для каждого такого, если следующий тоже 2, а предыдущий не 2, удалить этот следующий- найти элемент со значением 13, и если после него есть следующий, поменять их местами- найти минимальный элемент- вставить элемент на правильное место в отсортированном спискеМне кажется, это время, проведенное вместе за интенсивной проработкой основ, не было потрачено зря, и помогло укоренить правильные абстракции в голове.После того, как все эти задачи решаются без сложностей, без ошибок и практически без рассуждений, можно переходить к задачам типа "поменять порядок на обратный" или "найти и удалить все дубликаты в списке с помощью двух вложенных циклов". Не надо с них *начинать*, если основы не делаются быстро, правильно и без сомнений. А это произойдет, когда ментальные образы станут ясными и четкими и будут правильно отражать происходящее на удобном уровне абстракции. Начинающий программист часто не понимает, насколько важны эти ясность и четкость. В таком случае задача наставника - понять это и показать на живых примерах, как и почему они важны.

Мар 4, 2025 - 18:39
 0
связный список и подход к обучению программирования
Недавно помогал ребенку подготовиться к контрольной по программированию (школьному предмету; они учат C#). Главной темой были связные списки и работа с ними, что в данном случае было работой с классами типа Node, с методами Get/SetValue(), Get/SetNext().

Я увидел, что с одной стороны ребенок вроде и понимает, что такое связный список, зачем может быть нужен, что с ним делать; но конкретные задачи из старых контрольных, что им выдали, решает с трудом или вообще не. В принципе понимает, что хочет сделать, но в код это переводится с трудом, без уверенности и с постоянными ошибками.

Подумав немного, я решил не разбирать пока эти старые контрольные и их решения, а подтянуть основы. Сидя рядом, просил ребенка писать код НА БУМАГЕ, решающий очень простые задачи одну за другой. Немедленно обсуждали написанное, ошибки в нем, исправляли их и шли дальше. Задачи такие (во всех случаях предполагаем переменную list типа Node, указывающую на первый элемент списка, возможно равную null, если список пустой):

- проверить, пустой ли список
- проверить, есть ли в списке минимум 3 элемента
- проверить, есть ли в списке ровно 3 элемента
- проверить, верно ли, что второй элемент списока равен 4 (не забывать проверки существования элементов)
- если третий элемент списка существует, изменить его значение на 12
- если есть минимум 2 элемента, удалить второй
- распечатать все элементы списка
- проверить, есть ли в списке элемент со значением 5
- если есть хотя бы один элемент, вставить новый элемент с значением 10 на второе место в списке
- удалить все элементы, равные 5, предполагая, что первый не такой
- то же самое, но без предположения, что первый не такой
- найти все элементы в списке, равные 2, и для каждого такого, если следующий тоже 2, а предыдущий не 2, удалить этот следующий
- найти элемент со значением 13, и если после него есть следующий, поменять их местами
- найти минимальный элемент
- вставить элемент на правильное место в отсортированном списке

Мне кажется, это время, проведенное вместе за интенсивной проработкой основ, не было потрачено зря, и помогло укоренить правильные абстракции в голове.

После того, как все эти задачи решаются без сложностей, без ошибок и практически без рассуждений, можно переходить к задачам типа "поменять порядок на обратный" или "найти и удалить все дубликаты в списке с помощью двух вложенных циклов". Не надо с них *начинать*, если основы не делаются быстро, правильно и без сомнений. А это произойдет, когда ментальные образы станут ясными и четкими и будут правильно отражать происходящее на удобном уровне абстракции. Начинающий программист часто не понимает, насколько важны эти ясность и четкость. В таком случае задача наставника - понять это и показать на живых примерах, как и почему они важны.