Основные понятия программирования/алгоритмические концепции

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

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

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

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

Ответы

Ответ 1

Сделать забавное программирование!

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

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

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

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

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

  • Стеки
  • Очередь
  • Словари
  • Деревья
  • Etc

Большинство проблем заданы в С++.

В конечном итоге они переходят на более сложные проблемы, связанные с использованием Graph Traversal и популярных алгоритмов Graph (Dijkstra и т.д.), проблемы комбината и т.д. Каждая проблема это весело и дано в небольшом "рассказном" формате. Будьте осторожны, хотя некоторые из них очень сложны!

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

Ответ 2

Ломать вниз

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

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

filterItemsByCriteria();

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

(Примечание: я не знаю С++, так что это всего лишь общий пример)

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Привет!

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Сделайте бумажные инструкции.

Ответ 8

  • Объясните историю "Жареные яйца". Спросите слух, что они сделают, чтобы сделать себя яичницей. Заставьте их обратить внимание на шаг, о котором они думают. Вероятно, вы получите алгоритм менее 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. После того, как слух знаком со структурированным программированием (это может занять несколько недель или месяцев, в зависимости от того, как часто вы делаете уроки), вы можете перейти на С++ и OOP.

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

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

Ответ 14

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

Существует отличная книга "Как не программировать на С++", которую вы можете использовать для начала.

Ты всегда учишься лучше всего от ошибок, и я предпочитаю учиться у кого-то другого.

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

Ответ 15

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

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

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

Синтаксис для включения: назначение, операция, если /then/else, для цикла, while loop, select, input/output

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

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

Третий урок: более сложные темы алгоритма

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

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

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

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

Ответ 16

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

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

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

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

Ответ 17

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

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

Ответ 18

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

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

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

Ответ 19

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

Ответ 20

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

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

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

Ответ 21

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

Ответ 22

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

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

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

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

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

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

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

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

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

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

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