Навчання C ++ для учнів першого класу: Де провести межу?


35

Я буду наставником команди старшокласників для ПЕРШОГО Змагання з робототехніки, більшість команд розробляють [своє програмне забезпечення для роботи з використанням C ++. Для багатьох учнів команди це буде їх першим вступом до програмування. Я б не вибрав C ++ для викладання програмування для старшокласників (наприклад, Python або Javascript було б простіше, я думаю), але вибір встановлений.

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

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

Спасибі!

EDIT : Дякую за стільки чудових відповідей. Окрім прискореного C ++ , який пропонують багато людей, я виявив, що C ++ For Every - це відмінний текст.


52
О боже, будь ласка, нікого не навчайте JavaScript як першої мови!
SoapBox

26
@SoapBox: на відміну від чого? Я думаю, що Javascript надзвичайний як перша мова. Ви можете робити цікаві речі за допомогою декількох рядків коду, немає компіляторів накладного навчання та IDE тощо, його легко перевірити та налагодити, він підтримує як OO, так і функціональне програмування. Що може бути краще?
кевін клайн

7
Чому ви кажете, що масиви легше вводити? Я думаю, що вектори набагато інтуїтивніші для новачків, оскільки вам не потрібно думати про покажчики чи щось таке складне.
Кейсі Паттон

19
Якщо ви викладаєте C ++ школярам середньої школи, то ви вже переступили цю межу.
tylerl

7
Альтернативою викладанню C ++ є не COBOL.
поштовх

Відповіді:


40

Я думаю, ви повинні почати з типів даних, в які вбудована мова, як масиви та вказівники, і коли ваші студенти зрозуміють це, перейдіть до класів та OO, а потім до STL.

Причина полягає в тому, що ви можете навчити людей розуміти масиви, не розуміючи нічого іншого, окрім змінних та базової архітектури комп'ютера, але ви не можете навчити їх розуміти, vectorне навчаючи їх класів спочатку. Якщо ви використовуєте STL з початку роботи, вашим студентам доведеться просто жити, не маючи поняття про те, як vectorсаме працює. І тоді, коли ви дістанетесь до цього пункту, вони не матимуть достатнього розуміння покажчиків та масивів і речей, які ви отримуєте від таких завдань, як написання власного векторного класу, написання власного пов'язаного списку класів тощо, що буде потрібно цінувати та використовувати його особливості. Мене це дратує, коли студенти кажуть "що це?" а вчителі кажуть: "просто ігноруйте це, ви дізнаєтесь пізніше".

І як зазначав Деміан у коментарях, розшифрувати відносно криптичні повідомлення, які ви отримуєте від помилок шаблону, значно складніше, ніж зрозуміти помилки, які ви можете отримати з масивів / нешаблонних конструкцій.

Я не відчуваю так само coutі про printf. Він не є нижчим рівнем, ніж інший, за винятком випадків, коли coutвикористовується перевантаження оператора.

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

Я часто говорю це, але я ще раз це скажу: краще спочатку навчити учнів довгому поділу, а потім дозволити їм використовувати калькулятор, ніж дозволити використовувати калькулятор, а потім навчити їх довгому поділу.

Щодо книг, які навчають початківців, дивіться основний список хороших книг на C ++ .


4
Я був фактично такої ж думки, але подивився на книгу Струсруп учіння C ++ ( stroustrup.com/Programming ), і він явно виступає за використання vectorнад масивами. Я розірваний.
зворотневиключення

4
@recipriversexclusion: Просто констатуючи очевидне, але містер Струструп далеко не студент середньої школи;)
Деміан Брехт

14
О БОЖЕ МІЙ. Як у світі хтось може подумати, що ручне маніпулювання динамічно розподіленими масивами може бути «найпростішим першим» маршрутом до C ++, коли є std::stringі std::vector?! Це 328 програми програмування С? Я викладаю C ++ протягом десятиліть, початківцям програмування, студентам, які мали рік Java, та професіоналам програмування. Я використовую std::stringі std::vectorз першого дня. Вони прості у використанні, незалежно від їх внутрішніх якостей. (Ви б не відмовлялися від викладання струни VB, тому що вона зсередини занадто складна?)
sbi

