初めて高校生にC ++を教える:どこに線を引きますか?


35

FIRST Robotics Competitionの高校生のチームを指導します。ほとんどのチームは、C ++を使用してロボットソフトウェアを開発しています。チームの多くの学生にとって、これはプログラミングの最初の紹介となります。私はプログラミングを高校生に教えるためにC ++を選択しなかったでしょう(例えば、PythonやJavascriptのほうが簡単だと思います)が、選択は決まっています。

私は彼らに適切なC ++を教えたい(つまり、C / C ++の混合方言、つまりC +を避けたい)が、不必要な複雑さでそれらを怖がらせたくはない。そのことについては:

  • 特に、初日からSTLの使用を開始する必要があります。vectorまたは単に標準配列に固執しますか?配列を導入する方が簡単ですが、ポインターエラーをキャッチするのは難しいかもしれません。
  • I / Oについてはcout、などに固執すべきprintfですか、それとも習得しやすいと思いますか?
  • このような若い学習者に使用するのに適したC ++のオンラインリソースはありますか?

ありがとう!

編集:非常に多くの優れた答えをありがとう。多くの人から推奨されているAccelerated C ++に加えて、C ++ For Everyoneは素晴らしいテキストであることがわかりました。


52
ああ、ジャバスクリプトを第一言語として教えないでください!
-SoapBox

26
@SoapBox:何とは対照的に?Javascriptは第一言語として素晴らしいと思います。数行のコードで興味深いことができます。コンパイラやIDEなどを学習するスタートアップオーバーヘッドはありません。テストとデバッグが簡単で、オブジェクト指向プログラミングと関数型プログラミングの両方をサポートします。何が良いでしょうか?
ケビンクライン

7
なぜ配列は導入しやすいと言うのですか?ポインターやそのような複雑なものについて考える必要がないため、ベクターは初心者にとってはるかに直感的だと思います。
ケーシーパットン

19
高校生にC ++を教えている場合は、すでに境界線を越えています。
タイラー

7
C ++を教えることに代わるものはCOBOLではありません。
11

回答:


40

言語に組み込まれている配列やポインターのようなデータ型から始めて、生徒がそれらを理解したら、クラスとオブジェクト指向、そしてSTLに進むべきだと思います。

その理由は、変数と基礎となるコンピューターアーキテクチャ以外に他の多くを理解することなく配列を理解するように人々に教えることができるが、vector最初にクラスを教えることなく理解することを教えることはできないからです。最初からSTLを使用する場合、生徒はvector正確にどのように機能するかについての手掛かりを持たずに生活する必要があります。そして、そのポイントに到達すると、必要なポインターや配列、および独自のベクタークラスの作成、リンクリストクラスの作成などの操作から得られるものを十分に把握できなくなります。その機能を評価して活用する。学生たちが「それは何ですか?」と言うと困ります。教師は「それを無視してください。後で学習します。」

そして、デミアンがコメントで指摘したように、テンプレートエラーから得られる比較的暗号化されたメッセージを解読することは、配列/非テンプレート構造から得られるエラーを理解するよりもはるかに困難です。

私は約同じように感じていないcoutprintfcout演算子のオーバーロードを使用する場合を除き、どちらも他のレベルよりも低いレベルではありません。

これはばかげているように思えるかもしれませんが、抽象化に移る前に、すべてのものの非常に基本的な構成要素を人々に理解してもらうことは絶対に狂信的です。生のポインターに精通するまで、スマートポインターを使用しないでください。配列の前にベクターはありません。

私はこれをよく言いますが、もう一度言います。生徒に電卓を使わせてから後で長い目盛りを教えるよりも、最初に生徒に長い目盛りを教えてから電卓を使わせる方が良いです。

初心者向けの書籍については、優れたC ++書籍のマスターリストを参照してください。


4
私は実際には同じ意見でしたが、StrousrupのTeaching C ++本(stroustrup.com/Programming)を見て、彼は明示的にvectorover arrayの使用を推奨しています。破れた。
recipriversexclusion

4
@recipriversexclusion:明らかなことを述べているだけですが、Stroustrup氏は高校生とは程遠い ;)
デミアンブレヒト

