Преподавание С ++ ученикам старших классов: где провести черту?

35

Я буду наставником команды старшеклассников для ПЕРВОГО соревнования по робототехнике, большинство команд здесь разрабатывают [свое программное обеспечение для роботов с использованием C ++. Для многих студентов в команде это будет их первое знакомство с программированием. Я бы не выбрал C ++ для обучения программированию старшеклассников (например, Python или Javascript было бы проще, я думаю), но выбор установлен.

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

  • Должен ли я начать использовать STL с первого дня, особенно vectorили просто придерживаться стандартных массивов? Массивы проще вводить, но ошибки указателя могут быть сложнее уловить.
  • Что касается ввода / вывода, следует ли мне придерживаться и coutт. Д. Или, как вы думаете printf, будет легче учиться?
  • Существуют ли онлайн-ресурсы для C ++, подходящие для таких юных учеников?

Благодарность!

РЕДАКТИРОВАТЬ : Спасибо за так много отличных ответов. В дополнение к Ускоренному C ++ , который предлагается многими людьми, я обнаружил, что C ++ For Everyone - отличный текст.

возврат
источник
52
О Боже, пожалуйста, не учите никого javascript как первый язык!
SoapBox
26
@SoapBox: в отличие от чего? Я думаю, что Javascript потрясающий как первый язык. Вы можете делать интересные вещи с помощью нескольких строк кода, нет никаких компиляторов запуска обучения и IDE и т. Д., Его легко тестировать и отлаживать, и он поддерживает как ОО, так и функциональное программирование. Что может быть лучше?
Кевин Клайн
7
Почему вы говорите, что массивы проще вводить? Я думаю, что векторы для новичков гораздо более интуитивны, так как вам не нужно думать о указателях или о чем-то таком сложном.
Кейси Паттон
19
Если вы учите C ++ ученикам старших классов, значит, вы уже переступили черту.
Тайлер
7
Альтернативой обучению C ++ не является COBOL.
Джоккинг

Ответы:

40

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

Причина в том, что вы можете научить людей понимать массивы, не понимая ничего другого, кроме переменных и базовой компьютерной архитектуры, но вы не можете научить их понимать, vectorне обучая их сначала классам. Если вы используете STL с самого начала, ваши студенты должны будут просто жить, не имея понятия о том, как vectorименно работает. И затем, когда вы дойдете до этого момента, они не будут достаточно хорошо разбираться в указателях и массивах и вещах, которые вы получаете от выполнения таких вещей, как написание собственного векторного класса, написание собственного класса связанного списка и т. Д., Что будет необходимо ценить и использовать его возможности. Меня раздражает, когда студенты говорят: «Что это?» и учителя говорят: «Просто игнорируй это, ты узнаешь это позже».

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

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

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

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

Что касается книг для обучения начинающих, см. Основной список хороших книг по С ++ .

Seth Carnegie
источник
4
На самом деле я придерживался того же мнения, но посмотрел на книгу Strousrup's Teaching C ++ ( stroustrup.com/Programming ), и он явно выступает за использование vectorover-массивов. Я разрываюсь.
взаимное исключение
4
@recipriversexclusion: Просто констатирую очевидное, но мистер Страуструп далек от старшеклассника;)
Демиан Брехт
14
О, МОЙ БОГ. Как кто-то может подумать, что ручное манипулирование динамически размещаемыми массивами может быть «самым простым» путем к C ++, когда есть std::stringи std::vector?! Это программисты на 32 C? Я преподаю C ++ в течение десятилетия начинающим программистам, студентам, у которых был год Java, и профессионалам программирования. Я пользуюсь std::stringи std::vectorс первого дня. Они просты в использовании, независимо от того, что их внутренности. (Вы не уклонитесь от преподавания струны В.Б., потому что она слишком сложна изнутри?)
sbi
18
Вот твой отрицательный голос. Вам не нужно учиться строить дом, чтобы наслаждаться преимуществами жизни в доме. Вы не должны быть в состоянии написать, std::vectorчтобы быть в состоянии использовать это. И классы являются чрезвычайно базовой частью C ++. Что не является основным, так это отладка всех тех ошибок, которые они получат, используя собственные массивы и указатели.
DeadMG
6
@DeadMG: метафора дома не работает. В доме, когда фундамент построен, вам никогда не придется думать об этом снова. Вы просто продолжаете строить все остальное. В C ++, то мгновенные вы видите newключевое слово, вы обратно в управлении памятью terrirory. И часто библиотеки запрашивают указатели, и вы должны спросить себя: «Это собирается вступить во владение? Или мне все еще нужно его почистить?». Основание моей ноги. Больше похоже на гвоздь или конопатить что-нибудь.
Крис Эберле
38

