Nauczanie języka C ++ dla uczniów szkół średnich po raz pierwszy: gdzie wytyczyć granicę?

35

Będę mentorem zespołu uczniów szkół średnich w PIERWSZYM konkursie robotyki, większość zespołów rozwija tutaj [swoje oprogramowanie robotów przy użyciu C ++. Dla wielu uczniów w zespole będzie to ich pierwsze wprowadzenie do programowania. Nie wybrałbym C ++ do nauczania programowania dla uczniów szkół średnich (np. Python lub Javascript byłoby łatwiejsze), ale wybór jest już ustalony.

Chcę nauczyć ich właściwego języka C ++ (tj. Unikać mieszanego dialektu C / C ++, tj. C +), ale nie chcę ich straszyć niepotrzebną złożonością. Z tego powodu:

  • Czy powinienem zacząć używać STL od pierwszego dnia, szczególnie. vectorlub po prostu trzymać się standardowych tablic? Tablice są łatwiejsze do wprowadzenia, ale błędy wskaźnika mogą być trudniejsze do uchwycenia.
  • W przypadku I / O powinienem się trzymać coutitp., Czy uważasz, printfże łatwiej byłoby się tego nauczyć?
  • Czy są jakieś zasoby internetowe dla C ++, które są odpowiednie dla takich młodych uczniów?

Dzięki!

EDYCJA : Dzięki za tak wiele doskonałych odpowiedzi. Oprócz przyspieszonego C ++ , który jest sugerowany przez wiele osób, przekonałem się, że C ++ For Everyone to doskonały tekst.

receptriversexkluzja
źródło
52
Boże, proszę, nie ucz nikogo javascript jako pierwszego języka!
SoapBox
26
@ SoapBox: w przeciwieństwie do czego? Myślę, że Javascript jest świetny jako pierwszy język. Możesz robić ciekawe rzeczy za pomocą kilku linii kodu, nie ma kompilatorów do nauki startu, IDE itp., Jest łatwy do testowania i debugowania, i obsługuje zarówno OO, jak i programowanie funkcjonalne. Co mogło być lepiej?
kevin cline
7
Dlaczego mówisz, że tablice są łatwiejsze do wprowadzenia? Myślę, że wektory są o wiele bardziej intuicyjne dla początkujących, ponieważ nie musisz myśleć o wskaźnikach ani niczym takim złożonym.
Casey Patton,
19
Jeśli uczysz języka C ++ dla uczniów szkół średnich, przekroczyłeś już granicę.
tylerl
7
Alternatywą dla nauczania C ++ nie jest COBOL.
jhocking

Odpowiedzi:

40

Myślę, że powinieneś zacząć od typów danych wbudowanych w język, takich jak tablice i wskaźniki, a kiedy twoi uczniowie to zrozumieją, przejdź do klas i OO, a następnie STL.

Powodem jest to, że możesz nauczyć ludzi rozumieć tablice, nie rozumiejąc wiele więcej poza zmiennymi i podstawową architekturą komputerową, ale nie możesz nauczyć ich rozumienia vectorbez uprzedniego nauczenia ich klas. Jeśli użyjesz STL od samego początku, twoi uczniowie będą musieli żyć, nie mając pojęcia, jak vectordokładnie działa. A potem, kiedy dojdziesz do tego punktu, nie będą mieli wystarczającej wiedzy na temat wskaźników i tablic oraz rzeczy, które otrzymujesz po robieniu rzeczy takich jak pisanie własnej klasy wektorowej, pisanie własnej klasy listy połączonych itp., Które będą konieczne docenić i wykorzystać jego funkcje. Denerwuje mnie, gdy uczniowie mówią „co to jest?” a nauczyciele mówią „po prostu zignoruj ​​to, nauczysz się później”.

I jak zauważył Demian w komentarzach, odszyfrowanie stosunkowo tajemniczych wiadomości otrzymanych z błędów szablonów jest znacznie trudniejsze niż zrozumienie błędów, które możesz uzyskać z tablic / konstrukcji innych niż szablony.

Nie czuję tego samego couti printf. Żaden poziom nie jest niższy niż drugi, z wyjątkiem tego, że coutwykorzystuje przeciążenie operatora.

To może wydawać się głupie, ale jestem absolutnie fanatykiem, gdy ludzie rozumieją podstawowe elementy składowe wszystkiego przed przejściem do abstrakcji. Nie powinieneś używać inteligentnych wskaźników, dopóki nie opanujesz surowych wskaźników, żadnych wektorów przed tablicami, tego rodzaju rzeczy.

Często to mówię, ale powiem to jeszcze raz: lepiej najpierw nauczyć uczniów długiego podziału, a potem pozwolić im korzystać z kalkulatora, niż pozwolić im na korzystanie z kalkulatora, a następnie nauczyć ich długiego podziału.

Jeśli chodzi o książki do nauki początkujących, zobacz główną listę dobrych książek w C ++ .

Seth Carnegie
źródło
4
Tak naprawdę byłem tego samego zdania, ale spojrzałem na książkę Strousrup's Teaching C ++ ( stroustrup.com/Programming ), a on wyraźnie opowiada się za używaniem vectortablic. Jestem rozdarta.
receptriversexclusion
4
@recipriversexclusion: Po prostu stwierdzenie oczywistości, ale pan Stroustrup jest daleki od licealisty;)
Demian Brecht
14
O MÓJ BOŻE. Jak na świecie ktoś może myśleć, że ręczne manipulowanie dynamicznie przydzielanymi tablicami może być „najłatwiejszą” drogą do C ++, jeśli jest std::stringi std::vector! Czy to programiści 32 C upvoting? Uczę języka C ++ od dekady, początkujących programistów, studentów, którzy mieli rok pracy w Javie, oraz programistów. Używam std::stringi std::vectorod pierwszego dnia. Są łatwe w użyciu, bez względu na ich wnętrzności. (Nie
wstydzisz się
18
Oto Twoja opinia. Nie musisz uczyć się budowy domu, aby cieszyć się korzyściami płynącymi z życia w domu. Nie musisz być w stanie pisać, std::vectoraby móc z niego korzystać. A klasy są niezwykle podstawową częścią C ++. To, co nie jest podstawowe, to debugowanie wszystkich błędów, które dostaną przy użyciu natywnych tablic i wskaźników.
DeadMG
6
@DeadMG: Metafora domu nie działa. W domu, po zbudowaniu fundamentu, nie musisz już więcej o tym myśleć. Po prostu budujesz wszystko inne. W C ++, to chwila pojawi się newsłowo kluczowe, masz rację z powrotem do terrirory zarządzania pamięcią. I często biblioteki proszą o wskazówki, a ty musisz zadać sobie pytanie: „czy to przejmie na własność? Czy nadal muszę to wyczyścić?”. Podstawa mojej stopy. Bardziej jak gwóźdź, uszczelka czy coś takiego.
Chris Eberle,
38

To jest moje własne doświadczenie. Weź to za cokolwiek jest warte.

Patrząc wstecz, kiedy zacząłem programować, naprawdę chciałbym dowiedzieć się o pamięci jako pierwszy . Nie, to nie jest ekscytujące. Sprawi, że się oszklisz. Ale jest to bardzo łatwa koncepcja do nauczenia. Po prostu pokaż tabelę 1-D i zmuś ich do wykonania kilku ćwiczeń mentalnych:

Lekcja 1:
To jest 10 bajtów pamięci. Jest to litera „a” umieszczona w komórce nr 3. „a” to wartość, a 3 to adres. DOBRZE? Jest to liczba 3 umieszczana w komórce 5. Jego wartość to 3, a jej adres to 5. Co może oznaczać liczba 3? Może to być tylko cyfra 3 lub może to być odniesienie do adresu 3. Tak jak 1 może być liczbą lub kodem kraju. To tylko liczba, wszystko zależy od tego, jak ją traktujemy.

Lekcja 2:
Nauczmy się liczyć binarnie. Policzmy do 10 za pomocą binarnego liczenia palców. Ciekawe nie? Widzisz, jak potrzebne były tylko 4 palce? Mówimy więc, że potrzebne są tylko 4 bity (1/2 komórki). Co jest najwyższym, na co możesz liczyć z jednej strony (odpowiedź to 31). Co powiesz na 2 ręce (odpowiedź to 1023). Wyjaśnij, jak więcej bitów oznacza wyższe zakresy liczb. Przypomnij im, że komórka pamięci ma 8 bitów. Zapytaj, co się stanie, gdy liczba potrzebuje więcej niż 8 bitów. Jak zapisaliby w pamięci liczbę wielobajtową (w sposób logiczny)? Przedstaw je do znaków, spodenek, liczb całkowitych i długich.

Lekcja 3:
Oto program, który napisałem w C ++. Używa 32-bitowych liczb całkowitych. I to również jest liczba. Ale jest to liczba używana do wskazywania. Używając tej małej gwiazdki, obiecujemy, że liczba będzie używana do wskazywania. Oto jak wskazujemy na pierwszą liczbę. Mały znak i wypełnia dla nas wartość. Czy to nie prawda?

etcetera. Po wyczerpaniu podstawowej pamięci wszystko inne jest ciastem. To biedni studenci, którzy zakładają, że kompilator robi coś magicznego (lub że nigdy nie muszą myśleć o zarządzaniu pamięcią), którzy mają najwięcej problemów. A C ++ zamazuje wody, ponieważ niektóre rzeczy są automatycznie czyszczone (np. Normalny wektor), podczas gdy inne rzeczy nie (np. Wektor przydzielany przy użyciu „nowego”). I nawet nie zaczynaj od ciągów (char * vs. std :: string - spróbuj wyjaśnić to bez znajomości wskaźnika).

Nie wiem, na jaką platformę będą kierowane konkurencje robotów, ale jeśli jest to środowisko o ograniczonej pamięci, umiejętności zarządzania pamięcią są kluczowe.

EDYTOWAĆ

Kiedy nauczysz ich podstaw, to tak, mówię C ++. Technicznie są to po prostu różne biblioteki, ale tak, nie ma sensu mylić ich z więcej niż jednym paradygmatem. Daj im narzędzia C ++ (które zawierają wskaźniki i tablice).

Chris
źródło
To dobrze postawiona odpowiedź. Myślę, że problem polega na tym, że możesz tego nauczyć, ale wiele dzieci (to ja początkowo walczyłem ze wskazówkami związanymi ze wskaźnikiem / pamięcią z powodu braku zainteresowania) po prostu je wyłączy, ponieważ to nie jest zabawne, nawet jeśli jest to niezbędna wiedza z powodzeniem programować w C ++.
Keith Layne
3
Tak, tutaj nie ma argumentów. Z tego samego powodu dzieci uczą się matematyki i geografii. Dopiero później zdają sobie sprawę, że powinni byli zwracać uwagę. Jestem pewien, że ten konkretny problem wciąż nie został rozwiązany.
Chris Eberle,
+1. Pamiętam, jak zebrałem swoje rozumienie tego, jak pamięć działała dość długo po tym, jak zapoznałem się z C ++. Nie sądzę, że mogłem to zrozumieć z góry (nie w praktycznym sensie, jak na przykład reprezentacja wartości).
Cameron,
+1, tak próbowałem powiedzieć, ale lepiej. Podczas szkolenia mechaników muszą zrozumieć silnik, zanim uczynisz ich ekspertami od jazdy.
Seth Carnegie,
Tak, zastanawiam się, czy początkujący mogą to zrozumieć. To jest TAK absurdalnie łatwe (i nagle zaczynasz mówić: „wow, komputery są naprawdę głupimi maszynami, prawda?”), Ale wymaga to od nich uwagi i dotrzymania obietnicy, że będzie więcej ekscytujących rzeczy. Brak widoku „dużego obrazu” sprawia, że ​​ogólne podejście jest nieco odrętwiałe.
Chris Eberle,
31

Czy powinienem zacząć używać STL od pierwszego dnia, szczególnie. wektor czy po prostu trzymać się standardowych tablic? Tablice są łatwiejsze do wprowadzenia, ale błędy wskaźnika mogą być trudniejsze do uchwycenia.

zdecydowanie przejdź od razu do korzystania ze standardowych typów bibliotek. a std::stringlub std::vectorjest tym, czego często powinni używać, a (zdecydowana większość implementacji) tego typu oferuje pewną formę wykrywania błędów i obsługi błędów, jednocześnie odrywając wiele złożoności od uczniów.

możesz poświęcić sporo czasu na nauczenie uczniów, jak zbudowana jest pamięć i jak zarządzać pamięcią (styl C), lub możesz od razu przystąpić do pracy z użyciem idiomatycznych typów języka, a następnie wyjaśnić szczegóły implementacji, jeśli to konieczne (i kiedy mają lepsze zrozumienie, czym jest tablica i gdzie są używane).

składnia std::vector(tworzenie / odczyt / zapis) nie jest dużo bardziej skomplikowana niż tablica C. dla porównania, ręczne zarządzanie pamięcią i wszystkie typowe błędy popełniane przez nowych uczniów przy użyciu tablic C są znacznie trudniejsze do nauczenia się, nauczenia i używania.

Jeśli chodzi o wejścia / wyjścia, czy powinienem trzymać się cout itp., Czy uważasz, że printf byłby łatwiejszy do nauczenia się?

cout. osobiście uważam, że coutłatwiej się nauczyć. co ważniejsze, powinieneś wybrać, coutponieważ jest bardziej bezpieczny, wszechstronny i pozwala zdefiniować sposób drukowania obiektu, co oznacza, że ​​masz już wbudowane funkcje i bezpieczeństwo typów przy użyciu niektórych standardowych typów bibliotek. W końcu, to po prostu skończyć z programów mieszanych, kiedy zdajesz sobie sprawę, mogą one też muszą nauczyć coutoprócz printf.

w rzeczywistości uważam, że powinieneś przeczytać Accelerated C ++, autorstwa Koeniga i Moo, i ewentualnie użyć go do instrukcji (pośrednio odpowiadając na pytanie 3). w książce wprowadzają std::couttuż przed return(strona 3) i zapisują wskaźniki i tablice do rozdziału 10. Gdybym mógł skopiować i wkleić przedmowę tej książki jako odpowiedź na twoje pytanie, zrobiłbym to. (uwaga: polecam przeczytać ją z perspektywy nauczania c ++).

Edytuj Oto przedmowa

Czy są jakieś zasoby internetowe dla C ++, które są odpowiednie dla takich młodych uczniów?

jeśli nie chcesz używać Accelerated C ++ (który ogólnie zakłada pewne podstawy programowania), być może chciałbyś Eckel's Thinking in C ++ . Nie przeczytałem go, ale jest to swobodnie rozpowszechniany tekst wprowadzający do C ++.

3 obroty
źródło
1
+1 ... a ja LOL'owałem mocno na "wprowadzają std :: cout tuż przed powrotem (strona 3)" muszę zajrzeć do tego :)
Felix Dombek
1
@ Fix i bezpośrednio przed std::coutwprowadzeniem wprowadzane są nawiasy klamrowe =) (jest to prosty podział wszechobecnego „Hello, World”)
justin
1
Serdecznie popieram zalecenie książki Koeniga i Moo. Jego celem jest nauczanie zarówno C ++, jak i programowania. Myślenie Bruce'a Eckle'a w C ++ ma na celu przede wszystkim nauczanie języka C ++ dla osób z wcześniejszym doświadczeniem w języku proceduralnym (takim jak C lub Basic).
Stephen C. Steel
11