14
ああ、神様。どのように世界の缶に誰がありますときには、手動で動的に割り当てられた配列を操作すると、C ++の「最も簡単な、最初の」ルートかもしれないと思うstd::stringstd::vector?!32人のCプログラマーは賛成ですか?私は、プログラミングの初心者、Javaの1年間を経験した学生、およびプログラミングの専門家に10年間C ++を教えてきました。私が使用std::stringし、std::vector初日から。内臓が何であれ、使いやすいです。(VBの弦は内側が複雑すぎるため、VBの弦を教えることを
ためらわ

18
これがあなたの下票です。家に住むことの利益を享受するために家を建てることを学ぶ必要はありません。std::vector使用できるようにするために書くことができる必要はありません。また、クラスはC ++の非常に基本的な部分です。基本的ではないのは、ネイティブ配列とポインターを使用して取得するエラーをすべてデバッグすることです。
DeadMG

6
@DeadMG:家のメタフォアは機能しません。家では、基礎が構築されると、もう一度考える必要はありません。他のすべてを構築するだけです。C ++では、インスタントあなたが見るnewキーワードが、あなたはメモリ管理terriroryに右の背中をしています。多くの場合、ライブラリはポインターを要求し、「それが所有権を取得するのか、それともクリーンアップする必要があるのか​​」と自問する必要があります。私の足の基礎。爪やコーキングのようなもの。
クリスエバレ

38

これは私自身の経験です。それが価値があるものは何でもそれを取る。

私がプログラミングを始めたときを振り返ってみると、まず記憶について学んだことを願っています。いいえ、エキサイティングではありません。それはあなたをgl薬にします。しかし、教えるのはとてつもなく簡単な概念です。1次元のテーブルを見せて、いくつかのメンタルエクササイズを行ってください。

レッスン1:
これは10バイトのメモリーです。これは、セル番号3に入力される文字「a」です。「a」は値であり、3はアドレスです。OK?これは、セル5に入れられる3番です。その値は3、アドレスは5です。まあ、それは単なる数字の3である可能性があります-または-それはアドレス 3 への参照である可能性があります。1が数字であるか国コードである可能性があります。それは単なる数字であり、それは私たちがそれをどのように扱うかにかかっています。

レッスン2:
バイナリで数えることを学びましょう。バイナリフィンガーカウントを使用して10までカウントしましょう。面白くない?4本の指だけで必要なことをご覧ください。したがって、必要なのは4ビット(1/2セル)だけです。あなたが片方で数えることができる最高のものは何ですか(答えは31です)。2ハンドはどうですか(答えは1023)。ビットが多いほど数値範囲が広くなることを説明します。メモリセルは8ビットであることを思い出してください。数値に8ビット以上が必要な場合はどうなるかを尋ねます。彼らはどのようにマルチバイト数をメモリに入れますか(論理的な方法で)?それらをchars、shorts、integer、longsに導入します。

レッスン3:
これは、C ++で作成したプログラムです。32ビット整数を使用します。そして、これ数字です。しかし、これはポインティングに使用される数値です。この小さなアスタリスクを使用することで、数字がポインティングに使用されることを約束します。そして、これが最初の数でそれをどのように指し示すかです。小さなアンパサンドが値を満たします。きちんとした?

等。基本的な記憶力が低下すると、他のすべては簡単になります。最も苦労する傾向があるのは、コンパイラーが魔法のような(またはメモリー管理について考える必要がない)ことをしていると思うのは貧しい学生です。また、C ++は自動的にクリーンアップされるもの(つまり、通常のベクトル)とそうでないもの(つまり、「new」を使用して割り当てられたベクトル)があるため、水を汚します。また、文字列を開始することさえしないでください(char * vs. std :: string-ポインターの知識がなくても説明してみてください)。

ロボット競技会がターゲットとするプラットフォームはわかりませんが、メモリが限られた環境である場合、メモリ管理スキルは非常に重要です。

編集

基礎を教えたら、はい、C ++を最後までやりましょう。技術的にはそれらは異なるライブラリーですが、それらを複数のパラダイムと混同しても意味がありません。C ++ツール(ポインターと配列を含む)を提供します。


それは良い反応です。私が考える問題は、あなたがそれを教えることができるということですが、多くの子供たち(私は興味の欠如のためにポインタ/メモリの概念で最初に苦労した人でした)は、それが必要な知識であっても楽しいものではないので、それを調整するだけですC ++で正常にプログラムするには。
キースレイン

3
うん、ここで引数はありません。同じ理由で、子供たちは数学と地理を無視します。後になってようやく、彼らは注意を払うべきであることに気付きます。特定の問題がまだ解決されていないことを確認してください。
クリスエバレ

+1。C ++を導入してからしばらく経って、メモリがどのように機能するかについての理解をまとめました。しかし、私はそれを前もって理解できたとは思いません(値がどのように表されるかなど、実際的な意味ではありません)。
キャメロン

+1、これは私が言おうとしていたことですが、より良いことです。メカニックをトレーニングする場合、専門家を運転させる前にエンジンを理解する必要があります。
セスカーネギー

うん、初心者がこれを理解できるかどうかについて何度も行きます。それはとんでもなく簡単です(そして、あなたは突然、「すごい、コンピューターはとてつもなく馬鹿な機械ですよね?」「全体像」が見えないことで、全体的なアプローチが少し心を麻痺させます。
クリスエバレ

31

特に、初日からSTLの使用を開始する必要があります。ベクトルまたは標準配列に固執しますか?配列を導入する方が簡単ですが、ポインターエラーをキャッチするのは難しいかもしれません。

間違いなく、標準のライブラリタイプを使用します。std::stringまたはstd::vector、彼らは多くの場合、学生からの複雑さの多くを抽象化しながら、これらのタイプは、エラー検出とエラー処理のいくつかのフォームをご利用いただけます(の実装の大半)を使用してべきものです。

メモリの構成方法とメモリの管理方法(Cスタイル)を生徒に教えるのにかなりの時間を費やすか、または必要に応じて(および彼らが配列とは何か、配列がどこで使用されているかをよりよく理解する)。

std::vector(作成/読み取り/書き込み)の構文は、C配列の構文ほど複雑ではありません。それに比べて、手動のメモリ管理と、Cアレイで新しい学習者が犯すすべての一般的なエラーは、学習、指導、使用がはるかに困難です。

I / Oについては、coutなどに固執するべきですか、それともprintfを学ぶ方が簡単だと思いますか?

cout。個人的には、私はcout学ぶのが簡単だと思う。おそらくもっと重要なのは、coutより安全で汎用性があり、オブジェクトの印刷方法を定義できるため、選択する必要があります。つまり、いくつかの標準ライブラリタイプを使用して、組み込みの機能と型安全性を既に持っています。最後に、coutに加えて学習する必要があるかもしれないことに気付いたときに、混合プログラムになりますprintf

実際、KoenigとMoo によるAccelerated C ++を読んで、おそらくそれを指示に使用する必要があります(質問3に間接的に答える)。本では、std::cout直前return(3ページ)を紹介し、第10章までポインターと配列を保存します。質問の答えとしてその本の序文をコピーして貼り付けることができれば、そうします。(注:C ++を教える観点から読むことをお勧めします)。

編集 ここでは、はじめにあります

このような若い学習者に使用するのに適したC ++のオンラインリソースはありますか?

Accelerated C ++(一般的なプログラミングのバックグラウンドを前提としています)を使用したくない場合は、Eckel's Thinking in C ++を使用することをお勧めします。私はそれを読んでいませんが、自由に配布されるC ++イントロテキストです。


1
+1 ...そして「戻る直前にstd :: coutを導入する(ページ3)」を
一生懸命に笑い読みしました

1
@Felixと直接前std::coutの導入は、中括弧)は、それがユビキタスの『Hello、World』の簡単な郭清だ()=導入されている
ジャスティン・

1
ケーニッヒとムーの本の推薦を心から二番目に。C ++とプログラミングの両方を教えることを対象としています。Bruce EckleのThinking in C ++は、主に手続き言語(CやBasicなど)の経験がある人にC ++を教えることを目的としています。
スティーブンC.スチール

11

考慮すべきことの1つは、通常の最初のコードでは、あらゆる形式のデータ構造(構造体、クラス、配列、ベクトル、リスト)が非常に小さな役割を果たしているということです。通常、非常に少量のセンサーデータを処理し、それを使用して非常に少量のアクチュエーター動作を決定します。

しかし、何の巨大な役割を果たしている、とすることができ非常に理解しにくいの異なる形式すべてです制御に行きます。

だから、私はコントロールに重点を置いていました。基本から始め:ifforwhile。それらをたくさん練習してもらいます。それらをよく知ってもらいます。

...しかし、それは難しくなります。適度なサイズのロボットコードはいずれ、やや複雑な制御パターンになります。

  • すべてを呼び出す大きな「メイン」ループ

  • ステートマシン(これらは多く表示されます)

  • 以前の値の保存/実行中のカウンター(PIDなど)

これらは初心者が理解するのが難しいです。プログラムがこのようにコードをどのように移動するかを考えると混乱しますが、今は気づかないかもしれませんが、そうです。それはあなたの学生に言語そのものよりも多くのトラブルを与えるでしょう。

また、幸運を!季節がうまくいくことを願っています。


2
+1; これは通常のデスクトップ環境ではなく、実際の埋め込みコードです。ステートマシンはstd :: vectorと配列よりもはるかに重要です。
–MSalters

8
  • 特に、初日からSTLの使用を開始する必要があります。vectorまたは単に標準配列に固執しますか?配列を導入する方が簡単ですが、ポインターエラーをキャッチするのは難しいかもしれません。

配列の問題は、単純な教科書の例以外は動的にサイズ調整された配列が必要であり、動的にサイズ調整された配列が必要になる瞬間がstd::vectorずっと簡単になることです。また、動的にサイズ設定された配列を安全に処理する唯一の方法は、独自のクラスでラップすることstd::vectorです。
不可解に一般的な信念に反して、学生は、そうした獣を自分で実装する方法を知らなくても、複雑な機構を実装する必要がある機能を使用できます。コメントで述べたように、他の言語で文字列を教えないことを検討することさえ考えないでしょう、それらの実装が複雑であるという理由だけで?

  • I / Oについてはcout、などに固執すべきprintfですか、それとも習得しやすいと思いますか?

何か問題が発生した瞬間(typedef一見無関係なヘッダーに変更を加えた瞬間)にプログラムが屋根を突き破るような一連の古風なフォーマット文字列規則が、なぜ型の安全性よりも望ましいのstd::coutでしょうか?

  • このような若い学習者に使用するのに適したC ++のオンラインリソースはありますか?

オンラインであろうとなかろうと、ほとんどのC ++リソースは不良です。そして、読みにくいフォントや言語の使用については話していません。私は明らかに明白な事実上の誤りについて話している。優れたC ++リソースはほとんどなく、ほとんどが1ダースから2ダースです。オンラインで知っているのは、ブルース・エッケルの『C ++で思考』だけです


10年間、Koenig / MooのAccelerated C ++をベースとして、非常に異なるバックグラウンドを持つ学生にC ++を教えてきました。私のコースはその10年で大きく変わりましたが、根本的な原則を除いて、今では本の近くにはありません。最初から現代的で正しい、安全なイディオムを使用してください。後でより安全なイディオムを支持して学習させるために、メモリを手動で操作する方法を生徒に教えないでください。ここで提供されている回答の一部でわかるように、これは機能しません。最初に手動で方法を教えた人は、現代の安全なイディオムを使用する利点を理解することはほとんどありません。


7

C ++を教えたい場合は、printfのようなCサブセットではなく、ベクトルとcoutとしてC ++コンストラクトから直接始めます。


7

初日からSTLの使用を開始すべきですか?

はい。C ++でネイティブ配列を使用すると、エラーが発生しやすくなり、99%の確率で単に悪い習慣になります。

I / Oについては、coutなどに固執すべきですか?

はい。

このような若い学習者に使用するのに適したC ++のオンラインリソースはありますか?

彼らはそれほど若くありません。プログラムの学習には、知恵は必要なく、モチベーションと心の開放が必要です。過去2年間に高校で教えられた、生徒がプログラムを学ぶ準備を整えるようなものは考えられません。Bruce EckelのThinking in C ++を見ましたか?無料でダウンロードでき、非常によくレビューされています。人気のある恐ろしいC ++:プログラムの方法とすべてのSam's Teach Yourself C ++ ...の本は避けてください。


5

私は高校で最初のプログラミング言語としてC ++を教えられましたが、それ「C +」に似ていました、今ではそれについて言及しています。coutコンソールとファイルにテキストを書き込むために使用しましたが、かなりの数のC関数も使用していました(getch()私のお気に入りでした)。

基本を教える最も効果的な(そしておそらく楽しい)方法は、目標指向のカリキュラムを使用することだと思います。ベースのゲーム(またはロボット工学の同等物)。次に、「Xをどうやってやるの?」と尋ねると、Xを既に見た例で分類できます。たとえば、「最初にZで行ったようにユーザーから入力を取得する必要があります。 3Dグラフィックス『が、あなたはまだそれがどのように説明することができ...」Xはおそらく、彼らは、例えばを行うために、追加の知識を必要とすることを何かになりますので、(明らかにそれは、これは実際には容易ではない』でしょうハイレベルで働きます方法)。

それらを示す例は、コピーペーストされたブラックボックスマジックとして始まり、プログラミングパズルの断片がゆっくりと解明されるにつれて謎が解き明かされます。たとえば、生徒はifs の基本を非常にすばやく学習しますが、ブール式はifsの条件(古典的なif (blah) return true; else return false;コードにつながる)内での使用に限定されないことに気付かないでしょう。

コンテナとして配列またはベクターを選択するかどうかの微妙さは、最初は学生とは無関係に思えます。ベクトル/配列は、多くの変数を1つの変数として持つ方法であり、インデックスを介してアクセスできます。できる場所に固執してください。ポインタも後まで理解されません。それは物事を説明するべきではないということではありません。一度にすべてを説明することはできず、説明した内容が完全に吸収されるわけではありません。人間は直線的にではなく、有機的に学習します。オペレーターのオーバーロードが何であるかを適切に理解するまで、私coutは数年間使用していました!

ああ、繰り返しを恐れないでください。「これは私たちがやったHello Worldプログラムのようなものです。コンソールにテキストを書き込んだことを覚えていますか?」(いいえ...)「念のためもう一度やり直しましょう。」...そして質問をします!生徒に楽しい例とたくさんのやり取りをしてもらいましょう。

C ++は複雑な言語であり、あなたが何をしようとも、その複雑さのかなりの部分(および一般的なプログラミング技術の部分)は生徒に失われます。あなたがそれらを見せることはすべて彼らにとって新しいものです。そのほとんどは、深い理解レベルでは沈みません(少なくとも、すぐには理解できません)。メモリの仕組み、PCのコンポーネントの相互作用、スタックとヒープの内容、ポインター、クラス、ループ、if-elseチェーンなど、大部分が正しく理解できません。これで結構です!それらを使用することを理解する必要はありません-驚くほどのクールなプログラムは、5つのネストされた冗長ifsと43などの名前の付いた43個の変数を持つ、非常にugい1000行関数で記述できますx_2r。重要なことは、生徒が絶えず学習し改善していることです。ブラックボックスは、長い目で見て透明(または少なくとも半透明のグレー)になれば問題ありません。コースの終わりまでに、彼らはデザインパターンが何であるかを知らないかもしれませんが、彼らは最初の数週間で書いたプログラムを振り返り、コードをしつこく見ることができるはずです。彼らは、最初に書いたプログラムが実際にどのように機能するかをかなりの詳細レベルで理解する必要があります(それを書いたとき、彼らは何も知りませんでした)。しかし、彼らはすべてを知りません - まだ


5

私は高校から大学まで、私の人生の中で多くのプログラミングクラスを受講しました。ストリームに出力する方法以外は、最初のc ++クラスからあまり多くのことを学んだとは言えません。

私のアドバイスは、過去数年しか開発者でなかった若い学生として、彼らに物事を馬鹿にしないことです。彼らに何をしているのか、どのように動作するのかをオペレーティングシステムレベルまで伝えます(IMOを使用する必要はありません)。

Cを教えることは、それを実行するためのより良い方法だと思います(ほとんどの場合、ご存じのようにC ++としてほとんど常にコンパイルされます)。端末が実際に何であるか、プログラムがどのように対話するか、文字列はメモリ内の\ 0で終わる文字の配列であること、mallocとは何か、C ++がそれを抽象化する方法、charとintがメモリに格納される方法を教える、ect ...これらは、開発中に問題に遭遇したときに問題を解決する方法を実際に誰かに知らせるものです。

子供たちにプログラムをさせ、主に質問に答えるためにそこにいることの重要性を強調することはできません。私の経験では、あなたはそれを使って言語を学びます。書籍やレッスンは役立つ場合があり、開始するために必要ですが、最終的には、C / C ++ファイルを渡して次のように言います。これはXの例です。 X)をハッキングします。マニュアルページの使用方法(* NIXを使用している場合)またはcplusplus.comを表示し、stdライブラリを調べて、自分で物事を理解させます。