Это мой собственный опыт. Возьми это за то, что оно того стоит.

Оглядываясь назад, когда я начал программировать, я действительно хотел бы узнать о памяти в первую очередь . Нет, это не интересно. Это заставит вас застеклить. Но это смехотворно простая концепция для обучения. Просто покажите 1-D таблицу и заставьте их выполнить несколько умственных упражнений:

Урок 1:
это 10 байт памяти. Это буква «а», помещаемая в ячейку № 3. «а» - это значение, а 3 - это адрес. ОК? Это число 3, помещаемое в ячейку 5. Его значение равно 3, а его адрес равен 5. Теперь, что может означать число 3? Ну, это может быть просто число 3 или ссылка на адрес 3. Также как 1 может быть числом или кодом страны. Это просто число, все зависит от того, как мы к нему относимся.

Урок 2:
Давайте научимся считать в двоичном виде. Давайте посчитаем до 10 с помощью двоичного подсчета пальцев. Интересно нет? Видите, как нужно всего 4 пальца? Итак, мы говорим, что нужны только 4 бита (1/2 ячейки). На что вы можете рассчитывать с одной стороны (ответ 31). Как насчет двух рук (ответ 1023). Объясните, как больше бит означает более высокий диапазон номеров. Напомните им, что ячейка памяти составляет 8 бит. Спросите, что происходит, когда число требует более 8 бит. Как они поместили бы многобайтовое число в память (логическим способом)? Представьте их символам, шортам, целым и длинным.

Урок 3:
Вот программа, которую я написал на C ++. Он использует 32-битные целые числа. И это здесь тоже число. Но это число используется для указания. Используя эту маленькую звездочку, мы обещаем, что число будет использоваться для указания. И вот как мы указываем на первый номер. Маленький амперсанд заполняет ценность для нас. Аккуратно, а?

и так далее. Как только вы потеряли основную память, все остальное - торт. Это бедные студенты, которые предполагают, что компилятор делает что-то волшебное (или что им никогда не нужно думать об управлении памятью), которые имеют тенденцию бороться больше всего. И C ++ мутит воду, потому что некоторые вещи автоматически очищаются (то есть нормальный вектор), в то время как другие вещи не очищаются (то есть вектор выделяется с использованием «new»). И даже не заводите меня на строки (char * против std :: string - попробуйте объяснить это без знания указателя).

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

РЕДАКТИРОВАТЬ

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

Крис
источник
Это хороший ответ. Проблема, я думаю, в том, что вы можете научить этому, но многие дети (я был одним из тех, кто сначала боролся с понятиями указатель / память из-за отсутствия интереса) просто настроят это, потому что это не весело, даже если это необходимые знания успешно программировать на C ++.
Кейт Лэйн,
3
Да, здесь нет аргументов. По той же причине дети настраивают математику и географию. Только позже они понимают, что должны были обратить внимание. Уверен, что эта проблема еще не решена.
Крис Эберле
+1. Я помню, как сложил свое понимание того, как память работала довольно долго после того, как я познакомился с C ++. Однако я не думаю, что мог бы понять это заранее (ни в каком практическом смысле, как то, как представлены ценности).
Кэмерон
+1, это то, что я пытался сказать, но лучше. При обучении механиков они должны разбираться в двигателе, прежде чем заставлять их водить экспертов.
Сет Карнеги,
Да, я возвращаюсь к тому, могут ли новички понять это. Это НАСТОЛЬКО смехотворно легко (и вы вдруг обнаружите, что говорите «вау, компьютеры - это очень глупые машины, не так ли?»), Однако это требует от них, чтобы они обращали внимание и держались за обещание более захватывающих вещей. Непонимание «большой картины» делает общий подход немного тупым.
Крис Эберле
31

