İlk kez lise öğrencilerine C ++ öğretmek: Çizgiyi nereye çekmek?


35

İLK Robotik Yarışması için lise öğrencilerinden oluşan bir ekibime danışmanlık yapacağım, buradaki çoğu takım C ++ kullanarak kendi robot yazılımlarını geliştirdi. Takımdaki öğrencilerin çoğu için bu programlamaya ilk girişleri olacaktır. Programlamayı öğretmek için C ++ 'ı seçmezdim (örneğin Python veya Javascript daha kolay olurdu) ama seçim yapıldı.

Onlara uygun C ++ 'ı (yani karışık bir C / C ++ lehçesinden, yani C +' dan kaçının) öğretmek istiyorum ancak onları gereksiz yere karmaşıklıkla korkutmak istemiyorum. Bu konuda:

  • İlk günden itibaren STL kullanmaya başlamalı mıyım, esp. vectorya da sadece standart dizileri ile sopa? Dizilerin tanıtılması daha kolay ancak işaretçi hatalarının yakalanması zor olabilir.
  • G / Ç için yapışmalı mıyım cout, vb. Öğrenmenin printfdaha kolay olacağını mı düşünüyorsun ?
  • C ++ için böyle genç öğrenciler için uygun herhangi bir çevrimiçi kaynak var mı?

Teşekkürler!

EDIT : Çok mükemmel cevaplar için teşekkürler. Birçok insan tarafından önerilen Hızlandırılmış C ++ 'a ek olarak , C ++' nın Herkes İçin mükemmel bir metin olduğunu gördüm .


52
Tanrım, lütfen kimseye javascript'i ilk dil olarak öğretme!
SoapBox 12:11

26
@SoapBox: neye karşı? Bence Javascript ilk dil olarak müthiş. Birkaç kod satırıyla ilginç şeyler yapabilirsiniz, başlangıçta genel öğrenen derleyiciler ve IDE'ler vb. Yoktur, test edilmesi ve hata ayıklanması kolaydır ve hem OO hem de fonksiyonel programlamayı destekler. Daha iyi ne olabilir?
kevin cline

7
Neden dizilerin tanıtılmasının daha kolay olduğunu söylüyorsunuz? Sanırım vektörler yeni gelenler için çok daha sezgiseldir, çünkü işaretçiler veya bunun gibi karmaşık bir şey hakkında düşünmeniz gerekmez.
Casey Patton

19
C ++ 'ı lise öğrencilerine öğretiyorsanız, çizgiyi çoktan aştınız.
tylerl

7
C ++ öğretisine alternatif COBOL değildir.
jhocking

Yanıtlar:


40

Bence dilin benzer diziler ve işaretçilerde oluşturduğu veri türleriyle başlamalısınız ve öğrencileriniz bunları anladığında derslere ve OO'ya, sonra da STL'ye geçmelisiniz.

Bunun nedeni, değişkenlere ve temeldeki bilgisayar mimarisine ek olarak insanlara dizileri anlayabilmeyi öğretebilmenizdir vector; STL'yi en baştan kullanıyorsanız, öğrencilerinizin vectortam olarak nasıl çalıştığı hakkında bir ipucu olmadan yaşamak zorunda kalacaklar . Ve o zaman bu noktaya geldiğinizde, kendi işaretçilerinizi, dizileri ve kendi vektör sınıfınızı yazmak, kendi bağlantılı liste sınıfınızı yazmak vb. özelliklerini takdir etmek ve kullanmak. Öğrenciler "bu nedir?" Dediğinde beni rahatsız ediyor. ve öğretmenler “görmezden gelin, daha sonra öğreneceksiniz” diyor.

Ve Demian yorumlarda da belirtildiği gibi , şablon hatalarından aldığınız nispeten şifreli mesajları deşifre etmek, dizilerden / şablon olmayan yapılardan alabileceğiniz hataları anlamaktan oldukça zordur.

Ben aynı şeyleri hissetmiyorum coutve printf. coutOperatör aşırı yüklemesi kullanması dışında hiçbiri diğerinden daha düşük bir seviye değildir .

Bu aptalca görünebilir, ancak insanlara soyutlamalar yapmadan önce her şeyin çok temel yapı taşlarını anlamalarını sağlamak konusunda kesinlikle fanatiğim . Ham işaretçilerle yetkin olana kadar, akıllı işaretçiler kullanmamalısınız, dizilerden önce vektör yok, böyle şeyler.

Bunu sık sık söylüyorum, ama tekrar söyleyeceğim: öğrencilere önce uzun bölümü öğretmek ve daha sonra bir hesap makinesi kullanmalarına izin vermekten sonra daha sonra onlara uzun bölümü öğretmek yerine bir hesap makinesi kullanmalarına izin vermek daha iyidir.

Kitaplara yeni başlayanlara öğretmek için , iyi C ++ kitaplarının ana listesine bakın .


4
Aslında aynı görüşündeydim ama Strousrup'un C ++ Öğretimi C ++ kitabına baktım ( stroustrup.com/Programming ) ve açıkça vectoraşırı dizilerin kullanılmasını savunuyordu . Ben ayrılıyorum.
recipriversexclusion 3

4
@recipriversexclusion: Açıkça belirtmek isterim ama Bay Stroustrup bir lise öğrencisinden çok uzakta ;)
Demian Brecht