TL; DR子供に自分で教えさせましょう。構造を提供し、質問に答えるためにそこにいてください。

また、リンクリストは真実です!


4

一般的な方法でプログラミングを教えるのではなく、ロボットなどを使用して一種の組み込みプログラミングを教えるのです。正しく理解できたら。

まず、使用するライブラリと必要なものを確認する必要があると思います。

使用するCライブラリ、または多くのポインターとC配列を持つCライクがある場合、その使用方法や使用理由を教える方法が必要だと思います。

ただし、文字列とベクターを使用して開始するための簡単なコードを表示することができます。これがC ++の動作です。だからといって、ポインターを教えられないというわけではありません。

低レベルC ++(Cに似ています)とSTLを使用した高レベルC ++の違いを明確にする必要があるかもしれません。C ++の初心者にとって最も難しいことの1つは、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. ループ(コンピューターは同じことを何度も繰り返すのが得意です)。whileおよびforループを表示します。

それにはそれぞれ1時間に2回のレッスンが必要です。実践的なコンポーネントで参照できるメモの簡潔なセットを準備してください。あなたは彼らを優秀なプログラマーにしようとしているのではないので、コンソールからの読み方、構造の作成、その他必要なすべての方法の例を挙げてください。カスタムユーティリティライブラリではなく、言語でサポートされている機能のみを使用してください。混乱させるだけです。