Должен ли я начать использовать STL с первого дня, особенно вектор или просто придерживаться стандартных массивов? Массивы проще вводить, но ошибки указателя могут быть сложнее уловить.

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

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

синтаксис std::vector(create / read / write) не намного сложнее, чем у массива C. по сравнению с этим ручное управление памятью и все распространенные ошибки, которые новые ученики делают с массивами Си, гораздо сложнее изучать, обучать и использовать.

Для ввода / вывода, я должен придерживаться cout и т. Д. Или вы думаете, что printf будет легче выучить?

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

на самом деле, я думаю, что вы должны прочитать Accelerated C ++, написанную Koenig и Moo, и, возможно, использовать его для обучения (косвенный ответ на вопрос 3). в книге, они вводят как std::coutраз передreturn (стр. 3) и сохраняют указатели и массивы до главы 10. Если бы я мог скопировать и вставить предисловие этой книги в качестве ответа на ваш вопрос, я бы сделал это. (примечание: я рекомендую вам прочитать его с точки зрения обучения с ++).

Изменить вот предисловие

Существуют ли онлайн-ресурсы для C ++, подходящие для таких юных учеников?

если вы не хотите использовать Accelerated C ++ (который предполагает некоторый опыт программирования в целом), то, возможно, вам понравится Eckel's Thinking in C ++ . Я не читал его, но это свободно распространяемый вводный текст C ++.

джастин
источник
1
+1 ... и я LOL хотел бы, чтобы «они представили std :: cout перед возвращением (стр. 3)», должен взглянуть на это :)
Феликс Домбек
1
@Felix и непосредственно перед std::coutвведением, вьющиеся фигурные скобки введены =) (это простое вскрытие вездесущего "Hello, World")
Джастин
1
Я от всего сердца рекомендую книгу Кенига и Му. Он нацелен на обучение как C ++, так и программированию. Мышление Брюса Экла в C ++ в первую очередь направлено на обучение C ++ тем, кто уже имел опыт работы с процедурным языком (таким как C или Basic).
Стивен С. Сталь
11

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

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

Поэтому я бы сделал упор на контроль. Начнем с основ: if, for, while. Попросите их много практиковаться. Заставь их хорошо знать это ....

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

  • Большой «основной» цикл, который вызывает все

  • Конечные автоматы (их много видно)

  • Сохранение предыдущих значений / счетчика хода (как для PID)

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

Кроме того, удачи! Надеюсь, что сезон пройдет хорошо.

Оуэн
источник
2
+1; это не обычная среда рабочего стола, а настоящий встроенный код. Конечные автоматы гораздо важнее, чем std :: vector против массивов.
MSalters
8
  • Должен ли я начать использовать STL с первого дня, особенно vectorили просто придерживаться стандартных массивов? Массивы проще вводить, но ошибки указателя могут быть сложнее уловить.

Проблема с массивами состоит в том, что для всего, кроме простых примеров из учебников, потребуются массивы динамического размера, и в тот момент, когда вам нужны массивы динамического размера, std::vectorгораздо проще. Кроме того, единственный способ безопасно обработать массивы динамического размера - это обернуть их в свой класс, что было бы плохим std::vectorплагиатом.
Вопреки необъяснимо распространенному мнению, студенты могут использовать функции, которые требуют реализации сложной механики, не зная, как реализовать таких зверей самостоятельно. Как я уже сказал в комментарии: вы даже не подумаете о том, чтобы не учить строки на других языках, просто потому, что их реализация сложна, не так ли?

  • Что касается ввода / вывода, следует ли мне придерживаться и coutт. Д. Или, как вы думаете printf, будет легче учиться?

Почему набор соглашений об устаревших форматных строках, которые заставляют вашу программу взорвать крышу в тот момент, когда вы получаете что-то не так (что происходит, когда вы меняете какой- typedefто, казалось бы, не связанный заголовок), предпочтительнее безопасности типов std::cout?

  • Существуют ли онлайн-ресурсы для C ++, подходящие для таких юных учеников?