Jedną rzeczą do rozważenia jest to, że w typowym PIERWSZYM kodzie struktury danych dowolnej postaci (struktury, klasy, tablice, wektory, listy) odgrywają bardzo małą rolę. Zwykle masz do czynienia z bardzo małą ilością danych czujnika i używasz ich do decydowania o bardzo małej ilości ruchów siłownika.

Ale co ma odgrywają ogromną rolę, a może być bardzo trudne do zrozumienia, są różne formy kontroli , które idą dalej.

Położyłem więc duży nacisk na kontrolę. Zacznij od podstaw: if, for, while. Niech często je ćwiczą. Poznaj ich dobrze ....

... ale potem robi się trudniej. Każdy kod robota o umiarkowanym rozmiarze ostatecznie przechodzi w trudniejsze wzorce sterowania:

  • Duża „główna” pętla, która nazywa wszystko

  • Automaty stanowe (te często się wyświetlają)

  • Zapisywanie poprzednich wartości / bieżący licznik (jak dla PID)

Trudno je zrozumieć początkującym. Myślenie o tym, jak program porusza się po kodzie w ten sposób, jest mylące, możesz nie zdawać sobie z tego sprawy, ale tak jest. Sprawi to twoim studentom o wiele więcej problemów niż sam język.

Powodzenia! Mam nadzieję, że sezon idzie dobrze.