始めから、例でリードし、適切にレイアウトされたコードの例を示します。インデントは、あなたが最も快適なスタイルで一貫し、ブレースと括弧が正しいはずです。変数名は意味のあるものでなければなりません。例としてスロップを表示すると、スロップが許容できることがわかります。それは悪い出発点です。インデントを正しくすることの重要性を強調します-私が教えた多くのコードが一貫してコードをインデントすると、どこが間違っているのかをより簡単に確認できることがわかりました。それは、それらのエラーの大部分が、操作(意図されていないループ/条件付きの操作、またはその逆の操作)の不正確なスコープであったためです。

その後、実際の作業に移ります。何かを学ぶ最良の方法は、それを破ってその理由を解明することです。コードをコンパイルするための使いやすい環境があることを確認する必要があります。スクリーンショットを手元に文書化します。

いくつかの概念を理解するのに役立つ良い例は、Cokeマシンの構築です。

  • アイテムと価格のメニューを出力します(メニューの格納はユーザー定義の構造の配列でした。C++のクラスである可能性があります)。出力するにはループが必要でした。
  • ユーザーの選択を読みます。
  • ユーザーにお金を求めます。彼らは、セント(1、5、10、20、50、100、200でAus)でコイン単位を入力できます。未知の宗派を無視します。ユーザーが十分なお金を投入していない間は、質問を繰り返します(ループ)。
  • 必要な変更(モジュロ除算)を計算し、コインの最小数を与えます。出力を画面に印刷します。
  • 次のユーザーを待ちます。