Большинство ресурсов C ++, онлайн или нет, плохие. И я не говорю об использовании трудно читаемых шрифтов или языка. Я говорю о явно очевидных фактических ошибках. Хороших ресурсов C ++ очень мало, в основном одна или две дюжины книг . Единственное, что я знаю, это онлайн - « Размышление» Брюса Экеля на C ++ .


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

оборота сби
источник
7

Если вы хотите преподавать C ++, я бы начал непосредственно с конструкций C ++, таких как vector и cout, вместо подмножества C, таких как printf.

K-Балло
источник
7

Должен ли я начать использовать STL с первого дня ...?

Да. Использование собственных массивов в C ++ подвержено ошибкам и просто неэффективно в 99% случаев.

Для ввода / вывода, я должен придерживаться cout, и т.д ...?

Да.

Существуют ли онлайн-ресурсы для C ++, подходящие для таких юных учеников?

Они не так молоды. Обучение программированию не требует мудрости, просто мотивации и непредубежденности. Я не могу придумать ничего, чему бы обучали в последние два года в старшей школе, чтобы лучше подготовить ученика к обучению программированию. Вы смотрели на мышление Брюса Экеля в C ++ ? Он доступен для бесплатной загрузки и очень хорошо проверен. Пожалуйста, избегайте популярных, но ужасных C ++: Как программировать и всех книг Sam's Teach Yourself C ++ ....

Кевин Клайн
источник
5

Я преподавал C ++ в старшей школе как первый язык программирования, хотя это было больше похоже на "C +", теперь, когда вы упомянули об этом; мы использовали coutдля записи текста на консоль и файлы, но также довольно много функций Си ( getch()было моим любимым).

Я думаю, что наиболее эффективным (и, возможно, забавным) способом обучения основам является использование целенаправленной учебной программы: начните с показа, как выводить данные, затем ввод с клавиатуры, затем простой файловый ввод-вывод и т. Д. Переходите к простому текстовому вводу. основанная игра (или эквивалент робототехники). Затем, когда они спрашивают: «Как мне сделать X?», Вы можете разбить X на примеры, которые они уже видели, например: «Сначала вам нужно получить информацию от пользователя, как мы делали в Z, затем ... "(очевидно, на практике это не так просто, поскольку X, вероятно, потребует дополнительных знаний, например" 3D-графики ", но вы все равно можете объяснить, как это будет работать на высоком уровне путь).

Примеры, которые вы им показываете, начнутся с чёрного ящика, скопированного копией магии, тайны которого раскрываются, когда кусочки головоломки программирования постепенно выясняются. Например, ваши студенты ifдовольно быстро изучат основы s, но они, вероятно, не поймут, что булево выражение не ограничивается исключительно использованием в ifусловии (что приводит к классическому if (blah) return true; else return false;коду).

Тонкости выбора массива или вектора в качестве контейнера поначалу покажутся неуместными для студентов. Вектор / массив будет просто способом иметь множество переменных в качестве одной переменной, доступной через индекс. Придерживайтесь того, где вы можете. Указатели не будут поняты до позже тоже. Это не значит, что вы не должны объяснять вещи; только то, что вы не можете объяснить все сразу, и то, что вы объясняете, не будет полностью поглощено. Люди учатся органически, а не линейно. Я использовал coutпару лет, прежде чем правильно понял, что такое перегрузка оператора!

Ох, и не бойся повторений. «Это похоже на программу Hello World, которую мы сделали - помните, как мы записывали текст в консоль?» (нет ...) «Давайте снова пройдемся, чтобы убедиться». ... и задавайте вопросы! Держите студентов увлеченными веселыми примерами и большим количеством взаимодействия.

