должны ли мы преподавать указатели в курсе “основы программирования”?

StackOverflow https://stackoverflow.com/questions/660538

  •  20-08-2019
  •  | 
  •  

Вопрос

Следующей осенью я буду преподавать курс по основам программирования на первом курсе информатики.Каковы плюсы и минусы преподавания указателей в таком курсе?(Моя позиция:их нужно учить).

Редактировать: Моя проблема с аргументом "обслужи свою аудиторию" заключается в том, что в первые пару лет обучения в университете мы (профессора) не знаем, хотели бы студенты быть учеными или нет...мы хотели бы знать, но мы должны найти баланс между теми, кто останется в школе (4 года ученого не делают), и теми, кто станет инженерами.

Окончательное решение: По крайней мере, ссылки, но, возможно, указатели без арифметики указателей.

Это было полезно?

Решение

По крайней мере, вы должны преподавать ссылки или какую -то эквивалентную концепцию. Я думаю, что вы, вероятно, должны успокоиться в таких вещах, как арифметика указателя, C -массивы и струны, но косвное направление является очень важной концепцией в информатике, и студенты должны быть введены в это.

Другие советы

Да.

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

Как только вы немного поймете о том, как распределяется память, и как она решается и манипулируется указателями, объяснение многих других конструкций становится легче. Например, объяснение NullPointerException В Java или даже концепции ссылок на таких языках - это игра для детей, если у вас есть кто -то, кто понимает указатели в C (и, что еще лучше, если они также ссылаются на Grok в C ++).

Абсолютно научите их. Понимание косвенности имеет важное значение для программирования, будь то с указателями, ссылками, динамическим привязкой или любым количеством других вещей. Теперь, очевидно, не начинаются с них, но понимание косвенности, по крайней мере, так же важно, как и идеи управления потоком управления.

Конечно, некоторые люди просто не получат его и будут делать плохо или бросить. Если это курс для людей, которые хотят быть специальностями CS, не потеете, потому что вы просто даете им стимул переключать майоры раньше, чем позже. Если это больше или общий курс ED для людей, которые как -то заинтересованы в программировании, то, вероятно, они все еще должны быть представлены, но не оценены резко или сильно.

В течение моего первого года обучения в качестве студента CS я осенью прошел курс Java, который был общим вступлением. Профессор не преподавал указатели напрямую, но он преподавал концепцию ссылок и почему вы можете изменять объекты, а не примитивах, когда они передаются в аргументе.

Во время моего второго семестра я прошел следующий курс в серии, который был о C, и этот класс сильно полагался на указатели.

Для вступления в класс программирования я бы сказал, просто упомянули ссылки, но не указаны напрямую.

Я думаю, что курс «Основы программирования» должен, по крайней мере, затронуть базовую архитектуру процессора и язык сборки, и если это так, вы не можете по -настоящему привести к тому, чтобы не обсудить указатели. Если вы преподаете только языки более высокого уровня (байто-код), то, я думаю, указатели путают аудиторию.

Плюсы:четкое понимание того, как память используется машиной, разница между указателями на данные в куче (и подводными камнями) иуказатели на данные в стеке, передача методов по адресу и т.д.

Минусы:сложный для аудитории, которая еще не разбирается (или у нее не было достаточно времени, чтобы усвоить концепции) в компьютерной архитектуре, включая то, что такое стек, что такое регистры, соглашения о вызовах и т.д.

Итак, подведем итог, это во многом зависит от вашей аудитории и от языка (ов), которым вы будете заниматься (указатели будут бессмысленными в контексте LISP или Java), а также о том, насколько глубоко вы готовы идти в направлении того, что такое куча, что такое стек, как область видимости преобразуется в стек (т. е.почему никогда не возвращать указатель на локальную переменную) и т.д.

Когда я преподавал указатели на уроках инженерии, я в конечном итоге запустил отладчик простой программы "hello world" и показал студентам реальный машинный код, значения регистров и соответствующие дампы памяти, манипуляции со стеком, передачу параметров и т.д., Но они были к этому готовы.Будет ли ваша аудитория восприимчива к такой детальной проработке, чтобы обеспечить четкое понимание того, что происходит за кулисами, и будет ли ты быть готовым зайти так далеко?:)

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

Хорошим примером является последняя книга Stroustrup: Программирование - принципы и практика с использованием C ++ Где он учит, как сделать анализатор, использование ввода/вывода (потоки) и использование графического интерфейса, прежде чем даже говорить о указателях!

Я думаю, что это будет хорошим ссылком для обучения, потому что более естественно понимать, как мы создаем идеи, а не в том, сколько ограничений (например, управление памятью) мы должны в то же время обрабатывать, чтобы заставить программное обеспечение. Я действительно рекомендую вам эту книгу, чтобы иметь новый взгляд на обучение основам программирования.

Это действительно зависит от цели вашего курса - преподавание программирования и преподавания информатики - это две отдельные цели, и хотя они не являются взаимоисключающими, вводные классы, как правило, не преподают одинаково хорошо. Вот пример разницы: скажем, мы хотим научиться сортировать список. Курс программирования в C ++ научит вас использовать синтаксис шаблона функции STD :: Sort, и домашнее задание может писать несколько функторов сравнения. Курс компьютерных наук объяснит вам, что такое слияние, как алгоритм выглядит в псевдокоде, и его характеристики производительности/пространства, и домашнее задание будет писать саму функцию сортировки.

Так что, если вы преподаете вводное программирование, то да, вы должны научить своих учеников указателям.

Если вы преподаете информатику, то нет, нет необходимости понимать указатели на вступительном уровне.

Любой, кто называет себя хорошим программистом, должен знать, как работают указатели; Быть хорошим программистом подразумевает, что они не знают только ни одного языка программирования, но они знают, как работают языки программирования в целом, что позволяет им адаптироваться к языкам программирования, которых они раньше не видели.

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

  • Если ваша цель состоит в том, чтобы дать этим людям полное, хорошо округлое знакомство с языками программирования в целом, то указатели да будут частью этого.
  • Если ваш способ познакомить их с программированием - сначала использовать один язык программирования, с намерением охватить другие языки на последующих курсах, и указатели не имеют отношения к этому языку, тогда нет необходимости говорить о указателях.

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

Мой первый вводный курс программирования использовал Haskell. Только когда был введен последующий курс, использующий C (я был введен (я уже был хорошим программистом C и C ++, когда я прошел курс; эти субъекты были обязательными).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top