その後、C ++構造に移動できます。少なくとも基本的なプログラムを作成できるようになるまで、あまり深く入り込みたくないでしょう。

そして何よりも、質問に専念するための多くの時間と忍耐が必要です。多くのものがありますが、それらのほとんどはあなたがうんざりするでしょう。


1

C ++の観点(「C ++ hello world」)から物事を教えるべきではなく、問題の領域-この場合はロボット工学-の観点から物事を教えるべきだと思います。それで、あなたのこんにちは世界はLEDを点滅させるか、モーターを運転するでしょう。

もちろん、型、関数、IO操作を含む、概念的に意味のあるC ++アクションの増加のサブセットで、各小さなロボットタスクを分解することができます/すべきです。

私自身に関して言えば、私はプロのプログラマーではなく、Java、C ++、Pythonを学ぼうとしました。実際に(単純な)問題を解決する必要があるときに、何か(Python)を達成し始めました。言語自体の偶発的な実装の詳細に過度の注意を払うことを避けて、私は要点を正しました。

だから私はアドバイスしたい:言語のマニュアルを読むのではなく、選択した言語で物事を行うことを学ぶ。それが人々をやる気にさせるものだと思います。


0

厳密なC ++を教えます。printfを書いて、それを小さなパラメータまたは間違ったタイプに渡すと、奇妙なことがどのように起こるか知っていますか?無効なポインタを使用すると、悪いことが起こる可能性がありますか?教えてはいけない