piekarnik
źródło
2
+1; nie jest to zwykłe środowisko pulpitu, ale prawdziwy osadzony kod. Maszyny stanowe są znacznie ważniejsze niż tablice std :: vector vs.
MSalters
8
  • Czy powinienem zacząć używać STL od pierwszego dnia, szczególnie. vectorlub po prostu trzymać się standardowych tablic? Tablice są łatwiejsze do wprowadzenia, ale błędy wskaźnika mogą być trudniejsze do uchwycenia.

Problem z tablicami polega na tym, że wszystko oprócz prostych przykładów z podręczników będzie wymagało tablic o dynamicznym rozmiarze, a moment, w którym potrzebujesz tablic o dynamicznym rozmiarze, std::vectorjest o wiele łatwiejszy. Ponadto jedynym sposobem na bezpieczne obsługiwanie tablic o dynamicznym rozmiarze jest zawinięcie ich do własnej klasy, co byłoby złym std::vectorzdzierstwem.
W przeciwieństwie do niewytłumaczalnie popularnych przekonań, uczniowie mogą korzystać z funkcji, które wymagają wdrożenia złożonej mechaniki, nie wiedząc, jak samodzielnie wdrożyć takie bestie. Jak powiedziałem w komentarzu: nie pomyślałbyś nawet o tym, aby nie uczyć ciągów w innych językach, tylko dlatego, że ich implementacja jest złożona, prawda?

  • W przypadku I / O powinienem się trzymać coutitp., Czy uważasz, printfże łatwiej byłoby się tego nauczyć?