14
AMAN TANRIM. Dünyada nasıl birisi dinamik olarak tahsis edilmiş dizileri manüel olarak manipüle etmenin, ne zaman std::stringve ne zaman std::vector? 32 C programcısı yukarı mı bakıyor? On yıldan beri C ++ 'a yeni başlayanlara programlama, Java’ya sahip olan öğrencilere ve programlama profesyonellerine ders veriyorum. Kullanıyorum std::stringve std::vectorilk günden itibaren. Onların doğuştan ne olursa olsun, kullanımı kolaydır. (VB'nin karakter dizisini öğretmekten
çekinmezsin

18
İşte sizin oyunuz. Bir evde yaşamanın yararlarının tadını çıkarmak için bir ev inşa etmeyi öğrenmek zorunda değilsiniz. Kullanabilmek için yazabilmek zorunda değilsiniz std::vector. Ve sınıflar C ++ 'ın son derece temel bir parçasıdır. Temel olmayan, yerel dizileri ve işaretçileri kullanacakları tüm bu hataları ayıklamak.
DeadMG 12:11

6
@DeadMG: Ev metaforu çalışmıyor. Bir evde, temel kurulduktan sonra bir daha asla düşünmek zorunda kalmazsınız. Sen sadece başka her şeyi inşa etmeye devam et. C ++, anlık Gördüğünüz newanahtar kelime, bellek yönetimi terrirory içine doğru geri konum. Ve çoğu zaman kütüphaneler işaretçiler ister ve kendinize sormanız gerekir, "bu sahiplenecek mi? Yoksa hala temizlemem gerekiyor mu?". Ayağımı kur Daha çok çivi, kalafat veya başka bir şey gibi.
Chris Eberle

38

Bu benim kendi tecrübem. Neye mal olursa olsun onu al.

Ben programlama başladığı zamana geri baktığımda, gerçekten bellek hakkında öğrenmiş isterdim ilk . Hayır, heyecan verici değil. Sizi sırlandırır. Ama öğretmesi gülünç derecede kolay bir kavram. Sadece bir üç boyutlu masa gösterin ve onları birkaç zihinsel alıştırmadan geçirin:

Ders 1:
Bu, 10 byte hafızadır. Bu "a" harfi, 3 numaralı hücreye giriyor. "A" değer, 3 ise adres. TAMAM? Bu, hücre 5'e konulan 3 sayısıdır. Değeri 3'tür ve adresi 5'tir. Şimdi 3 sayısı ne anlama geliyor? Peki bu sadece bir sayı 3 olabilir - ya da - adres 3'e referans olabilir . Tıpkı 1 numara olabilir ya da ülke kodu olabilir. Bu sadece bir rakam, hepsi nasıl davrandığımıza bağlı.

Ders 2:
İkili saymayı öğrenelim. İkili parmak sayımı kullanarak 10'a kadar sayalım. İlginç değil mi? Bunun sadece 4 parmağa ihtiyacı olduğunu gördün mü? Yani biz sadece 4 bit gerekli olduğunu söylüyoruz (1/2 hücre). Bir yandan güvenebileceğiniz en yüksek değer nedir (cevap 31'dir). 2 el nasıl (cevap 1023). Daha fazla bitin daha yüksek sayı aralıkları anlamına geldiğini açıklayın. Onlara bir bellek hücresinin 8 bit olduğunu hatırlatın. Bir sayı 8 bitten fazlasına ihtiyaç duyduğunda ne olacağını sorun. Çoklu bayt sayısını belleğe (mantıksal bir şekilde) nasıl koyarlar? Onları karakterlere, kısa filmlere, tam sayılara ve uzun sürelere tanıt.

Ders 3:
İşte C ++ ile yazdığım bir program. 32 bit tam sayı kullanır. Ve bu da bir sayı. Ancak bu işaret etmek için kullanılan bir sayıdır. Bu küçük yıldız işaretini kullanarak, numaranın işaretleme için kullanılacağına dair bir söz veriyoruz. Ve işte ilk rakamı nasıl göstereceğimiz. Küçük ve işareti bizim için değeri dolduruyor. Düzgün ha?

Et cetera. Temel hafızayı bir kez aldığınızda, her şey pastadır. Derleyicinin büyülü bir şey yaptığını varsayan (ya da asla hafıza yönetimi hakkında düşünmek zorunda olmadıkları) fakir öğrencilerdir. C ++ suları karıştırır, çünkü bazı şeyler otomatik olarak temizlenir (normal bir vektör), diğerleri ise (yani "yeni" kullanılarak tahsis edilen bir vektör). Ve beni dizgelere bile sokma (char * vs. std :: string - işaretçi bilgisi olmadan bunu açıklamaya çalış).

Robot rekabetinizin hangi platformu hedef alacağını bilmiyorum, ancak sınırlı bir bellek ortamı varsa, bellek yönetimi becerileri çok önemlidir.

DÜZENLE

Onlara temelleri öğrettikten sonra, evet diyorum ki C ++ 'a gidelim. Teknik olarak onlar sadece farklı kütüphanelerdir, fakat evet, onları birden fazla paradigma ile karıştırmanın bir anlamı yoktur. Onlara C ++ araçları (işaretçiler ve diziler içeren) verin.


Bu iyi hazırlanmış bir cevap. Sanırım sorun şu ki bunu öğretebiliyorsunuz ama birçok çocuk (ilk başta ilgi eksikliği nedeniyle işaretçi / bellek kavramlarıyla mücadele eden biriydim) sadece bunu çözecek, çünkü gerekli bilgi olmasına rağmen eğlenceli değil. başarıyla C ++ programlamak için.
Keith Layne