18
Ось ваш відгук. Вам не потрібно вчитися будувати будинок, щоб насолоджуватися перевагами життя в будинку. Вам не потрібно писати, std::vectorщоб користуватися нею. А заняття є надзвичайно базовою частиною C ++. Що не головне - це налагодження всіх тих помилок, які вони отримають за допомогою нативних масивів та покажчиків.
DeadMG

6
@DeadMG: метафора будинку не працює. У будинку, коли фундамент побудований, вам ніколи більше не доведеться думати про це. Ви просто продовжуєте будувати все інше. У C ++, то миттєві ви бачите newключове слово, ви назад в управлінні пам'яттю terrirory. І часто бібліотеки часто запитують покажчики, і вам потрібно запитати себе: "Це ти будеш брати право власності? Або мені все-таки потрібно прибирати?". Фундація моєї ноги. Більше схожий на цвях або ущільнювач або щось подібне.
Кріс Еберле

38

Це мій власний досвід. Візьміть його за все, що варто.

Озираючись назад, коли я почав програмувати, я дуже хотів би, щоб я дізнався про пам'ять спочатку . Ні, це не захоплююче. Це змусить вас засклитись. Але це смішно проста концепція вчити. Просто покажіть 1-D таблицю і змусьте їх пройти кілька розумових вправ:

Урок 1:
Це 10 байт пам'яті. Це буква "a", яка вводиться в комірку № 3. "a" - це значення, а 3 - адреса. ДОБРЕ? Це число 3, яке вводиться в комірку 5. Його значення - 3, а адреса - 5. Тепер що може означати число 3? Що ж, це може бути просто число 3, або це може бути посилання на адресу 3. Так само, як 1, може бути числом або може бути кодом країни. Це просто число, все залежить від того, як ми ставимося до цього.

Урок 2:
Навчимось рахувати у двійковій формі. Давайте порахуємо до 10 за допомогою двійкового підрахунку пальців. Цікаво ні? Подивіться, як для цього знадобилися лише 4 пальці? Тому ми кажемо, що потрібно всього 4 біта (1/2 комірки). Що найвище, на що ви можете розраховувати з однієї сторони (відповідь - 31). Як щодо 2 руки (відповідь - 1023). Поясніть, як більше бітів означає більший діапазон чисел. Нагадуйте їм, що комірка пам'яті становить 8 біт. Запитайте, що відбувається, коли для чисельності потрібно більше 8 біт. Як би вони помістили багатобайтове число в пам'ять (логічно)? Познайомте їх з символами, шортами, цілими чи довгими.

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

etcetera. Як тільки ви знизите основну пам'ять, все інше - це торт. Саме бідні студенти вважають, що компілятор робить щось магічне (або що їм ніколи не доводиться думати про управління пам'яттю), які прагнуть найбільше боротися. А C ++ замулює води, оскільки деякі речі автоматично очищаються (тобто звичайний вектор), а інші - ні, тобто вектор, виділений за допомогою "нового". І навіть не запускайте мене з рядків (char * vs. std :: string - спробуйте пояснити це без знання вказівника).

Я не знаю, на яку платформу буде націлена конкуренція ваших роботів, але якщо це середовище з обмеженою пам'яттю, навички управління пам'яттю мають вирішальне значення.

EDIT

Після того, як ви навчили їх основ, тоді так, я кажу, переходьте C ++ до кінця. Технічно вони просто різні бібліотеки, але так, немає сенсу плутати їх з більш ніж однією парадигмою. Надайте їм інструменти C ++ (що включає вказівники та масиви).


Це добре поставлена ​​відповідь. Я думаю, проблема полягає в тому, що ви можете цього навчити, але багато дітей (я спочатку боровся з концепціями вказівника / пам’яті через відсутність інтересу) просто налаштують це, адже це не весело, хоча це потрібні знання успішно програмувати на C ++.
Кіт Лейн

3
Так, тут ніяких аргументів. З тієї ж причини діти відучують математику та географію. Лише згодом вони зрозуміють, що їм слід було б звернути увагу. Досить впевнений, що певна проблема все ще не була вирішена.
Кріс Еберле