初日から、リファレンス、STLの使用方法を教え、ポインターを使用するためにマークを失います。スマートポインターも教えないでください。ポインタを使用していることに気付くのは、GUIを実行し、オブジェクト(イメージボックスなど)が存在し、有効なイメージまたはnullである必要がある場合のみです。コンソールプログラミングでは、長い間(スマートまたはロー)ポインターを使用していません。

要するに、彼らにトラブルを与える可能性のあるものを教えてはいけません。入出力ストリーム、構造体を教え、タイプキャストでもマークを失うことを伝え、デザインを教えようとしないでください。誰もがベテランのプロになることを望まない


0

C ++の講義シリーズではありませんが、Richard BucklandのCOMP1917は、Cでのプログラミングに関する優れた講義シリーズです(データ構造COMP1927が続きます)。

私自身の意見では、C ++は新入生にとっては複雑すぎますが、Cはよりシンプルで、新しいC ++プログラマーに欠けているシステムプログラミングの優れた基盤を提供します。


0

ボイラープレートコードのかなりの部分から始めて、すぐにプログラミングで「何かクールなことをする」のを助け、時間の経過とともに物事がどのように機能するかについての理解を磨きます。LEDを点滅させるために、C ++のすべての複雑さを理解する必要はありません。「このコードをそこに置くと、LEDが点滅します」ということを知る必要があります。そして、「ちょっと、ループについて今話しましょう。ループを書くと、50行のコードを書かなくてもLEDを50回点滅させることができますよね?」次に、条件について説明します。ユーザーがコントロールボックスのボタンAを押したとき、空気圧をアクティブにしてフラグを立てる必要があります。これを行うためのコードを追加します。または、コントロールボックスのスイッチ2をオンに切り替えた場合、ドリルモーターを順方向ではなく逆方向に実行します。