C ++ - сложный язык, и независимо от того, что вы делаете, значительная часть этой сложности (и мастерства программирования в целом) будет потеряна для ваших учеников. Все, что вы им покажете, будет для них новым; большая часть этого не будет погружена в глубокий уровень понимания (по крайней мере, не сразу). Как работает память, как взаимодействуют компоненты ПК, что такое стек и куча, указатели, классы, даже циклы и цепочки if-else не будут должным образом поняты большинством. Хорошо! Их не нужно понимать, чтобы их использовать - огромное количество классных программ может быть написано с помощью супер-уродливых 1000-строчных функций с пятикратным вложением избыточных ifs и 43 переменных, называемых такими вещами x_2r. Важно то, что студенты постоянно учатся и совершенствуются, Черные ящики хороши до тех пор, пока они становятся прозрачными (или, по крайней мере, полупрозрачными серыми) в долгосрочной перспективе. К концу курса они могут не знать, что такое шаблоны проектирования, но они должны иметь возможность оглянуться назад на программы, которые они написали в первые несколько недель, и съежиться в своем коде. Они должны понять на значительном уровне детализации, как на самом деле работает первая написанная ими программа (тогда как когда они писали это, они понятия не имели). Но они не будут знать все - пока .

Кэмерон
источник
5

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

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

Я думаю, что обучение их Си - лучший способ сделать это (он все равно будет почти всегда компилироваться в C ++, как вы знаете). Обучая их тому, что на самом деле представляет собой терминал, как их программа взаимодействует с ним, что строка - это массив символов, заканчивающийся \ 0 в памяти, что такое malloc и как C ++ абстрагирует его, как char и int хранятся в памяти и т. д. Это то, что заставляет кого-то действительно знать, как решить проблему, когда он сталкивается с ней в процессе разработки.

Я не могу подчеркнуть важность того, чтобы позволить детям программировать и быть там, в основном, чтобы отвечать на вопросы. По моему опыту, вы изучаете язык, используя его. Книги и уроки могут быть полезны и необходимы для начала, но в конце я скажу, дайте им файл C / C ++ и скажите: это пример X, я бы хотел, чтобы вы сделали Y (что можно сделать взломав Х). Покажите им, как использовать справочные страницы (если они используют * NIX), или покажите им cplusplus.com и дайте им возможность изучить библиотеки std, чтобы самостоятельно разобраться.

TL; DR Пусть дети учат сами. Будьте там, чтобы обеспечить структуру и ответить на вопросы.

Также: связанные списки - это правда!

Бобак Хашеми
источник
4

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

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

Если у вас есть библиотека C для использования или C-like с большим количеством указателей и C-массивов, то я думаю, вам понадобится способ научить их, как использовать ее или почему вы ее используете.

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

Возможно, вам следует прояснить разницу между C ++ низкого уровня (который напоминает C) и C ++ высокого уровня с STL. Одна из самых сложных вещей в C ++ для начинающих - это посмотреть, что такое C, что такое C ++ и каковы различные системные API.

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

Никко
источник
2

Я начал обучать студентов C ++ в конце прошлого года и этим летом также для нашей ПЕРВОЙ команды робототехники.

Мы используем Программирование Страуструпа - Принципы и практика использования C ++ . Я нашел книгу доступной, читаемой и хорошо организованной. У нас было около 6 студентов, которые самостоятельно прочитали главы. Я здесь, чтобы помочь им с терминологией и вопросами. Они делают все упражнения в книге.

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

Не стоит недооценивать своих учеников. Студенты счастливы иметь книгу, читать, учиться и делать упражнения; и это было летом в свободное время! Есть много студентов, которые не поймут. Они должны перейти к чему-то другому; не все понимают программирование.

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

Удачи.

Билл Дверь
источник
+1: лучший ответ на сегодняшний день. Отличный выбор учебника. Поздравляю с успехом.
Кевин Клайн
1

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

  1. Вот как вы делаете программу [int main (..) {return 0; }]. Дайте общий обзор среды программирования, которую вы хотите, чтобы они тоже опробовали. Им нужно будет знать, как сделать проект и на самом деле скомпилировать / запустить его.

  2. Это переменная. Переменные могут хранить данные (int, char, float и т. Д.).

  3. Строки (C ++ легче использовать с cin).

  4. Вот как вы читаете и пишете данные (cin, cout). "Привет,% s!"

  5. Условные (компьютеры должны принимать решения).

  6. Циклы (компьютеры способны делать одно и то же снова и снова). Покажи пока и для петель.

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

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

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