+1. Я пам'ятаю, як склав своє розуміння того, як пам'ять працювала досить довго після того, як я був представлений на C ++. Я не думаю, що я міг би зрозуміти це заздалегідь (не в будь-якому практичному сенсі, як, наприклад, як представлені цінності).
Камерон

+1, це я намагався сказати, але краще. Під час навчання механіки вони повинні зрозуміти двигун, перш ніж зробити їх фахівцями з водіння.
Сет Карнегі

Так, я повертаюсь вперед і назад щодо того, чи можуть початківці зрозуміти це чи ні. Це так смішно просто (і ви раптом виявляєте, що говорите "вау, комп’ютери - це дуже дурні машини, чи не так?"), Однак це вимагає від них звернути увагу і дотриматись обіцянки ще захоплюючих речей. Якщо не бачити "великої картини", загальний підхід робить зануреним розум.
Кріс Еберле

31

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

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

ви можете витратити багато часу, навчаючи учнів, як структурується пам'ять і як керувати пам'яттю (стиль C), або ви можете приступити безпосередньо до роботи, використовуючи ідіоматичні типи мови, а потім поясніть деталі реалізації, якщо це потрібно (і коли вони мають краще розуміння того, що таке масив і де вони використовуються).

синтаксис std::vector(створення / читання / запис) не набагато складніший за масив C. порівняно, керування пам’яттю вручну та всі поширені помилки, які роблять нові учні з масивами С, набагато складніше вивчати, навчати та використовувати.

Чи слід дотримуватися вводу / виводу, чи слід дотримуватися cout тощо, чи ви вважаєте, що printf було б легше навчитися?

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

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

Редагувати тут Передмова

Чи є в Інтернеті ресурси на C ++, які підходять для таких молодих учнів?

якщо ви не хочете використовувати прискорений C ++ (який взагалі передбачає деякий фон із програмуванням взагалі), то, можливо, вам би хотілося думати Еккеля в C ++ . Я його не читав, але це вільно поширений вступний текст C ++.


1
+1 ... і мені LOL важко буде "вони вводять std :: cout безпосередньо перед поверненням (стор. 3)", я повинен зазирнути в це :)
Фелікс Домбек,

1
@Felix і безпосередньо перед std::coutвведенням фігурних брекетів вводяться =) (це просте розсічення всюдисущого "Привіт, світ")
Justin

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 ++ як вектор і cout, а не підмножиною C, як printf.


7

Чи варто починати використовувати STL з першого дня ...?

Так. Використання нативних масивів в C ++ є схильною до помилок і просто погана практика 99% часу.

Чи слід дотримуватися вводу / виводу, щоб дотримуватися cout тощо?

Так.

Чи є в Інтернеті ресурси на C ++, які підходять для таких молодих учнів?

Вони не такі вже й молоді. Навчання програмуванню не вимагає мудрості, просто мотивації та відкритості. Я не можу придумати нічого, чого навчали за останні два роки середньої школи, що краще підготувало б учня до навчання програмі. Ви подивилися на мислення Брюса Еккеля в С ++ ? Він доступний для безкоштовного завантаження та дуже добре перевірений. Будь ласка, уникайте популярних, але жахливих C ++: Як програмувати та всі книги Sam Sam Teach Yourself C ++ ...


5

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

Я думаю, що найефективнішим (і, можливо, цікавим) способом викладання основ є використання цільової навчальної програми: почніть із показу, як виводити матеріали, потім клавіатури, потім просто введення / виведення файлів тощо. Перехід до простого тексту - заснована гра (або еквівалент робототехніки). Потім, коли вони запитують: "Як мені зробити X?", Ви можете розділити X на приклади, які вони вже бачили, наприклад "Спочатку вам потрібно буде отримати дані від користувача, як ми це зробили в Z, потім ... "(очевидно, що це не так просто на практиці, оскільки X, ймовірно, буде щось, для чого їм потрібні додаткові знання, наприклад," 3D-графіка ", але ви все одно можете пояснити, як це буде працювати на високому рівні спосіб).

