こんにちは、Habr! Bjarne Straustrupによる記事「 プログラミングのためのインストラクターガイド 」の翻訳をご紹介します(最終訪問日:2017年12月20日)。
翻訳者から
Bjarn Straustrupは、C ++プログラミング言語の開発者として知られています。 彼の著者の本は、多くの由緒ある開発者のテーブルに載っています。
特に注目に値するのは、プログラミングの基本に関するチュートリアル「プログラミング:C ++を使用した原則と実践」です。 Bjarnは、テキサス大学の農業農業工学部の学生のためにそれを書き、そこで彼は学生のためのコースを長い間教えました。 チュートリアル自体に加えて、www.stroustrup.comで講師用ガイドを見つけることができます。 プログラミングの基礎のコースを教える際に彼が教えた経験は、C ++のコースだけでなく役に立つ場合があります。 マニュアルでは、教師の典型的な質問に対する回答を見つけることができます:資料を提出するには? スキルグループの層別化の対処方法 トピックを深く掘り下げるにはどのくらい必要ですか?
「プログラミング:C ++を使用した原則と実践」という本のロシア語版の講師用ガイドが見つからなかったため、翻訳して出版することにしました。
まとめ
このテキストは、観察と結論の単なるコレクションです。 「プログラミング:C ++を使用した原則と実践」という本でコースを教えている場合に役立ちます。
仮定
あなたは教授、講師、インストラクター、ティーチングアシスタントであると思います。 たぶんあなたの立場は異なって呼ばれます。 主なことは、「プログラミング:C ++を使用した原則と実践」という本でコースを教えるか、計画するかです。 本の序文と第0章「読者への対応」を(少なくとも)読んだことを前提としています。 そうでない場合は、この資料を読んでください。
あなたの生徒はまだプログラミングを行っていないか、プログラミングについて遠い理解を持っているか、C ++とは異なる言語を使用していると思います。 私は主に最初の2つのグループの問題を解決します。
この章に関する一般情報の後、個々のセクションに関するコメントを見つけることができます。 この章に基づいて講義を計画するときは、これらのメモを使用してください。 私のプレゼンテーションのスライドはサイトで利用できます。 私の資料を使用する場合は、どのように改善できるか提案してください。
フィードバックと指導経験の説明を歓迎します。
注:このテキストは単なるメモであり、それ以上のものではありません。 このテキストの技術的な編集には誰も関与しませんでした。 材料の完成を期待しないでください。 それどころか、これらの記録に示されているように、さらなる経験に基づいてさらに開発されます。 これらのメモを更新する予定です(サポートサイトで入手できます)。
ご注意 Perev:最終更新日は2011年10月7日でした。
はじめに
人々には、良いプログラムを書くことを学ぶことを妨げる信念があります:
- これは最も難しい技術的スキルの1つです。
- これはまれな才能を必要とするスキルです。
- プログラムは、主に夜間に完全に隔離された10代のソシオパスによって作成されます。
- プログラミングとは、暴力と残虐行為に関するビデオゲームの作成です。
- このスキルには数学の高度な知識が必要です。
- これは、日常的な思考とはまったく異なる活動です。
- それは人々を助けません。
プログラミングの教師としてのあなたの主な仕事は、これらの神話の影響を最小限にすることです。
1つの成功したプラクティスがあります。 3つまたは4つの講義ごとに、プログラミングによって解決される興味深い応用問題の説明に数分を費やします。 第1章では、何がおもしろいと思うかを知ることができます。 生徒は、その適用範囲を示していれば、ドライ理論をよりよく知覚します。 これらのコメントは簡潔であり、モラル化にはならないことが重要です。 もしあなた自身がいくつかのタスクが魅力的であると感じないなら、これを学生に納得させようとしないでください。 彼らは最初の瞬間にあなたの偽りの熱意を解き放ちます。 ストーリーの中で、私たちは個人的な経験、出張で見たもの、ニュースで聞いたもの、雑誌で読んだものに頼っています。 必ず例を挙げてください:写真、iPod、携帯電話、時計などの実際のデバイスです。
学生の興味は異なる場合があることに注意してください。 一部の学生は、ビデオゲームの最新の開発に興味があるかもしれません。 ただし、そのような事実は、プログラミング、コンピューターサイエンス、および情報技術をまったく学習する必要があるかどうかをまだ決定していない、より深刻な学生にとってプログラミングの否定的な考えを生み出す可能性があります。 2番目のグループは、さまざまな割合で、生物学と生物医学の例に興味があるかもしれません。 (注意perev:教科書はテキサス農業文化工学大学で開発されたものであり、おそらく地域特有のものです)さまざまなタスクについて話すことは非常に重要です。そうしないと、学生はプログラミングを切り離して想像力豊かな想像力を維持します。 可能な限り、コードを実世界の例に接続してみてください。「GoogleはSTLのようなテクニックを使用します」-STLのパーツの良い例、iPodグラフィックインターフェイスはGUIの章に、飛行機の例は鉄の操作の章に、プログラムの正確さ。
小さなプログラムを書いて実行することは「読書の章」の一部であるという考えを伝える必要があります。 多くの初心者にとって、最初の章の資料は単純すぎて真剣に考えることができず、一部の断片は時間を浪費するには抽象的すぎることがわかりました。 学生はプログラミングの経験がほとんどないため、すべてを知っていると信じています。 少なくとも、最初の1か月で一般的に伝えられることすべて。 このため、最初の講義をスキップすることさえあります。 他の人はまだプログラミングに遭遇していませんが、本を通してそれを学ぶことができると信じています。 学校では、彼ら自身が重要なものと重要でないものを区別できるという幻想を持っていました。 強い生徒の中には、費やす必要のある時間と労力を過小評価している人もいます。 学校の教材は、多くの努力なしに彼らに与えられました。 現実には、そうではありません。 彼らがこれに気付くのが早ければ早いほど良い。
コースの学習を成功させるには、生徒はまず課題に「時間を費やす」必要があります。 これは、以前のプログラミング経験、学年、または知的能力(私たちが知る限り)よりも重要です。 素材についての最低限の知識を得るには、タスクを完了するだけで十分です。 ただし、コースを完全にマスターするには、講義に参加し、章の最後に演習を実行する必要があります。 (注。本書の各章の終わりに、タスクと演習があります)演習を支援するために、「実験室」と教師のアシスタントに時間を割り当てます。 一つの良い習慣は、生徒を小さなグループに分けることです。 この場合、さまざまなプログラミング経験を持つ人々のグループを作ることが望ましい。 各章で、各生徒が次のことを行えるようにあらゆる努力をします。
- 「タスク」を完了しました。 インストラクター、アシスタント、または経験豊富な学生がここで役立ちます。彼らは、発生する「小さな実用的な問題」を支援することができます。
- 「あとがき」を読んで、少なくともいくつかの質問に答えました。 これには、テキストの一部のフラグメントを繰り返す必要があります。 勤勉な学生は自分でそれを行います。 そして、本当にそれを必要とする人は「蹴る」必要があります。
- 彼はいくつかの運動を行いました。 それらは複雑さ(最初は単純)によって大まかに分類され、後続のものはしばしば以前のものに基づいています。
学校の知識やオンラインフォーラムからの情報を主張して、他の生徒に自分が正しいことを納得させるすべてを知っているオタクに注意してください。 ベクトルと文字列の代わりに配列とポインタを使用することは、最もダメージを与える「明るいアイデア」です。 その犠牲者は、バッファオーバーフロー、固定ブロックでのメモリの割り当て、strcpy()の使用などの問題を解決しなければならない無実の新参者です。 彼らがこの準備をするずっと前に
「トップ大学のエリート学生」のために書くと信じられています。 これはタム新入生にとって非常にお世辞のレビューですが、現実はそうではありません。 私たちには最も厳しい選択はありません。また、学生は私たちが望むほどコースを学ぶ意欲がありません。 正直なところ、最初の数百人の学生は、ソフトウェア開発の将来を見ていなかった電気およびコンピューターのエンジニアでした(コース自体は必須でした)。 私たちの結果がこれらの専門家のレベルに達したとき、私たちはずっと後にコンピューター科学を専門とする新入生に教え始めました。
大規模なグループで教える場合、全員が対処できるわけではありません。 この場合、あなたは難しい決断を下す必要があります:弱い生徒を助けるために速度を落とすか、ペースを維持して生徒を失う。 魂のすべての繊維で、あなたは遅くなり、助けようとします。 ヘルプ。 利用可能なすべての方法で。 しかし、決して減速しないでください。 それは賢く、訓練され、勤勉な学生にとって不誠実です-彼らは困難なタスクの欠如から退屈し、あなたはそれらを失います。 いずれにせよあなたは誰かを失うので、それをあなたの将来のスターではなく、良い開発者や科学者に決してならない人にしましょう。 コンピュータサイエンスとプログラム開発はすでに、より興味深い科学分野の学生よりも劣っています。 この問題を悪化させないでください。
学生は私たちの期待に応えることができると確信しており、私たちのコースはこれを確認しているようです。 調査によると、学生は、新入生の一般的な規律よりも25%長い時間がかかり、応答が25%向上しています。 偶然にも、これは工学系大学で最高の満足度でした)。 このコースは、アメリカの学校の典型的な卒業生向けの最初のコースの二次生物学、物理学、または数学と同じくらい複雑ではありません。 通常、生物学などの確立された学問分野では、学校の準備はコンピューターサイエンスよりも優れています。
「Bjarn Straustrupによって教えられたため」コースが成功したことを示唆する人もいます。 これも非常にお世辞ですが、真実ではありません。 新入生は誰かの評判に敬意を払うことは珍しくありません。また、多くの場合、最初は(残念ながら)深刻な技術的詳細を勉強するよりも評価にずっと興味があります。 いずれにしても、コースの最後の4学期はピートピーターセン、ウォルタードハティ、ロニーウォードによって教えられました。 彼らは非常に経験豊富な上級教師です。 私は、たまに「ゲストレクチャー」のみを扱います。
当初、このコースは、週に2回の講義に加えて、ティーチングアシスタントの指導の下、実験室のクラスで行われました。 これは十分ではなく、コーナーをカットする必要がありました。 その後、コースは週に3回の講義と研究室に拡大され、改善されました。 そうして初めて、例の分析に時間を割き、本からさらに例を追加できました。 おそらく、強力な学生はこれを必要としませんでしたが(この情報は本の中にあります)、ほとんどの学生を助けました。 本にはまだ講義で提示したい多くの情報があります。 各スライドに2分を与えます。 同じ速度の場合、50分または60分間の講義に合うようにいくつかのスライドをスキップする必要があることがわかります。 私たちもそうします。
今、私たちは実験をすることに決め、週に2回の講義を行い、2学期にわたってコースを拡大しました。 コースの開始から「興味深い」問題の分析の開始までにかなりの時間が経過するため、成功は期待していません。 私が間違っていることを望みましょう。
以下に各章のレビューがあります。 それらは教師にとって有用かもしれませんが、私はそれらを本に入れないことに決めました。 テストの質問は、すべての回答が含まれている(そして間違った理由で好きな)レビューよりも学生にとってより有用であることが判明しました。
15週間の学期に常に第1章から第22章に進むことができます。 これにより、最後の(約)3週間で(最終講義と同時に)セッションに数日、必要なグループプロジェクトの時間が残ります。 第22章から第27章は、必ずしもこの順序で進む必要はありません。 必要に応じて読むことができます。 より野心的なプロジェクトをサポートするのに非常に役立ちます。
これは、コース用に1264ページの本を使用していることに注意してください。これは812ページで説明されています。 (およそ1329ページの翻訳と827の主要章への翻訳を翻訳します)。 他のすべては追加のメタリルです:興味のある学生のための特別なトピック、参考資料など
実践的な注意:一部の学生は(あまりにも)それらの情報に依存しており、スライド上にない本の資料を見逃す可能性があるため、スライドには情報が少しあふれています。 さらに、準備に十分な時間がなかったインストラクターを支援します(非常に一般的な現象)。 コードは20ptフォントで書かれています。 これは、200人の聴衆のほとんどにとって十分です。 まれな例外として、18ptフォントを使用します。 スライドの装飾があまり好きではないので、難しいトランジションや面白いアニメーションはありません。 暗い背景が気になる場合は、デザインを白黒に変更してください。 TAMUの私たちのチームは、まだこれについてコンセンサスを得ていません。 イラスト用の写真がもっとある場合や、品質が良い場合は、それらを送ってください。 生徒は、レッスンのトピックに関連する美しい写真が好きです。
各章の前に、エラー情報(www.stroustrup.com/Programming/errata.html)をお読みください。 タイプミスは、特にコードスニペットで、非常に学習を混乱させる可能性があります。
スライドを追加して、戦術的な問題を解決できます。 同じことをします。 TAMUスライドをすべて削除したので、これを行う必要はありません。 最初のスライドに自由に名前を追加してください。ただし、大幅な変更を行っていない場合は、私の名前とサポートサイトへのリンクを残してください。 変更を簡素化するために、PowerPointを公開しています。
謝辞
スライドとこのガイドに関する建設的なコメントをくださったLawrence“ Pete” Petersen、Walter Doherty、Ronnie Wardに感謝します。
第0章:読者への対応
明らかに、第0章には奇妙な番号が付けられています。 「0は奇数」は「0は奇数」と「0は奇数」の両方を意味します。 これは意図的な不条理です。 何人かの生徒だけがそれを読みます、そして、ほとんどはそれを見逃します。 以前にプログラミングしたことがない人はほとんど理解できません。 その主な目標は、あなた、教授、講師、助手などに、私の目標と方法の一般的なアイデアを提供することです。
では、なぜ「第0章」なのでしょうか? C ++の番号付けは-ルーレットの目盛りのように-1ではなく0から始まるので、人々に手がかりを与えるために:「ここで何か異常なことが起こっています。」 この章が講義や宿題を含む他の一連の章とは異なることを示すため。 ある程度、「メタ情報」を伝えます。
学生が第0章を読むことはお勧めしませんが、多くの人がそうします。 第0章の資料についての講義は提案していません。同時に、すべての講義および議論で必要に応じて使用する必要があるアイデアが含まれています。 彼女は質問に答えます、「なぜ私たちはこれをしているのですか?」 「本当にこれを行う必要があるのですか?」 学生がコース中に尋ねるずっと前に。 「第0章を読む準備ができました」と答えるだけで十分な場合もあります。
それでも、第0章を読んで真剣に受け止めてください。 初期段階では、材料を追加してコースを改善しようとする絶え間ない試みは、壊滅的な結果につながる可能性があります。 第12章まで、学生は過負荷状態にあります。 彼らは常に動機付けられている場合にのみ前進します。 各章の後、彼らはそれを理解していなくても、以前より少しだけ多くのことをすることができます。 この段階で学生にすべてを完全に理解させることでコースを拡大しようとしないでください。 あなたの仕事は、彼らが独立して新しい知識を追加し、同時に有意義にそれらを適用できるようなスキルのベースを準備することです。
あなたがアシスタントティーチャーである場合、生徒に何かを説明する前に、本全体を読んでください。 素材は父親のC ++ とは異なります。 また、講義を開くか、少なくともスライドのテキストを読んでください。 どのような事実があるのかわからない場合、生徒を支援することは困難です。 章へのスライドの情報は、章自体に最適なチートシートです。
私の意見では、キラーで破壊的なプラクティスの1つは、基本的なC ++タイプ、それらの相互作用、および分岐、ループ、再帰の詳細な作業の詳細な研究です。 この段階では、それは単なる自重です。 長年素晴らしい開発者になれますが、 unsigned short
からint
変換するための(不条理な)ルールを説明することはできません。
第1章と第2章
プログラミングを開始するには、学生が必要です:
- ソフトウェア開発者にとって重要かつ有用なタスクのアイデア、それらの解決に成功したいという願望、そして少しの理想主義。
- 実験のために作成、実行、および変更できる鮮やかな例。
両方が重要です。 これに講義1の半分を捧げることを提案します。
第1章の目的は、興奮感、高貴な目標への欲求、プロ意識を伝えることです。 血まみれで暴力的なビデオゲームを作成することではありません。
(政治家としてではなく、技術専門家として)世界を救いたい場合は、コンピューターを使用する必要があります。 ここで教えられ、研究されているアイデア、ツール、テクニックは、人類を前進させます。 私たちは一般的にビデオゲームに反対していません。 私たちは、ビデオゲームがコンピューターの主な用途であるという一般的な誤解に反対しています。 あらゆる機会に、ほとんどのビデオゲームはこのコースで学習できるテクニックを使用してC ++で記述されていると誤って言及します。
多くの学生は、キーボードと画面を備えたPCとは異なる外観のコンピューターを想像するのが困難です。 コンピュータの大部分が何であるか、何に使用されているのか、人々が何を使っているのかを伝えることは非常に便利です。 業界(米国、ヨーロッパ、およびその他の国)には情報システムの優れた構築者が十分にいないことを学生に思い出させても害はありません。 そして、これは彼らが有望なキャリアと良い給料を持っていることを意味します。 友達のプログラマーではない親や両親とは異なり、生徒自身がこれについて考える必要はないかもしれません。 多くの人々(人気のジャーナリスト、キャリアカウンセラー、両親)は2000年のドットコム危機を覚えており、すべての技術的な仕事は海外に委託されたと考えるかもしれません。 資格のある技術者を必要とするのはアメリカのビジネスマンではないこと。 アメリカの大学で電気とコンピューターを専攻しているほとんどの卒業生が最高の平均給与を受け取っていることに異議を唱えます。 純粋な科学、ビジネスなどの専門家以上
写真のさまざまなプラットフォームに注意してください。 多くの学生は、コンピューターが何であるかについて非常にあいまいな考えを持っています。 プロのソフトウェア開発者は、キャリアの中でさまざまなプラットフォームに出会うことができます。釘の先端にあるコンピューターから部屋全体を埋め尽くしたモンスターや、複数の大陸に分散したモンスターまで。
第2章では、ツールの紹介について説明します。 その中で、学生は最も簡単なプログラム「Hello、world!」を実行するために何をする必要があるかを学びます。 彼女はとても平凡です。 あなた自身がそれを過度に混乱させる必要はない(説明する必要がない!)場合、学生の典型的な反応は「問題は何ですか?」です。 これまでのところ、問題はありません。生徒がツールを習得し、課題のテキストを読み、演習を行う習慣を身に付ければ問題はありません。
常に「あとがき」セクションをご覧ください。 それは通常、章自体またはそれが何につながるかについて重要なことを言っています。
講義番号1では、これらの両方の章の内容を明らかにし、学生にコースの概要を提供し、最終的にどのような結果になるかについてのアイデアを提供します(ソフトウェアの重要性に関する入門的な議論に加えて)。 コードの構造と、正確さとプロフェッショナリズムに対する基本的な欲求に特に注意が向けられています。
スライド上の写真の説明は通常、本自体で繰り返されます。
描かれている飛行機は、ボーイング787(C ++では飛行に関与しないシステムです)と飛行中のF35(テキサスのフォートワース上空)です。 風力タービンは、もちろんC ++でプログラムされています。 そして、そのトラックは、石油鉱床の地震探査に使用されています。 多くのPCは、ハワイ島のマウナケア山の頂上にあるケック天文台を操作しています。
初心者を対象にしているため、「Hello、world!」の簡単な起動 それは多くの実際的な問題に関連しています:多くの学生は大学のサーバーにアカウントを持っていない、何人かはC ++コンパイラを持っていない、どこで入手できるのかわからない、何人かの指導助手は休暇や夏のインターンシップから戻ったばかりです。 最初の講義の前に、管理上および物流上の問題を解決するためにすべてを行ってください。 可能であれば、開始の1週間前にティーチングアシスタントと面談し、問題を最小限に抑える方法と、それでも問題が発生した場合の解決方法を決定します(150人の学生がいる場合、予期しない問題が発生します)。 全員がプログラム「Hello、world!」を正常に実行できるように、1回目と2回目の講義の間にアシスタントを配置するか、(さらに良い)アシスタントを確保します。 講義番号2の前。 これを行わないと、一部の学生はメイングループに何週間も遅れをとったり、クラスを辞めたりすることさえあります。
生徒を助ける前に、すべてのアシスタントが各章を実際に読んでください。 従来のコースでC ++の知識や、さらにはJavaの知識を持つアシスタントを引き付けることは、悪い考えです。
この講義では、欺whatとは何であり、そうでないものも分析します。 多くの新入生はこれに少し戸惑います。 共学は不正行為と見なされますか? 誰かに解決されたタスクを帳消しにすることは禁止されていますか? (ソフトウェア)ライブラリは許可されていますか? 私たちの答え:いいえ、はい、以前のやり方を忘れた場合のみです。 倫理を説明する必要がある場合、これは物語にふさわしい時期かもしれません。
プログラミングの応用分野をリストする際に、私は多くの人と同様、教育活動を見失います。 学生の目標が教師(大学まで)、特に科学分野の教師(再び、大学まで)になること、または誰かが技術スキル(トレーナー、技術仕様など)の普及に懸念がある場合、ソフトウェア開発の基礎は役に立つだけでなく、必要です。 明らかに、プログラミングは主に若者に科学と技術を真剣に考えるよう促します。ロボット競技や生物システムの視覚化について考えるだけです。
さらに、「実世界のアプリケーションのためのソフトウェア開発」を意味するとき、「産業」について時々話します。 実際のプログラムの作成は、大学、研究室、州および非営利組織でも発生する可能性があることを考慮する価値があります。
最初の3つの講義の間のどこかで、各例はどのプラットフォームでも実行できることに注意してください。 Windows、Apple、Linux、およびUnix上のPCについて言及します。 本からのすべてのコードは、サポートサイトで見つけることができます。 移植性は非常に重要だと考えています。 ほとんどの学生は私たちに同意しないか、彼らの意味を理解していません。 ただし、それらの多くは現在のコンピューターに関連付けられており、「ポータビリティ」をサポートするコースはすべてのユーザーに役立ちます。 学生が「最新のC ++コンパイラを備えた任意のシステム」を使用できるようにし、大学で使用されているシステムに対してのみ直接サポートを提供します。 ほとんどの学生はWindowsを使用しますが、常に少数のMacおよびLinuxユーザーがいました。
「homemade」ヘッダーファイルstd_lib_facilities.hを使用します。 ただし、これは理想的なアプローチではない場合があります。
- いくつかのヘッダーファイル( \ <string> 、 \ <vector>および\ <algorithms> )および関連する事実について早期に学生に伝える必要性から離れました。
- 名前空間について
- カスタムタイプと組み込みタイプの違いについて
- ヘッダーファイルとそれに接続するツールの対応について
- usingディレクティブを使用するさまざまな方法と、ネームスペースを明示的に指定する可能性について
- ファイルはC ++標準に従って書かれており、後で解析されます
妥協案として、 std_lib_facilities.hを使用して最初の章のコードを簡素化することにしました 。 第8章では、ヘッダーファイルと名前空間について詳しく説明します。 string 、 vector 、 iostreamおよびアルゴリズムの詳細な説明はさらに後で行われます。
生徒に「魔法」だけを与えないことに非常に興味があります。 それでも、「#include」std_lib_facilities.hというフレーズは、「標準ライブラリのツール(機能)を使用できるようにします(そして少し後で説明します)」は、「コンパイラーが実行可能コードを生成する」よりも呪文に似ていません。
本に加えて、 std_lib_facilities.hヘッダーファイルをダウンロードできるサポートサイトにアクセスできる必要があります。 インターネットがない場合は、このドキュメントの最後にこのファイルの内容を添付しました。
異なるシステム、IDE、コミュニティは、ヘッダーファイルとコードファイル(.cpp)の場所に関して異なる規則を使用します。 プロジェクトの構造は初心者を混乱させる可能性があります(私自身も混乱することがあります)。 本は、.hファイルと.cppファイルが同じフォルダーにあるという前提で説明されています。 したがって、ディレクティブにヘッダーファイルを含めます
#include "std_lib_facilities.h"
契約に応じて、生徒に使用を勧めることもできます
#include "../std_lib_facilities.h" //
または
#include "../../std_lib_facilities.h" //
または、ローカル契約に準拠する別のオプション。 環境内で正しく配置する方法をよく知っています。 推測することしかできません。
std_lib_facilities.hの取得場所 、保存方法、およびコンパイラーによっては、「ファイルの最後に改行がありません」という警告が表示される場合があります。 私の意見では、これは愚かな警告です。 ファイルの最後に空の行を追加して、コンパイラーがシャットダウンするようにします。
コードファイルには.cpp拡張子を使用し、ヘッダーファイルには.h拡張子を使用します。 また、この主題に関して異なる合意があります。 多くの場合、コードの.cc拡張子を見つけることができます。 いくつかの場所では、 .cxxと.Cを使用します。 また、一部のムッシュ(およびそのツール)は、 .hではなく.hhまたは.Hを好みます。 ファイル拡張子も同意であり、言語の一部ではありません。
私たちの学生のうち、60%がすでにプログラミングを行っており、40%がまだ1行のコードを見ていません。 最初の数週間は、生徒をレベルアップし、誰もが初めて使用する教材をすぐに始められるように迅速に取り組みます。 常にプログラムに参加し、最初に披露した学生がいます。 プログラミングの本物の初心者には怖いかもしれません。 両方のグループを説得する必要があります:
- プログラミング経験がなくてもマスターできる素材
- 遅かれ早かれ、プログラミングの経験があっても、彼らは学校にいない何かに出会うでしょう。 sayingにもあるように、「大学へようこそ」。
第2章あとがき
- C ++は、幅広いソフトウェア開発タスク用のプログラミング言語です。 例はページにあります 。
- 二重引用符付きテキスト
"
は、C ++では文字列リテラルと見なされます。 - 式
\n
は、次の行に折り返すことを意味する「特殊文字」です。 - coutという名前は、標準出力を表しています。 「送信済み」というテキストが画面に表示されます。
- ソースコードでは、
//
記号の後に記述されたすべてのテキストはコメントと見なされます。 コメントはコンパイラによって無視され、コードを読んで保守する人のために書かれています - プログラムの最初に、彼らは通常、プログラムの目的を説明するコメントを書きます。 このタイプのコメントは、どのようなアイデアを正式に、正確に、そして完全にコンピューターに伝えるべきかを、開発者に思い出させます。
- 「#includeディレクティブ」は、コンピューターがファイルから機能を含める(使用可能にする)ために必要です。
- std_lib_facilities.hファイルは、標準C ++ライブラリのツールを使用できるため重要です。
- すべてのC ++プログラムには、エントリポイント(mainという関数)が必要です。 プログラムの実行はそれから始まります。
- アクションを記述し、プリプロセッサディレクティブではないC ++プログラムの部分は、ステートメントと呼ばれます。
- C ++コンパイラは、ソースコード(作成するコード)を人間が読み取れる形式から「マシンコード」に変換します。これはコンピューターによって実行されます。
- コンパイラは、文法の正確性についてソースコードをスキャンします。 各単語を定義する必要があります。 プログラムには、プログラムの開始前に識別できる他の明らかなエラーがあってはなりません。 コンパイラは、すべての「コンパイルエラー」が解決された場合にのみプログラムをコンパイルします。
- コンパイラは、おそらくプログラミング中のあなたの親友です。
- リンカとは、プログラムのコンパイルされた部分を実行可能プログラムの形でリンクするプログラムであり、多くの場合、さまざまな人々によって開発されます。
- オブジェクトと実行可能ファイルは、システム間で移植できません。 たとえば、Windowsマシンでコンパイルすると、Linuxマシンでは起動しないWindows用のオブジェクトファイルを取得します。
- コンパイラがエラーを検出した場合、それはコンパイル時エラーと呼ばれます。 リンカがリンク時エラーの場合。 起動後に検出されるエラーは、実行時エラーまたは論理エラーのいずれかです。
- 原則として、コンパイルエラーはリンカーエラーよりも見つけて修正しやすいです。 また、リンカエラーは、実行時エラーや論理エラーよりも簡単に見つけて修正できます。
- IDEまたはIDEツールは、コードの記述、デバッグ、コンパイル、構成、および実行を支援します。
- IDEには通常、構文強調エディターが含まれています。 この機能は、コメント、キーワード、およびコードの他の部分を区別するのに役立ちます。
- 読んだこと、クラスの講師から聞いたことをすべて理解しているという印象を受けるかもしれませんが、プログラミングスキルを身に付けるには繰り返しと練習が必要です。
第3章オブジェクト、型、および値
この段階では、値を取得して維持するのに基本的に複雑なものは何もないことを明確にすることが重要です。 ただし、この考え方は、プログラマーでない人、特に数学の知識が豊富なプログラマーでない人にとっては予想外の新しいものです。 類推はうまく機能します。変数は、値を入力できるボックスです。 さらに、類推を使用します。変数の型はボックスの形状であり、変数に入れることができるものを決定します。
生徒が課題といくつかの演習を完了することが重要です。 以前にプログラムした学生は、rog慢すぎて、いくつかの新しい事実をスキップする傾向があります(学校と比較して)。 第4章で公式に知り合う前に、意図的にifコンストラクトを使用します。これは、幼稚園から知っていることの単なる新しい記録であることに注意してください。 ほぼ同じ方法で、算術演算が高校生全員に馴染みがあることを示します。 プログラミング言語ツールは、学生がすでに知っているアイデアの珍しい記録です。 定期的に指摘することが重要です。 別の模範的な例を解析するたびに、これを生徒に繰り返す価値があります。
ここで本当に新しいのは、割り当て、初期化、およびタイプです。
多くの人(特に数学をよく知っている人)にとって、(コンピューターによる)コマンドのシーケンシャルな実行のアイデアは予想外であることに注意してください。 1枚または2枚のスライドを用意し、プログラムを「コンピューターのように」1行ずつ話して、だれもが一般的なアイデアを得るようにします。 これには時間がかかりませんし、将来の問題を回避できます。 特に前もって終了するリスクがある場合は、スライド20〜21(「割り当てと増分」)と27(「別の単純な計算」)を取ることができます。 第4章は繰り返しになります。
この時点で生徒にタイプセーフティの問題をロードするのはなぜですか? 目標は、技術的な制限と現実世界の制限の両方を考慮した考え方の構築を開始することです。私たちの言語と実践は、ハードウェア上の問題の解決策を単に表現する方法です。 鉄は本物であり、そのような制限を課すことができます。 これはプログラミングコース(ソフトウェア開発)であり、数学や哲学ではありません。
第3章あとがき
- 実際のプログラムは通常、いくつかの入力データに基づいて結果を生成します。 起動するたびに同じテキストが表示されるわけではありません。
- オブジェクトとは、オブジェクトに含まれる情報の種類を示すメモリ領域です。
- 変数は、指定された名前とタイプ(たとえば、intまたはstring)を持つオブジェクトです。 オブジェクトに配置できるものは、タイプによって異なります。 たとえば、文字列はstring型の変数に、整数はint型に配置できます。
- プログラムがメモリを割り当て、新しい名前を使用できるようになるコマンドは、宣言と呼ばれます。
- ユーザーからデータを読み取るには、cinが使用されます。 この名前は、標準ライブラリで説明されている標準入力ストリーム(英語では「si-in」と発音します。「文字入力」)に関連付けられています。
- コンパイラは各変数の型を記憶し、宣言で指定された型に従ってそれらを使用することを確認します。
- 式
cin >> name >> age;
2つの値を読み取ります。 最初は文字列型の名前変数に配置されます。 2番目は、int型の年齢です。 1つの入力コマンドで複数の値を読み取ることができることに注意してください。 同様に、1つの出力コマンドで複数の値を出力できます。 - 一部の演算子は、セクション2.4の表に記載されています。 (約perev。おそらくセクション3.4を参照)
- 文字列変数は、その中の文字数を追跡します。
- オブジェクトがそのタイプの規則に従ってのみ使用される場合、プログラムまたはプログラムのフラグメントはタイプセーフです。
- . , C++ , .
- !
4
, (if, while, for, switch) (" , ") — , .
( ).
. . . , "" , ( ). , . , . , 10 : — . . : " , , !". , , . : " " " ".
— . , , - . . . , , ( , , ).
, " " — . , , . .
++x
? ( ) ++x
. x=x+1
"". , ++x
. - for (int i=0; i<max; i=i+1) ...
.
CS. , , . : " C++ , !". . " ". , , , . " ". , . , , (" ; ; — , !"). . , .
, , " ". , , "". . . "", .
, -. , .
4.
(. . )
- . ( 4.1)
- — . ( 4.1)
- , . ( 4.1)
- , . ( 4.1)
- : " , ". ( 4.3)
- . , . ( 4.3)
- . ( 4.3)
- . . ( 4.5)
- (block/compound statement) , . ( 4.5)
- . ( 4.5)
- , ..
;
{}
. ( 4.5) - if-else . , , — . ( 4.6).
- , - , . ( 4.6)
- (switch) . ( 4.7.1)
-
break;
,break;
. ( 4.7.1) -
default
. . ( 4.7.1) - , , . ( 4.8)
- for while, , . ( 4.8.3)
- for. (4.8.3)
- for . -. ( 4.8.3)
- while - , , , for. ( 4.8.3)
- , , . ( 4.2)
- " " , . ( 4.2)
- . , , . ( 4.9)
- , (). ( 4.9)
- . , , . ( 4.9.1)
- , . . ( 4.10)
- sort() : . ( 4.10.2)
- , . ( 4.11)
5:
, . , ( ) , .
" ". . .
, .
- - . , . , , .
5.
- , , . , , . ( 5.1)
- , , . ( 5.1)
- , , . , (. ) . ( 5.1)
- , , . ( 5.1)
- :
- ( 5.1)
- , 90% . ( 5.1)
- :
- ,
- , ( 5.1)
- , , , , , , . ( 5.2)
- : "", . , , . ( 5.3.3)
- , ,
- . ( 5.5)
- C++ , " ", . , ( ) ( ) , . ( 5.6)
- . , . ( 5.6)
- , . , , . ( 5.7)
- , . , . ( 5.8.1)
- , : "
error()
exception&
main()
. ( 5.8.1)
6.
.
, .
. .
, , , . , — .
:
- , .
- ; ; , .
, , . " "; ; , . ( ) . , .
. .
(.. )
( ) , " " "" "". . . , 6 7. .
, — . , . . , . , ( ); , - . 8, .
. , :
- , ( ) .
— .
, ", . ".
.
202-203. 4+5+6+7 , ( ).
4+5 6+7 . Token_stream , . , . , Token_stream . ( , " " , ).
, . , — . " ". — .. — . .
, . . , " , ..." .
, , , . .
6
- — . , ? ( 6.1)
- — , — . ( 6.2)
- — , . ( 6.2)
- , . , , . ( 6.2.2)
- . ( 6.3)
- " " . ( 6.3)
- , , . ( 6.3)
- : , . ( 6.4)
- Token C++. . ( 6.8)
- C++ : () . , , , .
- , — . .
7:
; , , .
— , ( , , ). : , , ..
, :
- ( )
- ( )
- (maintainer)
- ユーザー
, .. " ".
, (" ") . .
7
- , . ( 7.1)
- , , , . ( 7.1)
- " ", !
- . -, . ( 7.1)
- , . . ( 7.3)
- . ( 7.4, 7.5)
- () , . , . ( 7.6)
- , . ( 7.6)
- . " " . ( 7.6.2)
- , . ( 7.6.2)
- , ; . ( 7.6.3)
- , . , . ( 7.6.4)
- , . . ( 7.6.4)
- . , . ( 7.7)
8. :
— . , . , !
. "" " " " ". , , ( ). , " " ( , " ").
, "" , — . " ", ( ) . . " " " /" . , , . , - "" 25 , . , 25 ( ), . , ( /, iostream). , (. ) (" , "). . , , , , : , .
: ( ). , . . ( ) .
8:
- , - . ( 8.1)
- C++ , C, Java C#, . ( 8.1)
- , , , , . ( 8.2)
- C++, , . ( 8.2)
- ; , . ( 8.2)
- , . ( 8.2)
- , ( ) , . ( 8.2)
- ; , . ( 8.2)
- extern . ( 8.2)
- , -. ( 8.2)
- ; const . ( 8.2.1)
- () . ( 8.2.1)
- C++ , , "- ". ( 8.3)
- std_lib_facilities.h , cout, vector, sqrt(), error(), . ( 8.3)
- . , . ( 8.4)
- — , - . ( 8.4)
- , . . ( 8.4)
9. :
" " ( ). . Date.
(9.4.3). , , , . .
, "" . . . , .. , " " . .
( ). — get() set() , , .
, , , " ".
. , , . " ".
9.
- , . ( 9.1)
- . C++ : . ( 9.1)
- , , .. , . ( 9.1)
- , , . ( 9.1)
- C++ ( ) , .
- , . public.
- , . ( 9.3)
- , -. ( 9.3)
- , . ( 9.4.3)
- , , . _ :: __. ( 9.4.4)
- - . — . , 5 , . ( 9.4.4)
- (enum) , . ( 9.5)
- , C++ , : +, -, *, /, %, [], (), ^, !, &, <, <=, > >=. ( 9.6)
- . ( 9.6)
10. /.
"" ( - ; ). — "". . . (, /, ), .
, :
- ( , )
- ( ) .
- ("" " ")
, , — GUI ( 12-16). : .
10.
- : , , .
- , . / . /. ( 10.1)
- /, , / . ( 10.1)
- - , , , , , . ( 10.1)
- , C++ istream, — ostream. ( 10.2)
- , " " — . , . ( 10.3)
- , , ( ), . ( 10.3)
- , , ( ) , . ( 10.3)
- ostream istream , . ( 10.4)
- . ! , istream , " ":
- good() //
- eof() // (" ")
- fail() // -
- bad() // - ( 10.6)
- , :
- ( )
- - ( 10.7)
11. /
"" . " , //_, ". , , , . ( ) // ( , , , , ). / .
" , ". . 23, , , . : " , 23; . , ".
11.
- , - iostreams, 10, . , . ( 11.1)
- , . , , . ( 11.1)
- , ostream, . , <<.
- << hex << oct . , << hex , , << oct — .
- , — 0, 0x ( 0X). C++.
- : oct, hex, dec, showbase, noshowbase setw.
- .
- : fixed, scientific, general ( standard), setprecision setw.
- general scientific fixed . - 6 .
- (general 6 ) , . " ".
- .
- , . : istream, , ostream — .
- . , , good().
- / , , / , , .
- , : .
- iostream , /, . , , / .
- istream, , istringstream, , — ostringstream.
12.
. - . . /, . , () , / — " ".
, () , .
( ) : (, ), . , "" .
, " " . , , , " ".
FLTK ( ) . /GUI, , . , , FLTK . , . Windows, Linux Mac, . " ; , ".
MSVS GUI. , FLTK , . , ( 180 ), — .
, " Next" , " ". , , , — 16.
( ) , . , , .. , " ".
, 12-16 "". "Next" "" . , , , .
, ( 17), " " . " " — .
13.
( ) , FLTK. ; . (14) : shape - , . , : ; "" . Lines Text .
new . Vector_ref , , , " new". - ( ), ", new Vector_ref ; 17. , ".
private (14).
, . , , .
14.
: , . , . , , . — — " ", . , " , " . , " ; "" " ". , , — , ; , ".
15.
. — 14, 15. , , "" ( " ", - — "", ).
(), . , , ( "" , ). , . exp(). . , . .
expN() . , ( ). , — , . , Function . , . Axis . , . . , " " . , .
"" , (, ( sleep(); , 26.6.1) ( 24.7)
16.
. GUI . iPod . , , " ".
, . , . , , : , , ..
17: .
" " . .
" ":
- ,
- std::vector
- (templates)
, "". . , , , " , ".
, std:vector ( 19). ( ) :
- " " .
- .
, , Java C# ( - — , ).
, . — ; . , - ( C C++). . 18 25, .
, — C++ ( ; . 19). .
18.
, , . C. , .
.
19. ,
reserve(), resize() push_back() ( ""). STL ( 20).
, : RAII . . . , ( , Java).
, "" , ( ). , . , - (. Microsoft C++). , . , , ( ) . .
20.
STL . , " " " " . STL , ( , . ). "" , .
, . "" , STL — , STL. , (accumulate() find()). .
: STL, . , , :
- ""
"". . . , — .
21.
. : "!". , ( : " !" — , " ?" — ). — , , . , — . ( , ).
22.
, , . . " ". , .
. . . , , .
- 5 , 80.
C++ . , , . Fortran/Cobol/Lisp , . C++/Java/PHP. , -.
. , .
23.
, , . . . , -, .
, -, -, -, -.
.
. , , ( A,C,G,T: , , , ).
: " C++". : C, C#, Javascript, Java, C++, Ruby, Python ..
( , ) . . , ( ), ( ) .
24.
Matrix, . ( ) - (generic) . ( ).
, . — . , ( ), . .
25.
, . , — . .
, , . . , ( ) . , 17-19 ( ) 24.
C. — , . — . ( C C++). ; ( " " " ").
TEA , , ( ) ( , ).
3 , . 4 F-16 , — , MAN. 1. : , () , — .
, / "", .
26.
, "" . , , , .. , — . , . , . . — . .
27. C
, C , C++. — C++ . — — . . C C++ (. ), "" " ". , "" — , C C++ - — ( ), .
, C , C++. C++. C :
- //
- ブール
- const
- for (C99)
- inline (C99)
, , C++ C, .
/ C C++. . , "" C.
ワードカウントの例は、高レベルプログラミングと低レベルプログラミングの違いを示しています。すべてのプレゼンテーションコードを自分で作成した場合は間違っているため、これを使用しました。strcmp()と侵入型コンテナーの例は、他の例よりもCの使用を明確に示している(そして両方ともC ++に適用される)と信じています。