Dlaczego zestaw konwencji ciągów w formacie archaicznym, które powodują, że Twój program wysadza się w powietrze, gdy coś się nie powiedzie (co dzieje się w momencie zmiany typedefjakiegoś pozornie niezwiązanego nagłówka), jest lepszy niż bezpieczeństwo typu std::cout?

  • Czy są jakieś zasoby internetowe dla C ++, które są odpowiednie dla takich młodych uczniów?

Większość zasobów C ++, online lub nie, jest zła. I nie mówię o używaniu trudnych do odczytania czcionek lub języka. Mówię o rażąco oczywistych błędach faktycznych. Istnieje bardzo niewiele dobrych zasobów C ++, głównie jeden lub dwa tuziny książek . Jedyne, o czym wiem, że jest online, to Myślenie Bruce'a Eckela w C ++ .


Przez dekadę uczyłem języka C ++ dla studentów o bardzo różnym pochodzeniu, korzystając z Accelerated C ++ Koeniga / Moo jako podstawy. Mój kurs bardzo się zmienił w ciągu tej dekady, nie jest nigdzie w pobliżu książki, z wyjątkiem podstawowej zasady: używaj nowoczesnych, poprawnych, bezpiecznych idiomów od samego początku. Nie ucz swoich uczniów, jak ręcznie manipulować pamięcią, po to, aby później mogli oduczyć się tego na rzecz bezpieczniejszych idiomów. Jak widać na niektórych zamieszczonych tutaj odpowiedziach, to nie działa: Ci, którzy kiedyś uczyli najpierw ręcznych sposobów, rzadko zrozumieją zaletę korzystania z nowoczesnych, bezpiecznych idiomów.

rev sbi
źródło
7

Jeśli chcesz nauczyć C ++, zacznę od konstrukcji C ++ jako wektora i cout, zamiast podzbioru C, takiego jak printf.

K-ballo
źródło
7

Czy powinienem zacząć używać STL od pierwszego dnia ...?

Tak. Używanie rodzimych tablic w C ++ jest podatne na błędy i po prostu złe praktyki w 99% przypadków.

W przypadku I / O powinienem trzymać się cout itp.?

Tak.

Czy są jakieś zasoby internetowe dla C ++, które są odpowiednie dla takich młodych uczniów?