Приклади, які ви їх показуєте, починатимуться як магія, вставлена ​​в чорну скриньку, таємниці якої розгадуються, коли поступово з'ясовуються фрагменти головоломки програмування. Наприклад, ваші студенти вивчать основи ifs досить швидко, але, ймовірно, не зрозуміють, що булевий вираз не обмежується виключно використанням в умовах if's (що веде до класичногоif (blah) return true; else return false; коду).

Тонкості того, чи ви вибираєте масив чи вектор як контейнер, спочатку здаватимуться студентам неактуальними. Вектор / масив буде просто способом наявності безлічі змінних як однієї змінної, доступних через індекс. Дотримуйтесь того, де можете. Покажчики не будуть зрозумілі й пізніше. Це не означає, що ви не повинні пояснювати речі; просто, що ви не можете все пояснити відразу, і речі, які ви пояснюєте, не будуть повністю поглинені. Люди навчаються органічно, а не лінійно. Я використовував coutпару років перш ніж я правильно зрозумів, що таке перевантаження оператора!

О, і не бійтеся повторення. "Це як програма Hello World, яку ми зробили - пам'ятаєте, як ми писали текст на консоль?" (ні ...) "Давайте переглянемо це ще раз, щоб переконатися". ... І задайте питання! Нехай студенти займаються цікавими прикладами та великою кількістю взаємодії.

C ++ є складною мовою, і незалежно від того, чим ви займаєтесь, значна частина цієї складності (і загальної програми програмування взагалі) буде втрачена на ваших учнів. Все, що ви їм покажете, буде для них новим; більшість з них не зануриться на глибокий рівень розуміння (принаймні, не відразу). Як працює пам’ять, як взаємодіють компоненти ПК, що таке стек та купа, покажчики, класи, навіть петлі та ланцюги, якщо не, більшість не буде належним чином зрозуміти . Це добре! Їх не потрібно розуміти, щоб їх використовувати - дивовижна кількість класних програм може бути написана з надзвичайно потворними 1000-рядковими функціями з чотирикратними вкладеними зайвими ifs та 43 змінними, названими такими речами, якx_2r . Важливим є те, що студенти постійно навчаються та вдосконалюються. Чорні ящики прекрасні, якщо вони з часом стають прозорими (або принаймні напівпрозорими сірими). До кінця курсу вони можуть не знати, що таке дизайнерські малюнки, але вони повинні мати можливість озирнутися на програми, які вони написали в перші кілька тижнів, і поспішати на свій код. Вони повинні досить детально зрозуміти, як працює перша програма, яку вони написали (тоді, коли вони написали її, вони не мали уявлення). Але вони все не знають - поки що .


5

У своєму житті я взяв купу занять з програмування від середньої школи до коледжу. Я можу сказати, що я дійсно не надто багато навчився з мого першого класу c ++, крім того, як надрукувати речі в потік.

Моя порада, як молодий студент, який протягом останніх кількох років займався справжньою роботою, будучи розробником, - не дурити на них речі. Скажіть їм, що вони роблять, і як це працює до рівня операційної системи (Не потрібно вступати в IM IM).

Я думаю, що викладати їх на C - це кращий спосіб піти з цього питання (він майже завжди буде складатись як C ++, як ви знаєте). Навчаючи їх, що насправді є терміналом, як їх програма взаємодіє з ним, що рядок - це масив символів, що закінчується символом \ 0, що таке malloc і як C ++ абстрагує його, як знаки char та int зберігаються в пам'яті , тощо ... Це те, що змушує когось насправді знати, як вирішити проблему, коли стикається з нею в розвитку.

Я не можу наголосити на важливості дозволити дітям програмувати і бути там головним чином, щоб відповідати на питання. На мій досвід, ви вивчаєте мову, використовуючи її. Книги та уроки можуть бути корисними та потрібними для початку, але врешті-решт, я кажу, дайте їм файл C / C ++ і скажу: Це приклад X, я хотів би, щоб ви зробили Y (що можна зробити шляхом злому X). Покажіть їм, як користуватися довідковими сторінками (якщо вони використовують * NIX) або покажіть їм cplusplus.com та дозвольте їм вивчити моменти std, щоб самостійно розібратися.