興味のある問題を解決するために「十分に」教えることに集中し続けると、物事が圧倒されにくくなり、親しみやすくなります。彼らが本当に興味があり、複雑さを理解したい場合、彼らはおそらく戻って、地元のJCでのプログラミングまたはサマースクールコースの受講に関する包括的な本を読むでしょう。

ロボットで「制御できるようにしたいもの」のリストを作成し、それぞれをレッスンに変えます...彼らが知っておく必要のある最低限のものは...?

  • スイッチが特定の設定にある場合、「かっこいい」何かをしますか?
  • 空気圧バルブの開閉を指示します(例:グラバーアタッチメント)?
  • (ドライブトレイン用)ドリルモーターのオン/オフを切り替えますか?
  • 障害物検出センサーがアクティブになっている場合、ロボットに方向を変更させますか?
  • ロボットを2輪駆動モードと4輪駆動モードに切り替えますか?
  • ジョイスティックの感度を調整しますか?

書式指定子は非常に簡単に混同され、誤った指定子は多くの場合プログラムをクラッシュさせる自動レシピであるため、printfよりもcoutを教えるように、最も確実な構造を教えることに固執します。同様に、ベクトルはメモリ管理の複雑さの一部を難読化します。Xを実現するために最低限必要なこと(たとえば、STLライブラリのデータ構造を使用する必要があるかもしれない)


0

DeitelとDeitelによるC ++のプログラミング方法を使用します。私の意見では素晴らしい教科書。

あなたは初心者にプログラミングの方法を教え、同時に高度なレベルでプログラミングするようにしようとしているように聞こえます。あなたが彼らに猿を与えたいと思うなら、あなたが失敗する運命にある理解なしで猿がコーディングスニペットを見るのを見てください。

初心者クラスのためにSTLから離れてください。

ロボットのコーディングソリューションが既にある場合、またはロボットがどのように見えるかの非常に良いアイデアがある場合は、おそらく教科書のレッスンをロボットのコーディングタスクに「マッピング」できます。しかし、教科書は学習を促進させます。

コーディングを強制的に行い、学生に非常に狭いレッスンと言語への露出を与えると、あなたが書くコードの海がますます大きくなるにつれて、犬のパドルを学んだばかりのようになり、実際の水泳のためにdrれるでしょう必要とされている。

「彼らはcoutかprintfを学ぶべきか?」という質問ではありません。解決するために、与えられたロボットプログラミングタスクのコードを記述する方法について洞察を得るのに十分な学習の問題です。

これは読み取り割り当てた場合、彼らは知っていたすべてが、単純な主題、動詞文であり、あなたは半分しか語彙場合、結果は何でしょう知っているが必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.