Nie są tacy młodzi. Nauka programowania nie wymaga mądrości, tylko motywacji i otwartego umysłu. Nie mogę wymyślić niczego, czego nauczano w ciągu ostatnich dwóch lat liceum, które lepiej przygotowałoby ucznia do nauki programowania. Czy spojrzałeś na myślenie Bruce'a Eckela w C ++ ? Jest dostępny do pobrania za darmo i bardzo dobrze sprawdzony. Unikaj popularnego, ale okropnego C ++: Jak programować i wszystkich książek Sam's Teach Yourself C ++ ....

Kevin Cline
źródło
5

Uczono mnie, C ++ w liceum jako pierwszego języka programowania, chociaż to było bardziej jak „C +”, teraz, że można wymienić go; pisaliśmy couttekst na konsolę i pliki, ale także sporo funkcji C ( getch()było moim ulubionym).

Myślę, że najskuteczniejszym (i prawdopodobnie zabawnym) sposobem nauczania podstaw jest zastosowanie programu nauczania zorientowanego na cel: zacznij od pokazania, jak wypisywać dane, następnie wprowadzania danych za pomocą klawiatury, a następnie prostych operacji we / wy pliku itp. gra oparta (lub odpowiednik robotyki). Następnie, gdy pytają: „Jak mam zrobić X?”, Możesz rozbić X pod względem przykładów, które już widzieli, np. „Najpierw musisz uzyskać informacje od użytkownika, tak jak to zrobiliśmy w Z, a następnie ...”(oczywiście nie jest to łatwe, ponieważ w praktyce X będzie prawdopodobnie coś, że potrzebują dodatkowej wiedzy w tym celu, na przykład«grafiki 3D», ale można jeszcze wyjaśnić, jak to będzie działać na wysokim poziomie droga).

Przykłady, które im pokażesz, zaczną się jako magia wklejana w czarne skrzynki, której tajemnice zostają odkryte, gdy powoli układane są fragmenty układanki programistycznej. Na przykład, twoi uczniowie ifdość szybko nauczą się podstaw s, ale prawdopodobnie nie zdadzą sobie sprawy, że wyrażenie boolowskie nie ogranicza się wyłącznie do użycia w ifwarunku (prowadzącym do klasycznego if (blah) return true; else return false;kodu).

Subtelności, czy wybierzesz tablicę czy wektor jako pojemnik, na początku będą wydawać się nieistotne. Wektor / tablica będzie po prostu sposobem na posiadanie wielu zmiennych jako jednej zmiennej, dostępnej za pośrednictwem indeksu. Trzymaj się tego, gdzie możesz. Wskaźniki zostaną zrozumiane dopiero później. Nie oznacza to, że nie powinieneś wyjaśniać rzeczy; po prostu nie możesz wszystkiego wyjaśnić naraz, a rzeczy, które wyjaśniasz, nie zostaną całkowicie wchłonięte. Ludzie uczą się organicznie, a nie liniowo. Używałem coutprzez kilka lat, zanim właściwie zrozumiałem, co to było przeciążenie operatora!

Och, i nie bój się powtórzeń. „To tak, jak zrobiliśmy program Hello World - pamiętasz, jak napisaliśmy tekst na konsolę?” (nie ...) „Przejrzyjmy to jeszcze raz, żeby się upewnić”. ... i zadawaj pytania! Zachowaj zaangażowanie uczniów w zabawne przykłady i dużo interakcji.

C ++ jest złożonym językiem i bez względu na to, co robisz, znaczna część tej złożoności (i ogólnie umiejętności programowania) zostanie utracona na twoich uczniach. Wszystko, co im pokażesz, będzie dla nich nowe; większość z nich nie zagłębi się na głębokim poziomie zrozumienia (przynajmniej nie od razu). Jak działa pamięć, jak współdziałają komponenty komputera, jaki jest stos i stos, wskaźniki, klasy, nawet pętle i łańcuchy if-else nie zostaną właściwie zrozumiane przez większość. To jest wporządku! Nie trzeba ich rozumieć, że są używane - niesamowitą liczbę fajnych programów można napisać za pomocą super-brzydkich funkcji 1000-wierszowych z pięciokrotnie zagnieżdżonymi redundantnymi ifsi 43 zmiennymi o nazwanych rzeczach x_2r. Ważne jest to, że uczniowie stale się uczą i doskonalą. Czarne skrzynki są w porządku, o ile na dłuższą metę stają się przezroczyste (lub przynajmniej półprzezroczyste szare). Pod koniec kursu mogą nie wiedzieć, co to są wzorce projektowe, ale powinni być w stanie spojrzeć wstecz na programy, które napisali w ciągu pierwszych kilku tygodni i żałować kodu. Powinni zrozumieć na znacznym poziomie szczegółowości, w jaki sposób działa pierwszy napisany program (podczas gdy go napisali, nie mieli pojęcia). Ale nie będą wiedzieć wszystkiego - jeszcze .

Cameron
źródło
5

Brałem kilka zajęć programistycznych w moim życiu od liceum do college'u. Mogę powiedzieć, że tak naprawdę nie nauczyłem się zbyt wiele z mojej pierwszej klasy c ++ poza tym, jak drukować rzeczy do strumienia.