TL; DR Нехай діти навчають себе. Будьте там, щоб надати структуру та відповісти на питання.

Також: Пов'язані списки - це правда!


4

Ви не вчите їх програмуванню загальним способом, ви навчаєте їх своєрідному вбудованому програмуванню за допомогою Роботів тощо. Якщо я правильно зрозумів.

По-перше, я думаю, ви повинні перевірити, які бібліотеки ви збираєтеся використовувати і що вам потрібно.

Якщо у вас є бібліотека С для використання або C-подібна з великою кількістю покажчиків та С-масивів, то, мабуть, вам знадобиться спосіб навчити їх користуватися або чому ви ним користуєтесь.

Але, ви можете показати їм кілька простих кодів, щоб розпочати їх із рядків та векторів, саме так працює C ++. Це не означає, що ви не можете навчити їх вказівникам.

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

Оскільки мета тут не вивчити загальне програмування, а взяти участь у змаганнях з роботами, я орієнтував навчання таким чином.


2

Я почав викладати студентів C ++ наприкінці минулого року, а цього літа також для першої команди з робототехніки.

Ми використовуємо програмування Stroustrup - Принципи та практика використання 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. Петлі (комп’ютери добре робити те саме, що повторюється). Показати час і для циклів.

Це повинно зайняти приблизно два уроки години кожен. Обов’язково підготуйте стислий набір зауважень, на які вони можуть посилатися у практичній складовій. Ви не намагаєтесь зробити їх геніальними програмістами, тому наведіть приклади того, як читати з консолі, створювати структури та все інше, що потрібно робити. Використовуйте лише підтримувані мовою функції, а не спеціальні бібліотеки утиліт. Ви лише заплутаєте їх більше.

З початку роботи наведіть приклад і покажіть їм приклади добре викладеного коду. Відступи повинні бути правильними, дужки та дужки, відповідати стилю, який вам найбільше комфортний. Імена змінних повинні бути змістовними. Якщо ви показуєте slop як приклад, тоді вони дізнаються, що slop прийнятний. Це погана відправна точка. Підкресліть важливість правильного відступів - я виявив, що коли партія, яку я навчав, послідовно відводила їх код, їм було легше зрозуміти, куди вони йдуть не так. Це було через те, що більшість їх помилок були невірними сферами для операцій (розміщення операцій в циклі / умовні умови, які не повинні були бути, або зворотні).

Потім переходите до практичної роботи. Найкращий спосіб чогось навчитися - це зламати це і розібратися, чому. Ви хочете переконатися, що у них є зручне середовище для складання свого коду. Задокументуйте це знімками екрана в руці.

Хорошим прикладом, який допоміг мені сприйняти деякі концепції, було побудувати машину коксу:

  • Виведіть меню елементів та цін (зберігання меню - це масив визначеної користувачем структури. Може бути клас C ++). Для його виведення потрібна петля.
  • Прочитайте у виборі користувача.
  • Попросіть у користувача гроші. Вони могли просто ввести номінал монети в центах (1, 5, 10, 20, 50, 100, 200 в аусі). Ігноруйте невідомі номінали. Поки користувач не вклав достатньо грошей, продовжуйте запитувати (петлі).
  • Обчисліть необхідні зміни (поділ по модулю), давши найменшу кількість монет. Роздрукуйте вихід на екран.
  • Зачекайте наступного користувача.

Після цього ви можете перейти на конструкції C ++; ви не хочете зануритися занадто далеко, перш ніж вони зможуть принаймні скласти базову програму.

І, перш за все, майте багато вільного часу та терпіння присвятити питанням. Їх буде багато, і більшість з них змусить вас скупитися, бо вони настільки банальні, що відповідь вам очевидна.


1

Я думаю, що ви не повинні вчити речі з точки зору C ++ ("C ++ привіт світ"), але з проблемної області - у цьому випадку робототехніки - точки зору. Отже, ваш світ привіт би моргнув світлодіодом або керував мотором.

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