3
Evet, burada tartışma yok. Aynı sebepten dolayı çocuklar matematik ve coğrafyayı ayarlarlar. Ancak daha sonra dikkat etmeleri gerektiğinin farkındalar. Belli bir sorunun hala çözülmediğinden eminim.
Chris Eberle

+1. C ++ 'a girdikten bir süre sonra hafızanın nasıl çalıştığını anladığımı anladığımı hatırlıyorum. Olsa da, baştan anladığımı sanmıyorum (pratikte, değerlerin nasıl temsil edildiği gibi).
Cameron

+1, bu söylemeye çalıştığım şeydi, ama daha iyisi. Mekanik eğitimi verirken, sizleri sürüş uzmanı yapmadan önce motoru anlamaları gerekir .
Seth Carnegie

Evet, yeni başlayanların bunu kavrayıp kavramadığı konusunda ileri geri gidiyorum. Bu gülünç derecede kolay (ve birdenbire kendinizi "vay, bilgisayarlar gerçekten aptal makineler, öyle değil mi?") Diyerek buluyorsunuz. “Büyük resmi” görmemek, genel yaklaşımı bir parça zihin uyuşuk hale getirir.
Chris Eberle

31

İlk günden itibaren STL kullanmaya başlamalı mıyım, esp. vektör veya sadece standart dizileri ile sopa? Dizilerin tanıtılması daha kolay ancak işaretçi hatalarının yakalanması zor olabilir.

kesinlikle standart kütüphane türlerini kullanmaya gidin. a std::stringveya std::vectorsık sık kullanmaları gereken şeydir ve (bu uygulamaların büyük çoğunluğu) bu türlerin birçoğu öğrenciden soyutlarken bir çeşit hata saptama ve hata işleme şekli sunar.

Öğrencilere hafızanın nasıl yapılandırıldığını ve hafızanın nasıl yönetileceğini (C stili) öğreterek çokça zaman harcayabilir veya dilin deyimsel türlerini kullanarak doğrudan çalışmaya başlayabilir, daha sonra gerektiğinde uygulama ayrıntılarını açıklayabilir (ve Bir dizinin ne olduğunu ve nerede kullanıldığını daha iyi anlamak).

std::vector(create / read / write) sözdizimi, bir C dizisinden çok daha karmaşık değildir. Buna karşılık, manuel bellek yönetimi ve yeni öğrenenlerin C dizileriyle yaptığı tüm yaygın hataları öğrenmek, öğretmek ve kullanmak çok daha zor.

G / Ç için koya, vb. Bir yere yapıştırmalı mıyım, yoksa printf öğrenmenin daha kolay olacağını mı düşünüyorsunuz?

cout. şahsen, bence coutöğrenmesi daha kolay. belki de daha önemlisi, coutdaha güvenli, çok yönlü ve bir nesnenin nasıl basılacağını tanımlamanıza izin verdiğiniz için seçmelisiniz, bu, bazı standart kütüphane türlerini kullanarak yerleşik işlevlere ve çeşitliliğe sahip olduğunuz anlamına gelir. Sonunda, coutek olarak öğrenmeleri gerekebileceğini fark ettiğinizde, karma programlarla son bulacaksınız printf.

Aslında, Acelerated C ++ 'ı Koenig ve Moo tarafından okumalı ve muhtemelen öğretim için kullanmalı (3. soruyu dolaylı olarak cevaplayarak). Kitapta std::couthemen önce tanıtıldılar return(sayfa 3) ve 10. bölüme kadar işaretçilerden ve dizilerden tasarruf ettiler . Eğer bu kitabın önsözünü kopyalayıp yapıştırabilirsem sorunuzu yanıtlardım. (not: c ++ öğretiminin bakış açısı için okumanızı tavsiye ederim).

İşte Düzenle Önsöz

C ++ için böyle genç öğrenciler için uygun herhangi bir çevrimiçi kaynak var mı?

Eğer Accelerated C ++ (genel olarak programlama ile ilgili bir arka plan varsayan) kullanmak istemiyorsanız, belki Eckel'in C ++ 'ta Düşünmesini isteyebilirsiniz . Okumadım ama serbestçe dağıtılmış bir C ++ tanıtım metni.


1
1 ... ve LOL'd "onlar tanıtmak std :: cout sadece getiri (sayfa 3) önce" sert o biri :) içine lazım gözetleme
Felix Dombek

1
@Felix ve doğrudan std::couttanıtılmadan önce , kaşlı ayraçlar tanıtılır =) (her yerde "Merhaba, Dünya" nın basit bir diseksiyonu)
justin

1
Ben yürekten ikinci Koenig ve Moo kitabının tavsiyesinde ikinci. Hem C ++ öğretmeyi hem de programlamayı hedefler. Bruce Eckle'ın C ++ düşüncesi, öncelikle C ++ 'ı daha önce deneysel dili olanlara (C ya da Temel) sahip olanlara öğretmeyi amaçlamaktadır.
Stephen C. Steel

11

Dikkate alınacak bir şey, tipik FIRST kodunda, herhangi bir formdaki veri yapılarının (yapılar, sınıflar, diziler, vektörler, listeler) çok küçük bir rol oynadığıdır. Genellikle çok az miktarda sensör verisiyle ilgilenirsiniz ve çok az miktarda aktüatör hareketine karar vermek için kullanırsınız.

