Базовые концепции программирования / алгоритмики [закрыты]

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

Вопрос

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

Как вы думаете, на каких самых основных концепциях мне следует сосредоточиться?

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

Редактировать: Я заметил, что, вероятно, главное различие между программистами и новичками заключается в "способе мышления программиста" - я имею в виду концептуализацию проблем как, ну, вы знаете, алгоритмов.Я знаю, что это всего лишь вопрос практики, но знаете ли вы какие-нибудь упражнения / концепции / вещи, которые могли бы стимулировать развитие в этой области?

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

Решение

Сделайте программирование увлекательным!

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

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

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

Что касается актуальных тем для обсуждения, связанных с программированием / алгоритмами, я бы предложил в качестве группы попробовать некоторые из этих задач программирования в этом учебном пособии по программированию "Проблемы программирования": Ссылка на Amazon

Они начинаются с довольно простых задач программирования и постепенно переходят к задачам, требующим различных структур данных, таких как:

  • Стопки
  • Очереди
  • Словари
  • Деревья
  • И Т.д.

Большинство задач заданы на C ++.

В конце концов они переходят к более сложным задачам, включающим обход графа и популярные графовые алгоритмы (Дийкстра, и т.д.), Задачи комбинаторики и т.д.Каждая задача увлекательна и изложена в формате небольшой "истории".Однако имейте в виду, что некоторые из них очень сложны!

Редактировать:Пицца и газировка тоже никогда не повредят, когда дело доходит до привлечения людей на собрания вашего клуба.В нашем ACM club на каждой встрече (раз в месяц) подают пиццу.Несмотря на то, что большинство из нас все равно пришли бы, это хороший ледокол.Особенно для новых клубов или членов.

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

Разбиваем его

Для меня уникальность программирования заключается в необходимости разбивать задачи на достаточно маленькие шаги для компьютера . Это зависит от языка, но тот факт, что вам, возможно, придется написать «для цикла» просто считать до 100 дублей, чтобы привыкнуть.

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

filterItemsByCriteria();

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

(Примечание: я не знаю C ++, так что это просто общий пример)

filterItemsByCritera() {
  makeCriteriaList();
  lookAtItems();
  removeNonMatchingItems();
}

Затем вы разбиваете каждого из них дальше. Довольно скоро вы сможете определить все маленькие шаги, необходимые для составления списка критериев и т. Д. Когда все маленькие функции сработают, большая из них будет работать.

Это похоже на игру, в которую играют дети, когда они продолжают спрашивать "почему?" после всего, что вы говорите, за исключением того, что вы должны продолжать спрашивать "как?"

Связанные списки - классический вопрос для интервью, и на то есть веские причины.

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

Приветствую вас!

Я думаю, вы начинаете понимать СПОСОБ опережайте себя в овладении конкретным языком и работе над конкретными темами и учебной программой..Похоже, вы (и некоторые из респондентов) путаете "консультирование клуба программирования" с "руководством классом программирования".Это очень разные вещи.

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

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

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

Удачи и отличной работы!

Ну, это клуб программирования, так что это должно быть весело! Так что я бы сразу сказал окунуться в опыт. Начните с объяснения, что такое метод main (), затем попросите студентов написать программу Hello World. Постепенно улучшайте программу hello world, чтобы она имела функции и выводила пользовательский ввод.

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