Moja rada, jako młody student, który dopiero od kilku lat ma jakąkolwiek prawdziwą pracę jako programista, polega na tym, aby nie ogłuszać ich. Powiedz im, co robią i jak to działa do poziomu systemu operacyjnego (nie trzeba wchodzić w język IMO).

Myślę, że nauczenie ich języka C jest lepszym sposobem na obejście tego (nadal prawie zawsze kompiluje się jako C ++, jak wiesz). Uczenie ich, czym tak naprawdę jest terminal, w jaki sposób ich program oddziałuje z nim, że ciąg znaków jest tablicą znaków zakończonych \ 0 w pamięci, czym jest malloc i jak C ++ go wyodrębnia, jak char i int są przechowywane w pamięci , ect ... Te rzeczy sprawiają, że ktoś naprawdę wie, jak rozwiązać problem, gdy napotka go w fazie rozwoju.

Nie mogę podkreślić, jak ważne jest, aby pozwolić dzieciom programować i być tam głównie po to, aby odpowiadać na pytania. Z mojego doświadczenia uczysz się języka, używając go. Książki i lekcje mogą być pomocne i są niezbędne, aby zacząć, ale w końcu mówię, daj im plik C / C ++ i powiedz: To jest przykład X, chciałbym, żebyś zrobił Y (co można zrobić hakując X). Pokaż im, jak korzystać ze stron podręcznika man (jeśli używają * NIX) lub pokaż im cplusplus.com i pozwól im zbadać biblioteki standardowe, aby samodzielnie wymyślili różne rzeczy.

TL; DR Niech dzieci uczą się. Bądź tam, aby zapewnić strukturę i odpowiadać na pytania.

Również: Połączone listy są prawdą!

Bobak Hashemi
źródło
4

Nie uczysz ich programowania w sposób ogólny, uczysz ich pewnego rodzaju programowania wbudowanego za pomocą robotów i tym podobnych. Jeśli dobrze zrozumiałem.

Po pierwsze, uważam, że powinieneś sprawdzić, jakich bibliotek będziesz używać i czego potrzebujesz.

Jeśli zdarzy ci się mieć bibliotekę C do użycia lub podobną do C z wieloma wskaźnikami i tablicami C, to myślę, że potrzebujesz sposobu, aby nauczyć ich, jak go używać i dlaczego go używać.

Ale możesz pokazać im kilka prostych kodów, aby zacząć od ciągów i wektorów, tak działa C ++. To nie znaczy, że nie możesz nauczyć ich wskaźników.

Może powinieneś wyjaśnić różnice między niskim poziomem C ++ (który przypomina C) a wysokim poziomem C ++ w STL. Jedną z najtrudniejszych rzeczy w C ++ dla początkujących jest sprawdzenie, czym jest C, czym jest C ++ i jakie są różne systemowe interfejsy API.

Ponieważ celem tutaj nie jest nauka programowania ogólnego, ale udział w konkursie robotów, tak zorientowałem nauczanie.

Nikko
źródło
2

Zacząłem uczyć studentów C ++ pod koniec zeszłego roku, a tego lata również dla naszego PIERWSZEGO zespołu robotyki.

Używamy programowania Stroustrupa - zasady i praktyka posługiwania się C ++ . Uważam, że książka jest przystępna, czytelna i dobrze zorganizowana. Kazało nam około 6 uczniów samodzielnie przeczytać rozdziały. Jestem tutaj, aby pomóc im w terminologii i pytaniach. Wykonują wszystkie ćwiczenia z książki.

Kazałem uczniom pracować przez rozdział 14. Pomijanie rozdziałów na temat strumieni (nieprzydatne w programowaniu FRC). Rozdział 14 jest przydatny, ponieważ otrzymują wprowadzenie do podklas. Jednak prawdopodobnie muszą pójść dalej w książce, aby lepiej zrozumieć konstruktory i destrukty związane z podklasami.

Nie lekceważ swoich uczniów. Uczniowie chętnie korzystają z książki, czytają, uczą się i wykonują ćwiczenia; i to było latem w ich własnym czasie! Jest wielu studentów, którzy nie zrozumieją. Powinni przejść do czegoś innego; nie każdy rozumie programowanie.

Największą barierą nie jest język ani książka; to środowisko programistyczne. Visual Studio Express może zniechęcać początkujących użytkowników. Możesz być cenny, pomagając uczniom skoncentrować się na programowaniu, a nie na środowisku. Jednak nauka środowiska jest cenna, ponieważ programiści spędzają dużo czasu na dostosowywaniu się do nowych systemów programistycznych.

Powodzenia.

Bill Door
źródło
+1: jak dotąd najlepsza odpowiedź. Doskonały wybór podręcznika. Gratuluję sukcesu.
kevin cline
1

Mówisz, że chcesz nauczyć ich języka C ++, ale nie uczysz żadnych konstrukcji C, ale większość konstrukcji programowych, które będą musiały wiedzieć najpierw, są wspólne dla wszystkich języków, a wersje C ++ są zakorzenione w C:

  1. Oto jak tworzysz program [int main (..) {return 0; }]. Podaj podstawowy przegląd środowiska programistycznego, które również chcesz wypróbować. Będą musieli wiedzieć, jak stworzyć projekt i faktycznie go skompilować / uruchomić.

  2. To jest zmienna. Zmienne mogą przechowywać dane (int, char, float itp.).

  3. Ciągi (C ++ są łatwiejsze w użyciu z cin).

  4. W ten sposób odczytujesz i zapisujesz dane (cin, cout). „Witaj% s!”

  5. Warunki (komputery muszą podejmować decyzje).

  6. Pętle (komputery są dobre w robieniu tego samego w kółko). Pokaż podczas i dla pętli.