Хорошим примером, который помог мне воплотить некоторые идеи, была сборка кока-колы:

  • Выведите меню товаров и цен (для хранения меню был массив определенной пользователем структуры. Может быть классом в C ++). Для его вывода необходим цикл.
  • Читайте в выборе пользователя.
  • Попросите пользователя денег. Они могли просто ввести номинал монет в центах (1, 5, 10, 20, 50, 100, 200 в Aus). Игнорировать неизвестные конфессии. Пока пользователь не вложил достаточно денег, продолжайте спрашивать (циклы).
  • Рассчитайте необходимое изменение (деление по модулю), указав наименьшее количество монет. Распечатайте вывод на экран.
  • Ждите следующего пользователя.

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

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

Адам Хос
источник
1

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

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

Что касается меня, я не профессиональный программист, и пытался изучать Java, C ++ и Python. Я действительно начал чего-то достигать (Python), когда мне приходилось решать реальные (простые) проблемы. Это привело меня прямо к делу, избегая чрезмерного внимания к деталям случайной реализации самого языка.

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

heltonbiker
источник
0

Я бы преподавал строгий C ++. Вы знаете, как, когда вы пишете printf и передаете его маленьким параметрам или неправильному типу, происходит что-то странное? а если вы используете недействительные указатели плохие вещи могут произойти? НЕ УЧИТЕ, ЧТО

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

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

user2528
источник
0

Это не серия лекций на C ++, но COMP1917 Ричарда Бакленда - превосходно сделанная серия лекций по программированию на C (сопровождаемая COMP1927 , структуры данных).

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

greyfade
источник
0

Я хотел бы начать со значительных кусков стандартного кода, помочь им «сделать что-то крутое» с программированием сразу и уточнить их понимание того, как все работает со временем. Им не нужно ценить или понимать все тонкости C ++, чтобы светодиод мигал. Им просто нужно знать, «если вы поместите этот код туда, он начнет мигать». А потом «эй, давайте поговорим о том, что такое цикл, если вы пишете цикл, вы можете заставить светодиод мигать 50 раз без необходимости писать 50 строк кода, разве это не круто?» Теперь давайте поговорим об условных обозначениях: когда пользователь нажимает кнопку A на блоке управления, мы хотим активировать пневматику, чтобы поднять флажок, вот как мы добавили бы код для этого. Или, если переключатель 2 на нашем блоке управления включен, мы запускаем электродвигатель бура в обратном направлении, а не вперед.

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

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

  • сделать что-то "круто выглядящее", если переключатель находится в определенной настройке?
  • скажите, чтобы пневматический клапан открывался или закрывался (например, захватное приспособление)?
  • включить и выключить двигатели сверла (для трансмиссии)?
  • заставить робота менять направление, если активирован датчик обнаружения препятствий?
  • сделать робот переключаться между режимами 2 колеса против 4 колеса?
  • настроить чувствительность джойстика?
  • и т.п.

Я бы придерживался принципов конструирования, которые являются наиболее надежными, как я бы учил cout over printf, потому что спецификаторы формата очень легко перепутать, а неправильный спецификатор часто является автоматическим рецептом сбоя вашей программы. Аналогично, вектор запутывает некоторые сложности управления памятью. Не беспокойтесь о каждой детали о том, как все работает, или о том, что такое библиотека STL, по крайней мере, им нужно знать для достижения X (например, для этого может потребоваться использование структуры данных библиотеки STL)

Джессика Браун
источник
0

Используйте Как программировать на C ++ от Deitel и Deitel. ОТЛИЧНЫЙ учебник на мой взгляд.

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

Держитесь подальше от STL для начинающих.

Если у вас уже есть решение по кодированию для вашего робота - или ОЧЕНЬ ХОРОШАЯ ИДЕЯ того, на что он будет похож, то, возможно, вы сможете «сопоставить» уроки в учебнике с задачами кодирования для робота. Но позвольте учебнику вести обучение.

Если вы принудительно кормите кодирование, давая ученикам очень узкие уроки и знакомитесь с языком, то я думаю, что по мере того, как океан кода, который вы пишете, становится все больше и больше, это будет похоже на то, что вы только что научились грести веслом, и вы утонете, потому что РЕАЛЬНОЕ плавание требуется.

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

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

radarbob
источник