Щодо себе, я не професійний програміст і намагався вивчити Java, C ++ та Python. Я дійсно почав щось досягати (Python), коли у мене виникли реальні (прості) проблеми. Це спричинило мене до речі, уникаючи зайвої уваги до випадкових деталей реалізації самої мови.

Тому я радив би: не читайте посібник з мови, а навчіться робити речі з обраної вами мови. Я вважаю, що це мотивує людей.


0

Я б навчив суворому C ++. Ви знаєте, як, коли ви пишете printf і надаєте йому маленькі параметри або неправильний тип, відбувається щось дивне? і якщо ви використовуєте недійсні покажчики, можуть статися погані речі? НЕ ВЧИТИ ЦЕ

З першого дня я б навчив користуватися посиланнями, STL і сказати, що ви втрачаєте позначки для використання покажчиків. Не навчайте розумних покажчиків. Єдиний раз, коли я помічаю, що я використовую вказівники, це коли я роблю графічний інтерфейс, а об’єкти (як поле зображення) повинні існувати і бути дійсним зображенням або нулем. Для програмування консолей я давно не використовую покажчики (розумні чи сировинні).

Отже, коротко не навчайте їх нічого, що може доставити їм клопоту. Навчіть іострим, структурувати, скажіть їм, що вони теж втрачають позначки на машинописних машинах і не намагайтеся навчити дизайну. Ви не хочете, щоб хтось ставав досвідченим професіоналом


0

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

На мою власну думку, C ++ - це занадто велика складність для нових студентів, але C є світами простішим і дає хорошу основу в системному програмуванні, якого нові програмісти C ++ занадто часто не вистачають.


0

Я б почав зі значних фрагментів кодового шаблону, допомогти їм «зробити щось круто» з програмуванням відразу і уточнити їх розуміння того, як все працює з часом. Їм не потрібно цінувати або розуміти всі тонкощі C ++, щоб світлодіодний блимав. Вони просто повинні знати, "якщо ви помістите цей код туди, він змусить світлодіод блимати". І тоді "ей, давайте поговоримо про те, що це цикл зараз. Якщо ви пишете цикл, ви можете змусити світлодіод блимати 50 разів, не записуючи 50 рядків коду, чи це не круто?" Тепер давайте поговоримо про умовні умови, коли користувач натискає кнопку A на панелі управління, ми хочемо активувати пневматику, щоб підняти прапор, ось як ми додамо код для цього. Або якщо перемикач 2 на нашому блоці управління увімкнено, ми запускаємо дриль двигуна назад, а не вперед.

Якщо ви триматимете увагу на тому, щоб викладати їх "достатньо просто", щоб вирішити проблеми, які їх цікавлять, це зробить речі набагато менш захоплюючими та більш доступними. Якщо вони дійсно зацікавлені і хочуть розібратися в тонкощах, вони, ймовірно, повернуться назад і прочитають вичерпну книгу з програмування або пройдуть курс літньої школи в місцевому ЖК.

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

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

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


0

Використовуйте як програмувати C ++ за допомогою Deitel та Deitel. НАЙКРАЙНИЙ підручник на мою думку.

Здається, ви намагаєтесь навчити новачків програмувати, а потім одночасно запрограмувати їх на певному рівні. Якщо ви сподіваєтесь дати їм якусь мавпу побачити, що мавпа робить кодування фрагментів без розуміння того, що ви приречені на провал.

Тримайтеся подалі від STL для початківців класів.

Якщо у вас вже є рішення для кодування для вашого робота - або ДУЖЕ ДОБРЕ ІДЕЯ, як це буде виглядати, можливо, ви можете «зіставити» уроки в підручнику з завданнями кодування для робота. Але нехай підручник керує навчанням.

Якщо ви примусово кодуєте, даючи студентам дуже вузькі уроки та знаходячись на мові, то я думаю, що океан коду, який ви пишете, стає більшим і більшим, це буде як щойно навчилися веслати собаку, і ви будете тонути, бо РЕАЛЬНЕ плавання необхідно.

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

Якби це завдання для читання, якими були б результати, якби все, що вони знали, були простими предметно-дієсловними реченнями і знадобиться лише половина лексики, яку ви ЗНАЄМО .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.