To powinno zająć około dwóch lekcji na godzinę. Przygotuj zwięzły zestaw notatek, do których mogą się odnosić w części praktycznej. Nie próbujesz uczynić ich genialnymi programistami, więc podaj przykłady, jak czytać z konsoli, tworzyć struktury i wszystko, co powinni zrobić. Używaj tylko funkcji obsługiwanych przez język, a nie niestandardowych bibliotek narzędzi. Będziesz ich bardziej mylić.

Od samego początku prowadź za przykładem i pokaż im przykłady dobrze ułożonego kodu. Wcięcia powinny być poprawne, nawiasy klamrowe i nawiasy spójne ze stylem, w którym czujesz się najlepiej. Nazwy zmiennych powinny mieć znaczenie. Jeśli podasz slop jako przykład, dowiedzą się, że jest on do zaakceptowania. To zły punkt wyjścia. Podkreślaj znaczenie poprawnego wcięcia - odkryłem, że kiedy dużo nauczałem, wciskałem konsekwentnie ich kod, łatwiej było im dostrzec, gdzie popełniają błąd. Stało się tak, ponieważ większość ich błędów była niepoprawnym zakresem dla operacji (umieszczanie operacji w pętlach / warunkach, które nie miały być, lub odwrotnie).

Następnie przejdź do praktycznej pracy. Najlepszym sposobem na nauczenie się czegoś jest złamanie tego i ustalenie, dlaczego. Musisz się upewnić, że mają łatwe w użyciu środowisko do kompilacji swojego kodu. Dokumentuj to za pomocą zrzutów ekranu w dłoni.

Dobrym przykładem, który pomógł mi zrozumieć niektóre koncepcje, było zbudowanie maszyny do coli:

  • Wyprowadza menu pozycji i cen (przechowywanie menu było tablicą struktury zdefiniowanej przez użytkownika. Może to być klasa w C ++). Wyprowadzenie go wymagało pętli.
  • Przeczytaj w wyborze użytkownika.
  • Poproś użytkownika o pieniądze. Mogą po prostu wpisać nominał monety w centach (1, 5, 10, 20, 50, 100, 200 w Aus). Zignoruj ​​nieznane nominały. Chociaż użytkownik nie włożył wystarczającej ilości pieniędzy, wciąż pytaj (pętle).
  • Oblicz wymaganą zmianę (podział modulo), podając najmniejszą liczbę monet. Wydrukuj wydruk na ekranie.
  • Poczekaj na następnego użytkownika.

Następnie możesz przejść do konstrukcji C ++; nie chcesz zanurkować zbyt daleko, zanim będą mogli przynajmniej stworzyć podstawowy program.

A przede wszystkim dużo czasu i cierpliwości, aby poświęcić się pytaniom. Będzie ich wielu, a większość z nich spowoduje, że będziesz się kulił, ponieważ są tak trywialne, że odpowiedź jest dla ciebie oczywista.

Adam Hawes
źródło
1

Myślę, że nie powinieneś uczyć rzeczy z punktu widzenia C ++ („C ++ hello world”), ale z dziedziny problemów - w tym przypadku robotyki - z punktu widzenia. Tak więc, twój cześć świat będzie mrugał diodą LED lub prowadził silnik.

Oczywiście można / należy rozłożyć każde małe zadanie robotyki na podzbiór rosnących znaczących pod względem koncepcyjnym akcji C ++, obejmujących typy, funkcje i operacje IO.

Jeśli chodzi o mnie, nie jestem profesjonalnym programistą i próbowałem nauczyć się Java, C ++ i Python. Naprawdę zacząłem coś osiągać (Python), kiedy miałem prawdziwe (proste) problemy do rozwiązania. To doprowadziło mnie do rzeczy, unikając nadmiernej uwagi na przypadkowe szczegóły implementacyjne samego języka.

Radziłbym więc: nie czytaj podręcznika danego języka, ale naucz się robić rzeczy z wybranym językiem. Myślę, że to motywuje ludzi.

heltonbiker
źródło
0

Nauczę ścisłego C ++. Wiesz, jak piszesz printf i podajesz go małemu params lub niewłaściwemu typowi, że dzieje się coś dziwnego? a jeśli użyjesz nieprawidłowych wskaźników, mogą wystąpić złe rzeczy? NIE UCZYĆ, ŻE

Od pierwszego dnia uczyłem, jak używać referencji, STL i mówiłem, że tracicie ZNAKI za używanie wskaźników. Nie ucz też inteligentnych wskaźników. Zauważyłem, że używam wskaźników tylko wtedy, gdy wykonuję GUI, a obiekty (takie jak pole obrazu) muszą istnieć i być poprawnym obrazem lub mieć wartość null. Do programowania konsoli nie używałem wskaźników (inteligentnych lub surowych) od dłuższego czasu.