Кто-то упомянул выше: "сделайте программирование увлекательным".Интересно, что сегодня люди учатся не ради того, чтобы учиться.Большинство людей хотят мгновенное удовлетворение.

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

  • Попросите их создать программу, которая угадывает число от 0 до 100.
  • Пусть они сделают клон блэкджека ...Я сделал это на базовом :-(

Составьте инструкции на бумаге.

<Ол>
  • Объясните "яичница" история. Спросите у аудитории, что они будут делать, чтобы приготовить себе яичницу. Сделайте, чтобы они отметили шаг, о котором они думают. Вероятно, вы получите менее 5 шагов алгоритма. Затем объясните им, сколько шагов нужно записать, если мы хотим научить компьютер жарить яйца. Что-то вроде:
  • 1) Go to the Fridge 
    2) Open the fridge door 
    3) Search for eggs 
    4) If there are no eggs - go to the shop to buy eggs ( this is another function ;) ) 
    5) If there are eggs - calculate how many do you need to fry 
    6) Close the fridge door 
    7) e.t.c. :)
    
    1. Начните с основ семантики синтаксиса C e.t.c и параллельно с этим объясните самые базовые алгоритмы, такие как пузырьковая сортировка.
    2. После того, как аудитория ознакомится со структурным программированием (это может занять несколько недель или месяцев, в зависимости от того, как часто вы проводите уроки), вы можете перейти на C ++ и ООП.

    Содержание в программировании Deitel & Deitel на C ++ - это достойное введение, а упражнения, предложенные в конце каждой главы, - отличные игрушечные задачи.

    По сути, вы говорите о: - контрольные структуры - функции - массивы - указатели и строки

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

    Начните с того, чтобы они поняли проблему, например, сортировку. Это очень просто, и они должны быть в состоянии общаться довольно быстро. Как только они увидят проблему, предоставьте им инструменты / решения для ее решения.

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

    начните с простого "Привет, мир!" программа. Это вводит основы, такие как переменные, запись в поток и поток программы.

    Затем добавьте сложность (связанные списки, файл io, получение пользовательского ввода и т. д.).

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

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

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

    Есть отличная книга "Как не программировать на C ++", с которой можно начать.

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

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

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

    Первый урок: терминология и синтаксис

    Терминология для охвата: переменная, оператор, цикл (итерация), метод, зарезервированное слово, тип данных, класс

    Синтаксис для покрытия: назначение, операция, если / затем / еще, для цикла, в то время как цикл, выбор, ввод / вывод

    Второй урок: создание базового алгоритма

    Охватите несколько простых алгоритмов, включающих некоторый ввод, может быть цикл for или while.

    Третий урок: более продвинутые темы алгоритмов

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

    Заключительный урок: групповой проект

    Создайте проект, в котором могут участвовать группы.

    Это не должны быть однодневные уроки. Вы можете распределить темы по нескольким дням.

    Псевдокод должен быть самым первым.

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

    Спасибо за ваши ответы!

    А как бы вы научили их актуальному решению проблем?

    Я знаю группу студентов, которые знают синтаксис C ++ и несколько базовых алгоритмов, но они не могут применить знания, которые они знают, когда они решают реальные проблемы - они не знают подхода, способа перевести свои мысли в набор строгих шагов. Я говорю не о «высокоуровневых» подходах, таких как динамическое программирование, жадность и т. Д., Но о базовом алгоритмическом мышлении.

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

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

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

    Ух ты.C ++ - один из худших возможных языков для начала, с точки зрения количества несвязанного дерьма, которое вам нужно, чтобы заставить что-либо работать (Java, я думаю, была бы немного хуже).

    При обучении новичков в среде с большим количеством шаблонов обычно начинают с "вот простая программа на языке Си.Мы обсудим, для чего нужна вся эта чушь в верхней части файла позже, а пока сосредоточьтесь на строках между 'int main(void)' и оператором 'return', где выполняется вся полезная работа ".

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

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

    Что касается языка выбора - поздравляю - вы обнаружите, что C ++ очень богат, заставляя вас думать о математических сочетаниях клавиш и миллионах способов заставить ваш код работать еще лучше (или реализовать причудливые шаблоны).

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

    Элегантность появилась после изучения шаблонов и реальных алгоритмов.

    Хэнк: Большой О ??? Вы хотите сказать начинающим программистам, что их код имеет O (n ^ 2), а ваш - n log n ??

    Я мог бы увидеть несколько разных способов сделать это:

    1) Базовые блоки программирования. Что такое условные заявления, например переключиться и если / еще? Что такое заявления о повторении, например, для и в то время как петли? Как мы можем объединить их, чтобы получить последовательность шагов, которую мы хотим? Вы можете сделать что-нибудь так же просто, как сложить счет за продукт или преобразовать температуру или расстояние от метрической до имперской или наоборот. Каковы основные типы переменных, такие как строка, целое число или двойная? Также здесь вы можете использовать булеву алгебру для продвинутой идеи или, возможно, научить делать арифметику в основаниях 2 или 16, что некоторым людям может быть легко, а другим - трудно.

    2) Алгоритмически, каковы аналогичные строительные блоки. Сортировка - довольно простая тема, которую можно широко обсудить и проанализировать, чтобы попытаться выяснить, как сделать это быстрее, чем просто поменять местами элементы, которые кажутся неупорядоченными, если вы изучите Bubblesort, который является самым мертвым способом сделать это.

    3) Компиляция и выполнение элементов. Что такое стек вызовов? Что такое куча? Как обрабатывается память для запуска программы, например, фрагменты кода и фрагменты данных? Как мы открываем и манипулируем файлами? Что такое компиляция и компоновка? Что такое файлы make? Часть этого проста, но она также может открыть глаза на то, как работают вещи, что может быть тем, что клуб освещает большую часть времени.

    Следующие 2 несколько более сложные, но могут быть веселыми:

    4) Обсудить различные идеи, лежащие в основе алгоритмов, такие как: 1) разделяй и властвуй, 2) динамическое программирование, 3) грубая сила, 4) создание структуры данных, 5) сведение проблемы к аналогичной, уже решенной, например, Числа Фибоначчи - это классическая рекурсивная проблема для начинающих программистов, и 6) идея «жадности»; как в примере с внесением изменений, если вы были в стране, где номиналы монет были a, b и c. Вы также можете получить некоторые примеры из теории графов, такие как связующее дерево с минимальным весом, если вы хотите что-то экзотическое, или коммивояжеры, которые могут быть легко описать, но решить их непросто.

    5) Математические функции. Как бы вы запрограммировали факториал, который является произведением всех чисел от 1 до n? Как бы вы вычислили суммы различных арифметических или геометрических рядов? Или вычислить количество комбинаций или перестановок r элементов из набора n? Учитывая набор точек, аппроксимируйте полином, который удовлетворяет этому требованию, например, в двумерной плоскости, называемой x и y, вы могли бы дать 2 точки и попросить людей выяснить, что такое уклон и y перехватить, если вы уже решили пары линейных уравнений.

    6) Списки, которые могут быть реализованы с использованием связанных списков и массивов. Что лучше для разных случаев? Как реализовать основные функции, такие как вставка, удаление, поиск и сортировка?

    7) Абстрактные структуры данных. Что такое стеки и очереди? Как вы строите и тестируете классы?

    8) Указатели. Это просто приводит к огромному количеству тем, таких как, как выделить / отменить выделение памяти, что такое утечка памяти?

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

    scroll top