DAVID J.マラン:これはCS50であり、 これは、4週の開始です。 そして、少年は、フォルクスワーゲンであります すべてのためのソフトウェアのトラブル。 私たちは見てみましょう。 [ビデオ再生] -Cars、賢い文字 ワイルドスピード映画インチ 今週ドイツの自動車メーカー フォルクスワーゲンは、自分自身を発見しました のスキャンダルの途中で 潜在的犯罪者の割合。 -Volkswagenは数十億のためにブレースされます 罰金で、可能な刑事告発 その幹部のため、として 同社は謝罪します 11〜万台をリギングするための それは排出量のテストを打つのに役立ちます。 -Certainディーゼルモデルがありました 洗練されたソフトウェアで設計 など、その使用される情報 ステアリング及び車両の位置 車があったかを決定するために高速化 排出量のテストを受けて。 そのような状況下では、エンジン 有毒な排出量を減少させるであろう。 しかし、車はバイパスに不正ました それが駆動されたときに。 排出量は、40に10を増加しました 許容可能なEPAレベル以上の時間。 [END再生] DAVID J.マラン:だからしてみましょう これを見てください そして、正確にどのようにこれを見ます 実装されるかもしれません これがどう影響しますか このようなので、多くの車。 だから私の手でここにプレスされています EPA--によって発行されたリリース 環境 保護庁ました 米規制当局は、あります 環境問題を処理し、 そして、実際の た法的通知 ほんの数日前にフォルクスワーゲンに送信します。 だから、EPAは書き込み、今記載されています 公に、洗練されたソフトウェア 特定のアルゴリズム フォルクスワーゲン車を検出 車が受けているとき 公式の排出テスト そして、完全排出をオン テスト中のみのコントロール。 の有効性 これらの車両の汚染 排出制御装置が大幅にあり すべての通常の運転中に低減 状況。 これが会う車になります 実験室やテストにおける標準 駅が、通常の動作中 窒素oxides--またはNOx--を発します 最大40倍の標準で。 フォルクスワーゲンによって生成されたソフトウェア 引用引用終わり、敗北装置です、 クリーンによって定義されます 米国のエア法。 彼らは、と言うことに行きます EPAと他の機関 敗北デバイスを発見 独立した分析後のソフトウェア 西の研究者によって、 バージニア大学。 NOxの汚染はに貢献 二酸化窒素、グラウンドレベルのオゾン、 微細な粒子状物質。 これらへの暴露 汚染物質がリンクされています の広い範囲で 深刻な健康への影響、 増加した喘息を含みます 攻撃や他の呼吸器 十分に深刻なことができる病気 病院に人々を送信します。 オゾンへの曝露と 粒子状物質も持っています 時期尚早と関連して 関連呼吸に起因する死亡 または心血管関連する影響。 子供、高齢者、人々 既存の呼吸器疾患 特にのための危険にさらされています これらの汚染物質の健康への影響。 十分ではそれは非常に深刻だ、と言うことです。 そしてのが読みに行きましょう ちょうど1より抜粋 し、我々は見てみましょう 基礎となる含意 車の文脈でこれを。 具体的には、フォルクスワーゲン 製造およびインストール いわゆる中ソフトウェア 電子制御 module--またはECM--の 検出されたこれらの車両 車両はのためにテストされていたとき EPAの排出基準の遵守。 含む種々の入力に基づいて ステアリングホイールの位置、車両 スピード、エンジンのの期間 操作、および気圧、 これらの入力を正確 パラメータを追跡 使用される連邦試験手順の EPA認定の排出テスト 目的。 EPAの排出テスト中、 車両のECMソフトウェア 生成ソフトウェアを実行しました 準拠した排出量の結果。 他のすべての回では、 車両のECMソフトウェア 別々の道を走りました 減少し、キャリブレーション の有効性 全体の発光制御システム、 特に選択的触媒 リーンNOxの還元trap-- これは我々が今では約表示されます。 NOxの結果、排出量 10〜40倍の倍増加 EPA準拠したレベルを超えます 駆動周期の種類に応じ。 それでは、これは本当に意味し、 ソフトウェアの実行中にソースコード フォルクスワーゲンの上にない持っています まだ一般に公開されて、 つまり、効果的に、これは 同等の内部のどこかにあり フォルクスワーゲンのコードの。 あなたがテストされている場合は、車の場合 特定の環境因子を検出します ステアリングホイールのような 位置や動き またはその欠如、車のまたはその 他の要因の任意の数の 現在仮定されます この式の一部であることを、 彼らは単にオン 完全な排出量が制御されます。 言い換えれば、開始します 汚染物質の少ない発光。 そうでなければ、他のすべての状況で それがあるとして検出されていないとき 実験室で、彼らはただありません。 そして、あなたはより多くにこれを簡略化することができます 何かコンクリート擬似コード このような。 車輪が回っている場合が、 ステアリングホイールは、示唆的ではありません 車はいくつかの上にあることを 回転シ​​リンダの種類 しかし、いくつかの種類で 倉庫は、試験されます その後として振る舞います EPAは、あなたのことがしたいと思います。 しないように注意してください。 それでは、見てみましょう その短いビデオで 何の影響を見てとります 実際に機械的にこれです。 [ビデオ再生] -last金曜日EPAは、いくつかのことを発表しました フォルクスワーゲンアウディ車は2009年の間に作られました 今年は、使用していました いわゆる敗北デバイス 排出量の法律を回避するには きれいな空気を保つために設計されています。 しかし、それは正確に何を意味するのでしょうか? さて、現代車は数十を持っています その中のコンピュータの。 そして、それらのコンピュータの一部 機能を調整助けます 最適のためのエンジンの 性能を確認しながら、 あまりにも多くのゴミがないこと 排気管から出てきます。 彼らは実際に働いています ここ数十年のためにこの方法。 基本的には、すべての部分 現代車のエンジンの センサやコントローラを持っています それ、およびこれらのコンピュータ上で データの数千人に読んでいます 調整を行う毎秒回 空気に対する燃料の比率のような それは、気筒内に起こっています。 これらの不正行為フォルクスワーゲン アウディのモデルはディーゼルであり、 そして、ディーゼルは、1以上を持っています 本当に重要なコンピュータ で制御されたパラメータ、 未燃燃料の量が起こっ 排気に。 今では悪い聞こえます。 あなたが望むような音はありません 排気に入る未燃焼燃料。 しかし、の場合 ディーゼル、あなたが何かを持っています そのデバイスであるNOxトラップと呼ばれます 吸収した窒素酸化物のトラップ そのでしょう汚染物質であること それ以外の場合は大気中に入ります。 そして、そのNOxトラップの効果 未燃焼燃料で強化されています。 だから敗北デバイスは、特別なプログラムです それを作ることができ、これらのコンピュータの内部 車が排出量を満たしているように見えます それがなくても標準。 フォルクスワーゲンは、その手に問題を抱えていました。 そのディーゼルエンジンが知られていました 偉大な燃費を取得するため、 しかし、NOxトラップだけうまく機能 より多くの燃料が使用されている場合。 だから車は、検出してくれ この敗北デバイスを使用して、 それが排出量を得ていたとき 試験は、それがより多くの燃料を使用し、 よくNOxトラップを動作させます、 排出量は大丈夫だと思います。 しかし、その後、あなたは、道路上のデバイスを取得します オフにし、あ​​なたがより少ない燃料を燃焼しています しかし、あなたは最大40倍を入れています 大気中へのより多くの汚染物質。 しかし、いったいどうやったのか 車はそれがあったことを知っています エミッションコンプライアンスのためにテストされていますか? EPAは、それが洗練されたと言います 物事をチェックするシステム ハンドル位置のような、 スピード、エンジンが上だった時間の長さ、 さらには、大気圧。 言い換えれば、存在しました ない方法これは偶発ませんでした ソフトウェアがあったため、 検出することは非常に慎重に設計されました 公式排出テスト。 それはいくつかのかなり深刻です 欺瞞とその者の なぜフォルクスワーゲンであります このような深刻な問題。 実際には、彼らの最高経営責任者(CEO)、マーティン ヴィンターコルンは、ちょうど辞任しました。 何が次に起こりますか? さて、あなたは半分百万の1なら ディーゼルジェッタ、ビートルズ、Golfs、Passats、 またはアウディA3Sは、影響します 良いニュースはです あなたの車はまだ運転しても安全であることを。 あなたは離れてそれを置く必要はありません フォルクスワーゲンまでリコールを発行します。 しかし、いくつかの点で、彼らはしています おそらく持っているつもり あなたの車の内部のソフトウェアを更新します。 それが起こるとき、あなたはかもしれません タンクあたりの少ないマイルを取得します。 弁護士は、すでに準備を進めています クラスアクション訴訟のためのアップ そう所有者が補償されるかもしれません 将来のある時点で。 しかし、それはことはないだろう いつでもすぐに起こります。 [END再生] DAVID J.マラン:だから、これは実際に発生させます 興味深い大きな画像の質問 信頼するように。 右? 私たちのすべてのiPhoneやアンドロイドを持っていますか、 私たちのポケットに何か可能性が最も高いです これらの日、またはラップトップ ある私達のラップに 実行中のソフトウェア製 AppleとMicrosoftが 他社の房。 しかし、どのように我々は何をすることを知っています これらのソフトウェア製品は、やっています 何これらは実際にあります 企業は、彼らがやっていると言いますか? 例えば、誰がするのです 言うたびに あなたのiPhoneに電話をかけます またはAndroid携帯電話など、 その電話番号もないことを いくつかの企業のサーバにアップロードされています いくつかのプログラムのあなたがたから それは、オペレーティングだか、書かれました iOSのやAndroidなどのシステム自体、 または、ダウンロードしたので、 一部のサードパーティ製のアプリ 何とか聞いていること すべてにあなたが入力していますか あなたが実際に言っているすべてのもの。 あなたはそれを知っていますかどのように、時 あなたたちは、クランを実行しています または、あなたをコンパイルするようにしてください CS50で独自のソフトウェアは、どのように あなたがそのCS50自身のスタッフが行い、 CS50ライブラリを介して、 すべてのログ記録されていません あなたが得ている文字列 またはすべてのあなたが得ているインチ? さて、あなたは確かに見ることができます 何かのためのソースコードを CS50ライブラリーのような、あなた ソースコードを見ることができます Linuxのオペレーティングシステムの CS50 IDE上で実行されています。 しかし、驚くべき発表 1984年に戻って与えられました によるチューリング賞の受信で 知られている非常に有名なコンピュータ科学者 名前のケン・トンプソンas--人 チューリング賞を受賞しています コンピュータサイエンスのの一種であります ノーベル賞、あなたがする場合は、 上の彼の仕事のために オペレーティング・システムと呼ばれます で非常に似ているのUnix、 我々は、Linuxである使用しているものに精神。 彼は彼に尋ねた質問 基本的に受諾演説、 以下のためのフレームワークを敷設 年と議論の年 信頼とセキュリティについて、これがありました。 どの程度べきもの信託Aへ 作品をprogram--という声明 トロイの木馬のありませんかsoftware--の? おそらくそれは信頼することより重要です ソフトウェアを書いた人。 そして、実際には、我々がリンクされました 彼の話に この賞を受け入れるときに与えました CS50のウェブサイト上で80年代で 今日のために講義ページの下。 あなたが表示されますので、どのような 彼が実際に与えることです どのようにしてもかなり単純な例 クランまたは何のようなコンパイラ 他の人が過去に使用したコンパイラ、 コンパイラの私たちに埋め込まれた場合にどのような 自分が使用している場合は少なく、 基本的に、と言う条件 あなたはこのコードを使用していることに気付いた場合 GetString関数またはGetIntで この関数は、先に行くと挿入します バックドアやトロイの木馬 その結果、そのプログラム 今、いくつかのゼロを持っています 悪意のある何かをするもの。 あなたのすべてのログ そのデータをアップロードするキーストローク、 一部のサーバー、または本当に何に。 そして、何ケン・トンプソン 彼の話に行うに進みます 場合でも、それを実証することです あなたは、ソースへのアクセス権を持っています そのコンパイラのコード 悪意を持ってこれを行う可能性があり、 それがために重要ではありません。 この鶏と卵があります 過去の多くの現実 年となるコンパイラ 自分自身をコンパイルするために使用されます。 言い換えれば、大昔に誰か 最初のコンパイラを書かれている必要がありました。 彼らは更新した後、任意の時間 そのソースコードを変更することによりコンパイラ 機能を追加し、それを再コンパイル 私たちのような人が使用する、よく、 彼らは古いものを使っています コンパイラのバージョン 新しいをコンパイルします コンパイラのバージョン。 そして、あなたが見てみる場合 彼が与えた話では、 あなたはその理由が表示されます その円形の、 あなたが実際にバグを持つことができますか ソフトウェアに組み込まれトロイの木馬 我々は、使用しています。 そして、あなたは見ていても これらのプログラムのソースコード、 それも明らかではないかもしれません トリックは実際にあるため、 一部の古いバージョンで それ以来されているコンパイラ 当社のソフトウェアへの脅威を注入します。 どれだけ我々は、言って 本当にできないといけません 私たちのラップトップ上で実行されている信頼のソフトウェア または電話や場所の任意の数。 そして実際に、それ以降の場合は、この学期で 我々は、Webプログラミングについて話し始めます 実際に構築を開始 Webアプリケーションに自分自身を、 我々はこれらの話をします 脅威など。 さて、あなたは不思議に思ったと気づいたかもしれません 小さな小さなダースがあったこと そのクリップでベイダー ベルジェが見せていました フォルクスワーゲンについて。もし あなたは、私は、見たことがありません 私たちは明るくなければならないと思いました 気分これが全てですので、 非常に気のめいると恐ろしいです。 私は振り返るつもりです 2011年のスーパーボウルで 時によって商業 Volkswagen--この ほとんどそれら好感again--なります テレビで初めて放送されました。 これは、60秒のクリップです 私は、あなたがお楽しみいただけますと思います。 [ビデオ再生] [MUSIC - 「スターウォーズ」のテーマ] 【DOG BARKS] 【CARが開始] [END再生] DAVID J.マラン:うん。 私はちょうどチェックしていました。 あの車は、違反のリストにあります。 大丈夫。 だから我々はいくつか見て 少し前擬似コード。 そして、ここに大きいです 擬似コードコードのスニペット 我々はこれまで何度か見てきたこと。 そしてのは、これがチャンスです使ってみましょう 新しいプログラミングを導入します 私たちがした技術 アルゴリズムを参照してください。 我々はマージソートを見先週。 しかし、ここではそれを形式化し、どのように見てみましょう 我々は、実際のコードでそれを使用する場合があります し、我々はこれを使用するつもりです 道技術最も 特定の他の問題を解決する可能性が高いです。 だから、これは最初のプログラムの一つであった、我々 これまでの擬似コードのコードではあるが、書いています。 そして、何このプログラム 私たちはコースを行うことを許可 電話帳にマイク・スミスを見つけることでした。 また、特定の行で通知8 このGO TO文を持っていた11。 そして、実際には、一定の 言語、C中でも 実際に持っています 文字通り声明 それに行くあなたがすることができます 特定の行にジャンプ。 これは、一般的にので、眉をひそめています それは非常に簡単に悪用される可能性が あなたはジャンプを開始することができます 対照的に、すべての場所で​​プログラム 種類のを使用します 論理及び制御フロー 私達はちょうどでこれまで使用してきたこと ループや条件など。 しかし、我々は、このアルゴリズムを簡素化することができます 擬似コードのコードでは以下の通り。 代わりに、この反復の またはループのアプローチ ここで、我々は戻って保持し、 バック、バックライン3に、 なぜ我々だけの種類のパント、よりません 一般的には、ライン7と10で言います ちょうどそれらの2を交換 と線対、 他のスミスは早い場合 本の中で私たちはよ にマイクを検索 本の左半分。 それ以外のスミスは、後になっている場合 本、右にマイクを検索 半分の本。 すでに真円に気づきます。 右? 私は中にマイクを探しています 電話帳とその後 私は最終的には多分ヒット ライン7または多分ライン10 そして、自分自身に私の命令が検索です 電話帳の半分にマイク用。 さて、どのように私はマイクを探していますか? 私はの真ん中によ マイクを探して、なぜ あなたは、ソートの輪の中に私を送っていますか? 何であるため、しかし、それは大丈夫です 問題の大きさに起こって、 7行目と10で書かれたように? 私達はちょうど検索を言っていません マイクのために、マイクを検索します。 我々は、具体的に何を言っていますか? の左半分に彼のために検索します 効果的である右半分 問題の半分のサイズ。 だから、我々は一種のだということもOKです この真円に従事、 この循環論法、 少なくとも私たちはだから 問題はますます小さくなっています。 そして、最終的に我々が到達しようとしています そのいわゆるベースケース場所 私達はちょうど1ページを持ってleft-- 私たちのボランティア先週など did--私たちは、1ページを持っていました 放置し、その後、私たちにはありません マイク・スミスの検索を維持する必要があります 彼はそのページのいずれかをだから または、彼はありません。 だから我々はこの考え、これを実装する方法 実際のコードで、円形の一種? まあ、我々は技術を活用することができます それは一般的に再帰として知られています。 そして、我々は、これを見てきました マージソートのための擬似コード先週。 これがあったことを思い出してください マージソートのための擬似コード。 それは間違いなくよりもさらに簡単です バブルまたは選択または挿入ソート ただ単純さの点で、 これであなたはそれを表現することができます。 しかし、それはので、です 我々は一種の円です 何かを検索し、言っ 再びそれを検索して。 しかし、我々は、いずれかで検索しています 左半分または右半分 して、最終的に私たちがしています この場合、マージ。 しかし、ここでは、あまりにも、と これら二つのソートライン、 我々は再びこれを持っていました 再帰の考え方。 そして、具体的にこれが何を意味するのか、 アルゴリズムの文脈では、 アルゴリズムは再帰的であるということです それは、使用するか、または自分自身を呼び出す場合。 またはCの点で、関数であります 関数をrecursive-- fooが、fooの場合は再帰的です どこかにそのソースコードで、 関数foo自分自身を呼び出します。 そして、それはすべてのfooが今までにない場合は残念です 何度も何度も自分自身を呼び出すです。 fooが最終的に停止した場合に行うようにそれは、OKです ちょっと待って、と言って、マージソート、 この問題は、スーパーである場合 例えば、小さな、 または私は私は誰彼を見つけました 探して、ちょうど返します。 再帰的ではなく、しないでください 周期的にもう一度自分自身を呼び出します。 そしてそうのは、見てみましょう どのようにこれは実際に動作する可能性があります。 だから私は先に行くつもりとオープンです ここでは2つのソースコードの例アップ。 一つはシグマ0と呼ばれています。 そして、これがすべてではありません 再帰的な、しかしそれでは、見てみましょう このプログラムは何を見て。 私はすべて取り除かました それ以外のすべてからのコメント CS50の上のソースコードの ウェブサイトはあなたの場合はコメントがあります 後でもう一度それを読みたいと思います。 そしてのは、カップルをやらせます 正気のこちらをチェックします。 したがって、このコードの先頭に、 我々はCS50.h.が含まれています これは何をするのか? それはなぜここにいるのですか? 合理的な普通の言葉で。 それは何をするのか? うん。 聴衆:GetIntで機能が動作するように。 DAVID J.マラン:だから GetIntで機能が動作します。 この内部のため ファイル、CS50.h、これ 我々は長い間で前に表示されます そのソースコードの観点から、 機能の束を持っています GetIntで、のGetString、declared-- others--のとしない限り束と 私たちは、実際に行が含まれていることを持っています、 コンパイラのクランではありません それが存在することを知っているだろう。 そして、同じ行のために行きます INTが定義された2 関数であるprintf関数、 我々はかなり使用してください。 さて、ライン4は少しファンキーようです それだけで1ライナーだから。 それは、セミコロン、無カーリーを持っています ブレース、その内部にはコード。 しかし、我々は何を呼びました 週間過去にこの事? うん。 だから、プロトタイプ。 そして、なぜ私たちは持っています 思わプロトタイプ 少し冗長にします 一般的にので、私たちは通常、 再び関数を参照してください それ以降のファイルで、右か? では、なぜ私たちはあなただけですhave--ん あなたの頭を悩まが、私はそれを取りますよ。 うん。 聴衆:[聞こえません] メインの後に関数。 DAVID J.マラン:その通り。 コンパイラはあなたを知っているように、 最終的に定義または実装します おそらく、メインの後にその機能。 だからクラン最も コンパイラは、一種のダムです そして彼らは知っていますよ あなたはそれらを教えてください。 そして、あなたが使用したい場合 シグマと呼ばれる機能、 あなたはより良いコンパイラを教えます それは、事前に存在します。 さて、メイン自体も それはラインの束だけれども、 今ではうまくいけば、かなりよく知られています。 それがdo whileループを持っています その目的は生活の中で ここで明らかに取得することです ユーザーからの正の整数。 そして、ちょうど彼を困らせる保ちます または彼女それらが協働するまで。 そして、16行目で私が持っています 興味深いコール。 IntAnswer。 左手のどちら 側は私のIntを与えます Answer--呼ばstore--できます 保存しようとしている、明らかに、 シグマの戻り値。 だから、シグマはただであります 任意であるが意味のある名前 私は、関数に与えてくれたこと その目的は生活の中で 1 argument--を取ることです 我々はこのcase--でNそれを呼ぶことにします そしてちょうどその数の合計を取ります ですプラスすべての正の数 それよりも小さいです。 だから私は数に2を渡した場合 シグマ、私は2と1を追加します プラス0--ので、それは私3与えません0--。 私はシグマに3を渡す場合は、私がしたいです 私に6を与える、3プラス2プラス1を持っています。 など。 だから、それだけですべてを追加します より小さいかそれに等しい数字。 さて、ダウンここで私は行きますよ 答えを印刷します。 だから、迅速な健全性チェックとして、してみましょう シグマ0--ドットスラッシュシグマを作ります0-- 私は2を入力しましょう​​。 そして、私は確かに3を得ます。 私は3を入力してみましょう。 私は確かに6を得ます。 そして、誰もがすぐに計算を行うことができれば、 私は50を行う場合、私は何を得るのつもり? 聴衆:[聞こえません]。 DAVID J.マラン:まあ、ありません。 非常に近いですが、1275。 これは50をすることの結果であります 49プラス48プラス47プラス46プラス 1までのすべての方法。 だから、シグマが行うすべてです。 しかし、我々はきた方法を見てみましょう 今それを実装しました。 だからダウンここで機能そのものです。 そして、これは持っていないようです まだ再帰と何か。 実際には、我々が使用しています 古い学校の技術。 私は合計という変数を初期化しています ゼロに、私はここにforeloopを持っています、 私はと呼ばれるint型を宣言しています 私に等しく、それを設定します1-- 私はに等しいそれを設定することができても ゼロが、私はまたやってることから、 それがゼロまたは1つだ場合誰が気に。 それは影響を与えないことが起こっています。 だから私はあまりにも長い間、私はあるとして反復よ m以下、これ に渡された引数です。 そして私はちょうど保ちます I.と洞察力をインクリメント ループの私がやっているすべての合計をやっています プラスI.に等しく、それは意図的なのです。 私はこの中で、行うにはしたくありません 合計プラスプラスのような場合、。 私は実際に追加します 私の現在の値 これはどんどん大きくなって保持 ランニングタリーに大きな。 そして私は、合計を返します。 だから答えは、値の合計を取得します。 そして、私はそれをプリントアウト。 だからここにチャンスがあります、 しかし、この種の簡単にするために、 このコード概念的 ブローの種類は、一つの の面で気に でもそれかかわらず、シンプルさ ソートする時間がかかります なぜこれの感謝 これらの小さな例で強力です。 ここではそのように選ぶ - シグマです このコードの2バージョン。 トップアップすべてがそうと同じです その同じ話は前と同じように適用されます。 しかし、今のは見てみましょう シグマの実装します 私はちょうどこれらに絞り込まました 4行のコードlines--、本当に、 プラスいくつかの中括弧と空白。 しかし、私は何をやっていますか? mは以下である場合 ゼロ、私は種類の処理する必要があります その超簡単な場合。 そして、あなたは私に、ゼロまたは何かを手場合 ただ奇妙である負の、 私はちょうど任意にするつもりです しかし、一貫してゼロを返します。 私はこの事はしたくありません いくつかの奇妙な無限に入ります なぜなら、負の値のループ。 あなたは私を与える場合だから、僕は、言っています 0以下、私はゼロを返しています。 それはだからしかし、それは良いことです 電話帳の単一のページ それが残っています。 私は非常に特定の問題を離れてかみますよ 再帰的なものを呼び出していません。 しかし、ライン31で、どのような 私がやっているように見えるのですか? 括弧だけ維持しています 物事、うまくいけば、少し明確に。 しかし、私がやっているすべては私があります M--何を返します あなたの手のme--プラス M--の値申し訳ありませんが、 プラスマイナス1メートルのシグマの値。 だから、これは何を意味するのでしょうか? あなたが入力として私は数3を与えると、 答え私は最終的に取得したいです 3プラス2プラス1は私に6を与えるから6です。 しかし、どのように私は約思います どのようにこのコードが実行されていますか? 私はシグマ呼び出し初めて 私は、値3を渡します それが作品に言ってようなものです 紙は、ここに値3です 私はシグマとしてこれを渡してきました。 図3は、明らかにそうではありませんが0未満であります IF条件は適用されません。 ELSEはありません。 だから私は何をしますか? 私はある、メートルを返すようにしたいです 3、プラスMマイナス1のシグマ。 だから、私はこのを追跡してみましょう。 私はこれを置くつもりです 一枚の紙ダウン。 そして、どのような値であることが 明らかに、私は渡すつもりです 物語の中で、この時点でシグマに? 何番? 2、右? 3マイナス1は2です。 だから、僕は少し必要があります ここでは、紙のスクラップ。 だから今シグマが再び呼び出さなっています。 そして、私は意図的に入れています このダウンそれはだから 種類の一時停止のような 物語のそのバージョン 今、私は集中だから メートルの信号のマイナス1。 だから、mは3、mでマイナス​​1は2です。 だからここに私は渡されてきた2があります。 2は明らか未満ではありません 0だからその場合は適用されません。 そうでなければ私はこれであるMを返します どのような値のものに加えて、シグマ? 1--のシグマのであれば、mはあるため、 今2 SO 2マイナス1は1です。 だから今私は値1を持っています。 私はちょうど番号を渡しています 関数の1 sigma-- または私はhere--ので1は明らかではありません ゼロ未満、まだ適用されません。 それ以外の戻り値1を加えたもののシグマ? 0。 だから、私はちょうどそれを覚えてみましょう。 私は後でそれに取得します。 今、私は先とJOT行くつもりです 数0ダウンそれはだから 私の引数またはパラメータ。 私は数0に合格しています そして最後に、このプロセス ただ自分の広告を繰り返します nauseumは何のでやめるん 私はこの0を見たら、私はすぐに行うのですか? 私はゼロを返します。 だから今、あなたは話を巻き戻す必要があります。 私は今の時間に後方に行く場合、 最も最近のものだったもの あなたは文字通りいた場合、私はやりました ビデオを巻き戻しますか? 私は、最新のをピックアップするつもりです 1、それは私に1を与えるプラス0は1です。 私は巻き戻しておく場合 物語、それは私を与えるために起こっています 2プラス1であるこの実行値。 だから、3です。 そして私は、巻き戻しを維持するつもりです。 私は最初の番号を下に置くとき 3--ので3プラス3は私に6を与えます。 そして今、あなたは巻き戻してしまった場合 この時点までの映像まで、 これは非常にありました 最初の質問私は尋ねました。 3渡されたとき、3のシグマは何ですか? これは、実際の合計6です 紙のすべてのこれらの作品。 だからにしながら、それが少しかかる場合 あなたの心を包み込む、それは大丈夫です。 しかし、それはそれlittle--た検討 私が積み重ねられたことを非常に意図的でした 互いの上にこれらの数字。 それは一種のようなものです 時間のレコードをmemory--、 ビデオでスクラバーのように、 私は確かで巻き戻すことができます。 そして、我々は戻ってくるつもりです ほんの少しのそのメタファー。 しかし、最初に、それはそこだと判明します オタクと面白い人々の多くは、 私はグーグルで、推測します。 う非常に誰か グーグルで心が得意 ちょっと来ると 私は何かを探しに役立ちますか? 非常に、非常に低いキー。 ことはない誰か おそらく、前に出てきます。 OK。 うん? いい加減にして。 ダウンさあ。 あなたの名前は何ですか? SAM:サム。 DAVID J.マラン:サムは、ダウンに来て。 これは、同じです。 始めまして。 ねえ。 おいで。 私はあなたがする必要があるので、すべて、場合 あなたは、サムは、ここでは、Googleの可能性があります。 あなたは用語の再帰を検索することができますか? 台無しにしないでください。 そして今、ええlet's--。 [OK]をクリックしますこと。 より良いものをクリックします。 ああ、それを得ます。 なし? OK。 それでは、カップルの人をしましょう​​。 関連そんなにありません 学問的にここが、あなたを持っています これまでアナグラムをGoogleで検索! SAM:いいえ。 DAVID J.マラン:OK。 アナグラムの代わりに再帰を検索します。 どのように斜めについて。 あなたは今までに斜めに検索しましたか! さて、これはに少し難しいです 参照うまくいけばOK everything's--。 それはちょうどあなたと私はこれを楽しみました。 OK。 最後に、このone's-- それは少し斜めです。 今バレルロールを行います。 ワンダフル。 大丈夫。 ビッグサムをお願い致します。 どうぞ。 ありがとうございます。 だから何がすべてで起こっています これらの愚かな例の? だから本当に、のボンネットの下に コー​​ドの行のGoogleの何百万人 どうやらIF数愚かです 基本的な条件 ユーザーが持っているかどうかをチェック このフレーズに入力しました、 おそらく取った何かをします 時間の非自明な量 ちょうどに実装します このように、面白いこと。 しかし、それは、それは沸騰すべてです フードの下にダウン。 しかし、当然のことながら、再帰 geekierの詳細です これらの特別なトリックの中で例。 そして、確かにそこに他のアウトがあります 同様に、我々はおそらく持っていないこと まだ発見されました。 だから、見てみましょう、または検討 ここで、以下のプログラム、 確かにいずれかをつかみます あなたの方法うちにこれらの。 私は先に行くつもりだと なプログラムを開きます 2つの値を交換しようとするだろう。 我々はそこに行く前に、しかし、それでは、これを実行してみましょう。 私たちはもう一つを得ることができます ボランティア、私が思いますか? あなたはボランティアしますか? なし? アップさあ。 アップさあ。 大丈夫。 だからあなたの名前は何ですか? ローレン:ローレン。 DAVID J.マラン:ローレン。 、ローレンをご利用下さい。 だから、ローレンがされています 次のようにここに挑戦しました。 始めまして。 だからここローレンが前面に持っています 彼女の2つの空のカップ。 そして、我々はいくつかのオレンジ色を持っています ジュース、牛乳 そして私達は行くつもりです 先と次の手順を実行します。 私達はちょうどこれを埋めるつもりです。 こっちミルクの少数のオンスとはしてみましょう こっち少しオレンジジュースを埋めます。 そして、すべての目の前で これらの観​​客、 これらのカップの2つの値を交換します。 ミルクカップにオレンジジュースを入れて そして、オレンジジュースカップミルク。 あなたがでた場合はどのようにこれを行うだろう 家庭やその他の物資へのアクセスを持っていましたか? ローレン:別のカップにそれを入れてください。 DAVID J.マラン:OK。 それでは、一時てみましょう 変数、私たちがするかどうか。 そして今、先に行くと実装 この同じスワッピング手続き。 とても良い。 我々は一時的にOJを入れています 変数、OJ変数にミルク、 現在は一時変数 ミルク変数に。 OK。 だから、非常によく、これまでに行われ。 だから、と判示out--なります ちょっと思いました。 ここで、少しだけそれをオタクには、この 対応するCのコードになります 私達はちょうど実装こと。 我々は、2つの入力AとBの両方を有していました これは我々だけである単純化のために言いますよ int型の。 そして、私は交換したい場合は、ここで注意してください 2つの変数a、bの値は、 我々は確かに仲介を必要とし、 一時変数、一時的なカップ、 値のいずれかを注ぐその中に 我々はそれのためのプレースホルダを持つようにします。 しかし、その後のコードは正確です ローレン、ここで実装されています。 今、ちょうど取得します 少しスゴは、判明します あなたがなしでこれを行うことができます 一時変数。 しかし、これを適切に行うために、我々はつもりです いくつかの化学でカンニングする必要があります。 ここではいくつかの余分なカップを持っています。 そう見える最も近いものは、 牛乳と水のようなperhaps-- またはミルクとOJ--は、我々はいくつかを持っています 水、私たちはこの1つを満たしますよ 澄んだ水の少数のオンスを持ちます。 それはおそらくあまりにも多くのです。 うん。 それはあまりにも多くの間違いです。 1秒に保持します。 そして今、我々は、私が思い出すように、油を持っています 中学校の化学クラスから、 うまくいけば、それは、水と混合しません。 しかし、この種の一種の 牛乳とOJのように見えます。 だから今、使用せず 一時変数、 あなたは、これらの2つの値を入れ替えることができますか? 水カップに入る油はそう、 水は、オイルカップに入ります。 ローレン:なしカップ? DAVID J.マラン:なしカップ。 そして、私は実際にはいませんでした 今年の前にこれをテスト これがする場合ので、私は知りません 実際に化学的に働きます。 それは起こることになっていませんでした。 それが動作していますか? 大丈夫。 だから、分離? 良い。 今、私たちが得るようになりました 他のカップに水。 スマート化学コンセントレータできました おそらく私よりもこれを行います。 LAUREN:水が底にあります。 DAVID J.マラン:だっwater-- 我々はこれをしたキー最後の時間です。 あなたは、正しい順序でそれをしなければなりません。 うん。 それで大丈夫です。 だから今、私たちは、オイルの2杯を持っています。 OK。 それで大丈夫です。 しかし、これはI--よりも働いていた化学場合 ローレン:これは水です。 DAVID J.マラン:それは主に水です。 大丈夫。 しかし、それはまだ前と同じカップです。 だからit--がそこにそれを試して注ぎます。 OK。 これは、クラスの時間をうまく利用は、今日です。 OK。 だから今素敵we--。 並べ替え。 大丈夫。 だから、非常に良いです。 ローレンに感謝します。 非常によくやりました。 だから、あなたの心を爆破します これはおそらく、何かであります あなたはCS50のIDで好きなら一緒にプレイするために、 あなたは、実際には、2つの変数を入れ替えることができます 一時的な整数値を使用しません。 そして、これは対応するCコードです。 そして、あなたは最後から思い出した場合 簡単場合は水曜日、我々は、導入されました、 C.そしてないでいくつかの新しい演算子 誰もがなけなしのニンジンを思い出します シンボルは、その小さな三角形であります キーボードからのシンボルが表しますか? 何ビット演算子? 聴衆:EXOR。 DAVID J.マラン:EXOR。 排他的論理和。 だから、あなたがしたい場合は、ちょうど楽しみのために aとb 2任意のを与えるために家、 任意のeight--と私のような値 8ビットの値を選択することになります。 あなたは32ビットでこれを行う場合は、 あなたは非常に迅速に飽きます。 しかし、わずか8ビットを与えます どのような1つまたは2つの値は、 そして、同様の値bを与えます。 そして定義を使用して 先週の水曜日からXORの、 、ビットでのそれぞれを、そのビットを適用 aとbのそれぞれのものの8ビット、 そして、このコードごとに正確にそれを行います。 そして、それは間違っていない何 あなたが画面上にここを参照してください。 それは確かに沸きます 3 XOR演算に 何とか魔法と B位置を交換します 任意の情報を失うことなく。 だから、油と水のトリックです 最も近い現実世界の化身 私はそれを模倣するために考えることができます。 しかし、それは確かに簡単です 一時的な変数を使用し、 ここで、この場合のように。 そして、これはあまりにも機会が、言っています あまりにも、マイクロ最適化のこのような、 コンピューター科学者として 楽しみのようなものながら、と言うでしょう あなたがなしでこれをやったかを自慢します 余分な変数でスワップのような、 それはすべてその説得力はありません。 32ビット、などを保存しているため 実際のint型の場合には、 すべてが魅力的ではありません ここで、システム上の あなたは数十MBのサイズを使用している場合があります あるいはそれ以上、メモリ、これらの日。 そして、実際には、ときに我々が得ます 後で問題セットに あなたが呪文を実装 チェックしましょう でこれを行うに挑戦されます このように小さなRAMとわずか 上の可能な限りの時間 あなたはまだcomputer-- 実装する必要があり週間 あなたができるでしょうhave--ますit-- これらのリソースを最小化するために挑戦しました。 そして、それは本当にだけです 機会この学期 あなたは剃ることが奨励されます場所 でも最高のパフォーマンスオフ それ以外の場合はかかります。 だから私たちはどのようにすることができますwhat-- 実際のコードでこれを参照してください? 私は今、先に行ってみましょう そして、例を開きます その意図的に呼ばれています いいえスワップないことはしていませんので、 実際には、変数をスワップ 実際には想像のとおり。 それでは、見てみましょう。 ここにはCS50を持っていないプログラムです ライブラリは、ちょうど標準I / Oが起こっています。 今、私たちはプロトタイプを持っています トップアップスワップ用するだけ それは後に定義されるように持っていることを意味します。 そして、ここでの主なのです。 Iは、任意のxとyを割り当て、 それぞれ、値1と2 彼らは小さなだという理由だけで そして、考えるのは簡単。 そして私はちょうどprintf出力の束を持っています 私は健全性チェックを持っているところ。 xは1であります yは2であると考えられます これらのprintf出力は何を言うだろう。 だから、これまでに無い魔法。 それから私は、と主張するつもりです ドットドットドットを交換し、デフ印刷します。 私はスワップを呼ぶつもりです 関数、xとyを渡します。 そして今度は、そのために仮定しましょう スワップは正確に実装されています それは先ほどあったように 一時変数を持ちます。 だから、私は大胆に主張し、スワップ。 xは今、この、yは今です。 しかし、ファイルはもちろん、 いいえスワップと呼ばれていません。 それでは、実際に何が起こるか見てみましょう。 私はスワップをコンパイルしない場合、その後、 ./noswapを行い、xは1であり、yは2です。 スワップスワップ。 xがyが2であり、1です。 だから、実際にあっても欠陥があるように思われます swap--のはnow--をスクロールダウンしてみましょうけれども ごとに正確に実装されています コー​​ドは、私が先ほど提案しました。 だから私たちは空想を取得するつもりはありません 今のXORのものです。 これは、あまりにも、ちょうど動作するはず ミルクとOJと同じように、 それが動作していないようです。 それでは、再びこれをしましょう​​。 たぶん私はちょうどそれを実行していませんでした。 それでは、再びなしスワップを実行しませんしましょう​​。 多分I--ありません。 だから、それだけで動作していないです。 それでは、少し健全性チェックをしましょう​​。 私はスワップここで先に行ってみよう ちょうど、追加分を待って、 %I / Nとletのあります プラグインの値。 私が本当にしたいので、 何が起こっているかを確認します。 そして実際、これは デバッグ技術 あなたが使用している場合がありますことを 営業時間、またはすでに自宅で、 ダンの前半に似 PSET3でアルメンダリスのビデオ 我々は、印刷を導入し、前記のようなデフ 少なくとも推奨技術、 簡単な例のために。 私が先に行くとmakeを実行してみましょう 再び無スワップ、./noswap。 面白い。 だから、真実であると思われるものに気づきます。 X 1であり、yは2であるが、bが1である場合に2です。 だから、これら二つは何とか入れ替えました ただし、xおよびyがスワップ取得されていません。 だから、何が起こっているか、明確にします 、ここまで私は、xとyを持っています そしてそれらは、内のローカル変数であります メインの範囲は、私は、xとyに渡しています スワップします。 今、スワップ、独立した機能として、 その引数を自由に呼び出すことができます または、そのパラメータ、それが望んでいるもの。 バーまたはXまたはYまたはAまたはB Fooのか。 ただ、彼らがしていることを明確にします xとy自体と同一ではありません、 私はAとBを言いました。 しかし、我々は彼らに私たちが望むものを呼び出すことができます。 そしてそれは次のようになります スワップが渡されています x-- AKA A--、それはです -Y- AKA bを渡されます。 どういうわけか、これらの3行があります 正確にこれらの値を交換します ローレンは、ミルクとOJで行ったように。 しかし、我々は、プリントアウトしたとき 値は、AとBの 確かにスワップが、Xであり、 yは彼らに何の変化もありません。 xとyがここにあることを思い出してください。 だから我々は、この経由を見ることができます 同様に別の技術。 そして、これはあまりにも技術であり、 問題に3を設定し、組み込み。 それでは、先に行くと、これでやろう CS50 IDをお持ちでない場合。 右辺我々について このデバッガタブを持っています。 そして、あなたがこれを開くならば、 いくつかの難解な情報があります それは最初にあなたに投げています。 しかし、それでは、この離れて本当の高速をいじめるしましょう​​。 だから1は、ローカル変数を参照してください。 CS50 IDEに構築することが判明し、 プログラミング環境のより多くの 一般的に、デバッガです。 あなたが視覚的に確認することができますツール 何があなたのプログラムの内部で起こっています 追加に頼ることなく、 printfをし、コンパイルと実行 そして、のprintfのを追加してコンパイルし、 営業時間中に、どのすでに、実行しています または家は、おそらく かなり面倒になっ。 そこでここでは、ちょうどその瞬間に、私たちはしています リアルタイムで見に行きます 私たちのローカル変数の値。 また、設定することができるようになるだろう ブレークポイントと呼ばれるものします 機会が一時停止する私のプログラムであります コー​​ドの特定の行で実行 私は好奇心だと。 右? これらのプログラムは一瞬で実行されます。 それは私たちより遅い人間のための種類のうれしいです 、一時停止の瞬間を取ることができるように、参照してください。 周りに何が起こっています コー​​ドの特定の行 プログラム耕作なし それを通って完全に終了します。 だから、ブレークポイントは、私たちができるようにするつもり 破壊し、ある時点で一時停止します。 コー​​ルスタックは、空想の方法です 関数が現在何を言っ 現時点で呼び出されています。 メインは常に最初に呼び出されます。 しかし、主が呼び出した場合 スワップと呼ばれる機能、 我々は実際にこれを参照するつもりです されている機能の塔 新しい順に呼ばれます。 それでは、それを見てみましょう。 私はズームアウトするつもりです。 私は自分のコードに戻って行くつもりです。 そして、私がしたいという理由だけで ここで知識をひけらかすされるように、 私が先に行くとクリックするつもりです ちょうどライン5の左側にあります。 そして、それは赤い点が作成されます。 そして、右側に気付きます デバッガがねえ、知っていること、 私は言ったブレークポイント 特にnoswap.cライン5、 このコード行で。 だから、デバッガは、私を知っています 次回ことを要求してきました 私は私のプログラムのそれのポーズを実行します そこだけではなく、実行 超高速全部を実行しています。 だから今は、[デバッグ]をクリックするつもりです IDEの最上部にあるボタン それは、次の操作を行うために起こっています。 当初はやや開くようになるだろう 怖い探して第二の端子window-- からのリモートデバッグ このような宿主とsuch-- 我々はに戻ってくるもの すべてのことはずっと前を意味します。 しかし、今のところ重要なものです その赤い点がヒットしたことで、 デバッガは、意図的に持っています execution--一時停止 ない、それ自体は、その行のが、最初に その関数の実際のコードの行。 ライン7である理由それはです 今黄色で強調しました。 そして今のは見てみましょう 右手側に。 デフォルトでは、次のようになり、 素敵なことに、xがどのような値を持っていますか? 0。 そしてYはどのような値を持っていますか? ゼロ。 そして、それはある意味で予想されることです 黄色line--が持っているそのxと-Y- まだ実行されません。 だから、xが値1を持つべきではありません。 これは、他の値を持っているかもしれませんが、 いわゆるゴミ値。 そして、私たちはそのことの中で幸運 本質的に、この時点ではゼロ。 だから今わずか数あります 私たちは気にする必要のボタン この方法でデバッグするときについて。 ここで注意してください、私たちは、再生ボタンを持っています。 そして、私たちは再生する場合またはヒット それはちょうどですが、再開 介して実行しようとして プログラムの残りの部分 あるいは、別のブレークポイントに到達するまで。 しかし、私は他のを設定していました ブレークポイントそれだけですので、 最後まで実行するつもり。 敗北のようなもの チャンスをうかがっの目的。 だからではなく、私が気に 右にこれらのアイコン。 そして、私は上にマウスを移動場合 それら、あなたは、あまりにも必要として あなたは少しtips--ツールチップが表示されます。 この1は、ステップオーバーです。 今では、スキップを意味するものではありません 次のコード行。 それはちょうどそれを実行意味し、 、次へ移動次へ移動し、 次へ移動します。 言い換えれば、ビア そのボタンは、私が歩くことができます 当時の私のコード1工程を経て。 行ずつ、文字通り。 さて、の右側に それは、別のものがあります 私たちは一瞬で表示されますことを。 これは、いわゆるです アイコンステップイン 私はダイビングを可能にするために行きます 別の関数に。 しかし、ちょうど一瞬でこれを見てみましょう。 だから私は、ステップオーバー]をクリックするつもりです。 私はクリックするとそして今、気づきます 右上のボタン、 大体現地の下であなたの目を保ちます 変数とxに何が起こるかを参照してください。 Xは現在1理由であります 黄色の線は、現在実行しています 私たちは8行に移ってきました。 そして、一瞬のY うまくいけば2になるはずです。 今、何も面白いこと ビットのために発生します。 すべてこれはprintfのです。 そして、私の第二の端末に、気づきます ウィンドウは、私が印刷DEFの出力を参照してください。 そして今、私が行う必要があります プログラマーとして決定。 私は、この行をステップオーバーすることができます コー​​ド、それを実行することではなく、 中身を好奇心を取得。 または私は実際にそれにステップすることができます スワップ自体の中に入ります。 それでは、後者を行うことができます。 私が先に行くと、クリックしてみましょう ステップオーバーしかしイントゥステップません。 お知らせ、突然のすべて ウィンドウの変更 最初に強調表示します スワップのコードの行。 それは21行です。 そして今、どのような種類のファンキーなのはつまり、 あなたがこっち見てみると、予想通り コンマbは、それぞれ、1及び2です。 なぜ一時32,767ですか! 多くのと同じように、その温度を想起 一瞬前に空のカップ、 21行目で、ここで宣言されています。 なぜ32,000-私は意味、理由であります それだけでいくつかの奇妙な値はありますか? うん? 観客:それは初期化されていません。 DAVID J.マラン:それは 初期化されていません。 だから、私たちのコンピュータは常に 物理的なメモリを有します。 それは、常に物理RAMを持っています。 そして、ゼロのは常にあります そして、自分のそこに、右か? 私たちはを使用しているので 一日中コンピュータ、 あなたはCS50 IDEを使用しています またはサーバー一日中。 だから、RAMは、いくつかのゼロを持っているのいずれか、または いくつかのいずれかのまたはいくつかの0と1。 どんなにかどうか あなたはそれらを使用しているではありません。 あなただけの空白持つことができません あなたはビットをしたいスペース。 彼らは、0と1のどちらかです。 だからので、その温度が判明 私たちは、まだそれを初期化していませんでした 我々は、これらの32ビットを持っているが、彼らはいませんでした 任意の既知の値に初期化されて。 だから、どのような彼らはほとんどなかったです 最近、これらの32 bits-- for--使用 私たちはいくつかの成果物を見ています これらの特定の32の以前の使用 ビット。 すぐに私もステップオーバークリックすると、 ふぅ、一時は値1を取得する予定です。 私は再びそれを行うなら、aは 値2を与えられることになるだろう して、bがしようとしています 値1が与えられます。 だから何が今でうれしいです 物語の中で、この時点 デバッガがあるということです スーパーゆっくりと、私を示します 自分のペースで、何 スワップの状態です。 しかし、ここで一番上に通知を気づきます その実際にコールスタック それには2つの層を有します。 今のように強調表示されています1 スワップ、私が代わりにメインをクリックした場合、 ローカル変数がどのように変化するかを気づきます 開発者は、単にホップすることができますので、 周りと何が違うの範囲に入ります。 だから我々はこのすべてをやっているにもかかわらず、 aとbを交換正しく仕事と、 私はスワップの間で前後に行く場合 2であり、bが1メインであり、 メインは全く影響を受けていますか? いいえ。 だからここに持ち帰りは何ですか? まあ、それはいつでもことが判明 あなたは、スワップのような関数を呼び出します あなたは何を、それの引数を渡します あなたはスワップ関数に渡しています この場合、コピーであります これらの引数の。 そのように、x及びyはそれぞれある場合 32ビット、何スワップを取得しています 二つの新しいローカルであります 変数、または引数、 呼ばれ、b--が、これらは任意です names--が、ゼロのパターン AとBの内部のものです xとyと同一であることが並ん しかし、そうではありません xとyと同じもの。 メインは、その作品に持っているかのようです xとyの用紙番号1と2、 そしてそれがいることを手渡すとき 一枚の紙を交換するために、 スワップは非常に迅速に取得します 独自のペンは、書き留めます 紙の独自のシート上に、図1及び図2 手は主に、元のxyバック して、独自の処理を行い AとBとの事。 そして、これは今のための超重要です これは自明でない意味を持っています 実際に正しいコードを書くための それは思われるので、我々は交換することはできません 二つの変数。 私は、正しいスワップ機能を書かれています。 私たちは、ローレンなどでそれを実装しました 実際に正しいスワップ機能、 しかし、それのどれも明らかに 問題場合、あなたは実際にはできません 恒久的に2つの値を交換します。 だから我々は、別の方法が必要です 実際にこれを取得するには、 私たちのことができるようにする必要があります 実際にこの問題を解決します。 そして、それはout--になり、私たちは来ます バックこの特定の画像へ long--前に、これは一つの方法であること お使いのコンピュータのメモリを引く可能性があります。 それはちょうど長方形です。 あなたは、任意のそれを描くことができ いくつかの方法が、それはです それを描くのに便利 以下の理由長方形。 我々は超えて、今日を開始し、するつもりです いわゆるスタックの話。 そして、スタックはちょうど塊です RAM--のmemory--のチャンク 関数は、アクセス権を持っていること 彼らが呼ばているときに。 そしてそれは、ことが判明 このスタックの最下部 メインのローカル変数のすべてがどこにあります 組織Cと組織Vとすべてのものと デフォルトで行くつもりです。メインの場合 スワップのようないくつかの他の関数を呼び出し、 よく、スワップが別のものを取得する予定です その上、メモリの最大の層。 そして、これだけにすばやくザッを与えるために この絵、私は越える場合here-- そして、私はでこれをミラーリングしましょう オーバーヘッドとしては、本当に私が持っているものwell--、 我々はについてのみ気場合 今のところ、この絵の下、 私はプログラムを実行するときにということです メインは、呼び出されます 主のチャンクが与えられます 自分のコンピュータ内のRAMであります このいわゆるスタックの一番下にあります。 そして、私はそれを描くつもりです 意図的に正方形として。 だから、32ビットまたは4バイトのようなものです。 そして、この主な機能は持っている場合 1の値を持つ変数と呼ばれるX そして、それは変数と呼ばれています 2の値とyが、それです メモリのこのスライバーを取るようなこと 主な操作によって与えられています システムとなるように、それを分割します 最初のローカル変数は、ここに行きます もう一つはここにあり、それはそれです。 主スワップ、スワップを呼び出すとき メモリの独自のスライスを取得します 私たちはこのように描くだろうと オペレーティングシステムから、 それが持っているために起こっているの ベースの独自のローカル変数 以前の私たちの実装について ローカル変数と 最初はaとbその 値1と2を得ます。 しかし、その後、できるだけ早く スワップコードは、実行します そして、ローレンは、実際にスワップ OJとミルク、何が起きているのでしょうか? さて、この2本、1になってきています 図1は、この方法で、2になってきて、とされています のTEMP変数が存在します その最終的にその全体の時間を使用 離れて行きます。 しかし、それは問題ではありません。 どのくらいの仕事あなたは この行は、このメモリ空間にof--で、 xとyは完全に変更されません。 だから我々は与えることのいくつかの方法が必要です スワップおよびそれのような機能 秘密のアクセス、あなたがする場合は、へ 関数は、xとyのようなメモリにlike--。 それでは、見てみましょう 助け例 私たちはされています正確に何を参照してください。 この全体の時間に行きます。 私は先に行くつもりです ゼロの比較開きます。 そして、私はクローズするつもりです 私たちのデバッガは、私が行きますよ この怖い探してメッセージを閉じます ちょうど数分待つ、と言います、 あなたは真ん中のデバッグにしています。 私はここで、このタブを非表示にするつもりです 戻ったばかりのシンプルさに戻ります。 GDBが殺されているのであれば、心配しないでください。 それはちょうど、プログラムがあることを意味します 意図的にこのような場合には、終了されて、 私が。 そして今、ゼロがこれを行うと比較してください。 私はCS50を使用しています 標準I / O内のライブラリ。 私は最初の主要な機能を持っています 何かを言う、と言うと、文字列を取得します。 その後、再び、それを言います 別の文字列を取得します。 そして、これら2つの文字列を気づきます それぞれ、sおよびtと呼ばれています。 そして今、このプログラムは、比較します ゼロ、生活の中で、その目的、 それが私に言うことになっています、 私は同じことを入力したのですか? そして、私は1週間に戻るつもりです。 私は私の同等の等号演算子を使用しています これは質の高い演算子です。 ていない代入演算子、 等価演算子。 私はちょうどsとtを比較しています。 それでは、実際に先に行くと、これを実行してみましょう。 そして、私は先に行くつもりです ゼロを比較します。 私は./comparezeroをするつもりです。 そして、私は行くつもりです 先と何かを言います 以下のような、のは、小文字でお母さんをやらせます どのように大文字でお母さんについて。 そしてもちろん、私は別のものを入力します。 大丈夫。 それが予想されることです。 それでは、もう一度を実行してみましょう。 どちらの回は小文字、小文字を行います。 それは私にはスーパーと同一になります。 入力します。 OK。 多分それが原因だけで奇妙な それは私の文法を好きではないです。 それでは、資本MOMをさせ、 首都MOM同じ。 異なるもの。 では、なぜそのようになるのですか? まあ、実際に何が起こっています ここボンネットの下に? それでは、背中の上に行ってみよう ここでちょっと そして何を考えるのGetString 実際にやっています。 あなたがのGetStringを呼び出すと、 それが機能私たちです 自分が書いた、それは何らかの形で取得します ユーザからの文字のシーケンス。 そして、まずは、と仮定してみましょう 私を与える私がのGetStringを呼び出す時、 このようになりますメモリの塊。 そして、私はすべて小文字で入力した場合 M-O-M--とそれの後に行きますか? だけで簡単に健全性チェック。 バックスラッシュゼロ。 我々はそれを知っています。 そして、私たちが果たしていることを思い出します Zamilaの名前の周りに および他の名前の束 ロブは、ここで見ていたとき メモリの内部で何が起こっているかで。 だから、その話はまったく同じです。 これは何のGetStringです 私に戻っています。 さて、私のコードは、先ほど保存されました GetStringの戻り値 Sと呼ばれる変数です。 そして、二回目は、私はそれを呼ばれ、 それはトンという変数に格納し。 私はこっちに行くのであれば、私が必要 このローカルvariable--を描画します そして、私は一般的に行きますよ just--我々はよなどの文字列を描きます ここに小さな広場としてそれを-S-呼び出します。 そして今、お母さんをどうしますかsomehow-- この変数sの中に入りますか? まあ、我々は戻って行く必要があります ここで第一原理に。 GetStringは実際に何を返すのですか? だから、M-O-Mことが判明 バックスラッシュゼロ、および任意の数 以下のようなメモリ内の他の文字列の Zamilaとロブやアンディまたは任意の他、 私たちにはもちろんです コンピュータのRAMやメモリ。 そして、あなたのRAMは、あなたが持っているlike--ています RAMのギグ、RAMの2ギグ、 または億20億バイト、 または多分それ以上のこれらの日。 それでは、今日の目的のために、としましょう​​、 それは我々がどのように番号を付ける問題ではないこと 彼らは、私たちは、それぞれに番号を付けることができます それら億20億の または40億バイト。 そして、ちょうど任意のことを言わせて これは最初の一口、二一口です、 第三、第四。 私は意図的にゼロを使用していませんよ 今日我々は戻ってそれに来ます。 換言すれば、これは、ある場合に 初めて私は、プログラムを使用しています 私は幸運と最初に取得しています 一口その後、場所1〜2であります その後3 4より。 そして、私が描く守れば、ボックス番号 20億はこちらの方法を超えるだろう。 だから、あなたは、どう思いますか、 GetStringは、実際に返しますか? これは、M-O-Mのバックスラッシュを返すいません ゼロ自体明らかにその理由 私が描いたボックス内に収まりません。 だから、他に何が実際にはgetStringかもしれません これらすべての週間返すこと? 答えはです ボードここでどこか。 あなたは、M-O-Mのバックスラッシュゼロに適合することはできません だから何の代わりに意味をなすのでしょうか? あなたが入れて、スーパー賢いなければならなかった場合 いわゆるエンジニアリングの帽子に、 あなたは何を返すことができますか? 情報の最小量は何ですか あなたはまだでしょうそれを返すことができます あなたがメモリ内のM-O-Mを見つけるみましょうか? うん? 聴衆:One。 DAVID J.マラン:One。 そして、なぜ1? 観客:それは言うだろうので あなたはここで、[聞こえない]行きます。 DAVID J.マラン:その通り。 私はアドレスを返すつもりです 私が得ている文字列の。 この中のアドレス 場合は、場所です。 だから何が本当に-S-に格納されています そして、すべての文字列変数こうしてfar-- ちょうどされています その文字列のアドレス。 一方、私が呼び出した場合 2回目のIのgetString 文字通り同じthing--を入力 lowercase-- M-O-MとM-O-M 別のバックスラッシュゼロ、 そして今、多分私のプログラムの ので、多分このいくつかの時間のために実行されて 10であり、これは、これは12であり、位置11であります これは13です。 いくつかの他のを使用しているコンピュータ 何らかの理由でメモリ。 何今、私の第二に行きます 私のプログラムのトンで変数? 10。 その通りです。 そして、私たちが見たときに このプログラムのソースコード 私は単純にしようとしているところ 2つの値を比較するために、 何、Tに等しい等しくよさ 明らかな人間の答え? わずか1が等しく10しないため。 それで、本明細書にあり 私たちのための機会は本当に ただ、最初、再び、に戻ります 原則とよく、考えます、 何がボンネットの下に起こっているの? 私たちは話してきました ビットとバイト、メモリ、 それは理解することは実際に便利です あなたがのGetStringを呼び出すときのため、 私たちはそれを考えるにもかかわらずです M-O-Mまたは文字列のママを返します アンディまたはZamilaまたはまたは 以下のように、技術的に それだけでアドレスを返すです メモリのチャンクの。 しかし、それは大丈夫です。 私はどのように知っていますので、を 文字列が終わるところ? 私はほんの始まりを与えられている場合は? まあ、バックスラッシュゼロ、右? ちょうど私ができる線形時間で 印刷デフM-O-Mでプリントアウト。 そして、すぐに、私はバックスラッシュを見るように ゼロ私が始めた場所、私は気にしないでください、 私はすでに暗黙のうちに知っています どこで終了する必要があります。 だから今日はbeginning--をマークし、 私は劇的に我々ので、これをやらせます に多くの問題を経験しました これらのここwheels--訓練を受けます ので、今日の訓練の車輪が開始します オフに来て、私達はで明らかにしleast-- [拍手] それが旅行の価値がありました はい、今朝ターゲットに? だからnow--があり、それはターン うち、文字列としてはそのようなもの。 文字列は存在しません。 それは我々が持っていた同義語です CS50ライブラリの内部。 今後、私たちは、呼び出しを開始するつもりです sとtではない文字列が、char型の星。 char型の星そして、我々はよ やがて離れていじめます。 しかし、これは言うことです、 我々は継続しても、その 今のところのGetStringを使用して、 技術的には私がすべき char型のスターとチャースターを言って。 そして、それは何のこと星が判明 示すために起こっていることは何かであります ポインタまたはアドレスと呼ばれます。 そして実際に、ティーザー 先にあるもののために この20秒のクリップである私たちの スタンフォード大学の友人ニックParlante 人は、かなりの時間前に、過ごします 時間のとんでもない量、 最高のように私は彼に伝えることができます キッチンや彼の地下室、 クレイメーションを作ります 世界に紹介 名前の文字 我々は意志でBinky ポインタの隣に時間を導入します。 だから、ここに来て何のプレビューです。 [ビデオ再生] -Hey、Binky。 目を覚ます。 これは、ポインタの楽しみのための時間です。 -あれは何でしょう? ポインタについては、こちらをご覧ください! ああ、グッディ。 [END再生] DAVID J.マラン:そして、そのノートに、 我々は水曜日にあなたが表示されます。 大丈夫。 ダンスは誰ですか? いい加減にして。 ダンスは誰ですか? あなたは私がそれを始めたいですか? 私はそれを始めるでしょう。 Woooo! ローレン:甘い空想モーセ。