Krótko mówiąc, nie ucz ich wszystkiego, co może przysporzyć im kłopotów. Ucz iostreams, struktury, powiedz im, że tracą znaki także na typecastu i nie próbuj uczyć projektowania. Nie chcesz, aby ktokolwiek stał się doświadczonym profesjonalistą

użytkownik2528
źródło
0

To nie jest seria wykładów C ++, ale COMP1917 Richarda Bucklanda to doskonale wykonana seria wykładów na temat programowania w C (wraz z COMP1927 , strukturami danych).

Moim zdaniem, C ++ jest zbyt skomplikowane dla nowych studentów, ale C jest prostsze w świecie i zapewnia dobrą podstawę do programowania systemów, których nowym programistom C ++ zbyt często brakuje.

greyfade
źródło
0

Zaczynam od znacznych fragmentów kodu na płycie, pomagam im „zrobić coś fajnego” przy programowaniu i udoskonalić ich zrozumienie tego, jak rzeczy działają w czasie. Nie muszą doceniać ani rozumieć wszystkich zawiłości C ++, aby dioda LED mrugała. Muszą tylko wiedzieć, „jeśli umieścisz tam ten kod, spowoduje to mrugnięcie diody LED”. A potem „hej, porozmawiajmy o tym, czym jest teraz pętla, jeśli napiszesz pętlę, możesz sprawić, że dioda LED będzie mrugać 50 razy bez konieczności pisania 50 linii kodu, prawda?” Porozmawiajmy teraz o warunkach warunkowych, kiedy użytkownik naciśnie przycisk A na skrzynce kontrolnej, chcemy aktywować pneumatykę, aby podnieść flagę, oto jak dodamy do tego kod. Lub jeśli przełącznik 2 na naszej skrzynce sterowniczej jest włączony, uruchamiamy silnik wiertarki do tyłu zamiast do przodu.

Jeśli skupisz się na nauczaniu ich „na tyle”, aby rozwiązać problemy, którymi są zainteresowani, sprawi, że będzie to o wiele mniej przytłaczające i łatwiej dostępne. Jeśli są naprawdę zainteresowani i chcą zrozumieć zawiłości, prawdopodobnie wrócą i przeczytają obszerną książkę o programowaniu lub na letnim kursie szkolnym w lokalnym JC.

Zrób listę „rzeczy, które chcą kontrolować” na swoim robocie i zmień każdą z nich w lekcję… co najmniej powinni wiedzieć…?

  • zrobić coś „fajnie wyglądającego”, jeśli przełącznik znajduje się w określonym ustawieniu?
  • nakazać zaworowi pneumatycznemu otwarcie lub zamknięcie (np. przystawka chwytająca)?
  • włączać i wyłączać silniki wiertnicze (dla układu napędowego)?
  • sprawić, by robot zmienił kierunek, jeśli czujnik wykrywania przeszkody jest włączony?
  • sprawić, by robot przełączał się między trybami napędu na 2 koła a na 4 koła?
  • wyregulować czułość joysticka?
  • itp.

Trzymałbym się nauczać konstrukcji, które są najbardziej niezawodne, tak jak uczyłbym couta nad printf, ponieważ specyfikatory formatu są bardzo łatwe do pomieszania, a niepoprawny specyfikator jest często automatyczną receptą na awarię twojego programu. Podobnie wektor zaciemnia niektóre złożoności zarządzania pamięcią. Nie przejmuj się każdym szczegółem, jak to działa, lub czym jest biblioteka STL, przynajmniej muszą wiedzieć, aby osiągnąć X (co może wymagać na przykład użycia struktury danych biblioteki STL)

Jessica Brown
źródło
0

Użyj Jak zaprogramować C ++ przez Deitel i Deitel. DOSKONAŁY podręcznik według mnie.

Wygląda na to, że próbujesz nauczyć nowicjuszy, jak programować, a następnie pozwolić im programować na pewnym zaawansowanym poziomie w tym samym czasie. Jeśli masz nadzieję, że dasz im małpę, zobacz, jak małpa koduje fragmenty bez zrozumienia, że ​​jesteś skazany na porażkę.

Trzymaj się z dala od STL dla początkujących.

Jeśli masz już rozwiązanie kodujące dla swojego robota - lub BARDZO DOBRY POMYSŁ, jak to będzie wyglądać, być może możesz „przyporządkować” lekcje z podręcznika do zadań kodowania dla robota. Ale niech podręcznik napędza naukę.

Jeśli zmuszasz się do kodowania, dając uczniom bardzo wąskie lekcje i kontakt z językiem, myślę, że gdy ocean kodu, który piszesz, staje się coraz większy, to będzie tak, jakbyś dopiero nauczył się pływać w wiosłach i utoniesz, ponieważ PRAWDZIWE pływanie jest wymagane.

To nie jest pytanie „czy powinni się uczyć cout czy printf?” Jest to kwestia wystarczającej wiedzy, aby mieć wgląd w sposób pisania kodu dla danych zadań programistycznych do rozwiązania.

Gdyby to było zadanie do czytania, jakie byłyby wyniki, gdyby wszystko, co wiedzieli, to proste zdania z podmiotem i tylko połowa słownictwa, którego WIESZ, będzie wymagana.

radarbob
źródło