1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J.マラン:これはCS50であり、 これは、4週の開始です。 3 00:00:14,050 --> 00:00:18,630 そして、少年は、フォルクスワーゲンであります すべてのためのソフトウェアのトラブル。 4 00:00:18,630 --> 00:00:20,264 私たちは見てみましょう。 5 00:00:20,264 --> 00:00:20,930 [ビデオ再生] 6 00:00:20,930 --> 00:00:25,560 -Cars、賢い文字 ワイルドスピード映画インチ 7 00:00:25,560 --> 00:00:29,100 今週ドイツの自動車メーカー フォルクスワーゲンは、自分自身を発見しました 8 00:00:29,100 --> 00:00:32,490 のスキャンダルの途中で 潜在的犯罪者の割合。 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagenは数十億のためにブレースされます 罰金で、可能な刑事告発 10 00:00:36,060 --> 00:00:38,560 その幹部のため、として 同社は謝罪します 11 00:00:38,560 --> 00:00:41,840 11〜万台をリギングするための それは排出量のテストを打つのに役立ちます。 12 00:00:41,840 --> 00:00:44,950 >> -Certainディーゼルモデルがありました 洗練されたソフトウェアで設計 13 00:00:44,950 --> 00:00:48,440 など、その使用される情報 ステアリング及び車両の位置 14 00:00:48,440 --> 00:00:51,870 車があったかを決定するために高速化 排出量のテストを受けて。 15 00:00:51,870 --> 00:00:55,650 そのような状況下では、エンジン 有毒な排出量を減少させるであろう。 16 00:00:55,650 --> 00:00:59,070 しかし、車はバイパスに不正ました それが駆動されたときに。 17 00:00:59,070 --> 00:01:03,320 排出量は、40に10を増加しました 許容可能なEPAレベル以上の時間。 18 00:01:03,320 --> 00:01:04,280 >> [END再生] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J.マラン:だからしてみましょう これを見てください 20 00:01:05,220 --> 00:01:07,250 そして、正確にどのようにこれを見ます 実装されるかもしれません 21 00:01:07,250 --> 00:01:09,680 これがどう影響しますか このようなので、多くの車。 22 00:01:09,680 --> 00:01:12,840 だから私の手でここにプレスされています EPA--によって発行されたリリース 23 00:01:12,840 --> 00:01:14,620 環境 保護庁ました 24 00:01:14,620 --> 00:01:18,032 米規制当局は、あります 環境問題を処理し、 25 00:01:18,032 --> 00:01:19,740 そして、実際の た法的通知 26 00:01:19,740 --> 00:01:22,420 ほんの数日前にフォルクスワーゲンに送信します。 27 00:01:22,420 --> 00:01:26,530 >> だから、EPAは書き込み、今記載されています 公に、洗練されたソフトウェア 28 00:01:26,530 --> 00:01:29,390 特定のアルゴリズム フォルクスワーゲン車を検出 29 00:01:29,390 --> 00:01:32,630 車が受けているとき 公式の排出テスト 30 00:01:32,630 --> 00:01:36,505 そして、完全排出をオン テスト中のみのコントロール。 31 00:01:36,505 --> 00:01:38,380 の有効性 これらの車両の汚染 32 00:01:38,380 --> 00:01:43,260 排出制御装置が大幅にあり すべての通常の運転中に低減 33 00:01:43,260 --> 00:01:44,320 状況。 34 00:01:44,320 --> 00:01:48,190 これが会う車になります 実験室やテストにおける標準 35 00:01:48,190 --> 00:01:52,790 駅が、通常の動作中 窒素oxides--またはNOx--を発します 36 00:01:52,790 --> 00:01:54,950 最大40倍の標準で。 37 00:01:54,950 --> 00:01:58,220 フォルクスワーゲンによって生成されたソフトウェア 引用引用終わり、敗北装置です、 38 00:01:58,220 --> 00:02:00,650 クリーンによって定義されます 米国のエア法。 39 00:02:00,650 --> 00:02:03,410 >> 彼らは、と言うことに行きます EPAと他の機関 40 00:02:03,410 --> 00:02:07,020 敗北デバイスを発見 独立した分析後のソフトウェア 41 00:02:07,020 --> 00:02:09,660 西の研究者によって、 バージニア大学。 42 00:02:09,660 --> 00:02:14,160 NOxの汚染はに貢献 二酸化窒素、グラウンドレベルのオゾン、 43 00:02:14,160 --> 00:02:15,700 微細な粒子状物質。 44 00:02:15,700 --> 00:02:18,090 これらへの暴露 汚染物質がリンクされています 45 00:02:18,090 --> 00:02:20,870 の広い範囲で 深刻な健康への影響、 46 00:02:20,870 --> 00:02:23,637 増加した喘息を含みます 攻撃や他の呼吸器 47 00:02:23,637 --> 00:02:26,470 十分に深刻なことができる病気 病院に人々を送信します。 48 00:02:26,470 --> 00:02:28,660 オゾンへの曝露と 粒子状物質も持っています 49 00:02:28,660 --> 00:02:31,960 時期尚早と関連して 関連呼吸に起因する死亡 50 00:02:31,960 --> 00:02:35,690 または心血管関連する影響。 51 00:02:35,690 --> 00:02:38,940 子供、高齢者、人々 既存の呼吸器疾患 52 00:02:38,940 --> 00:02:42,840 特にのための危険にさらされています これらの汚染物質の健康への影響。 53 00:02:42,840 --> 00:02:45,056 >> 十分ではそれは非常に深刻だ、と言うことです。 54 00:02:45,056 --> 00:02:46,930 そしてのが読みに行きましょう ちょうど1より抜粋 55 00:02:46,930 --> 00:02:49,370 し、我々は見てみましょう 基礎となる含意 56 00:02:49,370 --> 00:02:50,920 車の文脈でこれを。 57 00:02:50,920 --> 00:02:53,730 具体的には、フォルクスワーゲン 製造およびインストール 58 00:02:53,730 --> 00:02:56,210 いわゆる中ソフトウェア 電子制御 59 00:02:56,210 --> 00:02:59,320 module--またはECM--の 検出されたこれらの車両 60 00:02:59,320 --> 00:03:03,580 車両はのためにテストされていたとき EPAの排出基準の遵守。 61 00:03:03,580 --> 00:03:07,510 含む種々の入力に基づいて ステアリングホイールの位置、車両 62 00:03:07,510 --> 00:03:11,280 スピード、エンジンのの期間 操作、および気圧、 63 00:03:11,280 --> 00:03:13,720 これらの入力を正確 パラメータを追跡 64 00:03:13,720 --> 00:03:17,600 使用される連邦試験手順の EPA認定の排出テスト 65 00:03:17,600 --> 00:03:18,400 目的。 66 00:03:18,400 --> 00:03:21,850 >> EPAの排出テスト中、 車両のECMソフトウェア 67 00:03:21,850 --> 00:03:25,060 生成ソフトウェアを実行しました 準拠した排出量の結果。 68 00:03:25,060 --> 00:03:28,340 他のすべての回では、 車両のECMソフトウェア 69 00:03:28,340 --> 00:03:31,090 別々の道を走りました 減少し、キャリブレーション 70 00:03:31,090 --> 00:03:34,360 の有効性 全体の発光制御システム、 71 00:03:34,360 --> 00:03:37,864 特に選択的触媒 リーンNOxの還元trap-- 72 00:03:37,864 --> 00:03:39,280 これは我々が今では約表示されます。 73 00:03:39,280 --> 00:03:43,040 NOxの結果、排出量 10〜40倍の倍増加 74 00:03:43,040 --> 00:03:47,450 EPA準拠したレベルを超えます 駆動周期の種類に応じ。 75 00:03:47,450 --> 00:03:50,800 >> それでは、これは本当に意味し、 ソフトウェアの実行中にソースコード 76 00:03:50,800 --> 00:03:53,190 フォルクスワーゲンの上にない持っています まだ一般に公開されて、 77 00:03:53,190 --> 00:03:56,460 つまり、効果的に、これは 同等の内部のどこかにあり 78 00:03:56,460 --> 00:03:57,830 フォルクスワーゲンのコードの。 79 00:03:57,830 --> 00:04:02,200 あなたがテストされている場合は、車の場合 特定の環境因子を検出します 80 00:04:02,200 --> 00:04:04,330 ステアリングホイールのような 位置や動き 81 00:04:04,330 --> 00:04:06,710 またはその欠如、車のまたはその 他の要因の任意の数の 82 00:04:06,710 --> 00:04:09,940 現在仮定されます この式の一部であることを、 83 00:04:09,940 --> 00:04:12,370 彼らは単にオン 完全な排出量が制御されます。 84 00:04:12,370 --> 00:04:15,670 言い換えれば、開始します 汚染物質の少ない発光。 85 00:04:15,670 --> 00:04:18,769 >> そうでなければ、他のすべての状況で それがあるとして検出されていないとき 86 00:04:18,769 --> 00:04:20,790 実験室で、彼らはただありません。 87 00:04:20,790 --> 00:04:24,320 そして、あなたはより多くにこれを簡略化することができます 何かコンクリート擬似コード 88 00:04:24,320 --> 00:04:24,820 このような。 89 00:04:24,820 --> 00:04:27,810 車輪が回っている場合が、 ステアリングホイールは、示唆的ではありません 90 00:04:27,810 --> 00:04:30,060 車はいくつかの上にあることを 回転シ​​リンダの種類 91 00:04:30,060 --> 00:04:32,550 しかし、いくつかの種類で 倉庫は、試験されます 92 00:04:32,550 --> 00:04:36,070 その後として振る舞います EPAは、あなたのことがしたいと思います。 93 00:04:36,070 --> 00:04:37,960 しないように注意してください。 94 00:04:37,960 --> 00:04:40,420 それでは、見てみましょう その短いビデオで 95 00:04:40,420 --> 00:04:45,391 何の影響を見てとります 実際に機械的にこれです。 96 00:04:45,391 --> 00:04:48,620 >> [ビデオ再生] 97 00:04:48,620 --> 00:04:52,800 >> -last金曜日EPAは、いくつかのことを発表しました フォルクスワーゲンアウディ車は2009年の間に作られました 98 00:04:52,800 --> 00:04:55,840 今年は、使用していました いわゆる敗北デバイス 99 00:04:55,840 --> 00:04:59,060 排出量の法律を回避するには きれいな空気を保つために設計されています。 100 00:04:59,060 --> 00:05:01,700 しかし、それは正確に何を意味するのでしょうか? 101 00:05:01,700 --> 00:05:04,666 >> さて、現代車は数十を持っています その中のコンピュータの。 102 00:05:04,666 --> 00:05:07,040 そして、それらのコンピュータの一部 機能を調整助けます 103 00:05:07,040 --> 00:05:09,590 最適のためのエンジンの 性能を確認しながら、 104 00:05:09,590 --> 00:05:12,340 あまりにも多くのゴミがないこと 排気管から出てきます。 105 00:05:12,340 --> 00:05:15,170 彼らは実際に働いています ここ数十年のためにこの方法。 106 00:05:15,170 --> 00:05:17,380 基本的には、すべての部分 現代車のエンジンの 107 00:05:17,380 --> 00:05:20,080 センサやコントローラを持っています それ、およびこれらのコンピュータ上で 108 00:05:20,080 --> 00:05:23,460 データの数千人に読んでいます 調整を行う毎秒回 109 00:05:23,460 --> 00:05:26,220 空気に対する燃料の比率のような それは、気筒内に起こっています。 110 00:05:26,220 --> 00:05:28,730 >> これらの不正行為フォルクスワーゲン アウディのモデルはディーゼルであり、 111 00:05:28,730 --> 00:05:30,890 そして、ディーゼルは、1以上を持っています 本当に重要なコンピュータ 112 00:05:30,890 --> 00:05:34,030 で制御されたパラメータ、 未燃燃料の量が起こっ 113 00:05:34,030 --> 00:05:35,200 排気に。 114 00:05:35,200 --> 00:05:36,310 今では悪い聞こえます。 115 00:05:36,310 --> 00:05:39,642 あなたが望むような音はありません 排気に入る未燃焼燃料。 116 00:05:39,642 --> 00:05:41,600 しかし、の場合 ディーゼル、あなたが何かを持っています 117 00:05:41,600 --> 00:05:46,110 そのデバイスであるNOxトラップと呼ばれます 吸収した窒素酸化物のトラップ 118 00:05:46,110 --> 00:05:48,880 そのでしょう汚染物質であること それ以外の場合は大気中に入ります。 119 00:05:48,880 --> 00:05:53,040 そして、そのNOxトラップの効果 未燃焼燃料で強化されています。 120 00:05:53,040 --> 00:05:56,650 だから敗北デバイスは、特別なプログラムです それを作ることができ、これらのコンピュータの内部 121 00:05:56,650 --> 00:05:59,527 車が排出量を満たしているように見えます それがなくても標準。 122 00:05:59,527 --> 00:06:01,110 フォルクスワーゲンは、その手に問題を抱えていました。 123 00:06:01,110 --> 00:06:04,050 そのディーゼルエンジンが知られていました 偉大な燃費を取得するため、 124 00:06:04,050 --> 00:06:07,510 しかし、NOxトラップだけうまく機能 より多くの燃料が使用されている場合。 125 00:06:07,510 --> 00:06:10,460 だから車は、検出してくれ この敗北デバイスを使用して、 126 00:06:10,460 --> 00:06:13,870 それが排出量を得ていたとき 試験は、それがより多くの燃料を使用し、 127 00:06:13,870 --> 00:06:16,830 よくNOxトラップを動作させます、 排出量は大丈夫だと思います。 128 00:06:16,830 --> 00:06:21,130 しかし、その後、あなたは、道路上のデバイスを取得します オフにし、あ​​なたがより少ない燃料を燃焼しています 129 00:06:21,130 --> 00:06:24,256 しかし、あなたは最大40倍を入れています 大気中へのより多くの汚染物質。 130 00:06:24,256 --> 00:06:26,130 しかし、いったいどうやったのか 車はそれがあったことを知っています 131 00:06:26,130 --> 00:06:27,720 エミッションコンプライアンスのためにテストされていますか? 132 00:06:27,720 --> 00:06:30,590 EPAは、それが洗練されたと言います 物事をチェックするシステム 133 00:06:30,590 --> 00:06:34,090 ハンドル位置のような、 スピード、エンジンが上だった時間の長さ、 134 00:06:34,090 --> 00:06:35,507 さらには、大気圧。 135 00:06:35,507 --> 00:06:37,673 言い換えれば、存在しました ない方法これは偶発ませんでした 136 00:06:37,673 --> 00:06:40,260 ソフトウェアがあったため、 検出することは非常に慎重に設計されました 137 00:06:40,260 --> 00:06:41,630 公式排出テスト。 138 00:06:41,630 --> 00:06:43,588 それはいくつかのかなり深刻です 欺瞞とその者の 139 00:06:43,588 --> 00:06:45,420 なぜフォルクスワーゲンであります このような深刻な問題。 140 00:06:45,420 --> 00:06:48,600 実際には、彼らの最高経営責任者(CEO)、マーティン ヴィンターコルンは、ちょうど辞任しました。 141 00:06:48,600 --> 00:06:49,820 >> 何が次に起こりますか? 142 00:06:49,820 --> 00:06:53,900 さて、あなたは半分百万の1なら ディーゼルジェッタ、ビートルズ、Golfs、Passats、 143 00:06:53,900 --> 00:06:56,220 またはアウディA3Sは、影響します 良いニュースはです 144 00:06:56,220 --> 00:06:57,886 あなたの車はまだ運転しても安全であることを。 145 00:06:57,886 --> 00:07:00,510 あなたは離れてそれを置く必要はありません フォルクスワーゲンまでリコールを発行します。 146 00:07:00,510 --> 00:07:02,509 しかし、いくつかの点で、彼らはしています おそらく持っているつもり 147 00:07:02,509 --> 00:07:04,230 あなたの車の内部のソフトウェアを更新します。 148 00:07:04,230 --> 00:07:06,927 それが起こるとき、あなたはかもしれません タンクあたりの少ないマイルを取得します。 149 00:07:06,927 --> 00:07:09,260 弁護士は、すでに準備を進めています クラスアクション訴訟のためのアップ 150 00:07:09,260 --> 00:07:12,500 そう所有者が補償されるかもしれません 将来のある時点で。 151 00:07:12,500 --> 00:07:15,832 しかし、それはことはないだろう いつでもすぐに起こります。 152 00:07:15,832 --> 00:07:16,711 >> [END再生] 153 00:07:16,711 --> 00:07:19,960 DAVID J.マラン:だから、これは実際に発生させます 興味深い大きな画像の質問 154 00:07:19,960 --> 00:07:20,660 信頼するように。 155 00:07:20,660 --> 00:07:21,160 右? 156 00:07:21,160 --> 00:07:24,300 私たちのすべてのiPhoneやアンドロイドを持っていますか、 私たちのポケットに何か可能性が最も高いです 157 00:07:24,300 --> 00:07:26,500 これらの日、またはラップトップ ある私達のラップに 158 00:07:26,500 --> 00:07:28,510 実行中のソフトウェア製 AppleとMicrosoftが 159 00:07:28,510 --> 00:07:30,710 他社の房。 160 00:07:30,710 --> 00:07:34,240 しかし、どのように我々は何をすることを知っています これらのソフトウェア製品は、やっています 161 00:07:34,240 --> 00:07:37,680 何これらは実際にあります 企業は、彼らがやっていると言いますか? 162 00:07:37,680 --> 00:07:39,610 >> 例えば、誰がするのです 言うたびに 163 00:07:39,610 --> 00:07:42,200 あなたのiPhoneに電話をかけます またはAndroid携帯電話など、 164 00:07:42,200 --> 00:07:45,650 その電話番号もないことを いくつかの企業のサーバにアップロードされています 165 00:07:45,650 --> 00:07:48,399 いくつかのプログラムのあなたがたから それは、オペレーティングだか、書かれました 166 00:07:48,399 --> 00:07:51,070 iOSのやAndroidなどのシステム自体、 または、ダウンロードしたので、 167 00:07:51,070 --> 00:07:53,880 一部のサードパーティ製のアプリ 何とか聞いていること 168 00:07:53,880 --> 00:07:57,120 すべてにあなたが入力していますか あなたが実際に言っているすべてのもの。 169 00:07:57,120 --> 00:07:59,500 あなたはそれを知っていますかどのように、時 あなたたちは、クランを実行しています 170 00:07:59,500 --> 00:08:02,590 または、あなたをコンパイルするようにしてください CS50で独自のソフトウェアは、どのように 171 00:08:02,590 --> 00:08:06,080 あなたがそのCS50自身のスタッフが行い、 CS50ライブラリを介して、 172 00:08:06,080 --> 00:08:08,690 すべてのログ記録されていません あなたが得ている文字列 173 00:08:08,690 --> 00:08:10,276 またはすべてのあなたが得ているインチ? 174 00:08:10,276 --> 00:08:12,900 さて、あなたは確かに見ることができます 何かのためのソースコードを 175 00:08:12,900 --> 00:08:15,233 CS50ライブラリーのような、あなた ソースコードを見ることができます 176 00:08:15,233 --> 00:08:18,170 Linuxのオペレーティングシステムの CS50 IDE上で実行されています。 177 00:08:18,170 --> 00:08:23,090 しかし、驚くべき発表 1984年に戻って与えられました 178 00:08:23,090 --> 00:08:26,730 によるチューリング賞の受信で 知られている非常に有名なコンピュータ科学者 179 00:08:26,730 --> 00:08:29,750 名前のケン・トンプソンas--人 チューリング賞を受賞しています 180 00:08:29,750 --> 00:08:33,500 コンピュータサイエンスのの一種であります ノーベル賞、あなたがする場合は、 181 00:08:33,500 --> 00:08:35,309 上の彼の仕事のために オペレーティング・システムと呼ばれます 182 00:08:35,309 --> 00:08:39,039 で非常に似ているのUnix、 我々は、Linuxである使用しているものに精神。 183 00:08:39,039 --> 00:08:41,960 彼は彼に尋ねた質問 基本的に受諾演説、 184 00:08:41,960 --> 00:08:44,910 以下のためのフレームワークを敷設 年と議論の年 185 00:08:44,910 --> 00:08:46,970 信頼とセキュリティについて、これがありました。 186 00:08:46,970 --> 00:08:50,410 どの程度べきもの信託Aへ 作品をprogram--という声明 187 00:08:50,410 --> 00:08:53,010 トロイの木馬のありませんかsoftware--の? 188 00:08:53,010 --> 00:08:56,500 おそらくそれは信頼することより重要です ソフトウェアを書いた人。 189 00:08:56,500 --> 00:08:58,650 >> そして、実際には、我々がリンクされました 彼の話に 190 00:08:58,650 --> 00:09:02,400 この賞を受け入れるときに与えました CS50のウェブサイト上で80年代で 191 00:09:02,400 --> 00:09:04,030 今日のために講義ページの下。 192 00:09:04,030 --> 00:09:06,071 あなたが表示されますので、どのような 彼が実際に与えることです 193 00:09:06,071 --> 00:09:09,430 どのようにしてもかなり単純な例 クランまたは何のようなコンパイラ 194 00:09:09,430 --> 00:09:13,950 他の人が過去に使用したコンパイラ、 コンパイラの私たちに埋め込まれた場合にどのような 195 00:09:13,950 --> 00:09:18,190 自分が使用している場合は少なく、 基本的に、と言う条件 196 00:09:18,190 --> 00:09:22,360 あなたはこのコードを使用していることに気付いた場合 GetString関数またはGetIntで 197 00:09:22,360 --> 00:09:26,600 この関数は、先に行くと挿入します バックドアやトロイの木馬 198 00:09:26,600 --> 00:09:29,340 その結果、そのプログラム 今、いくつかのゼロを持っています 199 00:09:29,340 --> 00:09:30,930 悪意のある何かをするもの。 200 00:09:30,930 --> 00:09:33,080 あなたのすべてのログ そのデータをアップロードするキーストローク、 201 00:09:33,080 --> 00:09:35,100 一部のサーバー、または本当に何に。 202 00:09:35,100 --> 00:09:37,290 >> そして、何ケン・トンプソン 彼の話に行うに進みます 203 00:09:37,290 --> 00:09:40,580 場合でも、それを実証することです あなたは、ソースへのアクセス権を持っています 204 00:09:40,580 --> 00:09:43,794 そのコンパイラのコード 悪意を持ってこれを行う可能性があり、 205 00:09:43,794 --> 00:09:46,210 それがために重要ではありません。 この鶏と卵があります 206 00:09:46,210 --> 00:09:49,500 過去の多くの現実 年となるコンパイラ 207 00:09:49,500 --> 00:09:51,960 自分自身をコンパイルするために使用されます。 208 00:09:51,960 --> 00:09:55,440 言い換えれば、大昔に誰か 最初のコンパイラを書かれている必要がありました。 209 00:09:55,440 --> 00:09:59,060 彼らは更新した後、任意の時間 そのソースコードを変更することによりコンパイラ 210 00:09:59,060 --> 00:10:02,020 機能を追加し、それを再コンパイル 私たちのような人が使用する、よく、 211 00:10:02,020 --> 00:10:04,270 彼らは古いものを使っています コンパイラのバージョン 212 00:10:04,270 --> 00:10:06,370 新しいをコンパイルします コンパイラのバージョン。 213 00:10:06,370 --> 00:10:08,370 そして、あなたが見てみる場合 彼が与えた話では、 214 00:10:08,370 --> 00:10:10,970 あなたはその理由が表示されます その円形の、 215 00:10:10,970 --> 00:10:14,330 あなたが実際にバグを持つことができますか ソフトウェアに組み込まれトロイの木馬 216 00:10:14,330 --> 00:10:14,990 我々は、使用しています。 217 00:10:14,990 --> 00:10:18,010 そして、あなたは見ていても これらのプログラムのソースコード、 218 00:10:18,010 --> 00:10:21,550 それも明らかではないかもしれません トリックは実際にあるため、 219 00:10:21,550 --> 00:10:24,710 一部の古いバージョンで それ以来されているコンパイラ 220 00:10:24,710 --> 00:10:27,340 当社のソフトウェアへの脅威を注入します。 221 00:10:27,340 --> 00:10:29,740 >> どれだけ我々は、言って 本当にできないといけません 222 00:10:29,740 --> 00:10:32,939 私たちのラップトップ上で実行されている信頼のソフトウェア または電話や場所の任意の数。 223 00:10:32,939 --> 00:10:36,230 そして実際に、それ以降の場合は、この学期で 我々は、Webプログラミングについて話し始めます 224 00:10:36,230 --> 00:10:38,521 実際に構築を開始 Webアプリケーションに自分自身を、 225 00:10:38,521 --> 00:10:40,285 我々はこれらの話をします 脅威など。 226 00:10:40,285 --> 00:10:43,410 さて、あなたは不思議に思ったと気づいたかもしれません 小さな小さなダースがあったこと 227 00:10:43,410 --> 00:10:45,842 そのクリップでベイダー ベルジェが見せていました 228 00:10:45,842 --> 00:10:47,550 フォルクスワーゲンについて。もし あなたは、私は、見たことがありません 229 00:10:47,550 --> 00:10:49,190 私たちは明るくなければならないと思いました 気分これが全てですので、 230 00:10:49,190 --> 00:10:50,780 非常に気のめいると恐ろしいです。 231 00:10:50,780 --> 00:10:52,910 私は振り返るつもりです 2011年のスーパーボウルで 232 00:10:52,910 --> 00:10:55,300 時によって商業 Volkswagen--この 233 00:10:55,300 --> 00:10:59,620 ほとんどそれら好感again--なります テレビで初めて放送されました。 234 00:10:59,620 --> 00:11:04,039 これは、60秒のクリップです 私は、あなたがお楽しみいただけますと思います。 235 00:11:04,039 --> 00:11:04,705 [ビデオ再生] 236 00:11:04,705 --> 00:11:08,198 [MUSIC - 「スターウォーズ」のテーマ] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 【DOG BARKS] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 【CARが開始] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END再生] 243 00:12:05,955 --> 00:12:06,830 DAVID J.マラン:うん。 244 00:12:06,830 --> 00:12:07,663 私はちょうどチェックしていました。 245 00:12:07,663 --> 00:12:11,360 あの車は、違反のリストにあります。 246 00:12:11,360 --> 00:12:12,000 大丈夫。 247 00:12:12,000 --> 00:12:14,040 だから我々はいくつか見て 少し前擬似コード。 248 00:12:14,040 --> 00:12:15,380 そして、ここに大きいです 擬似コードコードのスニペット 249 00:12:15,380 --> 00:12:16,921 我々はこれまで何度か見てきたこと。 250 00:12:16,921 --> 00:12:19,970 そしてのは、これがチャンスです使ってみましょう 新しいプログラミングを導入します 251 00:12:19,970 --> 00:12:23,776 私たちがした技術 アルゴリズムを参照してください。 252 00:12:23,776 --> 00:12:25,400 我々はマージソートを見先週。 253 00:12:25,400 --> 00:12:28,270 しかし、ここではそれを形式化し、どのように見てみましょう 我々は、実際のコードでそれを使用する場合があります 254 00:12:28,270 --> 00:12:30,350 し、我々はこれを使用するつもりです 道技術最も 255 00:12:30,350 --> 00:12:32,000 特定の他の問題を解決する可能性が高いです。 256 00:12:32,000 --> 00:12:35,790 >> だから、これは最初のプログラムの一つであった、我々 これまでの擬似コードのコードではあるが、書いています。 257 00:12:35,790 --> 00:12:37,790 そして、何このプログラム 私たちはコースを行うことを許可 258 00:12:37,790 --> 00:12:41,510 電話帳にマイク・スミスを見つけることでした。 259 00:12:41,510 --> 00:12:46,216 また、特定の行で通知8 このGO TO文を持っていた11。 260 00:12:46,216 --> 00:12:48,090 そして、実際には、一定の 言語、C中でも 261 00:12:48,090 --> 00:12:50,006 実際に持っています 文字通り声明 262 00:12:50,006 --> 00:12:52,710 それに行くあなたがすることができます 特定の行にジャンプ。 263 00:12:52,710 --> 00:12:55,470 これは、一般的にので、眉をひそめています それは非常に簡単に悪用される可能性が 264 00:12:55,470 --> 00:12:58,490 あなたはジャンプを開始することができます 対照的に、すべての場所で​​プログラム 265 00:12:58,490 --> 00:13:00,690 種類のを使用します 論理及び制御フロー 266 00:13:00,690 --> 00:13:04,000 私達はちょうどでこれまで使用してきたこと ループや条件など。 267 00:13:04,000 --> 00:13:08,660 >> しかし、我々は、このアルゴリズムを簡素化することができます 擬似コードのコードでは以下の通り。 268 00:13:08,660 --> 00:13:11,250 代わりに、この反復の またはループのアプローチ 269 00:13:11,250 --> 00:13:14,160 ここで、我々は戻って保持し、 バック、バックライン3に、 270 00:13:14,160 --> 00:13:18,300 なぜ我々だけの種類のパント、よりません 一般的には、ライン7と10で言います 271 00:13:18,300 --> 00:13:20,570 ちょうどそれらの2を交換 と線対、 272 00:13:20,570 --> 00:13:22,810 他のスミスは早い場合 本の中で私たちはよ 273 00:13:22,810 --> 00:13:25,110 にマイクを検索 本の左半分。 274 00:13:25,110 --> 00:13:28,560 それ以外のスミスは、後になっている場合 本、右にマイクを検索 275 00:13:28,560 --> 00:13:29,540 半分の本。 276 00:13:29,540 --> 00:13:31,180 すでに真円に気づきます。 277 00:13:31,180 --> 00:13:31,680 右? 278 00:13:31,680 --> 00:13:34,250 私は中にマイクを探しています 電話帳とその後 279 00:13:34,250 --> 00:13:37,090 私は最終的には多分ヒット ライン7または多分ライン10 280 00:13:37,090 --> 00:13:41,089 そして、自分自身に私の命令が検索です 電話帳の半分にマイク用。 281 00:13:41,089 --> 00:13:42,380 さて、どのように私はマイクを探していますか? 282 00:13:42,380 --> 00:13:44,213 私はの真ん中によ マイクを探して、なぜ 283 00:13:44,213 --> 00:13:45,860 あなたは、ソートの輪の中に私を送っていますか? 284 00:13:45,860 --> 00:13:49,590 何であるため、しかし、それは大丈夫です 問題の大きさに起こって、 285 00:13:49,590 --> 00:13:52,630 7行目と10で書かれたように? 286 00:13:52,630 --> 00:13:54,989 私達はちょうど検索を言っていません マイクのために、マイクを検索します。 287 00:13:54,989 --> 00:13:56,280 我々は、具体的に何を言っていますか? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 の左半分に彼のために検索します 効果的である右半分 290 00:14:01,610 --> 00:14:03,440 問題の半分のサイズ。 291 00:14:03,440 --> 00:14:07,170 だから、我々は一種のだということもOKです この真円に従事、 292 00:14:07,170 --> 00:14:09,180 この循環論法、 少なくとも私たちはだから 293 00:14:09,180 --> 00:14:11,090 問題はますます小さくなっています。 294 00:14:11,090 --> 00:14:14,220 そして、最終的に我々が到達しようとしています そのいわゆるベースケース場所 295 00:14:14,220 --> 00:14:16,780 私達はちょうど1ページを持ってleft-- 私たちのボランティア先週など 296 00:14:16,780 --> 00:14:18,684 did--私たちは、1ページを持っていました 放置し、その後、私たちにはありません 297 00:14:18,684 --> 00:14:21,600 マイク・スミスの検索を維持する必要があります 彼はそのページのいずれかをだから 298 00:14:21,600 --> 00:14:23,080 または、彼はありません。 299 00:14:23,080 --> 00:14:27,480 >> だから我々はこの考え、これを実装する方法 実際のコードで、円形の一種? 300 00:14:27,480 --> 00:14:31,030 まあ、我々は技術を活用することができます それは一般的に再帰として知られています。 301 00:14:31,030 --> 00:14:33,960 そして、我々は、これを見てきました マージソートのための擬似コード先週。 302 00:14:33,960 --> 00:14:37,190 これがあったことを思い出してください マージソートのための擬似コード。 303 00:14:37,190 --> 00:14:40,560 それは間違いなくよりもさらに簡単です バブルまたは選択または挿入ソート 304 00:14:40,560 --> 00:14:43,310 ただ単純さの点で、 これであなたはそれを表現することができます。 305 00:14:43,310 --> 00:14:46,750 >> しかし、それはので、です 我々は一種の円です 306 00:14:46,750 --> 00:14:51,350 何かを検索し、言っ 再びそれを検索して。 307 00:14:51,350 --> 00:14:53,960 しかし、我々は、いずれかで検索しています 左半分または右半分 308 00:14:53,960 --> 00:14:56,070 して、最終的に私たちがしています この場合、マージ。 309 00:14:56,070 --> 00:14:58,520 しかし、ここでは、あまりにも、と これら二つのソートライン、 310 00:14:58,520 --> 00:15:01,320 我々は再びこれを持っていました 再帰の考え方。 311 00:15:01,320 --> 00:15:05,350 そして、具体的にこれが何を意味するのか、 アルゴリズムの文脈では、 312 00:15:05,350 --> 00:15:10,880 アルゴリズムは再帰的であるということです それは、使用するか、または自分自身を呼び出す場合。 313 00:15:10,880 --> 00:15:14,330 >> またはCの点で、関数であります 関数をrecursive-- 314 00:15:14,330 --> 00:15:18,510 fooが、fooの場合は再帰的です どこかにそのソースコードで、 315 00:15:18,510 --> 00:15:21,250 関数foo自分自身を呼び出します。 316 00:15:21,250 --> 00:15:25,790 そして、それはすべてのfooが今までにない場合は残念です 何度も何度も自分自身を呼び出すです。 317 00:15:25,790 --> 00:15:30,600 fooが最終的に停止した場合に行うようにそれは、OKです ちょっと待って、と言って、マージソート、 318 00:15:30,600 --> 00:15:32,980 この問題は、スーパーである場合 例えば、小さな、 319 00:15:32,980 --> 00:15:35,840 または私は私は誰彼を見つけました 探して、ちょうど返します。 320 00:15:35,840 --> 00:15:41,000 再帰的ではなく、しないでください 周期的にもう一度自分自身を呼び出します。 321 00:15:41,000 --> 00:15:44,200 >> そしてそうのは、見てみましょう どのようにこれは実際に動作する可能性があります。 322 00:15:44,200 --> 00:15:48,430 だから私は先に行くつもりとオープンです ここでは2つのソースコードの例アップ。 323 00:15:48,430 --> 00:15:50,321 一つはシグマ0と呼ばれています。 324 00:15:50,321 --> 00:15:52,320 そして、これがすべてではありません 再帰的な、しかしそれでは、見てみましょう 325 00:15:52,320 --> 00:15:53,694 このプログラムは何を見て。 326 00:15:53,694 --> 00:15:55,737 私はすべて取り除かました それ以外のすべてからのコメント 327 00:15:55,737 --> 00:15:58,070 CS50の上のソースコードの ウェブサイトはあなたの場合はコメントがあります 328 00:15:58,070 --> 00:15:59,570 後でもう一度それを読みたいと思います。 329 00:15:59,570 --> 00:16:02,010 そしてのは、カップルをやらせます 正気のこちらをチェックします。 330 00:16:02,010 --> 00:16:06,640 >> したがって、このコードの先頭に、 我々はCS50.h.が含まれています 331 00:16:06,640 --> 00:16:07,650 これは何をするのか? 332 00:16:07,650 --> 00:16:08,990 それはなぜここにいるのですか? 333 00:16:08,990 --> 00:16:11,740 合理的な普通の言葉で。 334 00:16:11,740 --> 00:16:12,424 それは何をするのか? 335 00:16:12,424 --> 00:16:12,858 うん。 336 00:16:12,858 --> 00:16:14,160 >> 聴衆:GetIntで機能が動作するように。 337 00:16:14,160 --> 00:16:16,243 >> DAVID J.マラン:だから GetIntで機能が動作します。 338 00:16:16,243 --> 00:16:18,115 この内部のため ファイル、CS50.h、これ 339 00:16:18,115 --> 00:16:20,950 我々は長い間で前に表示されます そのソースコードの観点から、 340 00:16:20,950 --> 00:16:23,270 機能の束を持っています GetIntで、のGetString、declared-- 341 00:16:23,270 --> 00:16:26,950 others--のとしない限り束と 私たちは、実際に行が含まれていることを持っています、 342 00:16:26,950 --> 00:16:29,320 コンパイラのクランではありません それが存在することを知っているだろう。 343 00:16:29,320 --> 00:16:32,400 そして、同じ行のために行きます INTが定義された2 344 00:16:32,400 --> 00:16:35,101 関数であるprintf関数、 我々はかなり使用してください。 345 00:16:35,101 --> 00:16:37,850 さて、ライン4は少しファンキーようです それだけで1ライナーだから。 346 00:16:37,850 --> 00:16:41,570 それは、セミコロン、無カーリーを持っています ブレース、その内部にはコード。 347 00:16:41,570 --> 00:16:44,640 しかし、我々は何を呼びました 週間過去にこの事? 348 00:16:44,640 --> 00:16:45,140 うん。 349 00:16:45,140 --> 00:16:46,060 だから、プロトタイプ。 350 00:16:46,060 --> 00:16:48,390 そして、なぜ私たちは持っています 思わプロトタイプ 351 00:16:48,390 --> 00:16:51,050 少し冗長にします 一般的にので、私たちは通常、 352 00:16:51,050 --> 00:16:53,474 再び関数を参照してください それ以降のファイルで、右か? 353 00:16:53,474 --> 00:16:56,390 では、なぜ私たちはあなただけですhave--ん あなたの頭を悩まが、私はそれを取りますよ。 354 00:16:56,390 --> 00:16:57,302 うん。 355 00:16:57,302 --> 00:17:00,000 >> 聴衆:[聞こえません] メインの後に関数。 356 00:17:00,000 --> 00:17:01,000 DAVID J.マラン:その通り。 357 00:17:01,000 --> 00:17:04,089 コンパイラはあなたを知っているように、 最終的に定義または実装します 358 00:17:04,089 --> 00:17:06,579 おそらく、メインの後にその機能。 359 00:17:06,579 --> 00:17:08,462 だからクラン最も コンパイラは、一種のダムです 360 00:17:08,462 --> 00:17:10,510 そして彼らは知っていますよ あなたはそれらを教えてください。 361 00:17:10,510 --> 00:17:12,569 そして、あなたが使用したい場合 シグマと呼ばれる機能、 362 00:17:12,569 --> 00:17:15,710 あなたはより良いコンパイラを教えます それは、事前に存在します。 363 00:17:15,710 --> 00:17:17,970 >> さて、メイン自体も それはラインの束だけれども、 364 00:17:17,970 --> 00:17:19,839 今ではうまくいけば、かなりよく知られています。 365 00:17:19,839 --> 00:17:21,942 それがdo whileループを持っています その目的は生活の中で 366 00:17:21,942 --> 00:17:24,400 ここで明らかに取得することです ユーザーからの正の整数。 367 00:17:24,400 --> 00:17:27,349 そして、ちょうど彼を困らせる保ちます または彼女それらが協働するまで。 368 00:17:27,349 --> 00:17:30,670 そして、16行目で私が持っています 興味深いコール。 369 00:17:30,670 --> 00:17:31,570 IntAnswer。 370 00:17:31,570 --> 00:17:33,710 左手のどちら 側は私のIntを与えます 371 00:17:33,710 --> 00:17:36,650 Answer--呼ばstore--できます 保存しようとしている、明らかに、 372 00:17:36,650 --> 00:17:39,090 シグマの戻り値。 373 00:17:39,090 --> 00:17:41,840 だから、シグマはただであります 任意であるが意味のある名前 374 00:17:41,840 --> 00:17:44,500 私は、関数に与えてくれたこと その目的は生活の中で 375 00:17:44,500 --> 00:17:47,680 1 argument--を取ることです 我々はこのcase--でNそれを呼ぶことにします 376 00:17:47,680 --> 00:17:52,280 そしてちょうどその数の合計を取ります ですプラスすべての正の数 377 00:17:52,280 --> 00:17:53,200 それよりも小さいです。 378 00:17:53,200 --> 00:17:58,140 >> だから私は数に2を渡した場合 シグマ、私は2と1を追加します 379 00:17:58,140 --> 00:18:00,240 プラス0--ので、それは私3与えません0--。 380 00:18:00,240 --> 00:18:05,320 私はシグマに3を渡す場合は、私がしたいです 私に6を与える、3プラス2プラス1を持っています。 381 00:18:05,320 --> 00:18:05,900 など。 382 00:18:05,900 --> 00:18:09,750 だから、それだけですべてを追加します より小さいかそれに等しい数字。 383 00:18:09,750 --> 00:18:12,040 >> さて、ダウンここで私は行きますよ 答えを印刷します。 384 00:18:12,040 --> 00:18:17,330 だから、迅速な健全性チェックとして、してみましょう シグマ0--ドットスラッシュシグマを作ります0-- 385 00:18:17,330 --> 00:18:18,690 私は2を入力しましょう​​。 386 00:18:18,690 --> 00:18:19,960 そして、私は確かに3を得ます。 387 00:18:19,960 --> 00:18:21,240 私は3を入力してみましょう。 388 00:18:21,240 --> 00:18:22,860 私は確かに6を得ます。 389 00:18:22,860 --> 00:18:27,636 そして、誰もがすぐに計算を行うことができれば、 私は50を行う場合、私は何を得るのつもり? 390 00:18:27,636 --> 00:18:29,839 >> 聴衆:[聞こえません]。 391 00:18:29,839 --> 00:18:30,880 DAVID J.マラン:まあ、ありません。 392 00:18:30,880 --> 00:18:33,340 非常に近いですが、1275。 393 00:18:33,340 --> 00:18:38,850 これは50をすることの結果であります 49プラス48プラス47プラス46プラス 394 00:18:38,850 --> 00:18:40,349 1までのすべての方法。 395 00:18:40,349 --> 00:18:41,390 だから、シグマが行うすべてです。 396 00:18:41,390 --> 00:18:43,350 しかし、我々はきた方法を見てみましょう 今それを実装しました。 397 00:18:43,350 --> 00:18:45,790 だからダウンここで機能そのものです。 398 00:18:45,790 --> 00:18:49,000 そして、これは持っていないようです まだ再帰と何か。 399 00:18:49,000 --> 00:18:51,070 実際には、我々が使用しています 古い学校の技術。 400 00:18:51,070 --> 00:18:56,680 私は合計という変数を初期化しています ゼロに、私はここにforeloopを持っています、 401 00:18:56,680 --> 00:19:00,790 私はと呼ばれるint型を宣言しています 私に等しく、それを設定します1-- 402 00:19:00,790 --> 00:19:04,080 私はに等しいそれを設定することができても ゼロが、私はまたやってることから、 403 00:19:04,080 --> 00:19:05,340 それがゼロまたは1つだ場合誰が気に。 404 00:19:05,340 --> 00:19:06,660 それは影響を与えないことが起こっています。 405 00:19:06,660 --> 00:19:10,110 >> だから私はあまりにも長い間、私はあるとして反復よ m以下、これ 406 00:19:10,110 --> 00:19:11,671 に渡された引数です。 407 00:19:11,671 --> 00:19:13,670 そして私はちょうど保ちます I.と洞察力をインクリメント 408 00:19:13,670 --> 00:19:20,010 ループの私がやっているすべての合計をやっています プラスI.に等しく、それは意図的なのです。 409 00:19:20,010 --> 00:19:22,326 私はこの中で、行うにはしたくありません 合計プラスプラスのような場合、。 410 00:19:22,326 --> 00:19:24,790 私は実際に追加します 私の現在の値 411 00:19:24,790 --> 00:19:28,190 これはどんどん大きくなって保持 ランニングタリーに大きな。 412 00:19:28,190 --> 00:19:30,210 >> そして私は、合計を返します。 413 00:19:30,210 --> 00:19:33,850 だから答えは、値の合計を取得します。 414 00:19:33,850 --> 00:19:35,282 そして、私はそれをプリントアウト。 415 00:19:35,282 --> 00:19:37,740 だからここにチャンスがあります、 しかし、この種の簡単にするために、 416 00:19:37,740 --> 00:19:41,260 このコード概念的 ブローの種類は、一つの 417 00:19:41,260 --> 00:19:43,250 の面で気に でもそれかかわらず、シンプルさ 418 00:19:43,250 --> 00:19:45,700 ソートする時間がかかります なぜこれの感謝 419 00:19:45,700 --> 00:19:47,330 これらの小さな例で強力です。 420 00:19:47,330 --> 00:19:50,380 ここではそのように選ぶ - シグマです このコードの2バージョン。 421 00:19:50,380 --> 00:19:55,290 トップアップすべてがそうと同じです その同じ話は前と同じように適用されます。 422 00:19:55,290 --> 00:19:59,220 しかし、今のは見てみましょう シグマの実装します 423 00:19:59,220 --> 00:20:05,040 私はちょうどこれらに絞り込まました 4行のコードlines--、本当に、 424 00:20:05,040 --> 00:20:06,980 プラスいくつかの中括弧と空白。 425 00:20:06,980 --> 00:20:07,930 >> しかし、私は何をやっていますか? 426 00:20:07,930 --> 00:20:11,050 mは以下である場合 ゼロ、私は種類の処理する必要があります 427 00:20:11,050 --> 00:20:12,490 その超簡単な場合。 428 00:20:12,490 --> 00:20:15,450 そして、あなたは私に、ゼロまたは何かを手場合 ただ奇妙である負の、 429 00:20:15,450 --> 00:20:17,909 私はちょうど任意にするつもりです しかし、一貫してゼロを返します。 430 00:20:17,909 --> 00:20:20,200 私はこの事はしたくありません いくつかの奇妙な無限に入ります 431 00:20:20,200 --> 00:20:21,810 なぜなら、負の値のループ。 432 00:20:21,810 --> 00:20:25,070 あなたは私を与える場合だから、僕は、言っています 0以下、私はゼロを返しています。 433 00:20:25,070 --> 00:20:28,220 >> それはだからしかし、それは良いことです 電話帳の単一のページ 434 00:20:28,220 --> 00:20:28,790 それが残っています。 435 00:20:28,790 --> 00:20:32,660 私は非常に特定の問題を離れてかみますよ 再帰的なものを呼び出していません。 436 00:20:32,660 --> 00:20:36,580 しかし、ライン31で、どのような 私がやっているように見えるのですか? 437 00:20:36,580 --> 00:20:39,780 括弧だけ維持しています 物事、うまくいけば、少し明確に。 438 00:20:39,780 --> 00:20:42,110 しかし、私がやっているすべては私があります M--何を返します 439 00:20:42,110 --> 00:20:45,790 あなたの手のme--プラス M--の値申し訳ありませんが、 440 00:20:45,790 --> 00:20:49,052 プラスマイナス1メートルのシグマの値。 441 00:20:49,052 --> 00:20:50,010 だから、これは何を意味するのでしょうか? 442 00:20:50,010 --> 00:20:53,965 あなたが入力として私は数3を与えると、 答え私は最終的に取得したいです 443 00:20:53,965 --> 00:20:57,307 3プラス2プラス1は私に6を与えるから6です。 444 00:20:57,307 --> 00:20:59,390 しかし、どのように私は約思います どのようにこのコードが実行されていますか? 445 00:20:59,390 --> 00:21:03,070 私はシグマ呼び出し初めて 私は、値3を渡します 446 00:21:03,070 --> 00:21:07,960 それが作品に言ってようなものです 紙は、ここに値3です 447 00:21:07,960 --> 00:21:09,920 私はシグマとしてこれを渡してきました。 448 00:21:09,920 --> 00:21:13,090 図3は、明らかにそうではありませんが0未満であります IF条件は適用されません。 449 00:21:13,090 --> 00:21:14,020 ELSEはありません。 450 00:21:14,020 --> 00:21:14,990 だから私は何をしますか? 451 00:21:14,990 --> 00:21:19,902 私はある、メートルを返すようにしたいです 3、プラスMマイナス1のシグマ。 452 00:21:19,902 --> 00:21:21,110 だから、私はこのを追跡してみましょう。 453 00:21:21,110 --> 00:21:22,710 私はこれを置くつもりです 一枚の紙ダウン。 454 00:21:22,710 --> 00:21:24,668 そして、どのような値であることが 明らかに、私は渡すつもりです 455 00:21:24,668 --> 00:21:26,540 物語の中で、この時点でシグマに? 456 00:21:26,540 --> 00:21:28,080 何番? 457 00:21:28,080 --> 00:21:28,610 2、右? 458 00:21:28,610 --> 00:21:29,670 3マイナス1は2です。 459 00:21:29,670 --> 00:21:32,000 だから、僕は少し必要があります ここでは、紙のスクラップ。 460 00:21:32,000 --> 00:21:33,931 だから今シグマが再び呼び出さなっています。 461 00:21:33,931 --> 00:21:35,930 そして、私は意図的に入れています このダウンそれはだから 462 00:21:35,930 --> 00:21:38,070 種類の一時停止のような 物語のそのバージョン 463 00:21:38,070 --> 00:21:40,720 今、私は集中だから メートルの信号のマイナス1。 464 00:21:40,720 --> 00:21:42,660 だから、mは3、mでマイナス​​1は2です。 465 00:21:42,660 --> 00:21:45,110 だからここに私は渡されてきた2があります。 466 00:21:45,110 --> 00:21:48,510 2は明らか未満ではありません 0だからその場合は適用されません。 467 00:21:48,510 --> 00:21:53,445 そうでなければ私はこれであるMを返します どのような値のものに加えて、シグマ? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 1--のシグマのであれば、mはあるため、 今2 SO 2マイナス1は1です。 470 00:21:59,650 --> 00:22:01,950 だから今私は値1を持っています。 471 00:22:01,950 --> 00:22:04,810 私はちょうど番号を渡しています 関数の1 sigma-- 472 00:22:04,810 --> 00:22:09,120 または私はhere--ので1は明らかではありません ゼロ未満、まだ適用されません。 473 00:22:09,120 --> 00:22:12,970 >> それ以外の戻り値1を加えたもののシグマ? 474 00:22:12,970 --> 00:22:13,470 0。 475 00:22:13,470 --> 00:22:14,678 だから、私はちょうどそれを覚えてみましょう。 476 00:22:14,678 --> 00:22:15,920 私は後でそれに取得します。 477 00:22:15,920 --> 00:22:18,060 今、私は先とJOT行くつもりです 数0ダウンそれはだから 478 00:22:18,060 --> 00:22:19,470 私の引数またはパラメータ。 479 00:22:19,470 --> 00:22:22,400 私は数0に合格しています そして最後に、このプロセス 480 00:22:22,400 --> 00:22:25,760 ただ自分の広告を繰り返します nauseumは何のでやめるん 481 00:22:25,760 --> 00:22:28,820 私はこの0を見たら、私はすぐに行うのですか? 482 00:22:28,820 --> 00:22:29,790 私はゼロを返します。 483 00:22:29,790 --> 00:22:31,790 だから今、あなたは話を巻き戻す必要があります。 484 00:22:31,790 --> 00:22:34,430 >> 私は今の時間に後方に行く場合、 最も最近のものだったもの 485 00:22:34,430 --> 00:22:36,670 あなたは文字通りいた場合、私はやりました ビデオを巻き戻しますか? 486 00:22:36,670 --> 00:22:41,630 私は、最新のをピックアップするつもりです 1、それは私に1を与えるプラス0は1です。 487 00:22:41,630 --> 00:22:44,100 私は巻き戻しておく場合 物語、それは私を与えるために起こっています 488 00:22:44,100 --> 00:22:46,880 2プラス1であるこの実行値。 489 00:22:46,880 --> 00:22:47,789 だから、3です。 490 00:22:47,789 --> 00:22:49,330 そして私は、巻き戻しを維持するつもりです。 491 00:22:49,330 --> 00:22:54,220 私は最初の番号を下に置くとき 3--ので3プラス3は私に6を与えます。 492 00:22:54,220 --> 00:22:57,272 >> そして今、あなたは巻き戻してしまった場合 この時点までの映像まで、 493 00:22:57,272 --> 00:22:58,980 これは非常にありました 最初の質問私は尋ねました。 494 00:22:58,980 --> 00:23:01,450 3渡されたとき、3のシグマは何ですか? 495 00:23:01,450 --> 00:23:04,204 これは、実際の合計6です 紙のすべてのこれらの作品。 496 00:23:04,204 --> 00:23:07,120 だからにしながら、それが少しかかる場合 あなたの心を包み込む、それは大丈夫です。 497 00:23:07,120 --> 00:23:10,700 しかし、それはそれlittle--た検討 私が積み重ねられたことを非常に意図的でした 498 00:23:10,700 --> 00:23:12,990 互いの上にこれらの数字。 499 00:23:12,990 --> 00:23:17,440 それは一種のようなものです 時間のレコードをmemory--、 500 00:23:17,440 --> 00:23:19,940 ビデオでスクラバーのように、 私は確かで巻き戻すことができます。 501 00:23:19,940 --> 00:23:24,350 そして、我々は戻ってくるつもりです ほんの少しのそのメタファー。 502 00:23:24,350 --> 00:23:28,240 >> しかし、最初に、それはそこだと判明します オタクと面白い人々の多くは、 503 00:23:28,240 --> 00:23:29,614 私はグーグルで、推測します。 504 00:23:29,614 --> 00:23:31,530 う非常に誰か グーグルで心が得意 505 00:23:31,530 --> 00:23:34,270 ちょっと来ると 私は何かを探しに役立ちますか? 506 00:23:34,270 --> 00:23:35,650 非常に、非常に低いキー。 507 00:23:35,650 --> 00:23:37,870 ことはない誰か おそらく、前に出てきます。 508 00:23:37,870 --> 00:23:38,370 OK。 509 00:23:38,370 --> 00:23:39,030 うん? 510 00:23:39,030 --> 00:23:39,530 いい加減にして。 511 00:23:39,530 --> 00:23:41,410 ダウンさあ。 512 00:23:41,410 --> 00:23:42,183 あなたの名前は何ですか? 513 00:23:42,183 --> 00:23:42,870 >> SAM:サム。 514 00:23:42,870 --> 00:23:44,290 >> DAVID J.マラン:サムは、ダウンに来て。 515 00:23:44,290 --> 00:23:45,320 これは、同じです。 516 00:23:45,320 --> 00:23:46,280 始めまして。 517 00:23:46,280 --> 00:23:46,780 ねえ。 518 00:23:46,780 --> 00:23:47,580 おいで。 519 00:23:47,580 --> 00:23:51,290 私はあなたがする必要があるので、すべて、場合 あなたは、サムは、ここでは、Googleの可能性があります。 520 00:23:51,290 --> 00:23:53,240 あなたは用語の再帰を検索することができますか? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 台無しにしないでください。 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> そして今、ええlet's--。 525 00:24:00,970 --> 00:24:03,380 [OK]をクリックしますこと。 526 00:24:03,380 --> 00:24:04,315 より良いものをクリックします。 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 ああ、それを得ます。 529 00:24:08,020 --> 00:24:08,520 なし? 530 00:24:08,520 --> 00:24:09,050 OK。 531 00:24:09,050 --> 00:24:10,430 それでは、カップルの人をしましょう​​。 532 00:24:10,430 --> 00:24:12,830 関連そんなにありません 学問的にここが、あなたを持っています 533 00:24:12,830 --> 00:24:14,520 これまでアナグラムをGoogleで検索! 534 00:24:14,520 --> 00:24:15,280 >> SAM:いいえ。 535 00:24:15,280 --> 00:24:15,520 >> DAVID J.マラン:OK。 536 00:24:15,520 --> 00:24:17,186 アナグラムの代わりに再帰を検索します。 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 どのように斜めについて。 539 00:24:23,790 --> 00:24:25,515 あなたは今までに斜めに検索しましたか! 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 さて、これはに少し難しいです 参照うまくいけばOK everything's--。 542 00:24:32,692 --> 00:24:34,150 それはちょうどあなたと私はこれを楽しみました。 543 00:24:34,150 --> 00:24:34,690 OK。 544 00:24:34,690 --> 00:24:38,950 >> 最後に、このone's-- それは少し斜めです。 545 00:24:38,950 --> 00:24:40,810 今バレルロールを行います。 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 ワンダフル。 548 00:24:45,310 --> 00:24:45,910 大丈夫。 549 00:24:45,910 --> 00:24:47,110 ビッグサムをお願い致します。 550 00:24:47,110 --> 00:24:49,416 どうぞ。 551 00:24:49,416 --> 00:24:50,400 ありがとうございます。 552 00:24:50,400 --> 00:24:52,807 >> だから何がすべてで起こっています これらの愚かな例の? 553 00:24:52,807 --> 00:24:55,640 だから本当に、のボンネットの下に コー​​ドの行のGoogleの何百万人 554 00:24:55,640 --> 00:24:58,860 どうやらIF数愚かです 基本的な条件 555 00:24:58,860 --> 00:25:01,160 ユーザーが持っているかどうかをチェック このフレーズに入力しました、 556 00:25:01,160 --> 00:25:03,760 おそらく取った何かをします 時間の非自明な量 557 00:25:03,760 --> 00:25:06,080 ちょうどに実装します このように、面白いこと。 558 00:25:06,080 --> 00:25:08,430 しかし、それは、それは沸騰すべてです フードの下にダウン。 559 00:25:08,430 --> 00:25:11,570 しかし、当然のことながら、再帰 geekierの詳細です 560 00:25:11,570 --> 00:25:13,880 これらの特別なトリックの中で例。 561 00:25:13,880 --> 00:25:16,880 そして、確かにそこに他のアウトがあります 同様に、我々はおそらく持っていないこと 562 00:25:16,880 --> 00:25:18,230 まだ発見されました。 563 00:25:18,230 --> 00:25:22,830 >> だから、見てみましょう、または検討 ここで、以下のプログラム、 564 00:25:22,830 --> 00:25:24,830 確かにいずれかをつかみます あなたの方法うちにこれらの。 565 00:25:24,830 --> 00:25:28,820 私は先に行くつもりだと なプログラムを開きます 566 00:25:28,820 --> 00:25:30,920 2つの値を交換しようとするだろう。 567 00:25:30,920 --> 00:25:33,210 我々はそこに行く前に、しかし、それでは、これを実行してみましょう。 568 00:25:33,210 --> 00:25:38,500 私たちはもう一つを得ることができます ボランティア、私が思いますか? 569 00:25:38,500 --> 00:25:40,480 あなたはボランティアしますか? 570 00:25:40,480 --> 00:25:40,980 なし? 571 00:25:40,980 --> 00:25:41,890 アップさあ。 572 00:25:41,890 --> 00:25:42,390 アップさあ。 573 00:25:42,390 --> 00:25:42,890 大丈夫。 574 00:25:42,890 --> 00:25:44,136 だからあなたの名前は何ですか? 575 00:25:44,136 --> 00:25:44,810 >> ローレン:ローレン。 576 00:25:44,810 --> 00:25:45,768 >> DAVID J.マラン:ローレン。 577 00:25:45,768 --> 00:25:46,890 、ローレンをご利用下さい。 578 00:25:46,890 --> 00:25:50,140 だから、ローレンがされています 次のようにここに挑戦しました。 579 00:25:50,140 --> 00:25:52,310 始めまして。 580 00:25:52,310 --> 00:25:55,730 だからここローレンが前面に持っています 彼女の2つの空のカップ。 581 00:25:55,730 --> 00:25:57,570 そして、我々はいくつかのオレンジ色を持っています ジュース、牛乳 582 00:25:57,570 --> 00:26:00,301 そして私達は行くつもりです 先と次の手順を実行します。 583 00:26:00,301 --> 00:26:01,550 私達はちょうどこれを埋めるつもりです。 584 00:26:01,550 --> 00:26:07,840 こっちミルクの少数のオンスとはしてみましょう こっち少しオレンジジュースを埋めます。 585 00:26:07,840 --> 00:26:11,475 >> そして、すべての目の前で これらの観​​客、 586 00:26:11,475 --> 00:26:13,550 これらのカップの2つの値を交換します。 587 00:26:13,550 --> 00:26:16,970 ミルクカップにオレンジジュースを入れて そして、オレンジジュースカップミルク。 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 あなたがでた場合はどのようにこれを行うだろう 家庭やその他の物資へのアクセスを持っていましたか? 590 00:26:26,150 --> 00:26:27,400 ローレン:別のカップにそれを入れてください。 591 00:26:27,400 --> 00:26:28,191 DAVID J.マラン:OK。 592 00:26:28,191 --> 00:26:31,940 それでは、一時てみましょう 変数、私たちがするかどうか。 593 00:26:31,940 --> 00:26:35,871 そして今、先に行くと実装 この同じスワッピング手続き。 594 00:26:35,871 --> 00:26:36,370 とても良い。 595 00:26:36,370 --> 00:26:41,490 我々は一時的にOJを入れています 変数、OJ変数にミルク、 596 00:26:41,490 --> 00:26:44,481 現在は一時変数 ミルク変数に。 597 00:26:44,481 --> 00:26:44,980 OK。 598 00:26:44,980 --> 00:26:48,740 だから、非常によく、これまでに行われ。 599 00:26:48,740 --> 00:26:50,990 だから、と判示out--なります ちょっと思いました。 600 00:26:50,990 --> 00:26:54,479 ここで、少しだけそれをオタクには、この 対応するCのコードになります 601 00:26:54,479 --> 00:26:55,520 私達はちょうど実装こと。 602 00:26:55,520 --> 00:26:58,650 我々は、2つの入力AとBの両方を有していました これは我々だけである単純化のために言いますよ 603 00:26:58,650 --> 00:26:59,260 int型の。 604 00:26:59,260 --> 00:27:02,780 そして、私は交換したい場合は、ここで注意してください 2つの変数a、bの値は、 605 00:27:02,780 --> 00:27:06,890 我々は確かに仲介を必要とし、 一時変数、一時的なカップ、 606 00:27:06,890 --> 00:27:10,830 値のいずれかを注ぐその中に 我々はそれのためのプレースホルダを持つようにします。 607 00:27:10,830 --> 00:27:13,480 しかし、その後のコードは正確です ローレン、ここで実装されています。 608 00:27:13,480 --> 00:27:15,500 >> 今、ちょうど取得します 少しスゴは、判明します 609 00:27:15,500 --> 00:27:20,930 あなたがなしでこれを行うことができます 一時変数。 610 00:27:20,930 --> 00:27:24,870 しかし、これを適切に行うために、我々はつもりです いくつかの化学でカンニングする必要があります。 611 00:27:24,870 --> 00:27:26,380 ここではいくつかの余分なカップを持っています。 612 00:27:26,380 --> 00:27:29,600 そう見える最も近いものは、 牛乳と水のようなperhaps-- 613 00:27:29,600 --> 00:27:34,090 またはミルクとOJ--は、我々はいくつかを持っています 水、私たちはこの1つを満たしますよ 614 00:27:34,090 --> 00:27:36,486 澄んだ水の少数のオンスを持ちます。 615 00:27:36,486 --> 00:27:38,332 それはおそらくあまりにも多くのです。 616 00:27:38,332 --> 00:27:38,832 うん。 617 00:27:38,832 --> 00:27:39,934 それはあまりにも多くの間違いです。 618 00:27:39,934 --> 00:27:40,600 1秒に保持します。 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> そして今、我々は、私が思い出すように、油を持っています 中学校の化学クラスから、 621 00:27:48,420 --> 00:27:49,990 うまくいけば、それは、水と混合しません。 622 00:27:49,990 --> 00:27:53,650 しかし、この種の一種の 牛乳とOJのように見えます。 623 00:27:53,650 --> 00:27:55,760 だから今、使用せず 一時変数、 624 00:27:55,760 --> 00:27:59,260 あなたは、これらの2つの値を入れ替えることができますか? 625 00:27:59,260 --> 00:28:03,884 水カップに入る油はそう、 水は、オイルカップに入ります。 626 00:28:03,884 --> 00:28:04,800 ローレン:なしカップ? 627 00:28:04,800 --> 00:28:05,940 DAVID J.マラン:なしカップ。 628 00:28:05,940 --> 00:28:07,860 そして、私は実際にはいませんでした 今年の前にこれをテスト 629 00:28:07,860 --> 00:28:10,110 これがする場合ので、私は知りません 実際に化学的に働きます。 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 それは起こることになっていませんでした。 632 00:28:18,650 --> 00:28:19,761 それが動作していますか? 633 00:28:19,761 --> 00:28:20,260 大丈夫。 634 00:28:20,260 --> 00:28:20,990 だから、分離? 635 00:28:20,990 --> 00:28:21,490 良い。 636 00:28:21,490 --> 00:28:24,714 今、私たちが得るようになりました 他のカップに水。 637 00:28:24,714 --> 00:28:27,630 スマート化学コンセントレータできました おそらく私よりもこれを行います。 638 00:28:27,630 --> 00:28:28,510 >> LAUREN:水が底にあります。 639 00:28:28,510 --> 00:28:31,910 >> DAVID J.マラン:だっwater-- 我々はこれをしたキー最後の時間です。 640 00:28:31,910 --> 00:28:33,950 あなたは、正しい順序でそれをしなければなりません。 641 00:28:33,950 --> 00:28:34,450 うん。 642 00:28:34,450 --> 00:28:35,270 それで大丈夫です。 643 00:28:35,270 --> 00:28:37,290 だから今、私たちは、オイルの2杯を持っています。 644 00:28:37,290 --> 00:28:37,790 OK。 645 00:28:37,790 --> 00:28:38,510 それで大丈夫です。 646 00:28:38,510 --> 00:28:40,110 しかし、これはI--よりも働いていた化学場合 647 00:28:40,110 --> 00:28:41,200 >> ローレン:これは水です。 648 00:28:41,200 --> 00:28:41,930 >> DAVID J.マラン:それは主に水です。 649 00:28:41,930 --> 00:28:42,430 大丈夫。 650 00:28:42,430 --> 00:28:44,210 しかし、それはまだ前と同じカップです。 651 00:28:44,210 --> 00:28:47,570 だからit--がそこにそれを試して注ぎます。 652 00:28:47,570 --> 00:28:49,300 OK。 653 00:28:49,300 --> 00:28:51,010 これは、クラスの時間をうまく利用は、今日です。 654 00:28:51,010 --> 00:28:51,510 OK。 655 00:28:51,510 --> 00:28:53,890 だから今素敵we--。 656 00:28:53,890 --> 00:28:55,460 並べ替え。 657 00:28:55,460 --> 00:28:55,960 大丈夫。 658 00:28:55,960 --> 00:28:56,690 だから、非常に良いです。 659 00:28:56,690 --> 00:29:00,006 ローレンに感謝します。 660 00:29:00,006 --> 00:29:01,950 非常によくやりました。 661 00:29:01,950 --> 00:29:04,570 >> だから、あなたの心を爆破します これはおそらく、何かであります 662 00:29:04,570 --> 00:29:08,660 あなたはCS50のIDで好きなら一緒にプレイするために、 あなたは、実際には、2つの変数を入れ替えることができます 663 00:29:08,660 --> 00:29:11,470 一時的な整数値を使用しません。 664 00:29:11,470 --> 00:29:13,060 そして、これは対応するCコードです。 665 00:29:13,060 --> 00:29:16,110 そして、あなたは最後から思い出した場合 簡単場合は水曜日、我々は、導入されました、 666 00:29:16,110 --> 00:29:19,720 C.そしてないでいくつかの新しい演算子 誰もがなけなしのニンジンを思い出します 667 00:29:19,720 --> 00:29:23,660 シンボルは、その小さな三角形であります キーボードからのシンボルが表しますか? 668 00:29:23,660 --> 00:29:26,003 何ビット演算子? 669 00:29:26,003 --> 00:29:26,770 >> 聴衆:EXOR。 670 00:29:26,770 --> 00:29:27,645 >> DAVID J.マラン:EXOR。 671 00:29:27,645 --> 00:29:28,560 排他的論理和。 672 00:29:28,560 --> 00:29:32,920 だから、あなたがしたい場合は、ちょうど楽しみのために aとb 2任意のを与えるために家、 673 00:29:32,920 --> 00:29:36,072 任意のeight--と私のような値 8ビットの値を選択することになります。 674 00:29:36,072 --> 00:29:38,530 あなたは32ビットでこれを行う場合は、 あなたは非常に迅速に飽きます。 675 00:29:38,530 --> 00:29:42,150 しかし、わずか8ビットを与えます どのような1つまたは2つの値は、 676 00:29:42,150 --> 00:29:43,790 そして、同様の値bを与えます。 677 00:29:43,790 --> 00:29:46,810 そして定義を使用して 先週の水曜日からXORの、 678 00:29:46,810 --> 00:29:52,560 、ビットでのそれぞれを、そのビットを適用 aとbのそれぞれのものの8ビット、 679 00:29:52,560 --> 00:29:54,980 そして、このコードごとに正確にそれを行います。 680 00:29:54,980 --> 00:29:58,170 そして、それは間違っていない何 あなたが画面上にここを参照してください。 681 00:29:58,170 --> 00:30:02,100 それは確かに沸きます 3 XOR演算に 682 00:30:02,100 --> 00:30:05,910 何とか魔法と B位置を交換します 683 00:30:05,910 --> 00:30:08,010 任意の情報を失うことなく。 684 00:30:08,010 --> 00:30:11,580 >> だから、油と水のトリックです 最も近い現実世界の化身 685 00:30:11,580 --> 00:30:12,980 私はそれを模倣するために考えることができます。 686 00:30:12,980 --> 00:30:15,950 しかし、それは確かに簡単です 一時的な変数を使用し、 687 00:30:15,950 --> 00:30:16,920 ここで、この場合のように。 688 00:30:16,920 --> 00:30:21,190 そして、これはあまりにも機会が、言っています あまりにも、マイクロ最適化のこのような、 689 00:30:21,190 --> 00:30:23,590 コンピューター科学者として 楽しみのようなものながら、と言うでしょう 690 00:30:23,590 --> 00:30:27,060 あなたがなしでこれをやったかを自慢します 余分な変数でスワップのような、 691 00:30:27,060 --> 00:30:28,640 それはすべてその説得力はありません。 692 00:30:28,640 --> 00:30:31,619 32ビット、などを保存しているため 実際のint型の場合には、 693 00:30:31,619 --> 00:30:33,410 すべてが魅力的ではありません ここで、システム上の 694 00:30:33,410 --> 00:30:36,722 あなたは数十MBのサイズを使用している場合があります あるいはそれ以上、メモリ、これらの日。 695 00:30:36,722 --> 00:30:38,680 そして、実際には、ときに我々が得ます 後で問題セットに 696 00:30:38,680 --> 00:30:41,010 あなたが呪文を実装 チェックしましょう 697 00:30:41,010 --> 00:30:43,550 でこれを行うに挑戦されます このように小さなRAMとわずか 698 00:30:43,550 --> 00:30:46,820 上の可能な限りの時間 あなたはまだcomputer-- 699 00:30:46,820 --> 00:30:50,160 実装する必要があり週間 あなたができるでしょうhave--ますit-- 700 00:30:50,160 --> 00:30:51,799 これらのリソースを最小化するために挑戦しました。 701 00:30:51,799 --> 00:30:53,840 そして、それは本当にだけです 機会この学期 702 00:30:53,840 --> 00:30:57,940 あなたは剃ることが奨励されます場所 でも最高のパフォーマンスオフ 703 00:30:57,940 --> 00:30:59,340 それ以外の場合はかかります。 704 00:30:59,340 --> 00:31:02,200 >> だから私たちはどのようにすることができますwhat-- 実際のコードでこれを参照してください? 705 00:31:02,200 --> 00:31:04,530 私は今、先に行ってみましょう そして、例を開きます 706 00:31:04,530 --> 00:31:07,700 その意図的に呼ばれています いいえスワップないことはしていませんので、 707 00:31:07,700 --> 00:31:10,670 実際には、変数をスワップ 実際には想像のとおり。 708 00:31:10,670 --> 00:31:12,260 それでは、見てみましょう。 709 00:31:12,260 --> 00:31:17,050 ここにはCS50を持っていないプログラムです ライブラリは、ちょうど標準I / Oが起こっています。 710 00:31:17,050 --> 00:31:19,560 今、私たちはプロトタイプを持っています トップアップスワップ用するだけ 711 00:31:19,560 --> 00:31:21,540 それは後に定義されるように持っていることを意味します。 712 00:31:21,540 --> 00:31:22,550 そして、ここでの主なのです。 713 00:31:22,550 --> 00:31:26,000 >> Iは、任意のxとyを割り当て、 それぞれ、値1と2 714 00:31:26,000 --> 00:31:28,590 彼らは小さなだという理由だけで そして、考えるのは簡単。 715 00:31:28,590 --> 00:31:32,280 そして私はちょうどprintf出力の束を持っています 私は健全性チェックを持っているところ。 xは1であります 716 00:31:32,280 --> 00:31:35,110 yは2であると考えられます これらのprintf出力は何を言うだろう。 717 00:31:35,110 --> 00:31:36,530 だから、これまでに無い魔法。 718 00:31:36,530 --> 00:31:40,100 >> それから私は、と主張するつもりです ドットドットドットを交換し、デフ印刷します。 719 00:31:40,100 --> 00:31:43,730 私はスワップを呼ぶつもりです 関数、xとyを渡します。 720 00:31:43,730 --> 00:31:47,350 そして今度は、そのために仮定しましょう スワップは正確に実装されています 721 00:31:47,350 --> 00:31:49,930 それは先ほどあったように 一時変数を持ちます。 722 00:31:49,930 --> 00:31:52,670 だから、私は大胆に主張し、スワップ。 723 00:31:52,670 --> 00:31:55,429 xは今、この、yは今です。 724 00:31:55,429 --> 00:31:57,220 しかし、ファイルはもちろん、 いいえスワップと呼ばれていません。 725 00:31:57,220 --> 00:31:58,678 それでは、実際に何が起こるか見てみましょう。 726 00:31:58,678 --> 00:32:04,450 私はスワップをコンパイルしない場合、その後、 ./noswapを行い、xは1であり、yは2です。 727 00:32:04,450 --> 00:32:05,770 スワップスワップ。 728 00:32:05,770 --> 00:32:07,200 xがyが2であり、1です。 729 00:32:07,200 --> 00:32:11,980 だから、実際にあっても欠陥があるように思われます swap--のはnow--をスクロールダウンしてみましょうけれども 730 00:32:11,980 --> 00:32:16,542 ごとに正確に実装されています コー​​ドは、私が先ほど提案しました。 731 00:32:16,542 --> 00:32:19,000 だから私たちは空想を取得するつもりはありません 今のXORのものです。 732 00:32:19,000 --> 00:32:21,890 これは、あまりにも、ちょうど動作するはず ミルクとOJと同じように、 733 00:32:21,890 --> 00:32:25,820 それが動作していないようです。 734 00:32:25,820 --> 00:32:27,180 >> それでは、再びこれをしましょう​​。 735 00:32:27,180 --> 00:32:29,310 たぶん私はちょうどそれを実行していませんでした。 736 00:32:29,310 --> 00:32:32,010 それでは、再びなしスワップを実行しませんしましょう​​。 737 00:32:32,010 --> 00:32:32,900 多分I--ありません。 738 00:32:32,900 --> 00:32:34,400 だから、それだけで動作していないです。 739 00:32:34,400 --> 00:32:36,060 それでは、少し健全性チェックをしましょう​​。 740 00:32:36,060 --> 00:32:39,690 私はスワップここで先に行ってみよう ちょうど、追加分を待って、 741 00:32:39,690 --> 00:32:43,856 %I / Nとletのあります プラグインの値。 742 00:32:43,856 --> 00:32:45,730 私が本当にしたいので、 何が起こっているかを確認します。 743 00:32:45,730 --> 00:32:47,570 そして実際、これは デバッグ技術 744 00:32:47,570 --> 00:32:50,028 あなたが使用している場合がありますことを 営業時間、またはすでに自宅で、 745 00:32:50,028 --> 00:32:53,560 ダンの前半に似 PSET3でアルメンダリスのビデオ 746 00:32:53,560 --> 00:32:56,870 我々は、印刷を導入し、前記のようなデフ 少なくとも推奨技術、 747 00:32:56,870 --> 00:32:58,080 簡単な例のために。 748 00:32:58,080 --> 00:33:01,720 私が先に行くとmakeを実行してみましょう 再び無スワップ、./noswap。 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> 面白い。 751 00:33:05,840 --> 00:33:11,670 だから、真実であると思われるものに気づきます。 X 1であり、yは2であるが、bが1である場合に2です。 752 00:33:11,670 --> 00:33:16,790 だから、これら二つは何とか入れ替えました ただし、xおよびyがスワップ取得されていません。 753 00:33:16,790 --> 00:33:21,090 だから、何が起こっているか、明確にします 、ここまで私は、xとyを持っています 754 00:33:21,090 --> 00:33:25,380 そしてそれらは、内のローカル変数であります メインの範囲は、私は、xとyに渡しています 755 00:33:25,380 --> 00:33:26,170 スワップします。 756 00:33:26,170 --> 00:33:29,080 今、スワップ、独立した機能として、 その引数を自由に呼び出すことができます 757 00:33:29,080 --> 00:33:30,590 または、そのパラメータ、それが望んでいるもの。 758 00:33:30,590 --> 00:33:33,280 バーまたはXまたはYまたはAまたはB Fooのか。 759 00:33:33,280 --> 00:33:36,870 ただ、彼らがしていることを明確にします xとy自体と同一ではありません、 760 00:33:36,870 --> 00:33:38,020 私はAとBを言いました。 761 00:33:38,020 --> 00:33:40,040 しかし、我々は彼らに私たちが望むものを呼び出すことができます。 762 00:33:40,040 --> 00:33:43,960 >> そしてそれは次のようになります スワップが渡されています 763 00:33:43,960 --> 00:33:48,980 x-- AKA A--、それはです -Y- AKA bを渡されます。 764 00:33:48,980 --> 00:33:51,900 どういうわけか、これらの3行があります 正確にこれらの値を交換します 765 00:33:51,900 --> 00:33:53,510 ローレンは、ミルクとOJで行ったように。 766 00:33:53,510 --> 00:33:56,010 しかし、我々は、プリントアウトしたとき 値は、AとBの 767 00:33:56,010 --> 00:34:01,340 確かにスワップが、Xであり、 yは彼らに何の変化もありません。 768 00:34:01,340 --> 00:34:03,150 xとyがここにあることを思い出してください。 769 00:34:03,150 --> 00:34:05,320 >> だから我々は、この経由を見ることができます 同様に別の技術。 770 00:34:05,320 --> 00:34:08,110 そして、これはあまりにも技術であり、 問題に3を設定し、組み込み。 771 00:34:08,110 --> 00:34:10,780 それでは、先に行くと、これでやろう CS50 IDをお持ちでない場合。 772 00:34:10,780 --> 00:34:13,730 右辺我々について このデバッガタブを持っています。 773 00:34:13,730 --> 00:34:16,159 そして、あなたがこれを開くならば、 いくつかの難解な情報があります 774 00:34:16,159 --> 00:34:17,530 それは最初にあなたに投げています。 775 00:34:17,530 --> 00:34:19,310 しかし、それでは、この離れて本当の高速をいじめるしましょう​​。 776 00:34:19,310 --> 00:34:21,620 >> だから1は、ローカル変数を参照してください。 777 00:34:21,620 --> 00:34:26,230 CS50 IDEに構築することが判明し、 プログラミング環境のより多くの 778 00:34:26,230 --> 00:34:28,060 一般的に、デバッガです。 779 00:34:28,060 --> 00:34:31,340 あなたが視覚的に確認することができますツール 何があなたのプログラムの内部で起こっています 780 00:34:31,340 --> 00:34:34,380 追加に頼ることなく、 printfをし、コンパイルと実行 781 00:34:34,380 --> 00:34:37,588 そして、のprintfのを追加してコンパイルし、 営業時間中に、どのすでに、実行しています 782 00:34:37,588 --> 00:34:40,070 または家は、おそらく かなり面倒になっ。 783 00:34:40,070 --> 00:34:43,090 >> そこでここでは、ちょうどその瞬間に、私たちはしています リアルタイムで見に行きます 784 00:34:43,090 --> 00:34:44,760 私たちのローカル変数の値。 785 00:34:44,760 --> 00:34:47,880 また、設定することができるようになるだろう ブレークポイントと呼ばれるものします 786 00:34:47,880 --> 00:34:52,570 機会が一時停止する私のプログラムであります コー​​ドの特定の行で実行 787 00:34:52,570 --> 00:34:53,710 私は好奇心だと。 788 00:34:53,710 --> 00:34:54,210 右? 789 00:34:54,210 --> 00:34:55,969 これらのプログラムは一瞬で実行されます。 790 00:34:55,969 --> 00:35:00,450 それは私たちより遅い人間のための種類のうれしいです 、一時停止の瞬間を取ることができるように、参照してください。 791 00:35:00,450 --> 00:35:02,380 周りに何が起こっています コー​​ドの特定の行 792 00:35:02,380 --> 00:35:05,050 プログラム耕作なし それを通って完全に終了します。 793 00:35:05,050 --> 00:35:08,510 だから、ブレークポイントは、私たちができるようにするつもり 破壊し、ある時点で一時停止します。 794 00:35:08,510 --> 00:35:12,990 >> コー​​ルスタックは、空想の方法です 関数が現在何を言っ 795 00:35:12,990 --> 00:35:14,140 現時点で呼び出されています。 796 00:35:14,140 --> 00:35:15,370 メインは常に最初に呼び出されます。 797 00:35:15,370 --> 00:35:17,230 しかし、主が呼び出した場合 スワップと呼ばれる機能、 798 00:35:17,230 --> 00:35:20,470 我々は実際にこれを参照するつもりです されている機能の塔 799 00:35:20,470 --> 00:35:22,400 新しい順に呼ばれます。 800 00:35:22,400 --> 00:35:23,310 それでは、それを見てみましょう。 801 00:35:23,310 --> 00:35:24,327 >> 私はズームアウトするつもりです。 802 00:35:24,327 --> 00:35:25,660 私は自分のコードに戻って行くつもりです。 803 00:35:25,660 --> 00:35:27,540 そして、私がしたいという理由だけで ここで知識をひけらかすされるように、 804 00:35:27,540 --> 00:35:31,100 私が先に行くとクリックするつもりです ちょうどライン5の左側にあります。 805 00:35:31,100 --> 00:35:32,830 そして、それは赤い点が作成されます。 806 00:35:32,830 --> 00:35:36,200 そして、右側に気付きます デバッガがねえ、知っていること、 807 00:35:36,200 --> 00:35:41,020 私は言ったブレークポイント 特にnoswap.cライン5、 808 00:35:41,020 --> 00:35:42,480 このコード行で。 809 00:35:42,480 --> 00:35:45,090 だから、デバッガは、私を知っています 次回ことを要求してきました 810 00:35:45,090 --> 00:35:48,530 私は私のプログラムのそれのポーズを実行します そこだけではなく、実行 811 00:35:48,530 --> 00:35:50,390 超高速全部を実行しています。 812 00:35:50,390 --> 00:35:53,889 >> だから今は、[デバッグ]をクリックするつもりです IDEの最上部にあるボタン 813 00:35:53,889 --> 00:35:55,430 それは、次の操作を行うために起こっています。 814 00:35:55,430 --> 00:36:00,680 当初はやや開くようになるだろう 怖い探して第二の端子window-- 815 00:36:00,680 --> 00:36:02,679 からのリモートデバッグ このような宿主とsuch-- 816 00:36:02,679 --> 00:36:04,970 我々はに戻ってくるもの すべてのことはずっと前を意味します。 817 00:36:04,970 --> 00:36:09,020 しかし、今のところ重要なものです その赤い点がヒットしたことで、 818 00:36:09,020 --> 00:36:11,735 デバッガは、意図的に持っています execution--一時停止 819 00:36:11,735 --> 00:36:15,560 ない、それ自体は、その行のが、最初に その関数の実際のコードの行。 820 00:36:15,560 --> 00:36:18,040 ライン7である理由それはです 今黄色で強調しました。 821 00:36:18,040 --> 00:36:20,550 >> そして今のは見てみましょう 右手側に。 822 00:36:20,550 --> 00:36:27,300 デフォルトでは、次のようになり、 素敵なことに、xがどのような値を持っていますか? 823 00:36:27,300 --> 00:36:27,860 0。 824 00:36:27,860 --> 00:36:29,750 そしてYはどのような値を持っていますか? 825 00:36:29,750 --> 00:36:30,410 ゼロ。 826 00:36:30,410 --> 00:36:35,540 そして、それはある意味で予想されることです 黄色line--が持っているそのxと-Y- 827 00:36:35,540 --> 00:36:36,770 まだ実行されません。 828 00:36:36,770 --> 00:36:38,510 だから、xが値1を持つべきではありません。 829 00:36:38,510 --> 00:36:41,470 これは、他の値を持っているかもしれませんが、 いわゆるゴミ値。 830 00:36:41,470 --> 00:36:44,320 そして、私たちはそのことの中で幸運 本質的に、この時点ではゼロ。 831 00:36:44,320 --> 00:36:46,400 >> だから今わずか数あります 私たちは気にする必要のボタン 832 00:36:46,400 --> 00:36:48,100 この方法でデバッグするときについて。 833 00:36:48,100 --> 00:36:49,970 ここで注意してください、私たちは、再生ボタンを持っています。 834 00:36:49,970 --> 00:36:51,877 そして、私たちは再生する場合またはヒット それはちょうどですが、再開 835 00:36:51,877 --> 00:36:53,710 介して実行しようとして プログラムの残りの部分 836 00:36:53,710 --> 00:36:55,300 あるいは、別のブレークポイントに到達するまで。 837 00:36:55,300 --> 00:36:56,910 しかし、私は他のを設定していました ブレークポイントそれだけですので、 838 00:36:56,910 --> 00:36:58,118 最後まで実行するつもり。 839 00:36:58,118 --> 00:37:00,280 敗北のようなもの チャンスをうかがっの目的。 840 00:37:00,280 --> 00:37:03,290 >> だからではなく、私が気に 右にこれらのアイコン。 841 00:37:03,290 --> 00:37:05,360 そして、私は上にマウスを移動場合 それら、あなたは、あまりにも必要として 842 00:37:05,360 --> 00:37:07,450 あなたは少しtips--ツールチップが表示されます。 843 00:37:07,450 --> 00:37:09,020 この1は、ステップオーバーです。 844 00:37:09,020 --> 00:37:11,290 今では、スキップを意味するものではありません 次のコード行。 845 00:37:11,290 --> 00:37:14,840 それはちょうどそれを実行意味し、 、次へ移動次へ移動し、 846 00:37:14,840 --> 00:37:15,580 次へ移動します。 847 00:37:15,580 --> 00:37:17,610 言い換えれば、ビア そのボタンは、私が歩くことができます 848 00:37:17,610 --> 00:37:20,390 当時の私のコード1工程を経て。 849 00:37:20,390 --> 00:37:21,914 行ずつ、文字通り。 850 00:37:21,914 --> 00:37:23,830 さて、の右側に それは、別のものがあります 851 00:37:23,830 --> 00:37:25,163 私たちは一瞬で表示されますことを。 852 00:37:25,163 --> 00:37:27,820 これは、いわゆるです アイコンステップイン 853 00:37:27,820 --> 00:37:30,300 私はダイビングを可能にするために行きます 別の関数に。 854 00:37:30,300 --> 00:37:31,800 しかし、ちょうど一瞬でこれを見てみましょう。 855 00:37:31,800 --> 00:37:33,280 だから私は、ステップオーバー]をクリックするつもりです。 856 00:37:33,280 --> 00:37:35,820 私はクリックするとそして今、気づきます 右上のボタン、 857 00:37:35,820 --> 00:37:41,260 大体現地の下であなたの目を保ちます 変数とxに何が起こるかを参照してください。 858 00:37:41,260 --> 00:37:44,115 Xは現在1理由であります 黄色の線は、現在実行しています 859 00:37:44,115 --> 00:37:45,840 私たちは8行に移ってきました。 860 00:37:45,840 --> 00:37:49,840 そして、一瞬のY うまくいけば2になるはずです。 861 00:37:49,840 --> 00:37:52,330 >> 今、何も面白いこと ビットのために発生します。 862 00:37:52,330 --> 00:37:53,390 すべてこれはprintfのです。 863 00:37:53,390 --> 00:37:58,010 そして、私の第二の端末に、気づきます ウィンドウは、私が印刷DEFの出力を参照してください。 864 00:37:58,010 --> 00:38:01,080 そして今、私が行う必要があります プログラマーとして決定。 865 00:38:01,080 --> 00:38:04,360 私は、この行をステップオーバーすることができます コー​​ド、それを実行することではなく、 866 00:38:04,360 --> 00:38:06,220 中身を好奇心を取得。 867 00:38:06,220 --> 00:38:11,130 または私は実際にそれにステップすることができます スワップ自体の中に入ります。 868 00:38:11,130 --> 00:38:12,340 それでは、後者を行うことができます。 869 00:38:12,340 --> 00:38:15,550 >> 私が先に行くと、クリックしてみましょう ステップオーバーしかしイントゥステップません。 870 00:38:15,550 --> 00:38:17,300 お知らせ、突然のすべて ウィンドウの変更 871 00:38:17,300 --> 00:38:19,330 最初に強調表示します スワップのコードの行。 872 00:38:19,330 --> 00:38:20,710 それは21行です。 873 00:38:20,710 --> 00:38:25,220 そして今、どのような種類のファンキーなのはつまり、 あなたがこっち見てみると、予想通り 874 00:38:25,220 --> 00:38:29,720 コンマbは、それぞれ、1及び2です。 875 00:38:29,720 --> 00:38:33,840 なぜ一時32,767ですか! 876 00:38:33,840 --> 00:38:36,560 多くのと同じように、その温度を想起 一瞬前に空のカップ、 877 00:38:36,560 --> 00:38:38,980 21行目で、ここで宣言されています。 878 00:38:38,980 --> 00:38:43,390 なぜ32,000-私は意味、理由であります それだけでいくつかの奇妙な値はありますか? 879 00:38:43,390 --> 00:38:43,890 うん? 880 00:38:43,890 --> 00:38:45,190 >> 観客:それは初期化されていません。 881 00:38:45,190 --> 00:38:46,940 >> DAVID J.マラン:それは 初期化されていません。 882 00:38:46,940 --> 00:38:49,370 だから、私たちのコンピュータは常に 物理的なメモリを有します。 883 00:38:49,370 --> 00:38:50,544 それは、常に物理RAMを持っています。 884 00:38:50,544 --> 00:38:52,710 そして、ゼロのは常にあります そして、自分のそこに、右か? 885 00:38:52,710 --> 00:38:54,626 私たちはを使用しているので 一日中コンピュータ、 886 00:38:54,626 --> 00:38:57,210 あなたはCS50 IDEを使用しています またはサーバー一日中。 887 00:38:57,210 --> 00:39:01,159 だから、RAMは、いくつかのゼロを持っているのいずれか、または いくつかのいずれかのまたはいくつかの0と1。 888 00:39:01,159 --> 00:39:02,950 どんなにかどうか あなたはそれらを使用しているではありません。 889 00:39:02,950 --> 00:39:05,270 あなただけの空白持つことができません あなたはビットをしたいスペース。 890 00:39:05,270 --> 00:39:06,850 彼らは、0と1のどちらかです。 891 00:39:06,850 --> 00:39:09,610 >> だからので、その温度が判明 私たちは、まだそれを初期化していませんでした 892 00:39:09,610 --> 00:39:14,580 我々は、これらの32ビットを持っているが、彼らはいませんでした 任意の既知の値に初期化されて。 893 00:39:14,580 --> 00:39:18,110 だから、どのような彼らはほとんどなかったです 最近、これらの32 bits-- for--使用 894 00:39:18,110 --> 00:39:23,000 私たちはいくつかの成果物を見ています これらの特定の32の以前の使用 895 00:39:23,000 --> 00:39:23,500 ビット。 896 00:39:23,500 --> 00:39:27,780 すぐに私もステップオーバークリックすると、 ふぅ、一時は値1を取得する予定です。 897 00:39:27,780 --> 00:39:31,600 私は再びそれを行うなら、aは 値2を与えられることになるだろう 898 00:39:31,600 --> 00:39:33,830 して、bがしようとしています 値1が与えられます。 899 00:39:33,830 --> 00:39:36,390 >> だから何が今でうれしいです 物語の中で、この時点 900 00:39:36,390 --> 00:39:39,750 デバッガがあるということです スーパーゆっくりと、私を示します 901 00:39:39,750 --> 00:39:42,640 自分のペースで、何 スワップの状態です。 902 00:39:42,640 --> 00:39:47,490 しかし、ここで一番上に通知を気づきます その実際にコールスタック 903 00:39:47,490 --> 00:39:49,180 それには2つの層を有します。 904 00:39:49,180 --> 00:39:53,240 今のように強調表示されています1 スワップ、私が代わりにメインをクリックした場合、 905 00:39:53,240 --> 00:39:57,100 ローカル変数がどのように変化するかを気づきます 開発者は、単にホップすることができますので、 906 00:39:57,100 --> 00:39:59,740 周りと何が違うの範囲に入ります。 907 00:39:59,740 --> 00:40:04,070 だから我々はこのすべてをやっているにもかかわらず、 aとbを交換正しく仕事と、 908 00:40:04,070 --> 00:40:09,080 私はスワップの間で前後に行く場合 2であり、bが1メインであり、 909 00:40:09,080 --> 00:40:11,851 メインは全く影響を受けていますか? 910 00:40:11,851 --> 00:40:12,350 いいえ。 911 00:40:12,350 --> 00:40:13,930 だからここに持ち帰りは何ですか? 912 00:40:13,930 --> 00:40:18,200 まあ、それはいつでもことが判明 あなたは、スワップのような関数を呼び出します 913 00:40:18,200 --> 00:40:21,600 あなたは何を、それの引数を渡します あなたはスワップ関数に渡しています 914 00:40:21,600 --> 00:40:24,730 この場合、コピーであります これらの引数の。 915 00:40:24,730 --> 00:40:28,620 そのように、x及びyはそれぞれある場合 32ビット、何スワップを取得しています 916 00:40:28,620 --> 00:40:30,760 二つの新しいローカルであります 変数、または引数、 917 00:40:30,760 --> 00:40:34,380 呼ばれ、b--が、これらは任意です names--が、ゼロのパターン 918 00:40:34,380 --> 00:40:39,520 AとBの内部のものです xとyと同一であることが並ん 919 00:40:39,520 --> 00:40:42,610 しかし、そうではありません xとyと同じもの。 920 00:40:42,610 --> 00:40:46,880 >> メインは、その作品に持っているかのようです xとyの用紙番号1と2、 921 00:40:46,880 --> 00:40:49,260 そしてそれがいることを手渡すとき 一枚の紙を交換するために、 922 00:40:49,260 --> 00:40:51,970 スワップは非常に迅速に取得します 独自のペンは、書き留めます 923 00:40:51,970 --> 00:40:56,240 紙の独自のシート上に、図1及び図2 手は主に、元のxyバック 924 00:40:56,240 --> 00:40:58,790 して、独自の処理を行い AとBとの事。 925 00:40:58,790 --> 00:41:01,940 そして、これは今のための超重要です これは自明でない意味を持っています 926 00:41:01,940 --> 00:41:06,260 実際に正しいコードを書くための それは思われるので、我々は交換することはできません 927 00:41:06,260 --> 00:41:07,500 二つの変数。 928 00:41:07,500 --> 00:41:09,150 >> 私は、正しいスワップ機能を書かれています。 929 00:41:09,150 --> 00:41:12,770 私たちは、ローレンなどでそれを実装しました 実際に正しいスワップ機能、 930 00:41:12,770 --> 00:41:16,700 しかし、それのどれも明らかに 問題場合、あなたは実際にはできません 931 00:41:16,700 --> 00:41:19,530 恒久的に2つの値を交換します。 932 00:41:19,530 --> 00:41:21,970 だから我々は、別の方法が必要です 実際にこれを取得するには、 933 00:41:21,970 --> 00:41:24,472 私たちのことができるようにする必要があります 実際にこの問題を解決します。 934 00:41:24,472 --> 00:41:27,180 そして、それはout--になり、私たちは来ます バックこの特定の画像へ 935 00:41:27,180 --> 00:41:30,500 long--前に、これは一つの方法であること お使いのコンピュータのメモリを引く可能性があります。 936 00:41:30,500 --> 00:41:31,460 それはちょうど長方形です。 937 00:41:31,460 --> 00:41:32,960 あなたは、任意のそれを描くことができ いくつかの方法が、それはです 938 00:41:32,960 --> 00:41:35,740 それを描くのに便利 以下の理由長方形。 939 00:41:35,740 --> 00:41:40,040 >> 我々は超えて、今日を開始し、するつもりです いわゆるスタックの話。 940 00:41:40,040 --> 00:41:43,870 そして、スタックはちょうど塊です RAM--のmemory--のチャンク 941 00:41:43,870 --> 00:41:47,100 関数は、アクセス権を持っていること 彼らが呼ばているときに。 942 00:41:47,100 --> 00:41:49,800 そしてそれは、ことが判明 このスタックの最下部 943 00:41:49,800 --> 00:41:53,590 メインのローカル変数のすべてがどこにあります 組織Cと組織Vとすべてのものと 944 00:41:53,590 --> 00:41:56,950 デフォルトで行くつもりです。メインの場合 スワップのようないくつかの他の関数を呼び出し、 945 00:41:56,950 --> 00:42:00,330 よく、スワップが別のものを取得する予定です その上、メモリの最大の層。 946 00:42:00,330 --> 00:42:04,490 >> そして、これだけにすばやくザッを与えるために この絵、私は越える場合here-- 947 00:42:04,490 --> 00:42:09,450 そして、私はでこれをミラーリングしましょう オーバーヘッドとしては、本当に私が持っているものwell--、 948 00:42:09,450 --> 00:42:12,100 我々はについてのみ気場合 今のところ、この絵の下、 949 00:42:12,100 --> 00:42:15,070 私はプログラムを実行するときにということです メインは、呼び出されます 950 00:42:15,070 --> 00:42:18,330 主のチャンクが与えられます 自分のコンピュータ内のRAMであります 951 00:42:18,330 --> 00:42:20,060 このいわゆるスタックの一番下にあります。 952 00:42:20,060 --> 00:42:22,143 そして、私はそれを描くつもりです 意図的に正方形として。 953 00:42:22,143 --> 00:42:24,540 だから、32ビットまたは4バイトのようなものです。 954 00:42:24,540 --> 00:42:28,790 そして、この主な機能は持っている場合 1の値を持つ変数と呼ばれるX 955 00:42:28,790 --> 00:42:32,626 そして、それは変数と呼ばれています 2の値とyが、それです 956 00:42:32,626 --> 00:42:35,750 メモリのこのスライバーを取るようなこと 主な操作によって与えられています 957 00:42:35,750 --> 00:42:38,850 システムとなるように、それを分割します 最初のローカル変数は、ここに行きます 958 00:42:38,850 --> 00:42:40,930 もう一つはここにあり、それはそれです。 959 00:42:40,930 --> 00:42:45,590 >> 主スワップ、スワップを呼び出すとき メモリの独自のスライスを取得します 960 00:42:45,590 --> 00:42:48,280 私たちはこのように描くだろうと オペレーティングシステムから、 961 00:42:48,280 --> 00:42:50,820 それが持っているために起こっているの ベースの独自のローカル変数 962 00:42:50,820 --> 00:42:53,825 以前の私たちの実装について ローカル変数と 963 00:42:53,825 --> 00:42:58,010 最初はaとbその 値1と2を得ます。 964 00:42:58,010 --> 00:43:00,450 しかし、その後、できるだけ早く スワップコードは、実行します 965 00:43:00,450 --> 00:43:03,760 そして、ローレンは、実際にスワップ OJとミルク、何が起きているのでしょうか? 966 00:43:03,760 --> 00:43:09,030 さて、この2本、1になってきています 図1は、この方法で、2になってきて、とされています 967 00:43:09,030 --> 00:43:13,360 のTEMP変数が存在します その最終的にその全体の時間を使用 968 00:43:13,360 --> 00:43:14,470 離れて行きます。 969 00:43:14,470 --> 00:43:16,720 しかし、それは問題ではありません。 どのくらいの仕事あなたは 970 00:43:16,720 --> 00:43:22,160 この行は、このメモリ空間にof--で、 xとyは完全に変更されません。 971 00:43:22,160 --> 00:43:26,320 >> だから我々は与えることのいくつかの方法が必要です スワップおよびそれのような機能 972 00:43:26,320 --> 00:43:32,640 秘密のアクセス、あなたがする場合は、へ 関数は、xとyのようなメモリにlike--。 973 00:43:32,640 --> 00:43:35,110 それでは、見てみましょう 助け例 974 00:43:35,110 --> 00:43:38,220 私たちはされています正確に何を参照してください。 この全体の時間に行きます。 975 00:43:38,220 --> 00:43:40,284 私は先に行くつもりです ゼロの比較開きます。 976 00:43:40,284 --> 00:43:42,200 そして、私はクローズするつもりです 私たちのデバッガは、私が行きますよ 977 00:43:42,200 --> 00:43:44,360 この怖い探してメッセージを閉じます ちょうど数分待つ、と言います、 978 00:43:44,360 --> 00:43:45,800 あなたは真ん中のデバッグにしています。 979 00:43:45,800 --> 00:43:48,383 私はここで、このタブを非表示にするつもりです 戻ったばかりのシンプルさに戻ります。 980 00:43:48,383 --> 00:43:50,160 GDBが殺されているのであれば、心配しないでください。 981 00:43:50,160 --> 00:43:53,910 それはちょうど、プログラムがあることを意味します 意図的にこのような場合には、終了されて、 982 00:43:53,910 --> 00:43:54,820 私が。 983 00:43:54,820 --> 00:43:57,700 >> そして今、ゼロがこれを行うと比較してください。 984 00:43:57,700 --> 00:44:00,110 私はCS50を使用しています 標準I / O内のライブラリ。 985 00:44:00,110 --> 00:44:04,319 私は最初の主要な機能を持っています 何かを言う、と言うと、文字列を取得します。 986 00:44:04,319 --> 00:44:06,110 その後、再び、それを言います 別の文字列を取得します。 987 00:44:06,110 --> 00:44:09,910 そして、これら2つの文字列を気づきます それぞれ、sおよびtと呼ばれています。 988 00:44:09,910 --> 00:44:12,910 そして今、このプログラムは、比較します ゼロ、生活の中で、その目的、 989 00:44:12,910 --> 00:44:15,470 それが私に言うことになっています、 私は同じことを入力したのですか? 990 00:44:15,470 --> 00:44:16,910 そして、私は1週間に戻るつもりです。 991 00:44:16,910 --> 00:44:19,950 私は私の同等の等号演算子を使用しています これは質の高い演算子です。 992 00:44:19,950 --> 00:44:22,220 ていない代入演算子、 等価演算子。 993 00:44:22,220 --> 00:44:23,890 私はちょうどsとtを比較しています。 994 00:44:23,890 --> 00:44:27,470 >> それでは、実際に先に行くと、これを実行してみましょう。 995 00:44:27,470 --> 00:44:32,680 そして、私は先に行くつもりです ゼロを比較します。 996 00:44:32,680 --> 00:44:35,110 私は./comparezeroをするつもりです。 997 00:44:35,110 --> 00:44:37,150 そして、私は行くつもりです 先と何かを言います 998 00:44:37,150 --> 00:44:43,450 以下のような、のは、小文字でお母さんをやらせます どのように大文字でお母さんについて。 999 00:44:43,450 --> 00:44:45,034 そしてもちろん、私は別のものを入力します。 1000 00:44:45,034 --> 00:44:45,533 大丈夫。 1001 00:44:45,533 --> 00:44:46,570 それが予想されることです。 1002 00:44:46,570 --> 00:44:47,640 >> それでは、もう一度を実行してみましょう。 1003 00:44:47,640 --> 00:44:49,740 どちらの回は小文字、小文字を行います。 1004 00:44:49,740 --> 00:44:51,490 それは私にはスーパーと同一になります。 1005 00:44:51,490 --> 00:44:52,930 入力します。 1006 00:44:52,930 --> 00:44:53,430 OK。 1007 00:44:53,430 --> 00:44:55,804 多分それが原因だけで奇妙な それは私の文法を好きではないです。 1008 00:44:55,804 --> 00:44:59,930 それでは、資本MOMをさせ、 首都MOM同じ。 1009 00:44:59,930 --> 00:45:01,490 異なるもの。 1010 00:45:01,490 --> 00:45:03,907 >> では、なぜそのようになるのですか? 1011 00:45:03,907 --> 00:45:06,240 まあ、実際に何が起こっています ここボンネットの下に? 1012 00:45:06,240 --> 00:45:08,180 それでは、背中の上に行ってみよう ここでちょっと 1013 00:45:08,180 --> 00:45:10,910 そして何を考えるのGetString 実際にやっています。 1014 00:45:10,910 --> 00:45:13,385 あなたがのGetStringを呼び出すと、 それが機能私たちです 1015 00:45:13,385 --> 00:45:16,510 自分が書いた、それは何らかの形で取得します ユーザからの文字のシーケンス。 1016 00:45:16,510 --> 00:45:20,280 そして、まずは、と仮定してみましょう 私を与える私がのGetStringを呼び出す時、 1017 00:45:20,280 --> 00:45:21,930 このようになりますメモリの塊。 1018 00:45:21,930 --> 00:45:26,990 そして、私はすべて小文字で入力した場合 M-O-M--とそれの後に行きますか? 1019 00:45:26,990 --> 00:45:28,840 だけで簡単に健全性チェック。 1020 00:45:28,840 --> 00:45:29,780 >> バックスラッシュゼロ。 1021 00:45:29,780 --> 00:45:30,510 我々はそれを知っています。 1022 00:45:30,510 --> 00:45:32,784 そして、私たちが果たしていることを思い出します Zamilaの名前の周りに 1023 00:45:32,784 --> 00:45:34,950 および他の名前の束 ロブは、ここで見ていたとき 1024 00:45:34,950 --> 00:45:36,280 メモリの内部で何が起こっているかで。 1025 00:45:36,280 --> 00:45:37,780 だから、その話はまったく同じです。 1026 00:45:37,780 --> 00:45:40,160 これは何のGetStringです 私に戻っています。 1027 00:45:40,160 --> 00:45:44,780 さて、私のコードは、先ほど保存されました GetStringの戻り値 1028 00:45:44,780 --> 00:45:47,510 Sと呼ばれる変数です。 1029 00:45:47,510 --> 00:45:51,390 そして、二回目は、私はそれを呼ばれ、 それはトンという変数に格納し。 1030 00:45:51,390 --> 00:45:55,070 >> 私はこっちに行くのであれば、私が必要 このローカルvariable--を描画します 1031 00:45:55,070 --> 00:45:59,610 そして、私は一般的に行きますよ just--我々はよなどの文字列を描きます 1032 00:45:59,610 --> 00:46:02,360 ここに小さな広場としてそれを-S-呼び出します。 1033 00:46:02,360 --> 00:46:09,760 そして今、お母さんをどうしますかsomehow-- この変数sの中に入りますか? 1034 00:46:09,760 --> 00:46:12,010 まあ、我々は戻って行く必要があります ここで第一原理に。 1035 00:46:12,010 --> 00:46:15,660 GetStringは実際に何を返すのですか? 1036 00:46:15,660 --> 00:46:19,030 >> だから、M-O-Mことが判明 バックスラッシュゼロ、および任意の数 1037 00:46:19,030 --> 00:46:22,364 以下のようなメモリ内の他の文字列の Zamilaとロブやアンディまたは任意の他、 1038 00:46:22,364 --> 00:46:24,280 私たちにはもちろんです コンピュータのRAMやメモリ。 1039 00:46:24,280 --> 00:46:27,760 そして、あなたのRAMは、あなたが持っているlike--ています RAMのギグ、RAMの2ギグ、 1040 00:46:27,760 --> 00:46:30,860 または億20億バイト、 または多分それ以上のこれらの日。 1041 00:46:30,860 --> 00:46:34,070 それでは、今日の目的のために、としましょう​​、 それは我々がどのように番号を付ける問題ではないこと 1042 00:46:34,070 --> 00:46:36,640 彼らは、私たちは、それぞれに番号を付けることができます それら億20億の 1043 00:46:36,640 --> 00:46:37,880 または40億バイト。 1044 00:46:37,880 --> 00:46:42,240 >> そして、ちょうど任意のことを言わせて これは最初の一口、二一口です、 1045 00:46:42,240 --> 00:46:43,380 第三、第四。 1046 00:46:43,380 --> 00:46:46,570 私は意図的にゼロを使用していませんよ 今日我々は戻ってそれに来ます。 1047 00:46:46,570 --> 00:46:49,570 換言すれば、これは、ある場合に 初めて私は、プログラムを使用しています 1048 00:46:49,570 --> 00:46:52,715 私は幸運と最初に取得しています 一口その後、場所1〜2であります 1049 00:46:52,715 --> 00:46:53,590 その後3 4より。 1050 00:46:53,590 --> 00:46:57,430 そして、私が描く守れば、ボックス番号 20億はこちらの方法を超えるだろう。 1051 00:46:57,430 --> 00:47:02,200 >> だから、あなたは、どう思いますか、 GetStringは、実際に返しますか? 1052 00:47:02,200 --> 00:47:06,010 これは、M-O-Mのバックスラッシュを返すいません ゼロ自体明らかにその理由 1053 00:47:06,010 --> 00:47:08,180 私が描いたボックス内に収まりません。 1054 00:47:08,180 --> 00:47:11,210 だから、他に何が実際にはgetStringかもしれません これらすべての週間返すこと? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 答えはです ボードここでどこか。 1057 00:47:16,820 --> 00:47:20,390 あなたは、M-O-Mのバックスラッシュゼロに適合することはできません だから何の代わりに意味をなすのでしょうか? 1058 00:47:20,390 --> 00:47:23,424 あなたが入れて、スーパー賢いなければならなかった場合 いわゆるエンジニアリングの帽子に、 1059 00:47:23,424 --> 00:47:24,340 あなたは何を返すことができますか? 1060 00:47:24,340 --> 00:47:27,340 情報の最小量は何ですか あなたはまだでしょうそれを返すことができます 1061 00:47:27,340 --> 00:47:30,610 あなたがメモリ内のM-O-Mを見つけるみましょうか? 1062 00:47:30,610 --> 00:47:31,270 うん? 1063 00:47:31,270 --> 00:47:31,950 >> 聴衆:One。 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J.マラン:One。 1065 00:47:32,200 --> 00:47:33,021 そして、なぜ1? 1066 00:47:33,021 --> 00:47:35,520 観客:それは言うだろうので あなたはここで、[聞こえない]行きます。 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J.マラン:その通り。 1069 00:47:39,390 --> 00:47:44,300 私はアドレスを返すつもりです 私が得ている文字列の。 1070 00:47:44,300 --> 00:47:46,570 この中のアドレス 場合は、場所です。 1071 00:47:46,570 --> 00:47:51,280 だから何が本当に-S-に格納されています そして、すべての文字列変数こうしてfar-- 1072 00:47:51,280 --> 00:47:53,430 ちょうどされています その文字列のアドレス。 1073 00:47:53,430 --> 00:47:57,840 >> 一方、私が呼び出した場合 2回目のIのgetString 1074 00:47:57,840 --> 00:48:03,300 文字通り同じthing--を入力 lowercase-- M-O-MとM-O-M 1075 00:48:03,300 --> 00:48:06,200 別のバックスラッシュゼロ、 そして今、多分私のプログラムの 1076 00:48:06,200 --> 00:48:09,820 ので、多分このいくつかの時間のために実行されて 10であり、これは、これは12であり、位置11であります 1077 00:48:09,820 --> 00:48:10,700 これは13です。 1078 00:48:10,700 --> 00:48:13,590 いくつかの他のを使用しているコンピュータ 何らかの理由でメモリ。 1079 00:48:13,590 --> 00:48:18,172 何今、私の第二に行きます 私のプログラムのトンで変数? 1080 00:48:18,172 --> 00:48:19,390 10。 1081 00:48:19,390 --> 00:48:20,050 その通りです。 1082 00:48:20,050 --> 00:48:23,910 >> そして、私たちが見たときに このプログラムのソースコード 1083 00:48:23,910 --> 00:48:26,550 私は単純にしようとしているところ 2つの値を比較するために、 1084 00:48:26,550 --> 00:48:32,180 何、Tに等しい等しくよさ 明らかな人間の答え? 1085 00:48:32,180 --> 00:48:34,890 わずか1が等しく10しないため。 1086 00:48:34,890 --> 00:48:36,861 それで、本明細書にあり 私たちのための機会は本当に 1087 00:48:36,861 --> 00:48:39,610 ただ、最初、再び、に戻ります 原則とよく、考えます、 1088 00:48:39,610 --> 00:48:41,110 何がボンネットの下に起こっているの? 1089 00:48:41,110 --> 00:48:43,240 私たちは話してきました ビットとバイト、メモリ、 1090 00:48:43,240 --> 00:48:46,820 それは理解することは実際に便利です あなたがのGetStringを呼び出すときのため、 1091 00:48:46,820 --> 00:48:50,280 私たちはそれを考えるにもかかわらずです M-O-Mまたは文字列のママを返します 1092 00:48:50,280 --> 00:48:53,120 アンディまたはZamilaまたはまたは 以下のように、技術的に 1093 00:48:53,120 --> 00:48:55,510 それだけでアドレスを返すです メモリのチャンクの。 1094 00:48:55,510 --> 00:48:56,910 >> しかし、それは大丈夫です。 1095 00:48:56,910 --> 00:49:00,570 私はどのように知っていますので、を 文字列が終わるところ? 1096 00:49:00,570 --> 00:49:03,840 私はほんの始まりを与えられている場合は? 1097 00:49:03,840 --> 00:49:05,380 まあ、バックスラッシュゼロ、右? 1098 00:49:05,380 --> 00:49:08,800 ちょうど私ができる線形時間で 印刷デフM-O-Mでプリントアウト。 1099 00:49:08,800 --> 00:49:11,820 そして、すぐに、私はバックスラッシュを見るように ゼロ私が始めた場所、私は気にしないでください、 1100 00:49:11,820 --> 00:49:14,950 私はすでに暗黙のうちに知っています どこで終了する必要があります。 1101 00:49:14,950 --> 00:49:18,700 >> だから今日はbeginning--をマークし、 私は劇的に我々ので、これをやらせます 1102 00:49:18,700 --> 00:49:21,800 に多くの問題を経験しました これらのここwheels--訓練を受けます 1103 00:49:21,800 --> 00:49:29,840 ので、今日の訓練の車輪が開始します オフに来て、私達はで明らかにしleast-- 1104 00:49:29,840 --> 00:49:31,373 >> [拍手] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> それが旅行の価値がありました はい、今朝ターゲットに? 1107 00:49:36,160 --> 00:49:39,600 だからnow--があり、それはターン うち、文字列としてはそのようなもの。 1108 00:49:39,600 --> 00:49:41,140 文字列は存在しません。 1109 00:49:41,140 --> 00:49:43,760 それは我々が持っていた同義語です CS50ライブラリの内部。 1110 00:49:43,760 --> 00:49:48,660 今後、私たちは、呼び出しを開始するつもりです sとtではない文字列が、char型の星。 1111 00:49:48,660 --> 00:49:51,180 char型の星そして、我々はよ やがて離れていじめます。 1112 00:49:51,180 --> 00:49:53,510 しかし、これは言うことです、 我々は継続しても、その 1113 00:49:53,510 --> 00:49:56,180 今のところのGetStringを使用して、 技術的には私がすべき 1114 00:49:56,180 --> 00:49:59,010 char型のスターとチャースターを言って。 1115 00:49:59,010 --> 00:50:01,720 >> そして、それは何のこと星が判明 示すために起こっていることは何かであります 1116 00:50:01,720 --> 00:50:04,340 ポインタまたはアドレスと呼ばれます。 1117 00:50:04,340 --> 00:50:06,110 そして実際に、ティーザー 先にあるもののために 1118 00:50:06,110 --> 00:50:09,760 この20秒のクリップである私たちの スタンフォード大学の友人ニックParlante 1119 00:50:09,760 --> 00:50:12,927 人は、かなりの時間前に、過ごします 時間のとんでもない量、 1120 00:50:12,927 --> 00:50:15,010 最高のように私は彼に伝えることができます キッチンや彼の地下室、 1121 00:50:15,010 --> 00:50:17,140 クレイメーションを作ります 世界に紹介 1122 00:50:17,140 --> 00:50:20,010 名前の文字 我々は意志でBinky 1123 00:50:20,010 --> 00:50:22,010 ポインタの隣に時間を導入します。 1124 00:50:22,010 --> 00:50:24,588 だから、ここに来て何のプレビューです。 1125 00:50:24,588 --> 00:50:26,370 >> [ビデオ再生] 1126 00:50:26,370 --> 00:50:27,510 >> -Hey、Binky。 1127 00:50:27,510 --> 00:50:28,260 目を覚ます。 1128 00:50:28,260 --> 00:50:30,672 これは、ポインタの楽しみのための時間です。 1129 00:50:30,672 --> 00:50:31,616 >> -あれは何でしょう? 1130 00:50:31,616 --> 00:50:33,032 ポインタについては、こちらをご覧ください! 1131 00:50:33,032 --> 00:50:34,450 ああ、グッディ。 1132 00:50:34,450 --> 00:50:35,431 >> [END再生] 1133 00:50:35,431 --> 00:50:38,055 DAVID J.マラン:そして、そのノートに、 我々は水曜日にあなたが表示されます。 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 大丈夫。 1136 00:50:48,090 --> 00:50:48,740 ダンスは誰ですか? 1137 00:50:48,740 --> 00:50:49,240 いい加減にして。 1138 00:50:49,240 --> 00:50:50,330 ダンスは誰ですか? 1139 00:50:50,330 --> 00:50:51,820 あなたは私がそれを始めたいですか? 1140 00:50:51,820 --> 00:50:53,770 私はそれを始めるでしょう。 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> ローレン:甘い空想モーセ。