Ancak , büyük bir rol oynamakta olan ve anlaşılması çok zor olan şey, devam eden farklı kontrol biçimleridir .

Bu yüzden kontrole çok önem verdim. Temelleri ile başlayın: if, for, while. Bunları çok uygulamalarını sağlayın. Onları iyi tanımalarını sağlayın ....

... ama sonra zorlaşıyor. Orta büyüklükteki herhangi bir robot kodu, nihayetinde daha zorlu kontrol modellerine ulaşır:

  • Her şeyi çağıran büyük "ana" döngü

  • Devlet makineleri (bunlar çok ortaya çıkıyor)

  • Önceki değerleri / çalışan sayacı kaydetme (PID'deki gibi)

Bunlar yeni başlayanların anlaması zor. Bir programın böyle bir kod içinde nasıl hareket ettiğini düşünmek kafa karıştırıcıdır, şimdi farkına varmayabilirsiniz, ama öyle. Öğrencilerinize dilin kendisinden daha fazla sorun çıkaracak.

Ayrıca, iyi şanslar! Umarım sezon iyi gider.


2
+ 1; bu normal bir masaüstü ortamı değil, gerçek bir gömülü koddur. Durum makineleri std :: vector ve dizilerden çok daha önemlidir.
MSalters

8
  • İlk günden itibaren STL kullanmaya başlamalı mıyım, esp. vectorya da sadece standart dizileri ile sopa? Dizilerin tanıtılması daha kolay ancak işaretçi hatalarının yakalanması zor olabilir.

Dizilerdeki sorun, basit ders kitabı örnekleri dışında herhangi bir şeyin dinamik boyutlu diziler gerektireceği ve dinamik boyutlu dizilere ihtiyaç duyduğunuz anda std::vectorçok daha kolay olmasıdır. Ayrıca, dinamik olarak boyutlandırılmış dizileri güvenle ele almanın tek yolu, bunları kendi sınıfınıza sarmaktır; bu da kötü bir std::vectorsökülme olur.
Açıklanamayan popüler inancın aksine, öğrenciler, bu canavarların kendilerinin nasıl uygulanacağını bilmeden, karmaşık mekaniği gerektiren özellikleri kullanabilirler . Bir yorumda dediğim gibi: Sadece onların uygulamalarının karmaşık olması nedeniyle, diğer dillerde dize öğretmemeyi düşünmezsiniz bile, değil mi?

  • G / Ç için yapışmalı mıyım cout, vb. Öğrenmenin printfdaha kolay olacağını mı düşünüyorsun ?

Neden yanlış bir anı yakaladığınız anda programınızı çatıdan havaya uçuran bir dizi arkaik dizi dizgisi kuralları (ki typedefbazı görünüşe göre ilgisiz bir başlıkta değişiklik yaptığınız an olur ) tip güvenliğine tercih edilir std::cout?

  • C ++ için böyle genç öğrenciler için uygun herhangi bir çevrimiçi kaynak var mı?

C ++ kaynaklarının çoğu, çevrimiçi olsun ya da olmasın, kötüdür. Ve okunması zor fontları veya dilleri kullanmaktan bahsetmiyorum. Göze batan bariz gerçek hatalardan bahsediyorum. Çok az sayıda iyi C ++ kaynağı var, çoğunlukla bir veya iki düzine kitap . Çevrimiçi olduğunu bildiğim tek şey Bruce Eckel'in C ++ 'da Düşünmesi .


On yıldan beri, Koenig / Moo's Accelerated C ++ 'ı temel olarak kullanan, çok farklı geçmişe sahip öğrencilere C ++' ı öğrettim . Kursum bu on yılda çok değişti, temel prensip dışında kitabın hiçbir yerinde yok: En başından beri modern, doğru, güvenli deyimleri kullanın. Öğrencilerinize hafızayı nasıl elle değiştireceklerini öğretmeyin, daha sonra daha güvenli deyimler lehine öğrenmelerini sağlayın. Burada verilen cevapların bazılarında görebileceğiniz gibi, bu işe yaramadı: İlk önce manuel yollarla öğretilenler, modern, güvenli deyimler kullanmanın avantajını nadiren anlayacaktır.


7

Eğer C ++ 'ı öğretmek istersen, printf gibi C altkümesi yerine doğrudan C ++ yapıları ile vector ve cout olarak başlayacağım.


7

İlk günden itibaren STL kullanmaya başlamalı mıyım?

Evet. C ++ 'da yerel dizilerin kullanılması hataya açıktır ve zamanın% 99'unda basit bir uygulama değildir.

G / Ç için koçan gibi yapmalı mıyım?

Evet.

C ++ için böyle genç öğrenciler için uygun herhangi bir çevrimiçi kaynak var mı?

Çok genç değiller. Programlamayı öğrenmek, bilgelik, sadece motivasyon ve açık bir zihin gerektirmez. Lisenin son iki yılında öğretilen bir öğrenciyi programlamayı öğrenmesi için hazırlayacak bir şey düşünemiyorum. Bruce Eckel'in Düşüncesini C ++ 'da gördün mü? Ücretsiz indirmek için kullanılabilir ve çok iyi yorum. Lütfen popüler ama korkunç C ++ 'dan kaçının : Sam'in Nasıl Programlanacağı ve Sam'in Kendini Öğretme C ++ ... kitapları.


5

O halde ben, bir ilk programlama dili olarak lisede C ++ öğretildi oldu daha "C +" gibi, şimdi sen söyleyince; coutKonsola ve dosyalara metin yazmak için kullandık , fakat aynı zamanda epeyce C fonksiyonunu kullandım ( getch()favorim).

Temel bilgileri öğretmenin en etkili (ve muhtemelen eğlenceli) yolunun hedef odaklı bir müfredat kullanmak olduğunu düşünüyorum: bir şeyler nasıl yazılacağını, sonra klavye girişini, sonra basit dosya giriş / çıkışını, vb. Göstererek başlayın. tabanlı oyun (veya robotik eşdeğeri). Sonra, "X'i nasıl yaparım?" Diye sorduklarında, daha önce gördükleri örnekler açısından X'i parçalayabilirsiniz, örneğin, "Önce Z'de yaptığımız gibi kullanıcıdan girdi almanız gerekir, sonra" 3D grafik 'ama yine de nasıl açıklayabilir ..." X olasılıkla onlar, örneğin yapmak için ek bilgiye ihtiyaç şey olacağından (belli ki bu pratikte kolay değil' olacağını yüksek seviyede çalışmak yön).

Onlara göstereceğiniz örnekler, kara kutu kopya yapıştırılmış büyü olarak başlayacak ve programlama bulmacasının parçaları yavaşça çözüldüğü için gizemleri çözülecektir. Örneğin, öğrencileriniz ifoldukça hızlı bir şekilde temellerini öğreneceklerdir , ancak muhtemelen bir boolean ifadesinin yalnızca bir ifkoşulda (klasik if (blah) return true; else return false;koda neden olacak şekilde) kullanımıyla sınırlı olmadığını farketmeyeceklerdir .

Bir dizi veya vektörü bir kap olarak seçip seçmemenizin incelikleri, ilk başta öğrencilerle ilgisiz görünecektir. Bir vektör / dizi, bir indeks üzerinden erişilebilen, bir değişken olarak birçok değişkene sahip olmanın bir yolu olacaktır. Yapabileceğin bir yere yap. İşaretçiler de daha sonraya kadar anlaşılmayacak. Bu şeyleri açıklamaman gerektiğini söylemiyor; Sadece bir kerede her şeyi açıklayamazsınız ve açıkladığınız şeyler tamamen emilmez. İnsanlar doğrusal olarak değil organik olarak öğrenirler. Operatör aşırı yüklemesinin ne olduğunu tam olarak anlayabilmek coutiçin birkaç senedir kullanıyordum !

Oh, ve tekrar etmekten korkma. “Bu yaptığımız Hello World programı gibi - konsola nasıl yazı yazdığımızı hatırlıyor musun?” (hayır ...) "Sadece emin olmak için tekrar geçelim." ... Ve sorular sorun! Öğrencileri eğlenceli örnekler ve çok fazla etkileşimle meşgul edin.

C ++ karmaşık bir dildir ve ne yaparsanız yapın, bu karmaşıklığın (ve genel olarak programlama zanaatinin) önemli bir kısmı öğrencilerinizde kaybolacaktır. Onlara gösterdiğiniz her şey onlar için yeni olacaktır; çoğu derin bir anlayış düzeyinde (en azından hemen değil) batamaz. Hafıza nasıl çalışır, bir PC'nin bileşenleri nasıl etkileşir, yığın ve yığının ne olduğu, işaretçiler, sınıflar, hatta döngüler ve eğer varsa zincirler çoğunluk tarafından tam olarak anlaşılmaz . Tamamdır! Kullanıldıkları anlaşılmayacaklar - süper çirkin 1000-line fonksiyonlarla, beşli-yuvalanmış yedekli ifs ve bunun gibi 43 değişkenli inanılmaz sayıda harika program yazılabilir x_2r. Önemli olan, öğrencilerin sürekli öğrenmeleri ve gelişmeleridir.. Siyah kutular uzun vadede şeffaf (veya en azından yarı saydam gri) olduğu sürece iyidir. Kursun sonunda, tasarım patlayıcılarının ne olduğunu bilemeyebilirler, ancak ilk birkaç hafta içinde yazdıkları programlara tekrar bakabilmeli ve kodlarını zorlayabilmelidirler . Yazdıkları ilk programın gerçekte nasıl çalıştığını çok ayrıntılı bir şekilde anlamalıdırlar (oysa yazdıkları hakkında hiçbir fikirleri yoktu). Fakat henüz her şeyi bilemeyecekler - henüz .


5

Hayatımda liseden üniversiteye kadar bir sürü programlama dersi aldım. İlk c ++ sınıfımdan bir şeyi akışa yazdırmadan başka bir şey öğrenmedim diyebilirim.

Yalnızca son birkaç yıldır geliştirici olarak gerçek bir işi olan genç bir öğrenci olarak benim tavsiyem, üzerine aşağılık şeyler yapmamaktır. Onlara ne yaptıklarını ve işletim sistemi seviyesine nasıl düştüğünü söyleyin (comp eng IMO'ya girmenize gerek yoktur).

Onlara C öğretmenin bunun için daha iyi bir yol olduğunu düşünüyorum (bildiğiniz gibi hala neredeyse her zaman C ++ olarak derlenir). Onlara terminalin gerçekte ne olduğunu, programlarının onunla nasıl etkileşime girdiğini, bir dizgenin bellekte \ 0 ile biten bir karakter dizisi olduğunu, malloc'un ne olduğunu ve C ++ 'ın onu nasıl soyutladığını, bir karakterin ve int'nin bellekte nasıl depolandığını öğretir. , vb… Bunlar, birinin gelişimde karşılaştığı bir problemi nasıl çözeceğini gerçekten bilmesini sağlayan şeydir.

Çocukların programlanmasına izin vermenin ve esas olarak soruları yanıtlamak için orada olmanın önemini vurgulayamıyorum. Benim tecrübeme göre, onu kullanarak bir dil öğreniyorsun. Kitaplar ve dersler yararlı olabilir ve başlamak için gereklidir, ancak sonunda, onlara bir C / C ++ dosyası ver ve şunu söyleyeyim: Bu bir X örneğidir, Y yapmanı istiyorum (ki bu yapılabilir) X'i keserek). Onlara man sayfalarının nasıl kullanılacağını gösterin (* NIX kullanıyorlarsa) veya cplusplus.com'a gösterin ve std lib'lerini keşfetmelerini sağlayın.

TL; DR Çocukların kendilerini öğretmelerine izin verin. Yapı sağlamak ve soruları cevaplamak için orada olun.

Ayrıca: Bağlantılı listeler gerçek!


4

Onlara genel bir şekilde programlama öğretmiyorsunuz, onlara Robots ve benzerlerini kullanarak bir çeşit gömülü programlama öğretiyorsunuz. Eğer doğru anladıysam.

İlk olarak, hangi kütüphaneleri kullanacağınızı ve neye ihtiyacınız olduğunu kontrol etmeniz gerektiğini düşünüyorum.

Kullanmak için bir C kütüphaneniz varsa veya çok fazla işaretçi ve C dizisi olan C-benzeri varsa, onlara nasıl kullanacağınızı veya neden kullanacağınızı öğretmenin bir yoluna ihtiyacınız olduğunu sanırım.

Ancak, dizeleri ve vektörlerle başlamalarını sağlamak için bazı basit kodları gösterebilirsiniz, C ++ bu şekilde çalışır. Bu onlara göstericileri öğretemeyeceğiniz anlamına gelmez.

Belki de STL ile düşük seviye C ++ (C'ye benzeyen) ve yüksek seviye C ++ arasındaki farkları açıklığa kavuşturmalısınız. Yeni başlayanlar için C ++ 'daki en zor şeylerden biri, C'nin, C ++ ve farklı sistem API'lerinin ne olduğunu görmektir.

Buradaki amaç genel programlamayı öğrenmek değil, bir Robot yarışmasına katılmak olarak, öğretiyi bu şekilde yönlendirdim.


2

Geçen yıl geç saatlerde C ++ öğrencilerine ve bu yaz da İLK Robotik Ekibimiz için ders vermeye başladım.

Stroustrup'un Programlama - İlkelerini ve Uygulamasını C ++ Kullanarak Kullanıyoruz . Kitabın ulaşılabilir, okunabilir ve iyi organize olduğunu gördüm. Bölümlerde 6 öğrenciyi kendi başlarına okuduk. Onlara terminoloji ve sorular konusunda yardımcı olmak için oradayım. Kitaptaki bütün alıştırmaları yapıyorlar.

Öğrencilerin 14. bölümden geçmesini sağladım. Bölümleri akışlarla atlama (FRC programlaması için kullanışlı değil). 14. bölüm boyunca faydalıdır çünkü alt sınıflara giriş yaparlar. Ancak, alt sınıflarla ilgili yapıcıları ve yıkıcıları daha iyi anlamak için muhtemelen kitapta daha ileri gitmeleri gerekir.

Öğrencilerinizi küçümsemeyin. Öğrenciler, kitabı okumaktan, okumaktan, alıştırma yapmaktan ve alıştırma yapmaktan mutluluk duyarlar; ve bu yaz boyunca kendi zamanlarında oldu! Anlayamayacak birçok öğrenci var. Başka bir şeye geçmeleri gerekir; herkes programlamayı anlamaz.

En büyük engel dil veya kitap değildir; bu gelişme ortamı. Visual Studio Express, ilk kez kullananlar için göz korkutucu olabilir. Öğrencilerin çevre yerine programlamaya odaklanmalarına yardımcı olabilirsiniz. Bununla birlikte, programcılar yeni geliştirme sistemlerine uyum sağlamak için çok zaman harcadıkları için çevreyi öğrenmek değerlidir.

İyi şanslar.


+1: Şimdiye kadar en iyi cevap. Mükemmel ders kitabı seçimi. Başarın için tebrikler.
kevin cline

1

Onlara C ++ 'ı öğretmek istediğinizi ama herhangi bir C yapısını öğretmek istemediğinizi söylüyorsunuz, ancak ilk önce bilmeleri gereken programlama yapılarının çoğu tüm diller için ortak ve C ++ sürümleri C'ye dayanıyor:

  1. Bu şekilde bir program yaptınız [int main (..) {return 0; }]. Onların da denemelerini istediğiniz programlama ortamına genel bir bakış verin. Bir projenin nasıl yapıldığını bilmeleri ve gerçekten onu derlemeleri / çalıştırmaları gerekiyor.

  2. Bu bir değişkendir. Değişkenler verileri saklayabilir (int, char, float, vb.).

  3. Dizeler (C ++ olanlar cin ile kullanmak daha kolaydır).

  4. Verileri böyle okuyup yazıyorsunuz (cin, cout). "Merhaba,% s!"

  5. Şartlı Cümleler (bilgisayar karar vermeli).

  6. Döngüler (bilgisayarlar aynı şeyi tekrar tekrar yapmakta iyidir). Süre ve döngü için göster.

Her biri yaklaşık iki saat sürecek. Pratik bileşende başvurabilecekleri kısa bir not seti hazırladığınızdan emin olun. Onları mükemmel programcılar yapmaya çalışmıyorsunuz, bu yüzden konsoldan nasıl okunacağına, yapılar oluşturacağınıza ve yapmaları gereken her şeye örnekler verin. Özel yardımcı program kütüphanelerini değil, yalnızca dil destekli özellikleri kullanın. Onları sadece daha fazla karıştıracaksınız.

Baştan sona örnek olarak liderlik edin ve onlara iyi düzenlenmiş kod örnekleri gösterin. Girintiler doğru, desteklemeli ve en rahat kullandığınız stildeki parantez içinde olmalıdır. Değişken isimleri anlamlı olmalıdır. Eğer bir örnek olarak slop gösterirseniz o zaman slop'un kabul edilebilir olduğunu öğrenirler. Kötü bir başlangıç ​​noktası. Doğru girmenin önemini vurgulayın - Ben öğrettiğim partinin kodunu tutarlı bir şekilde girintilediğinde, nerede yanlış yaptıklarını kolayca görebildiklerini gördüm. Bunun nedeni, hatalarının çoğunun işlemler için yanlış bir kapsam olmasıydı (işlemleri, olması gerekmeyen döngülere / koşullara koyarak ya da tersi ile).

Sonra pratik çalışmaya devam edin. Bir şeyi öğrenmenin en iyi yolu onu kırmak ve nedenini bulmaktır. Kodlarını derlemek için kullanımı kolay bir ortama sahip olduklarından emin olmak istersiniz. Elinizdeki ekran görüntüleri ile belgelendirin.

Bazı kavramları anlamama yardımcı olan iyi bir örnek, bir Kola makinesi oluşturmaktı:

  • Maddelerin ve fiyatların bir menüsünün çıktısını alma (menünün kaydedilmesi kullanıcı tanımlı bir yapı dizisiydi. C ++ 'da bir sınıf olabilir). Çıktı için bir döngü gerekli.
  • Kullanıcının seçiminde okuyun.
  • Kullanıcıdan para isteyin. Sadece kuruş para cinsinden girebilirler (Aus'ta 1, 5, 10, 20, 50, 100, 200). Bilinmeyen mezhepleri yoksay. Kullanıcı yeterince para yatırmamış olsa da sormaya devam edin (döngüler).
  • Gerekli olan değişimi hesaplayın (modulo bölme), en az sayıda para vererek. Çıkışı ekrana yazdırın.
  • Bir sonraki kullanıcı için bekleyin.

Bundan sonra C ++ yapılarına geçebilirsiniz; En azından temel bir program yapmadan önce çok uzağa dalmak istemezsiniz.

Her şeyden önce, sorulara ayırmak için çok fazla boş zamanınız ve sabrınız var. Pek çok insan olacak ve bunların çoğu sizi cüppeleştirecek çünkü cevabın sizin için açık olduğu kadar önemsizler.


1

Bence şeyleri C ++ bakış açısından ("C ++ merhaba dünya") değil, problem alanından - bu durumda robotik - bakış açısıyla öğretmelisiniz. Bu yüzden, merhaba dünyanız bir led yanıp sönüyor ya da bir motor kullanıyor olabilir.

Elbette, her bir küçük robotik görevini, türleri, işlevleri ve GÇ işlemlerini içeren, kavramsal olarak anlamlı artan C ++ eylemleri alt kümesinde ayrıştırabilir / ayrıştırmalısınız.

Kendime gelince, ben profesyonel bir programcı değilim ve Java, C ++ ve Python'u öğrenmeye çalıştım. Çözmem gereken gerçek (basit) problemlerim olduğunda gerçekten bir şey (Python) elde etmeye başladım. Bu beni doğrudan konuya götürdü, dilin kendisinin tesadüfi uygulama detaylarına aşırı dikkat göstermekten kaçındı.

Bu yüzden tavsiye ederim: bir dilin kılavuzunu okumayın, bunun yerine tercih ettiğiniz dili kullanarak bir şeyler yapmayı öğrenin. İnsanları motive eden şey bu, sanırım.


0

Sıkı C ++ 'ı öğretirdim. Printf yazıp küçük paramlara veya yanlış bir türe ne zaman verirsiniz, garip bir şey olur mu? ve geçersiz işaretçiler kullanırsanız kötü şeyler olabilir? BU ÖĞRETMEYİN

İlk günden itibaren referansların nasıl kullanılacağını öğreteceğim, STL ve işaretçiler kullanmak için MARKS LOSE diyorsunuz. Akıllı göstericilere de öğretmeyin. İşaretçileri kullandığımı fark ettiğim tek zaman GUI yaptığım zamandır ve nesneler (bir görüntü kutusu gibi) var olmalı ve geçerli bir resim ya da boş olmalıdır. Konsol programlama için uzun zamandır işaretçiler (akıllı ya da ham) kullanmıyorum.

Kısacası, onlara sorun çıkarabilecek hiçbir şey öğretmeyin. İyi akışları öğretin, yapıları, onlara da tipografi üzerindeki işaretleri kaybettiklerini söyleyin ve tasarım öğretmeye çalışmayın. Kimsenin deneyimli bir profesyonel olmasını istemezsiniz


0

Bu bir C ++ ders dizisi değildir, ancak Richard Buckland'ın COMP1917'si C'de programlama üzerine mükemmel bir şekilde hazırlanmış bir ders dizisidir (ardından COMP1927 , veri yapıları ile birlikte).

Benim düşünceme göre, C ++ yeni öğrenciler için çok karmaşıktır, ancak C dünyaları daha basittir ve yeni C ++ programcılarının sık sık yoksun olduğu sistem programlamada iyi bir temel sağlar.


0

Kayda değer kodun önemli parçalarıyla başlayacağım, programlamaya hemen "iyi bir şey yapmalarına" yardımcı olacak ve zaman içinde işlerin nasıl yürüdüğünü anlayabileceksiniz. Bir LED'in yanıp sönmesi için C ++ 'ın tüm inceliklerini anlamak veya anlamak zorunda değiller. Sadece bilmeleri gerekir "eğer bu kodu oraya koyarsanız, LED'in yanıp sönmesini sağlar." Ve sonra "hey, şimdi bir döngünün ne olduğu hakkında konuşalım, bir döngü yazarsanız, LED'in 50 satır kod yazmak zorunda kalmadan 50 kez yanıp sönmesini sağlayabilirsiniz, değil mi?" Şimdi şartlar hakkında konuşalım, kullanıcı kontrol kutusundaki A tuşuna bastığında, bayrağı kaldırmak için pnömatikleri etkinleştirmek istiyoruz, işte bunun için kod ekleyeceğiz. Veya kontrol kutumuzdaki anahtar 2 açıldığında, matkap motorunu ileri yerine tersten çalıştırırız.

İşleri, ilgilendikleri sorunları çözmeleri için onlara "yeteri kadar" öğretmeye odaklanırsanız, işleri daha az ezici ve daha ulaşılabilir hale getirir. Gerçekten ilgileniyorlarsa ve inceliklerini anlamak istiyorlarsa, muhtemelen geri dönecekler ve yerel JC'de programlama veya yaz okulu kursu alma konusunda kapsamlı bir kitap okuyacaklar.

Robotları üzerinde "kontrol edebilmek istedikleri şeyler" in bir listesini yapın ve her birini bir derse dönüştürün ... bilmeleri gereken en az şey nedir ...?

  • Bir anahtar belirli bir ayardaysa "cool görünümlü" bir şey yapmak?
  • pnömatik bir valfe açılmasını veya kapanmasını söyleyin (örneğin: bir tutucu bağlantı parçası)?
  • Matkap motorlarını açın ve kapatın (aktarma organları için)?
  • Bir engel algılama sensörü etkinleştirilmişse robotun yön değiştirmesini sağlayın?
  • robotu 2 tekerleğe karşı 4 teker sürüş modu arasında değiştirir mi?
  • joystick'in hassasiyetini ayarlamak
  • vb.

Biçimlendiricilerin karıştırılması çok kolaydır ve yanlış bir belirtici programınızı çökertmek için otomatik bir reçetedir, çünkü printf üzerinden cout öğretirim gibi en kusursuz olan yapıların öğretilmesine sadık kalacağım. Aynı şekilde, vektör bellek yönetimi karmaşıklıklarının bir kısmını da şaşırtıyor. İşlerin nasıl yürüdüğü ya da STL kütüphanesinin ne olduğu hakkında her konuda endişelenmeyin, sadece X'i başarmak için bilmeleri gereken en az şey (örneğin bir STL kitaplığı veri yapısının kullanılması gerekebilir)


0

Kullanım Programı C Nasıl ++ Deitel ve Deitel tarafından. Mükemmel ders kitabı bence.

Görünen o ki acemilere nasıl program yapmaları gerektiğini öğretiyorsunuz ve aynı zamanda aynı zamanda ileri bir seviyede program yapmalarını sağlıyorsunuz. Eğer onlara biraz maymun vermeyi umuyorsanız, maymun görmek başarısızlığa mahkum olduğunuz bir anlayışı olmayan kod parçacıklarını kodlayın.

Yeni başlayanlar için STL'den uzak durun.

Robotunuz için zaten bir kodlama çözümünüz varsa - veya nasıl görüneceğine dair ÇOK İYİ BİR FİKİR varsa, belki de ders kitabındaki dersleri robotun kodlama görevleriyle "eşleştirebilirsiniz". Fakat ders kitabının öğrenmeyi yönlendirmesine izin verin.

Kodlamayı zorlarsanız, öğrencilere çok dar dersler verir ve dile maruz kalırsanız, o zaman yazdığınız kod okyanusu büyüdükçe büyüyünce, sadece köpek küreklerini öğrenmiş gibi olacaksınız ve boğulacaksınız çünkü GERÇEK yüzme gerekli.

Bu "cout ya da printf öğrenmeli mi?" Sorusu değil. Verilen robot programlama görevleri için nasıl kod yazılacağı konusunda fikir sahibi olmak için yeterince öğrenme meselesi.

Bu bir okuma atama olsaydı, sonuç bildikleri tüm basit özne-fiil cümleler vardı ve sadece yarım kelime eğer ne olurdu BİLMEK gerekecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.