1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [第2週、続く] 2 00:00:02,270 --> 00:00:04,220 [デビッド·J·マラン、ハーバード大学] 3 00:00:04,220 --> 00:00:06,880 [これはCS50です。 - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 かしこまりました。これはCS50であり、これは2週目の終わりです。 5 00:00:10,990 --> 00:00:14,410 あなたは明日、この頃空腹であることが予想される場合は、 6 00:00:14,410 --> 00:00:18,620 私たちは小さなグループ明日、木曜日、午後1時15分のように招集するつもりだと知っている。 7 00:00:18,620 --> 00:00:21,360 あなたはRSVPしたい場合は、このURLはここにあります。 8 00:00:21,360 --> 00:00:26,740 スペースが限られているので、フォームはあなたがこれを埋める時間でいっぱいになった場合はご容赦下さい。 9 00:00:26,740 --> 00:00:29,300 興味があるかもしれない別のURL、しかしは、これです。 10 00:00:29,300 --> 00:00:32,369 ちょうど月の時間について、このコースは利用できるようにしようとしている 11 00:00:32,369 --> 00:00:36,890 すべてのより広くEDXを経由して、それを介してインターネット上の人々が、一緒に従うことができるようになります 12 00:00:36,890 --> 00:00:39,380 実際には、かなり積極的にコースに従事。 13 00:00:39,380 --> 00:00:42,270 彼らは議論CS50 ApplianceおよびCS50を使用することがあります 14 00:00:42,270 --> 00:00:45,490 そして、我々はすでに、この学期を使用してきた様々なソフトウェア·ツールのほとんど。 15 00:00:45,490 --> 00:00:48,710 そして、我々は今年の実験としてで取りたいと思い取り組みの一つ 16 00:00:48,710 --> 00:00:51,930 我々が翻訳することができますどれだけのコンテンツを確認することです 17 00:00:51,930 --> 00:00:53,960 他の話し言葉と書き言葉の言語へ。 18 00:00:53,960 --> 00:00:57,500 このプロジェクトに参加することに関心を持っているかもしれないので、もし 19 00:00:57,500 --> 00:01:02,270 それによって我々はコースの講義のための英語成績証明書や字幕を提供します 20 00:01:02,270 --> 00:01:05,450 そしてパンツとセミナーやセクションなど、 21 00:01:05,450 --> 00:01:08,200 あなたは流暢に話したり流暢にいくつかの他の言語を記述する場合、 22 00:01:08,200 --> 00:01:12,290 あなたがビデオの1つ以上に取ることによって、我々は、このプロジェクトであなたを従事するのが大好きだ 23 00:01:12,290 --> 00:01:15,200 あなたは非常によく知っている言語に翻訳する。 24 00:01:15,200 --> 00:01:18,700 >> あなたのインターフェイスの感覚を与えるために、このWebベースのユーザー·インターフェースはあり 25 00:01:18,700 --> 00:01:22,090 我々は、本質的にこ​​のようなUIを作成することを使用することがありますことを。 26 00:01:22,090 --> 00:01:24,290 これは、いくつかのハロウィーンの前に私を教えていた、 27 00:01:24,290 --> 00:01:27,390 そしてこれらのタイムスタンプの隣にある黒いであり右側に、 28 00:01:27,390 --> 00:01:31,210 あなたは、あの日、私の口から出てきた様々なものが表示されます 29 00:01:31,210 --> 00:01:34,850 その下位には、いくつかの他の言語に翻訳することができるでしょう 30 00:01:34,850 --> 00:01:38,690 マッピングは、この場合には、間にあるかを正確に、英語とは、スペイン語を言う。 31 00:01:38,690 --> 00:01:40,440 だから、実際には非常にユーザーフレンドリーなツールです。 32 00:01:40,440 --> 00:01:43,370 キーボードショートカットで非常に容易に巻き戻しと早送りができます。 33 00:01:43,370 --> 00:01:47,490 あなたがこの実験に参加し、持っていると思いますので、もしあなたの言葉がわかると読み 34 00:01:47,490 --> 00:01:51,850 そこに人々の潜在的に数千人が参加すること自由に感じれば。 35 00:01:51,850 --> 00:01:54,350 月曜日から子猫について一言。 36 00:01:54,350 --> 00:02:00,350 我々は過度に怖いメッセージを送信したといけないので、営業時間が示唆するように、あることを実現するか 37 00:02:00,350 --> 00:02:03,300 セクションが示唆するように、そしてもちろんデザインは非常によく似ている 38 00:02:03,300 --> 00:02:07,360 学生が協力して、問題のセットを介して動作するように話を持っている 39 00:02:07,360 --> 00:02:11,260 と一緒に問題があり、実際にラインがちょうど、に尽きる 40 00:02:11,260 --> 00:02:16,010 再び、あなたは最終的に提出する仕事が自分であるべきである。 41 00:02:16,010 --> 00:02:18,860 そしてそうはっきり言って、営業時間にそれは完全に正常で、 42 00:02:18,860 --> 00:02:22,240 それは完全にあなたの隣にいくつかの友人とチャットすることも、予想されるためだ。 43 00:02:22,240 --> 00:02:24,370 >> 彼または彼女はいくつかのトピックに苦労している、あなたが同じなら、 44 00:02:24,370 --> 00:02:27,940 "ああ、まあ、私はあなたに私が書いたコードのいくつかの行のを垣間見ることができるように、"それは、いいのよ 45 00:02:27,940 --> 00:02:31,250 それが起こると、その学習の過程で、私が思うに、非常に多くの助けとなるのです。 46 00:02:31,250 --> 00:02:36,750 ヘッドはソートのあまりに多く秒間こっち傾いているときに、その行は交差されるところ 47 00:02:36,750 --> 00:02:41,160 本当にちょうどあなたの友人のためのブロックを解除する機会があったために、そのためには分 48 00:02:41,160 --> 00:02:44,160 そして確かに物事は電子メールやDropbox等を介して交換されるとき、 49 00:02:44,160 --> 00:02:45,640 すぎる行があります。 50 00:02:45,640 --> 00:02:48,620 だから、すべての手段で快適に感じる、お友達とのおしゃべりを促したい 51 00:02:48,620 --> 00:02:52,810 とpsetとよりちょうど約同級生はあなたが最終的に何を提出することを認識 52 00:02:52,810 --> 00:02:57,340 本当にあなたの創造ではなく、他の誰かの製品でなければなりません。 53 00:02:57,340 --> 00:03:00,490 pset2ためのドメイン固有の問題となる1、 54 00:03:00,490 --> 00:03:04,740 これは、暗号技術の世界に飛び込むことで、明日の夜遅く出てくるだろう 55 00:03:04,740 --> 00:03:08,970 これは、情報を暗号化またはスクランブルする技術である 56 00:03:08,970 --> 00:03:12,600 これは究極的にはセキュリティの世界にも関する。 57 00:03:12,600 --> 00:03:16,560 さて、私達のほとんどのためのセキュリティは、かなりありふれたメカニズムの形式で提供されます。 58 00:03:16,560 --> 00:03:19,050 私たちのすべては、ユーザー名とパスワードを持っている 59 00:03:19,050 --> 00:03:23,450 と私たちのすべては、最も可能性の高い、非常に悪いユーザー名とパスワードを持っています。 60 00:03:23,450 --> 00:03:28,240 >> あなたのパスワードは複数のウェブサイト上で同じである場合、それは、おそらく最高のアイデアではありません 61 00:03:28,240 --> 00:03:30,070 私たちは、学期の終わりに向かって説明しますように。 62 00:03:30,070 --> 00:03:34,720 冗談 - - モニター上で、パスワードが付箋紙に書かれている場合 63 00:03:34,720 --> 00:03:38,350 それはあまりにも必ずしも最良のデザインが、かなり一般的な現象ではない。 64 00:03:38,350 --> 00:03:42,470 そして、あなたがあなたのパスワードを暗号化する暗号化方式を使用していないのであれば、 65 00:03:42,470 --> 00:03:44,210 彼らは特に脆弱です。 66 00:03:44,210 --> 00:03:47,270 あなたは隠されたWord文書を持っていることによって巧妙なスーパーであるしていると思うので、もし 67 00:03:47,270 --> 00:03:49,910 どこかにあなたのパスワードのすべてを持って、ハードドライブ上の 68 00:03:49,910 --> 00:03:53,670 それはあまりにも非常にセキュアなメカニズムではないつまり、誰に見に行くんだというフォルダにあります。 69 00:03:53,670 --> 00:03:56,990 それで何pset2がご紹介しますと、暗号化のこの芸術です 70 00:03:56,990 --> 00:04:02,010 パスワードのようなものはすべて、より安全になるように、情報をスクランブル。 71 00:04:02,010 --> 00:04:05,790 ここでコンテキストがその安全でないデータを持つ 72 00:04:05,790 --> 00:04:07,930 それを暗号化する機会が来て、それをスクランブルする。 73 00:04:07,930 --> 00:04:11,470 それでこれは、例えば、暗号化されたメッセージの例です。 74 00:04:11,470 --> 00:04:14,700 これは、実際に英語で何かを言うが、それははっきりと完全に明確ではありません。 75 00:04:14,700 --> 00:04:18,279 そして、我々はここに、この秘密のメッセージとは何かを離れていじめるために今日完全な円を来ます。 76 00:04:18,279 --> 00:04:23,490 彼らは英語のフレーズかもしれないようですが、コンピュータの現実の世界では、物事はさえ見ていません。 77 00:04:23,490 --> 00:04:28,430 例えば、これは、標準のLinuxやMacやUNIXコンピュータ上で見つけるかもしれないものである 78 00:04:28,430 --> 00:04:32,070 パスワード·ファイルと呼ばれる昔々あったファイルに記録します。 79 00:04:32,070 --> 00:04:34,200 >> 今日では、他の場所に移動した。 80 00:04:34,200 --> 00:04:39,210 あなたは、システム上の適切な場所で見てみると、あなただけではなく、あなたのユーザー名が表示されます 81 00:04:39,210 --> 00:04:43,400 またはシステム上の他の人のものですが、あなたはそれらのパスワードの暗号化バージョンが表示されます。 82 00:04:43,400 --> 00:04:47,980 確かに、そこにワードcryptは、以下のものが暗号化されていることを示唆している 83 00:04:47,980 --> 00:04:52,680 そしてこの一見ランダムな文字と文字と数字のシリーズなど 84 00:04:52,680 --> 00:04:56,480 一般的にはいくつかの秘密を知ることによってのみ復号することができます - 85 00:04:56,480 --> 00:04:58,840 シークレットワード、暗証番号 - 86 00:04:58,840 --> 00:05:03,160 ので確かに、暗号化の技術は、最終的に帰着するいくつかの並べ替えの信頼に 87 00:05:03,160 --> 00:05:05,650 そして、他の誰かがいない何かを知っている。 88 00:05:05,650 --> 00:05:10,090 だから我々は今日、もう少し詳細にこれを見ていきますとPSETに来て。 89 00:05:10,090 --> 00:05:12,200 そして今、合格/不合格の単語。 90 00:05:12,200 --> 00:05:15,360 あなた方のうちの何人かはPSET1、家庭用品、飛び込んだき、特にとして 91 00:05:15,360 --> 00:05:19,080 あなた自身のための、非常に新しい世界、そのフラストレーションと混乱を実現 92 00:05:19,080 --> 00:05:21,700 とだけ技術的な問題は非常に予想される、 93 00:05:21,700 --> 00:05:24,180 特にちょうどそんなに新しいあり第一PSETと、 94 00:05:24,180 --> 00:05:27,730 ちょうどlsとcdに慣れ親しむことと、これらのすべての難解なコマンド 95 00:05:27,730 --> 00:05:33,050 新しい環境、そしてその実際の素材とは別に、自身のプログラミングです。 96 00:05:33,050 --> 00:05:36,940 だから支持構造として存在し、オフィスの営業時間は、確かに存在することにも気付く。 97 00:05:36,940 --> 00:05:38,880 >> のセクションでは、今度の日曜日から始まります。 98 00:05:38,880 --> 00:05:42,960 しかし、最も重要なのは、これがあなたのための世界ではないというだけのこと感じている場合、 99 00:05:42,960 --> 00:05:44,710 それは本当にちょうど時間がかかりますことを実現します。 100 00:05:44,710 --> 00:05:48,600 そしてそれは、クラスパスを取って/失敗の私にとっては数年前にこの機会を与えなかった 101 00:05:48,600 --> 00:05:50,990 正直なところ、私も教室に足を踏み入れてもみなかった。 102 00:05:50,990 --> 00:05:53,690 そして、あなたは、もちろん第五月曜日、言うまで、このアップを変更することができます 103 00:05:53,690 --> 00:05:58,280 あなたが今エッジにしているそうだとすれば、完全に実現することはなく、頭いくつかの他の海域​​に、 104 00:05:58,280 --> 00:06:01,260 確かにちょうど合格/失敗し変更することを検討してください。 105 00:06:01,260 --> 00:06:04,570 繰り返しになりますが、物事を取ることをハーバード大学でここは本当にこの国の文化なさそうだ合格/不合格 106 00:06:04,570 --> 00:06:08,670 誰もが本当に実現するか、〜以上の成績を収める読んでもらいたいので、 107 00:06:08,670 --> 00:06:11,130 しかし率直に言って、これは何かを試すの素晴らしい方法です 108 00:06:11,130 --> 00:06:16,720 、、非常に細かいことはあなたに慣れていない場合があります、あなたは、ほとんどの場合、やって終わるだろう 109 00:06:16,720 --> 00:06:18,210 多分ずっとあなたの驚きに。 110 00:06:18,210 --> 00:06:20,980 そして、より具体的に、私はありません一般的に合格/不合格かと思う 111 00:06:20,980 --> 00:06:22,940 あなたはPSET0で経験したかもしれない、特にとして、 112 00:06:22,940 --> 00:06:26,560 あなたには、いくつかのpsetに10時間、15時間、25時間以内に置けば 113 00:06:26,560 --> 00:06:29,920 とするだけで壁に頭を強打していて、それが夜遅くなってきたスーパー 114 00:06:29,920 --> 00:06:33,950 しかし、あなたは道のpset 90%を撮影したとするだけで、一つのことを把握することはできません 115 00:06:33,950 --> 00:06:36,520 合格/不合格本当に、このようなクラスの端を脱ぐ 116 00:06:36,520 --> 00:06:39,100 あなたは喜んで、さて、私はそれは完璧ではないと知っている "と言うのを並べ替えることができますどこに 117 00:06:39,100 --> 00:06:42,350 しかし、私はこの上に私のお尻をオフに働いて、私は "それは終わった場所にはかなり満足している 118 00:06:42,350 --> 00:06:44,850 それは合格/不合格の期待に応えていきます。 119 00:06:44,850 --> 00:06:47,540 だから、このことを念頭に置いておくん。かしこまりました。 120 00:06:47,540 --> 00:06:50,520 >> ハーバード大学のWi-Fiを使用するには苦労しているあなたの人々ですから、 121 00:06:50,520 --> 00:06:54,780 周りに浮かんで、CS50のSSID、Wi-Fi接続があることを知っている 122 00:06:54,780 --> 00:06:56,490 あなたのためのより良い運を持っているかもしれない。 123 00:06:56,490 --> 00:07:00,130 それは少し皮肉だあなたはこれに接続して試してみたい場合には、このためのパスワード、 124 00:07:00,130 --> 00:07:08,350 そしてそれは良いのない場合はお知らせ - - より良い速度のために、最大8つのすべての方法12345 125 00:07:08,350 --> 00:07:10,910 8は5よりも安全であるためです。 126 00:07:10,910 --> 00:07:16,910 だから、Wi-Fiパスワード、ワイヤレスでここCS50に接続する場合は、12345678を、必要がある場合 127 00:07:16,910 --> 00:07:20,380 そして、あなたはまだ断続的な接続性の問題がある場合、議論CS50に投稿 128 00:07:20,380 --> 00:07:25,420 そして、私たちはこの空間のために知っていることの力をもらおう。かしこまりました。 129 00:07:25,420 --> 00:07:32,230 特に、すべての物事のアップルのファンの男の子または女の子であるあなたの人々のために非常に速く、無理難題。 130 00:07:32,230 --> 00:07:37,460 私は数年前から掘って、、ここにiUnlock.cこのファイルでした 131 00:07:37,460 --> 00:07:39,930 だけの種類のより具体的な、より複雑なことに 132 00:07:39,930 --> 00:07:42,560 私たちが書いてきた、より基本的なC言語のプログラムの一部。 133 00:07:42,560 --> 00:07:46,910 だから私はiUnlock.c、このファイルを開いた。それは今日の講義のページで利用可能なのです。 134 00:07:46,910 --> 00:07:49,810 左側には、機能の長いリストを参照してください。 135 00:07:49,810 --> 00:07:53,230 だから、これを書いた奴はメインよりも多くの機能を、書いています。 136 00:07:53,230 --> 00:07:57,340 彼はここにライブラリの全体の束を使用しており、我々はスクロールを開始した場合、 137 00:07:57,340 --> 00:08:04,890 何これは実際にあると、元のiPhoneのための非常に最初、私は信じて、亀裂があります。 138 00:08:04,890 --> 00:08:09,830 >> あなたは、AT&Tから〜のいましめを解くことを意味し、オリジナルのiPhoneを脱獄したいとき 139 00:08:09,830 --> 00:08:13,710 そして実際に、その上に特別なソフトウェアをインストールし、Appleは人々が何を望んでいないということを行う 140 00:08:13,710 --> 00:08:18,480 誰かは、彼らがソフトウェアの欠陥を悪用する可能性があります正確にどのように把握するために時間がかかった 141 00:08:18,480 --> 00:08:22,690 したがって、アップルソフトウェアのミス、バグ、およびが生まれたiUnlock.c- - 142 00:08:22,690 --> 00:08:26,760 そのあなたのコンピュータ上でそれをコンパイルし、iPhoneにそれをインストールした場合 143 00:08:26,760 --> 00:08:29,430 それは、USBケーブル、言う、を介してコンピュータに接続されていた 144 00:08:29,430 --> 00:08:32,450 これはあなたのiPhone上で管理者権限またはroot権限を与えるだろう 145 00:08:32,450 --> 00:08:34,620 とあなたはかなりあなたがやりたいことができます。 146 00:08:34,620 --> 00:08:36,400 それで、この魅力的な猫とネズミのゲームがありまして 147 00:08:36,400 --> 00:08:39,340 アップル、多くの企業のように、彼らのような特定の世界の他の部分との間に、 148 00:08:39,340 --> 00:08:43,350 あなただけの彼らが意図したものそれを行うことができるように自分の作品をロックダウンしてみてください。 149 00:08:43,350 --> 00:08:47,360 しかし、このような人々と低レベルの詳細の理解のおかげで - 150 00:08:47,360 --> 00:08:50,830 この場合のCプログラミング - とおなじみのコンストラクトの多く 151 00:08:50,830 --> 00:08:55,280 私達は一緒に遊んで始めたことを、あなたは本当にハードウェアを活用することができます 152 00:08:55,280 --> 00:08:59,250 の方法では、フィット感と、いくつかの企業体である必要はありませんを参照してください。 153 00:08:59,250 --> 00:09:01,600 だから例えば、私は、このすべてが何をしているのか見当がつかない 154 00:09:01,600 --> 00:09:03,580 しかしバージョンの取得は、かなり簡単なように見えます 155 00:09:03,580 --> 00:09:05,710 そして、それは次のようになり、この人が書いた関数である。 156 00:09:05,710 --> 00:09:09,250 これは、引数として整数のいくつかの種類を取り、何も返しません 157 00:09:09,250 --> 00:09:13,710 条件ブレークしかし、もし、ここでループやif条件のためにループに表示されます 158 00:09:13,710 --> 00:09:16,770 我々は下にスクロールしている場合や何らかの形で、バージョン番号に関し、 159 00:09:16,770 --> 00:09:19,650 これらのキーワードの多くは、新しいことを行っているにもかかわらず。 160 00:09:19,650 --> 00:09:22,590 そして、我々は見たことがないし、これまで表示されないことがあり、ここでの関数の全体の多くはあり 161 00:09:22,590 --> 00:09:24,350 学期の経過。 162 00:09:24,350 --> 00:09:29,160 >> 一日の終わりに、それは我々がこれまで一緒に遊んできたのと同じルールとロジックに従っています。 163 00:09:29,160 --> 00:09:34,340 だから、これは、あなたのiPhone 3sまたは4sのか、まもなく5Sこれらの日をクラックするにはあまりにも古いです 164 00:09:34,340 --> 00:09:38,830 しかし、それはすべての非常に我々が飛び込んだきたこの世界から派生していることを知っています。 165 00:09:38,830 --> 00:09:42,280 のは、もう少し簡単な例を見てみましょう: 166 00:09:42,280 --> 00:09:46,260 この1は、単にいくつかの構文を使用して暖め始めるために、また、いくつかの他のデータ型 167 00:09:46,260 --> 00:09:48,910 私たちは話をしましたが、実際にC言語で見たことがない 168 00:09:48,910 --> 00:09:53,670 これはpositive1.cと呼ばれるファイルであり、先頭のコメントにつき、 169 00:09:53,670 --> 00:09:56,070 これは単に、ユーザーが正の数を提供することが求​​められています。 170 00:09:56,070 --> 00:09:59,910 そのため、ユーザ対話型プログラムのための素晴らしいです、do-whil​​eループの例です 171 00:09:59,910 --> 00:10:02,070 あなたが何かをするようにユーザに指示する必要がどこに、 172 00:10:02,070 --> 00:10:05,530 そして、彼らはあなたがそれらで叫ぶまたはそれらの入力を拒否する協力しない場合。 173 00:10:05,530 --> 00:10:10,480 ポイントのケース:私は24行目まで19をするつもりです 174 00:10:10,480 --> 00:10:14,620 限り、ユーザーは私に正の数を与えていない。 175 00:10:14,620 --> 00:10:21,340 18行目でここにこの詳細は、なぜ私はこの全体のループ構造の上にnを宣言した 176 00:10:21,340 --> 00:10:26,870 としては、私が実際にnを取得する気に22行の横にある右に反対?うん。 177 00:10:26,870 --> 00:10:29,330 [学生]スコープ。 >>うん、スコープのようにこの問題を解決しました。 178 00:10:29,330 --> 00:10:31,770 と普通の言葉に、範囲はに何を指しているのでしょう? 179 00:10:34,880 --> 00:10:41,560 うん。 >> [聞こえない学生の応答] >>あなたは大声で少し話すことはできますか? 180 00:10:41,560 --> 00:10:45,440 あなたは、その変数にアクセスすることができます[学生]。 >>パーフェクト。 181 00:10:45,440 --> 00:10:47,610 どこで特定の変数にアクセスすることができます。 182 00:10:47,610 --> 00:10:50,990 そして一般的には、親指のルールは、これまでされていることをいくつかの変数のスコープ 183 00:10:50,990 --> 00:10:56,140 あなたが見てきた最新の中括弧で定義されています。 184 00:10:56,140 --> 00:11:03,070 >> 私は22行目のnを宣言のミスを犯した場合、したがって、この場合には、そのラインが働くだろう。 185 00:11:03,070 --> 00:11:10,840 、私はint型になるだろう、と私は、22行目でその変数nに入れたい 186 00:11:10,840 --> 00:11:17,060 しかし、コードのどの行には、今私が何について話しているか見当がつかないでしょうか? >> [学生] 25。 187 00:11:17,060 --> 00:11:23,840 [マラン] 25、この場合、それは中括弧の外側にあるので、それは同様に24が判明した。 188 00:11:23,840 --> 00:11:28,550 迷惑のだから少しだけが、非常に簡単に、単純に変数を宣言することで解決 189 00:11:28,550 --> 00:11:30,700 関数自体の外。 190 00:11:30,700 --> 00:11:32,760 我々は、あなたが一歩先を行くことができます今日は後ほど説明します 191 00:11:32,760 --> 00:11:34,940 あなたも少し怠け癖がつく可能性があります。 192 00:11:34,940 --> 00:11:39,660 そして、これは一般には推奨されるべきではないですが、あなたも、怠け癖がつく可能性があり 193 00:11:39,660 --> 00:11:44,150 そして、ループの内側に、関数の内部ではなく、話すことではない、グローバル変数を置き 194 00:11:44,150 --> 00:11:49,800 私は15行目でここに行ったようですが、ファイル自体に、すべての関数の外には、書いてきた。 195 00:11:49,800 --> 00:11:55,220 これは、一般に、ひんしゅくを買うが、これは時々他の問題への解決策であると認識されている 196 00:11:55,220 --> 00:11:56,910 として我々は最終的に表示されます。 197 00:11:56,910 --> 00:11:59,500 だから今のところ、我々はこのようにそれを残しておきますが、私たちはこれを書き換えることができるかどうかを確認してみましょう 198 00:11:59,500 --> 00:12:02,360 ほんの少し違った自分を表現し始めます。 199 00:12:02,360 --> 00:12:05,550 このプログラムは、単に明確にするために、positive1です。 200 00:12:05,550 --> 00:12:11,980 私はここで先に行くと、私の端末ウィンドウで入力し、positive1を作ってみましょう。 201 00:12:11,980 --> 00:12:15,080 大丈夫コンパイルされます。私は、Enterを押して、positive1を実行するつもりです。 202 00:12:15,080 --> 00:12:19,250 私はあなたが私達に正の整数を与えることを求めています。私は-1と言うでしょう。それは動作しませんでした。 203 00:12:19,250 --> 00:12:22,340 0、99。それが動作するように思われる。 204 00:12:22,340 --> 00:12:25,310 多分ない最も厳格なテストが、少なくともそれは素敵なサニティチェックだ 205 00:12:25,310 --> 00:12:27,100 我々は正しい軌道に乗っていることを確認します。 206 00:12:27,100 --> 00:12:29,570 >> だから今、私が先に行くと、これのバージョン2を開いてみましょう 207 00:12:29,570 --> 00:12:32,800 そして既に何が違うのですか? 208 00:12:32,800 --> 00:12:39,030 それは同じことを実装していますが、何が明らかに異なる今回のように外に飛び出すのか? 209 00:12:40,790 --> 00:12:47,090 緑の中で、このブール値。それは緑、データ型であるブール値、として知られているこのキーワードで強調表示されます。 210 00:12:47,090 --> 00:12:50,510 これは、Cのすべてのバージョンに組み込まれて来ていない 211 00:12:50,510 --> 00:12:52,650 あなたは、特定のライブラリをインクルードする必要があります。 212 00:12:52,650 --> 00:12:56,460 我々のケースでは、私たちはboolへのアクセスを持っているので、CS50ライブラリが含まれていた。 213 00:12:56,460 --> 00:12:59,860 しかし、18行目では、我々はここに感謝と呼ばれるブール値を持っているように思われる。 214 00:12:59,860 --> 00:13:02,190 私はこの何かを求めているかもしれませんが、私はそれは感謝と呼ばれる 215 00:13:02,190 --> 00:13:04,750 ちょうどいくつかの意味を伝えるの種類に。 216 00:13:04,750 --> 00:13:07,700 だから最初は18行目で、私は明らかに感謝してないんだけど 217 00:13:07,700 --> 00:13:12,230 感謝してブール値は18行目でfalseに初期化されているので。 218 00:13:12,230 --> 00:13:16,500 そしてそれは私が23を介して、ライン21にここで何をやったかと思われる 219 00:13:16,500 --> 00:13:19,200 私はちょうど一種の私のロジックを書き換えてきたさ。 220 00:13:19,200 --> 00:13:26,100 ない機能的に異なるので、int型は、ユーザーが提供した場合ですが、22行目で、今私はチェック 221 00:13:26,100 --> 00:13:31,360 0より大きい場合は、私は単純にtrueに感謝の値を変更します。 222 00:13:31,360 --> 00:13:35,590 そして、私がなぜそれを行うのですか? 25行目にあるので、明らかに私は条件をチェックするつもりです。 223 00:13:35,590 --> 00:13:39,760 感謝がfalseのときにこのループを行う。 224 00:13:39,760 --> 00:13:42,960 だから私は、バージョン1の代替としてこれを提案した 225 00:13:42,960 --> 00:13:47,050 それはおそらく、少なくとももう少し直感的なので、それはもう少し英語で接地だ。 226 00:13:47,050 --> 00:13:51,980 感謝がfalseのときに感謝じゃないか、そうしながら次の手順を実行します。 227 00:13:51,980 --> 00:13:56,220 そして、この時間はあまりにも私は明らかに、ユーザーが入力した内容を覚えて気にしない 228 00:13:56,220 --> 00:14:00,050 予告ので、そこには変数nので、実際には、小さな白い嘘はありません。 229 00:14:00,050 --> 00:14:03,290 >> 我々はそれの一番下にした途端に、機能的には、プログラムが少し異なっています 230 00:14:03,290 --> 00:14:04,960 私はnが何であるか覚えてないんだから。 231 00:14:04,960 --> 00:14:09,120 しかし、私たちはgetIntを見てきたにもかかわらず、あまりにもここにいることを証明したかった 232 00:14:09,120 --> 00:14:13,780 との右辺で使用されてGetStringメソッドは、これまでのところ、等号 233 00:14:13,780 --> 00:14:17,310 私たちは価値を覚えていること、技術的に、それは厳密には必要ではありません。 234 00:14:17,310 --> 00:14:20,290 もしあなただけの値を保存する気にしない理由のいかんにかかわらず、 235 00:14:20,290 --> 00:14:25,540 あなただけの、我々は単にこのような場合、getIntを書くことができていることがわかり、値を確認したい 236 00:14:25,540 --> 00:14:27,320 開いた括弧、括弧近い。 237 00:14:27,320 --> 00:14:30,570 その関数は、我々が言ってきたように、値を返すことになるだろう。 238 00:14:30,570 --> 00:14:32,220 それはintををお返しになるだろう。 239 00:14:32,220 --> 00:14:34,460 そしてあなたは精神的に、このような出来事を思えば 240 00:14:34,460 --> 00:14:38,190 私は99で入力したときに、getIntは、番号99を返します 241 00:14:38,190 --> 00:14:41,840 私のコードは、実際にこのあたかもので、概念的には、それは。 242 00:14:41,840 --> 00:14:45,950 99が0より大きければ確かにそうだとすれば、感謝がtrueになり、 243 00:14:45,950 --> 00:14:50,810 次に25行目では、私は今、感謝していますので、我々がやっている、オーッを実現 244 00:14:50,810 --> 00:14:53,970 そして26行目では、我々は単に、 "正の整数をありがとう!"と言う 245 00:14:53,970 --> 00:14:55,960 それがために起こったものは何でも。 246 00:14:55,960 --> 00:14:59,140 今すぐいわば、ここで若干の糖衣構文を実行してみましょう。 247 00:14:59,140 --> 00:15:04,670 我々はpositive3でこの目と最後のバリアントで、このライン25をクリーンアップすることができるかどうかを確認してみましょう。 248 00:15:04,670 --> 00:15:13,600 >> 唯一の違いに気付くには、コードのどの行ですか? >> [学生] 25。 >> [マラン]うん、25。 249 00:15:13,600 --> 00:15:17,680 そして、我々は本当にただまだこのトリックを見ていないが、我々は、月曜日に感嘆符を見た 250 00:15:17,680 --> 00:15:21,070 これは何を意味する? >> [学生]はありません。 >>いないか、または否定。 251 00:15:21,070 --> 00:15:23,510 だからブール値を取得し、その値を反転させます。 252 00:15:23,510 --> 00:15:25,810 真が偽になる場合は、falseがtrueになります。 253 00:15:25,810 --> 00:15:30,420 だから、これは、私が提案したい、でも、コードを書くのはもう少し直感的な方法です 254 00:15:30,420 --> 00:15:33,430 私はまだfalseに感謝して初期化するので、私はまだ、次の操作を行います。 255 00:15:33,430 --> 00:15:36,010 時が来れば、私は、trueに設定され感謝 256 00:15:36,010 --> 00:15:40,880 しかし今は本当にただ、口頭で左から右にこのコードを変換することができます 257 00:15:40,880 --> 00:15:45,630 ながら(感謝!)ビッグバンまたは感嘆符ではなく、の概念を表すので 258 00:15:45,630 --> 00:15:47,580 とても感謝していないが 259 00:15:47,580 --> 00:15:49,900 だから、もう一度、我々はそれ自体任意の新しい概念を導入していない。 260 00:15:49,900 --> 00:15:53,730 我々がスクラッチで演奏するとき、我々は、バックブールの話 261 00:15:53,730 --> 00:15:56,720 しかし、我々は単に多くの異なる方法で私たちのコードを書き始めることができますすぐに理解しています。 262 00:15:56,720 --> 00:16:01,060 だから特にPSET1であなたには、いくつかのプログラムを書くための方法を考え出すのに苦労して一​​種のなら、 263 00:16:01,060 --> 00:16:04,340 ソリューションの数に制限はありませんので、オッズは、あなたは運がいいアール 264 00:16:04,340 --> 00:16:06,110 あなたは時に起こることができます。 265 00:16:06,110 --> 00:16:10,500 例えば、これは、ちょうど3つのプログラムの最も単純なためです。かしこまりました。 266 00:16:10,500 --> 00:16:14,200 そして今、我々は月曜日に戻り値をこのノートに残って思い出す。 267 00:16:14,200 --> 00:16:18,450 だから、非常に初めて、我々はちょうどメイン持たないプログラムを書いた。 268 00:16:18,450 --> 00:16:22,550 それはまた、私がここで書いた独自のカスタム機能を持っています。 269 00:16:22,550 --> 00:16:26,810 だから、31行目で34を介して、私はキューブの機能を実装しました。 270 00:16:26,810 --> 00:16:30,240 それは、複雑ではありません。それはちょうどA *この場合は*です。 271 00:16:30,240 --> 00:16:34,750 しかし、何それについて重要なのは、私がの形式で入力を取っているということです 272 00:16:34,750 --> 00:16:39,180 と私は、* A * Aの形式で出力を返すよ。 273 00:16:39,180 --> 00:16:43,560 だから今、私は能力を持って、ずっと私はprinf単独で使われていたような、 274 00:16:43,560 --> 00:16:47,240 キューブ関数を呼び出して、この関数を呼び出すことができます。 275 00:16:47,240 --> 00:16:51,970 >> とキューブ関数は、いくつかの入力を受け取り、キューブ関数は、いくつかの出力を返します。 276 00:16:51,970 --> 00:16:56,960 これとは対照的に、printfのちょうど何かをした。 277 00:16:56,960 --> 00:17:00,840 余談として、それが値を返さない場合でも、それは、我々が気にかけていることは何も返されませんでした; 278 00:17:00,840 --> 00:17:03,110 あなただけの、一般的にそれを無視する。 279 00:17:03,110 --> 00:17:06,510 printfはちょうど何かをした。これは、画面に印刷の副作用を持っていた。 280 00:17:06,510 --> 00:17:11,770 ここではそれとは対照的に、我々は実際に何かを返しキューブ関数を持っています。 281 00:17:11,770 --> 00:17:15,520 だから、これに精通しているために、それはかなり簡単なアイデアだ。 282 00:17:15,520 --> 00:17:19,640 しかし、入力を渡し、出力を取り戻すのこの考えにあまり精通している人のために、 283 00:17:19,640 --> 00:17:21,950 ちょうど何か超簡単に試してみましょう。 284 00:17:21,950 --> 00:17:25,490 快適で誰もが簡単にステージに上がって来ている? 285 00:17:25,490 --> 00:17:28,040 あなたは同様にあなたのカメラに慣れている必要があります。うん?オーケー。 286 00:17:28,040 --> 00:17:31,240 あなたの名前は? >> [生徒]ケン。 >>ケン。かしこまりました。ケンは、アップ時に来る。 287 00:17:31,240 --> 00:17:35,050 ケンはここにある種の関数であることを行っている。 288 00:17:35,050 --> 00:17:38,720 先に進み、これをやってみましょう。少し空想を取得してみましょう。 289 00:17:38,720 --> 00:17:42,260 よろしくね。センターステージへようこそ。かしこまりました。 290 00:17:42,260 --> 00:17:46,640 のがここでこのボタンを押してみましょう。かしこまりました。 291 00:17:46,640 --> 00:17:49,820 だからここでは、現代の黒板を持っている 292 00:17:49,820 --> 00:17:53,470 と私は私は、例えば、main関数である 293 00:17:53,470 --> 00:17:56,460 と私は私の手にiPadを持っていない。 294 00:17:56,460 --> 00:17:59,710 >> まあ、私はそれを言うことはできません - 私は本当にする方法を覚えていない。 295 00:17:59,710 --> 00:18:02,480 私は本当に良い筆跡を持っていない、 296 00:18:02,480 --> 00:18:05,520 ので、したがって、私はあなたが私のために、画面上に何かを印刷したい。 297 00:18:05,520 --> 00:18:12,040 私は、メインプログラムである、と私はあなたがこれを言う必要がありますするつもり 298 00:18:12,040 --> 00:18:16,720 私の鶏の傷でそれを書いて、次にあなたに入力を渡すことによって。 299 00:18:16,720 --> 00:18:20,400 この演習では、関数と呼び出し元の関数の概念ですが、だから愚かな 300 00:18:20,400 --> 00:18:22,400 及びこれに機能本当に沸騰ダウン返す。 301 00:18:22,400 --> 00:18:26,260 私がメイン、私はちょうど、画面にprintfの、俗に言う、何かを書かれている 302 00:18:26,260 --> 00:18:29,110 私は、このプログラムを実行していて、できるだけのprintf呼び出さ 303 00:18:29,110 --> 00:18:32,880 それは1つの引数を引用符または二重引用符の間に時々つのパラメータを取ります。 304 00:18:32,880 --> 00:18:35,880 ここではその引数です。私はケンにそれを渡している。 305 00:18:35,880 --> 00:18:39,020 彼は何年か前に書かれた数字ブラックボックスである 306 00:18:39,020 --> 00:18:41,510 ことは明らかだけ画面上のものを印刷する方法を知っています。 307 00:18:41,510 --> 00:18:43,150 だから実行してください。 308 00:18:49,280 --> 00:18:51,280 それは悪くはない。非常に良い。 309 00:18:51,280 --> 00:18:55,510 だから今のケンは、実行中に行われます。彼は私に何かを手の甲する必要がありますか? 310 00:18:55,510 --> 00:18:57,470 はなく、私たちがこれまで見てきた。 311 00:18:57,470 --> 00:19:00,460 繰り返しになりますが、printfは実際には数値を返しませんが、我々は今のところそれを無視しようとしている 312 00:19:00,460 --> 00:19:03,470 我々はそれを使ったことがないので。だからケンのためにそれだ。 313 00:19:03,470 --> 00:19:08,580 それで今、主は再びプログラムの制御を引き継ぐ 314 00:19:08,580 --> 00:19:11,060 そのコード行ので、printfは、実行が終了しています。 315 00:19:11,060 --> 00:19:14,050 そして、我々は他の行が含まれているものは何でも実行して、私たちのやり方について行く。 316 00:19:14,050 --> 00:19:17,320 だから今度は若干異なる例を試してみましょう。 317 00:19:17,320 --> 00:19:24,940 ここで今回は、最初の画面をクリアしてみましょう、と我々はキュービング機能をするつもりだ、この時間 318 00:19:24,940 --> 00:19:27,080 しかし、今回は、私は出力値を期待しています。 319 00:19:27,080 --> 00:19:29,180 >> それでは、先に行くとこれを行うことができます。 320 00:19:29,180 --> 00:19:35,790 今私は、xはxの立方体を取得言うコードの行を持っている。 321 00:19:41,370 --> 00:19:46,370 コー​​ドの行、リコールは、次のようになります。x =キューブ(X); 322 00:19:46,370 --> 00:19:50,930 だから、これはどのように動作するように起こっている?先に進み、再びあなたに白い画面を挙げてみましょう。 323 00:19:50,930 --> 00:19:54,070 私は今、xの値を書き留めてするつもりです、 324 00:19:54,070 --> 00:20:01,400 時間のこの瞬間にどれがあることを起こる、のはそれをシンプルに保つために2、としましょう​​。 325 00:20:01,400 --> 00:20:06,150 私は紙の上に私のxの値が2の値を、書き留めてある。 326 00:20:06,150 --> 00:20:10,920 私はケンにそれを手渡す。 >>そして私はちょうど答えを書くのか? >>うん、ちょうど答えを書いてみましょう。 327 00:20:12,760 --> 00:20:18,940 オーケー。そして今、彼は私に何かを返す必要があります。パーフェクト。セグエニース。 328 00:20:18,940 --> 00:20:23,120 だから今、彼は、このケースでは8の値を教えて手の甲、そして私はそれで何をしますか? 329 00:20:23,120 --> 00:20:28,250 実は - この権利を取得、見てみましょう。私はそれをどうするつもりですか? 330 00:20:28,250 --> 00:20:33,440 今私はこの値を取得し、実際にメモリ内の同じビットに格納するつもりです。 331 00:20:33,440 --> 00:20:35,170 しかし、私はここで苦労のようなものだ気付く。 332 00:20:35,170 --> 00:20:38,210 ここで私は実際に、xの値を書けばいいので、私は少し混乱している 333 00:20:38,210 --> 00:20:43,150 私は何をやったかを物理的にケンに値2を持っていた一枚の紙を渡しているので、 334 00:20:43,150 --> 00:20:46,590 どのXだったし、実際、それは何が起こったかを正確です。 335 00:20:46,590 --> 00:20:50,210 だから、あなたが関数を呼び出すとするときに引数を渡すことが判明 336 00:20:50,210 --> 00:20:53,290 こんにちは同じように、世界のあなたは2点のような引数を渡すと、 337 00:20:53,290 --> 00:20:57,110 一般的には、その引数のコピーを渡しています。 338 00:20:57,110 --> 00:21:00,730 そして私は、ここに数字の2を書いたとケンに渡したのと同じよう 339 00:21:00,730 --> 00:21:04,720 それは私がまだどこかに値2のコピーを持っていることを意味する必要があります 340 00:21:04,720 --> 00:21:08,890 確かに、今私は、値8を戻してもらいましたので、私はRAMに戻ってする必要があるため、 341 00:21:08,890 --> 00:21:12,130 そして実際に私が一度数字の2を持っていた8を書き留めます。 342 00:21:12,130 --> 00:21:16,950 だから視覚的に、文字通りでは、値のコピーを渡すのこの概念を覚えています。 343 00:21:16,950 --> 00:21:20,780 >> ケンは彼のことをやって、何か私を手の甲 - この場合は8のような価値 - 344 00:21:20,780 --> 00:21:24,980 そして私は私がそれを周りに残しておきたい場合、その値を使って何かをしなければならない。 345 00:21:24,980 --> 00:21:29,650 だから、これのすべてはずっと前にあまりにも精通して戻ってくるだろう。 346 00:21:29,650 --> 00:21:34,920 ケン、ここでこのデモのために本当にありがとうございました。 [拍手] 347 00:21:34,920 --> 00:21:36,920 非常によくやった。 348 00:21:36,920 --> 00:21:42,690 最終的に我々がここで行ってきたことを呼び出し元の関数の一部に関し、その方法を見てみましょう。 349 00:21:42,690 --> 00:21:47,910 私が先に行くと、ここでキュービング例に私たちを連れ戻すましょう。 350 00:21:47,910 --> 00:21:53,300 我々は実際にはさらにこれを服用開始したい場合ことに注意してください、 351 00:21:53,300 --> 00:21:57,570 我々はここで渡されている数xという事実に留意する必要があるとしている 352 00:21:57,570 --> 00:22:01,530 実際に関数に渡されているものとは異なっている。 353 00:22:01,530 --> 00:22:05,880 だからもう一度、コピーすることによって、このパスは一瞬で非常に密接な関係になろうとしています。 354 00:22:05,880 --> 00:22:09,580 のは非常に適切ではまだ動作しません何かを見てみましょう。 355 00:22:09,580 --> 00:22:13,250 私は、先に行くと、自然に欠陥がある第三バギー例を開くつもりです 356 00:22:13,250 --> 00:22:18,550 そしてそれはbuggy3と呼ばれ、それがスワップ機能を実装している。 357 00:22:18,550 --> 00:22:25,110 ここでは、xとyは任意にそれぞれ1と2に初期化された主な機能を持っています。 358 00:22:25,110 --> 00:22:27,700 我々は、getIntを使用することもできますが、我々は単純な運動が必要 359 00:22:27,700 --> 00:22:30,170 ので、1と2のように、ハードコードされたのです。 360 00:22:30,170 --> 00:22:35,340 ライン21と22では、我々は明らかに、xとyの行ごとに1を出力します。 361 00:22:35,340 --> 00:22:39,720 次に23行目で、私は、ドット、ドット、ドットはこれらの値を交換していますと主張している。 362 00:22:39,720 --> 00:22:44,170 私は明らかに2つの引数をスワップと呼ばれる24行目の関数を呼び出す。 363 00:22:44,170 --> 00:22:48,300 関数は2つの引数を取るために、それは完全に合法です。我々は、printf既にそれを行う見てきました。 364 00:22:48,300 --> 00:22:51,830 >> だから、スワップは明らかにxとyを受け取り、その名前が示唆するように 365 00:22:51,830 --> 00:22:54,670 私はそれがこれらの2つの値を交換するために起こっていることを望んでいるでしょう。 366 00:22:54,670 --> 00:23:00,090 それでは、私は25行目で主張する "スワップ!"と私は、xとyを転載 367 00:23:00,090 --> 00:23:03,070 彼らが実際に交換されてきたという仮定の下で。 368 00:23:03,070 --> 00:23:06,080 しかし、私は実際にこのプログラムを実行する場合 - 私はターミナルウィンドウを開いてみましょう、 369 00:23:06,080 --> 00:23:09,860 私はbuggy3を作ってみましょう - 名前が示すように、これはよく終わろうとしていません 370 00:23:09,860 --> 00:23:15,770 私は、入力xが1であることに気づくを打ったとき、yが2であるため、 371 00:23:15,770 --> 00:23:19,420 しかも、プログラムの終了時に、彼らは、実際には、まだ同じです。 372 00:23:19,420 --> 00:23:22,960 だから、実際に何が起こっているのケンとはちょうど今実証に基づいて? 373 00:23:22,960 --> 00:23:28,710 このスワップ機能に飛び込みましょう。それは超短いです。それだけで数行のコード長いです。 374 00:23:28,710 --> 00:23:34,520 でも、ケンと一緒にここまで言われ、単純な物語に基づいて基本的な問題は何ですか? 375 00:23:34,520 --> 00:23:36,670 なぜスワップが壊れている? 376 00:23:36,670 --> 00:23:39,660 [学生]あなたは、コピーではなく、変数に格納している。 377 00:23:39,660 --> 00:23:43,980 その通りです。我々は、コピーではなく、変数自体に保存している。 378 00:23:43,980 --> 00:23:47,170 言い換えれば、スワップは明らかに2つの引数は、intをとり、 379 00:23:47,170 --> 00:23:49,370 そしてそれは、任意に、aとbと呼ばれています 380 00:23:49,370 --> 00:23:54,420 とここまで私がそれぞれ1と2のx、y、、で合格しました 381 00:23:54,420 --> 00:23:58,770 私は文字通り、xに渡していないんだけど、私は文字通り、yに渡していないよ 382 00:23:58,770 --> 00:24:01,450 私はxとyのコピーのコピーを渡している。 383 00:24:01,450 --> 00:24:04,510 それはあなたがスワップにコピーして貼り付けたかのようにほとんどの 384 00:24:04,510 --> 00:24:07,810 あなたはそれが実際に操作したい値。 385 00:24:07,810 --> 00:24:14,480 その場合は、私はプログラムの開始が行を実行35、36、だそうだとすれば 386 00:24:14,480 --> 00:24:18,650 私は37行目に到達したとき、物語の中で、この時点での値は何ですか? 387 00:24:21,040 --> 00:24:25,050 物語のこの時点では、37行目は、この時点での値は何ですか? >> [生徒] 1。 388 00:24:25,050 --> 00:24:29,280 [マラン] xは最初の引数として渡されたため、それはちょうど、右、1でなければなりません、 389 00:24:29,280 --> 00:24:33,080 そして、この関数は単に恣意その最初の引数を呼びかけている。 390 00:24:33,080 --> 00:24:38,200 同様に、第2引数はyで、それだけで勝手に第二引数bを呼び出すことと言えます。 391 00:24:38,200 --> 00:24:40,990 >> この二分法は、実際にはかなり簡単に説明されています。それについて考えてみよう。 392 00:24:40,990 --> 00:24:43,320 我々の誰も、printfを書いた人に会ったた 393 00:24:43,320 --> 00:24:50,770 そう確かに、彼または彼女は私たちの変数は30年後に呼ばれることになりましたか見当を持っていません。 394 00:24:50,770 --> 00:24:56,650 ですから、あなたが書いている関数内の変数と呼んでいるものとの間の区別が存在しなければならない 395 00:24:56,650 --> 00:25:02,080 そして、あなたが呼び出しまたは使用している関数内の変数と呼んでいるもの。 396 00:25:02,080 --> 00:25:05,340 だから、他の言葉で、私は、xとyのようにmy変数を書かれている 397 00:25:05,340 --> 00:25:08,890 しかし、他の誰かがスワップ機能を書いていた場合、彼または彼女は確かに知っているだろう 398 00:25:08,890 --> 00:25:10,690 何私の変数が呼ばれることになり、 399 00:25:10,690 --> 00:25:13,830 ので、この名前の二重性を持っている理由、これがあると認識しています。 400 00:25:13,830 --> 00:25:16,750 技術的には、私は、偶然にこれを行うことができます 401 00:25:16,750 --> 00:25:20,080 しかし、彼らはまだコピーとして渡されるであろう。 402 00:25:20,080 --> 00:25:23,650 それはちょうど偶然だろう審美場合に、スワップを書いたあの人 403 00:25:23,650 --> 00:25:26,150 同じ名前を使用していた。 404 00:25:26,150 --> 00:25:32,370 だから物語の中で、この時点で、37行目は、1であり、bは2であり、そして今、私はそれらを交換するに進みます。 405 00:25:32,370 --> 00:25:34,900 まず第一に、私は実際にははるかに簡単にこれを行うことができます。 406 00:25:34,900 --> 00:25:36,690 私は、これらのコードの3行は何をしていたかわからない。 407 00:25:36,690 --> 00:25:41,210 私はちょうどこれをやってみましょう:B = A;はa = b;行われます。 408 00:25:41,210 --> 00:25:44,690 なぜこれが、論理的に壊れたのですか? 409 00:25:46,490 --> 00:25:48,900 それは右、直感的なものの一種ですか? 410 00:25:48,900 --> 00:25:52,560 だから、BとBになるになる 411 00:25:52,560 --> 00:25:57,730 しかし、問題は37行が実行されるとすぐに、aとbの値はどうだということですか? 412 00:25:57,730 --> 00:26:03,410 あなたが泥酔してたので1、同じことは、いわば、あなたは等しくなるようにbを変更しました。 413 00:26:03,410 --> 00:26:08,890 だから一度37行が実行された、それは素晴らしいことだ、あなたが今1番の2つのコピーを持っている 414 00:26:08,890 --> 00:26:13,350 この関数の内部では、38行目で言うので、その後ときA = B、 415 00:26:13,350 --> 00:26:17,640 あなたはただ1から1を代入しているので、ねじ込ん一種のだ。 416 00:26:17,640 --> 00:26:20,580 に、どのような種類のあなたが気にかけて価値を失ってしまった。 417 00:26:20,580 --> 00:26:23,220 だから、これの元のバージョンでは、私がやったことに気づく。 418 00:26:23,220 --> 00:26:26,850 私の代わりにこのように見えたコードの3行目を持っていた。 419 00:26:26,850 --> 00:26:28,580 私は一時的な変数を宣言します。 420 00:26:28,580 --> 00:26:32,170 >> tmpは一時的な変数のための非常に一般的な名前であり、それはintだ 421 00:26:32,170 --> 00:26:34,580 それは私がのコピーを作りたいものと一致する必要があるため。 422 00:26:34,580 --> 00:26:39,770 私は、37行目が実行されたので、一旦、tmpの内部のコピーを保管 423 00:26:39,770 --> 00:26:45,860 の値は - 迅速な健全性チェック - 1、bの値は2であり、 424 00:26:45,860 --> 00:26:48,970 とtmpの値も1になります。 425 00:26:48,970 --> 00:26:52,060 だから今は、38行目を実行します。 426 00:26:52,060 --> 00:27:00,540 38行目が実行されると、bの値をとります。 aとbが2であったので、今は2である。 427 00:27:00,540 --> 00:27:05,210 だから物語の中で、この時点で、2であり、a、bは2であり、tmpは1です 428 00:27:05,210 --> 00:27:11,060 だから今論理的に、我々はbにちょうどウンチのtmpの値ができると我々は完了です。 429 00:27:11,060 --> 00:27:12,800 だから我々はその問題を解決しました。 430 00:27:12,800 --> 00:27:17,720 残念ながら、私はこの形でこのプログラムを実行するとき、それは実際には任意の値をスワップしません。 431 00:27:17,720 --> 00:27:20,100 しかし、明確にすることが、なぜですか? 432 00:27:23,660 --> 00:27:26,450 私は、さっきから論理的な問題を修正しました 433 00:27:26,450 --> 00:27:31,020 私はこのプログラムを実行する場合、再び、、xとyは変わらない 434 00:27:31,020 --> 00:27:33,310 プログラムの実行の終わりまで。 435 00:27:33,310 --> 00:27:37,220 [聞こえない学生のコメント] >>我々は何も返されていないが、本当だそう。 436 00:27:37,220 --> 00:27:39,670 なぜなら、これまでの問題のビットがここにあるのOUTしかし、それは、ターン 437 00:27:39,670 --> 00:27:44,170 我々は戻ることができてきた唯一のものは、一つのことであり、これはCの制限です 438 00:27:44,170 --> 00:27:49,070 あなたは私がここで立ち往生のようなものだその場合、実際に1つの値を返すことができます 439 00:27:49,070 --> 00:27:53,310 私は、xの新しい値を返すことができますか私は、Yの新しい値を返す可能性があるため、 440 00:27:53,310 --> 00:27:55,190 しかし、私は両方のバックが欲しい。 441 00:27:55,190 --> 00:27:58,650 だから戻って、ここで単純な解決策ではありません。 442 00:27:58,650 --> 00:28:01,710 しかし、問題は根本的になぜですか?我々は実際には何を交換している? 443 00:28:01,710 --> 00:28:04,190 [学生] aとb。 >> aとb。 444 00:28:04,190 --> 00:28:08,230 しかし、AとBは、我々はちょうどこの作品のすべてをやったことを意味し、xとyのコピーです 445 00:28:08,230 --> 00:28:11,650 我々だけで、スワップ機能と、これらの変数のすべての3つの話を3分を費やし 446 00:28:11,650 --> 00:28:15,420 そしてそれは、単独で完全に正しい、素晴らしいことだ 447 00:28:15,420 --> 00:28:20,740 しかし、AとBのスコープはここでしかこれらの行にあります。 448 00:28:20,740 --> 00:28:24,790 >> だから、あなたがのためにループ内の整数iを宣言した場合、forループのように、 449 00:28:24,790 --> 00:28:28,760 同様に、あなたが書いた関数のaとbの内側を宣言している場合、 450 00:28:28,760 --> 00:28:33,320 彼らはすぐにスワップの実行が終了するような手段は、その関数の内部でのみ有効な、ね 451 00:28:33,320 --> 00:28:38,470 そして我々は24行目から25行目は、xとyに行くまったく変わっていない。 452 00:28:38,470 --> 00:28:42,790 あなただけの変数のコピーを交換する時間の全体の多くを無駄にした。 453 00:28:42,790 --> 00:28:47,010 だから、これを解決する方法は、実際に非自明であることが判明した。 454 00:28:47,010 --> 00:28:50,670 我々は1つだけ値を返すことができるので、それは、値を返すようにするため、非常に十分ではありません 455 00:28:50,670 --> 00:28:53,470 と私は本当に、同時にxとyの両方を交換したい 456 00:28:53,470 --> 00:28:55,210 ので、我々はこれに戻ってくる必要があるとしている。 457 00:28:55,210 --> 00:29:01,020 しかし、今のところ、問題は根本的にaとbがコピーであることに由来していることを実現 458 00:29:01,020 --> 00:29:03,630 そして彼らは自分のスコープ内にあります。 459 00:29:03,630 --> 00:29:05,050 何らかの方法でこれを解決しようとしてみましょう。 460 00:29:05,050 --> 00:29:11,250 これの第4の変形、buggy4と呼びましょう、実際にここに戻ってスクロールして開くさせて頂いております。 461 00:29:11,250 --> 00:29:13,370 これについてはどうですか? 462 00:29:13,370 --> 00:29:17,810 これは、我々はそれを解決するで刺しを取る前に見て似ていますが、単純な問題である。 463 00:29:17,810 --> 00:29:24,190 このプログラムは、インクリメントと呼ばれ、それは明らかに18行目で1にxの整数を初期化しています。 464 00:29:24,190 --> 00:29:28,150 私はその後、xが1であると主張し、私はその後、 "インクリメント..."主張 465 00:29:28,150 --> 00:29:33,730 私はその後の増分を呼び出すのではなく、その後の行22と23で、私はそれがインクリメントされての請求、 466 00:29:33,730 --> 00:29:40,220 2、おそらく - - 私はxが何であれ今であると主張するが、このプログラムはバグが多いです。 467 00:29:40,220 --> 00:29:42,610 何が問題なの? 468 00:29:43,440 --> 00:29:50,160 うん。 >> [聞こえない学生の応答] >>その通りです。 469 00:29:50,160 --> 00:29:52,490 だから、xは18行目には、明らかに、宣言されています。 470 00:29:52,490 --> 00:29:54,700 それがメインの中括弧の中にある。 471 00:29:54,700 --> 00:29:58,440 だからここに簡単な答えは、xがここに存在している間ということです 472 00:29:58,440 --> 00:30:03,930 それは32行目に存在しないので、このプログラムは、実際には、コンパイル時にエラーとなります。 473 00:30:03,930 --> 00:30:07,940 私はこのコードをコンパイルしてみてくださいコンパイラは私に向かって怒鳴り起こっている 474 00:30:07,940 --> 00:30:14,100 いくつかの未宣言の識別子またはその旨を何かについて。実際、やってみよう。 475 00:30:14,100 --> 00:30:18,470 これはbuggy4を作ることです。そこにそれがある。 476 00:30:18,470 --> 00:30:22,110 32行目で宣言されていない識別子は 'x'の使用。 477 00:30:22,110 --> 00:30:25,580 そして、実際に、これが有用であることそれでは、今日ここより明確になるであろう 478 00:30:25,580 --> 00:30:27,580 営業時間や家庭で。 479 00:30:27,580 --> 00:30:29,300 >> それが書かれた暗号のような少しだということに注意してください。 480 00:30:29,300 --> 00:30:37,270 しかし、Clangのは持っているという事実はbuggy4.c言って、私達に怒鳴ら:32:5、実際に有用である。 481 00:30:37,270 --> 00:30:42,050 これは、エラーが文字位置5の32行目にあることを意味します。 482 00:30:42,050 --> 00:30:46,700 だから、1、2、3、4、5。どこに問題があることは、実際には、です。 483 00:30:46,700 --> 00:30:49,790 また、あまりにも、営業時間や家庭で心に留めて、私はここでラッキーだ。 484 00:30:49,790 --> 00:30:52,990 私は一つのミスがあります。それは修正することは比較的容易になるだろう。 485 00:30:52,990 --> 00:30:55,990 しかし、あなたは圧倒的なエラーメッセージの完全な画面全体を取得する場合、 486 00:30:55,990 --> 00:31:00,330 再び最下位の1がちょうど一番上の1の症状かもしれないことを認識しています。 487 00:31:00,330 --> 00:31:03,450 だから、常にトップダウンからバグを追いかける 488 00:31:03,450 --> 00:31:05,820 ただデイジーチェーンの効果があるかもしれないので、 489 00:31:05,820 --> 00:31:09,240 それはあなたが実際に行うよりもずっと問題を抱えている示唆している。 490 00:31:09,240 --> 00:31:15,150 私の目標は、xをインクリメントする場合ので、どのように我々はこの問題を解決するだろうか? >> [生徒]×グローバルを作成します。 491 00:31:15,150 --> 00:31:17,060 わかりましたので、我々は、xがグローバルにすることができます。 492 00:31:17,060 --> 00:31:20,480 、Let 'sは、私は約以前警告したショートカットを取るが、一体、私達はちょうど簡単な修正を必要とする 493 00:31:20,480 --> 00:31:25,730 だからここまでのint xを言ってみましょう。これは、xがグローバルになります。 494 00:31:25,730 --> 00:31:31,800 だから今、メイン、それへのアクセス権を持ち、増分はそれへのアクセス権を持っている 495 00:31:31,800 --> 00:31:34,110 ので私が先に行くと、すぐにこれをコンパイルしましょう​​。 496 00:31:34,110 --> 00:31:37,630 buggy4を行い、入力します。今コンパイルしているようだ。 497 00:31:37,630 --> 00:31:41,230 buggy4を実行してみましょう。そしてそれは実際に動作しているようです。 498 00:31:41,230 --> 00:31:45,150 これは、私はしないように、私が言うようにやるのは、これらのものの一つである 499 00:31:45,150 --> 00:31:47,010 私はちょうどので、一般的に、ここで行ったように、 500 00:31:47,010 --> 00:31:50,440 私たちのプログラムは、これよりもはるかに興味深いとはるかに長く得ようとしている、 501 00:31:50,440 --> 00:31:56,390 そして人生の問題に対するソリューションは、ちょうどあなたのファイルの先頭にすべての変数を入れている場合、 502 00:31:56,390 --> 00:31:59,690 非常に迅速にプログラムは管理が恐ろしく難しいのですか。 503 00:31:59,690 --> 00:32:02,190 それは、新しい変数名を考えるのが難しくなる 504 00:32:02,190 --> 00:32:05,240 それは、変数が何をやっていることを理解することが困難になる 505 00:32:05,240 --> 00:32:08,460 ので、一般的に、これは良い解決策ではありません。 506 00:32:08,460 --> 00:32:10,030 それでは、良いこれを行うことができます。 507 00:32:10,030 --> 00:32:12,160 私たちはここで、グローバル変数を使用する必要はありません。 508 00:32:12,160 --> 00:32:16,240 >> 私はxをインクリメントしたいので、私は明らかでした - 509 00:32:16,240 --> 00:32:18,670 我々だけでこれを行うために、一日の終わりには、これは愚かな物語のようなものです - 510 00:32:18,670 --> 00:32:24,450 しかし、私はその演算子については知りませんでしたか、私はそれ自体メインでそれを変更することが許可されなかった場合、 511 00:32:24,450 --> 00:32:30,730 他にどのように私はこの時間ではなくキューブにこっちケンを実装することができますが、インクリメントする? 512 00:32:31,380 --> 00:32:33,190 どのように私はここにこの事を変更するのですか?うん。 513 00:32:33,190 --> 00:32:38,480 [学生] xの渡し、その後、戻り[聞こえない] >>さて、良い。 514 00:32:38,480 --> 00:32:41,900 では、なぜ私は、xに渡し、その後ではなく、それを返さない 515 00:32:41,900 --> 00:32:44,870 なぜ私はちょうどx + 1を返すことはしない。 516 00:32:44,870 --> 00:32:47,710 カップルより多くの事はここで変更する必要があります。私は正しい軌道に乗ってよ。 517 00:32:47,710 --> 00:32:49,770 私は微調整するために他に何が必要なのですか?他の誰か。うん。 518 00:32:49,770 --> 00:32:51,740 [聞き取れない生徒の応答] 519 00:32:51,740 --> 00:32:54,730 それがvoidではないので、私はインクリメントの戻り値の型を変更する必要があります。 520 00:32:54,730 --> 00:32:57,780 、ボイドは何も返されませんされていることを意味しますが、明らかに今はある 521 00:32:57,780 --> 00:32:59,830 に変更するには、このニーズはそう - >> [生徒] intです。 522 00:32:59,830 --> 00:33:02,740 私は実際に戻ってる何と矛盾しないようにint型。 523 00:33:02,740 --> 00:33:05,180 今すぐ何か他のものはまだここにバギーです。うん。 524 00:33:05,180 --> 00:33:08,400 [聞き取れない生徒の応答] >> [マラン]私はxをインクリメントする必要がありますね? 525 00:33:08,400 --> 00:33:12,080 [聞き取れない生徒の応答] >> [マラン]ああ、そう、私はxを渡す必要があります。 526 00:33:12,080 --> 00:33:16,660 だから私はここにこれを行う必要があります。 >> [聞こえない学生のコメント] 527 00:33:16,660 --> 00:33:20,050 [マラン]だからプロトタイプは、私がここでこれを設定変更する必要があります。 528 00:33:20,050 --> 00:33:22,930 これはint型になることがありますので、これはなっている - 529 00:33:22,930 --> 00:33:25,620 うーん、私は実際にここにバグを持っています。のは、最初にこの1を修正しましょう​​。 530 00:33:25,620 --> 00:33:29,590 これは実際には何をすべきか?それはint何かがあるはずだ。 531 00:33:29,590 --> 00:33:32,700 あなたが変数xのすべての呼び出しを開始した場合、それは、率直にXであるが、可能性 532 00:33:32,700 --> 00:33:35,390 それはどれがどれだかもうあまり明確な得るために起こっている。 533 00:33:35,390 --> 00:33:39,560 >> だから勝手に、私のヘルパー関数に異なる命名規則を選択してみましょう 534 00:33:39,560 --> 00:33:41,940 私が書いている機能。我々はそれと呼ぶことにしますか、我々はそれを呼び出すことができます - 535 00:33:41,940 --> 00:33:45,010 それは数さらに明示的にするために呼び出してみましょう。 536 00:33:45,010 --> 00:33:47,560 それでは私は数がプラス1で、何でも返す必要が 537 00:33:47,560 --> 00:33:50,740 そして今、私はこことここでもうひとつ、最大1他の事を変更する必要があります。 538 00:33:50,740 --> 00:33:54,350 私は、最初の21行目に変更するには何がありますか? >> [聞こえない学生の応答] 539 00:33:54,350 --> 00:33:57,610 [マラン]私はそれをxに代入する必要があります。私はちょうどインクリメント(x)を呼び出すことはできません。 540 00:33:57,610 --> 00:34:01,960 私は左側にxの値を変更することで答えを覚えておく必要があります。 541 00:34:01,960 --> 00:34:04,680 とxが左と右に今あるにもかかわらず、それは全く大丈夫です 542 00:34:04,680 --> 00:34:08,860 右側が最初に実行されるので、左側のものにそのまま流しこむれる - 543 00:34:08,860 --> 00:34:10,600 この場合のx。 544 00:34:10,600 --> 00:34:12,159 そして、最後に、これは今では簡単な修正です。 545 00:34:12,159 --> 00:34:17,230 これは単に、以下のものをダウンのINT番号と一致する必要があります。 546 00:34:17,230 --> 00:34:20,570 だから本当に愚かな関数の変化の全体の束 547 00:34:20,570 --> 00:34:24,420 しかし、我々はますますやりたいだろうというものの代表。 548 00:34:24,420 --> 00:34:27,090 だからbuggy4を作る。私はどこかでしくじった。 549 00:34:27,090 --> 00:34:30,139 ああ、私の神。 6行のプログラムの5つの間違い。 550 00:34:30,139 --> 00:34:35,690 だから18行、文字5日に何が悪いの? 551 00:34:35,690 --> 00:34:39,610 だから私はこの、int型を宣言する必要があります。 552 00:34:39,610 --> 00:34:41,920 見てみましょう。その他のエラーの全体の束があります。 553 00:34:41,920 --> 00:34:47,010 ああ、私の神 - 19、18、21 - しかし、再び、ここだけの画面は、コントロールLをクリアしてみましょう、 554 00:34:47,010 --> 00:34:49,380 とClangのを再実行してください。 555 00:34:49,380 --> 00:34:51,340 だから5の問題は実際にはその1です。 556 00:34:51,340 --> 00:34:57,520 だから今のEnter、buggy4を実行してみましょう。やれやれ、xが正しくインクリメントされている。 557 00:34:57,520 --> 00:35:02,720 かしこまりました。数字をインクリメントする方法について何か質問はありますか?うん。 558 00:35:02,720 --> 00:35:09,870 [聞こえない学生の質問】>>良い質問です。 559 00:35:09,870 --> 00:35:14,220 それは私はただの数字にxを変更することができますし、プログラムがすぐに知ることがどうですか? 560 00:35:14,220 --> 00:35:16,200 >> 繰り返しになりますが、この抽象化と考えることもできます。 561 00:35:16,200 --> 00:35:21,600 私がメインですし、ケンはインクリメントされていたら、率直に言って、私はケンが自分のiPadを呼んでいる気にしない。 562 00:35:21,600 --> 00:35:26,570 私は彼がこの機能の彼の実装と関係している何と呼んでいるものを気にしない。 563 00:35:26,570 --> 00:35:33,340 これは、私は、メイン、気にする必要がないことを、実装の詳細です。 564 00:35:33,340 --> 00:35:38,250 それで、単に関数の内部一貫してそれを変更する - 数はこことここ数 - 565 00:35:38,250 --> 00:35:40,960 それは私が再コンパイルする限り、かかる時間です。 566 00:35:40,960 --> 00:35:44,180 あなたは私たちの約多くを考えるなら、それは運転免許証を持つあなたのもの、好きなものだ 567 00:35:44,180 --> 00:35:46,770 、誰が運転したか、あなたも車の中で運転した場合 568 00:35:46,770 --> 00:35:50,950 私たちのほとんどは、車がボンネットの下にどのように動作するか見当がつかない。 569 00:35:50,950 --> 00:35:54,970 あなたがフード、私たちのほとんどを開く場合、文字通り、 - 私自身を含めて - 570 00:35:54,970 --> 00:35:56,940 本当に我々が探しているものを知っているつもりではないが、 571 00:35:56,940 --> 00:35:59,220 あなたが今、このようなものと感じるかもしれないような一種の。 572 00:35:59,220 --> 00:36:01,480 しかし、我々は本当に、車がどのように動作するかを気にする必要はありません 573 00:36:01,480 --> 00:36:05,970 私たちは何車内ロッドとピストンとすべてのケーブル気にする必要はありません 574 00:36:05,970 --> 00:36:08,160 実際にやっている。 575 00:36:08,160 --> 00:36:12,770 ですから、ピストンと呼んでいるもののようなものは、このケースではここでは関係ありません。同じ考え。 576 00:36:12,770 --> 00:36:25,300 うん。 >> [聞こえない学生の質問] 577 00:36:25,300 --> 00:36:29,180 前に変数XAモーメントのより用途がある場合は、 578 00:36:29,180 --> 00:36:32,150 あなたは、プログラマが、どこでもそれらを変更する必要があります。 579 00:36:32,150 --> 00:36:36,600 それとも、文字通りファイル、メニューの操作を行い、[置換、見つけることができる - のようなものを - 580 00:36:36,600 --> 00:36:39,170 しかし、あなたはそれらの変更を自分で作る必要があるとしている。 581 00:36:39,170 --> 00:36:47,450 あなたは一貫している必要があります。 >> [生徒]複数の変数がある場合は[聞こえない] 582 00:36:47,450 --> 00:36:53,100 ここのように特定の順序、これがあった場合は、別の番号をint? >> [学生]が正しい。 583 00:36:53,100 --> 00:36:56,590 [マラン]うん。関数を呼び出しているときに順序が問題になります。 584 00:36:56,590 --> 00:37:00,050 >> だから私は、何かコンマ何かでここに増分を呼び出していた場合、 585 00:37:00,050 --> 00:37:01,680 ダイレクトマッピングがあります。 586 00:37:01,680 --> 00:37:05,690 最初の変数は、それが呼ばれるものは何でも、こっちの最初の引数のコピーが作られています。 587 00:37:05,690 --> 00:37:07,760 申し訳ありません。これは、括弧であってはならない。 588 00:37:07,760 --> 00:37:11,490 二番目と二番目の引数ラインアップ。オーダーだから、そう、事項。かしこまりました。 589 00:37:11,490 --> 00:37:17,020 申し訳ありません。私はそこに着くために長い道のりを取った。その他の質問は?かしこまりました。 590 00:37:17,020 --> 00:37:20,610 だから我々は実際にここで何が起こっているかの絵を描くことができないかどうかを確認してみましょう 591 00:37:20,610 --> 00:37:23,090 フードの下に、いわば。 592 00:37:23,090 --> 00:37:26,640 これは、コンピュータのメモリを表すかもしれません四角形です。 593 00:37:26,640 --> 00:37:30,970 あなたはメモリがどのように動作するかのアイデアや方法RAMが動作していない場合でも、 594 00:37:30,970 --> 00:37:33,940 少なくともあなたは、これらの日それの束を持っていることを前提としています。 595 00:37:33,940 --> 00:37:36,280 あなたがそれのメガバイトを持っている、あなたはそれのギガバイトを持っている 596 00:37:36,280 --> 00:37:40,870 そして我々はバイトだけで何であることを0週目から知っていますか? >> [生徒] 8ビット。 597 00:37:40,870 --> 00:37:42,950 8ビット、右か?だから8のゼロと1。 598 00:37:42,950 --> 00:37:45,880 お使いのコンピュータは、RAMのギグ、RAMの2ギグ、これらの日を持っていますので、もし 599 00:37:45,880 --> 00:37:55,030 あなたは、メモリの億または20億バイト、または約8億160億ビットを持ってい 600 00:37:55,030 --> 00:37:56,890 お使いのコンピュータの内部。 601 00:37:56,890 --> 00:38:00,590 少しふんわりウィリーの例とは違って、それは一般的にはもう磁性粒子ではありません。 602 00:38:00,590 --> 00:38:04,450 ますます - 少なくともノートPCで - それは、ソリッドステートドライブ、SSD、だ 603 00:38:04,450 --> 00:38:08,580 ただ可動部分を持たないこと。それは、すべての電子です。これは、すべての電気ベースだ。 604 00:38:08,580 --> 00:38:14,060 だから、あなたが持っているメモリの1または2ギガバイトを表すものとして、この長方形を考える。 605 00:38:14,060 --> 00:38:16,020 >> だから、メモリの塊だ。 606 00:38:16,020 --> 00:38:19,830 コンピュータサイエンスの世界では、ソートで仕切られている 607 00:38:19,830 --> 00:38:22,950 さまざまなことを行うためのメモリの塊。 608 00:38:22,950 --> 00:38:27,190 例えば、そこに矩形で示唆したように、これは、コンピュータのRAMである場合、 609 00:38:27,190 --> 00:38:31,130 それは、慣例により、あなたのRAMの最上部にある、いわばことが判明 610 00:38:31,130 --> 00:38:33,660 テキストセグメントと呼ばれるものが一般的である。 611 00:38:33,660 --> 00:38:36,740 それらはあなたがコンパイルした0と1です。 612 00:38:36,740 --> 00:38:39,020 だから我々が何であるかはa.outでフードの下に見てきたときに、 613 00:38:39,020 --> 00:38:41,980 あなたがプログラムを実行するすべてのこれらの0と1、 614 00:38:41,980 --> 00:38:46,290 それらの0と1は、RAMと呼ばれるものには、ハードドライブからロードされます 615 00:38:46,290 --> 00:38:49,320 RAMに彼らは先頭に配置している。 616 00:38:49,320 --> 00:38:52,770 一方、あなたは他のものを持っている:データの初期化を解除し、データを初期化します。 617 00:38:52,770 --> 00:38:57,510 メモリのそれらの2帯状の領域を使用すると、頻繁に使用していないグローバル変数を参照してください 618 00:38:57,510 --> 00:39:00,760 もしそうなら、時には、彼らは同様にそこまで終わる。 619 00:39:00,760 --> 00:39:04,260 環境変数は、私たちが多くの時間を費やすことはしませんが、:そしていくつかの他のものはあり 620 00:39:04,260 --> 00:39:06,860 学期を通して戻ってくるだろうが、その後、2つの重要な事柄、 621 00:39:06,860 --> 00:39:08,550 スタックとヒープ。 622 00:39:08,550 --> 00:39:12,210 プログラムを実行するときに、コンピュータのメモリのほとんどが予約されています 623 00:39:12,210 --> 00:39:15,370 何かのために、スタックとヒープと呼ばれるものと呼ばれる。 624 00:39:15,370 --> 00:39:18,840 今日はヒープについて話をするつもりはないが、我々はスタックについてお話します。 625 00:39:18,840 --> 00:39:24,600 スタックは、マザーハウスにダイニングホールミールトレイのビジュアルを想起させることを意図している 626 00:39:24,600 --> 00:39:28,110 またはどこでもあなたは、ダイニングホールスタッフが毎日それらをきれいにどこのことが起こる 627 00:39:28,110 --> 00:39:30,180 彼らは上の階からそれらを積み重ね、 628 00:39:30,180 --> 00:39:34,550 と同様に、メモリでは、スタック上に何かを入れてのこのアイデアは、そこにある 629 00:39:34,550 --> 00:39:36,860 スタック上に何かを入れて、スタック上に何かを置く。 630 00:39:36,860 --> 00:39:38,240 そして、我々はこれで何を意味するのですか? 631 00:39:38,240 --> 00:39:41,860 >> この写真のちょうど下半分には、コンピュータのRAM上でズームしてみましょう 632 00:39:41,860 --> 00:39:44,330 次のことを提案する。 633 00:39:44,330 --> 00:39:48,170 それはあなたがa.outまたはhelloのようなプログラムを実行するとことが判明 - 634 00:39:48,170 --> 00:39:50,100 - プログラムは、あなたが書いたことは何でも 635 00:39:50,100 --> 00:39:54,020 再び、これらの0と1は、長期保管であるハードドライブからロードされます。 636 00:39:54,020 --> 00:39:57,230 あなたがRAMにロードされたプラグを引っ張るときでさえそこにとどまります。 637 00:39:57,230 --> 00:40:00,610 RAMはハードドライブよりも高速である - それはハードドライブに比べて小さいです - 638 00:40:00,610 --> 00:40:03,300 あなたがそれらを実行している間にプログラムがどこに住んでますが、それは。 639 00:40:03,300 --> 00:40:08,230 ですから、二重のMacまたはPC上のプログラムをクリックして、それがRAMにハードドライブから読み込まれている。 640 00:40:08,230 --> 00:40:11,520 それは、RAM、ウェイ上部に0と1を外出先にロードだとすぐに 641 00:40:11,520 --> 00:40:16,610 いわゆるテキストセグメントが、その後できるだけ早くあなたのプログラムが実際に実行して起動すると、 642 00:40:16,610 --> 00:40:21,360 main関数が呼び出され、主、我々が見てきたように、多くの場合、ローカル変数を持っています 643 00:40:21,360 --> 00:40:24,870 そして、それは整数や文字列と文字などがあります。 644 00:40:24,870 --> 00:40:29,180 だからあなたのあなたが書いたことをプログラムしたり、ダブルクリックしたプログラムなら 645 00:40:29,180 --> 00:40:32,970 いくつかの変数がメインの内側に使用され、 646 00:40:32,970 --> 00:40:37,240 彼らは、いわば記憶のあなたのスタックの一番下になってしまう。 647 00:40:37,240 --> 00:40:39,410 具体的には、これは実際に何を意味するのか? 648 00:40:39,410 --> 00:40:48,450 これはちょうど、我々は、コンピュータで数値にRAMのバイトに行く必要がある場合や、 649 00:40:48,450 --> 00:40:55,750 これはバイト数が0の場合があり、これはバイト番号1、2、3、4、5、6、かもしれないことに気づく 650 00:40:55,750 --> 00:41:01,480 最大2億〜すべての道は、そこまで最上部にあるすべての方法だろう。 651 00:41:01,480 --> 00:41:05,880 だから、他の言葉で、私たちは、バイト単位でRAMまたはメモリについて話すとき、 652 00:41:05,880 --> 00:41:11,500 それだけで、誰かが何番目のメモリ、これらのチャンクのそれぞれに決めたことを意味します。 653 00:41:11,500 --> 00:41:16,650 ですから、intの32ビットを必要とするか、またはあなたは、charは8ビットを必要とするとき、 654 00:41:16,650 --> 00:41:18,840 彼らは、メモリ内にどこに終わるのですか? 655 00:41:18,840 --> 00:41:22,350 >> 概念的には、彼らは単にスタックと呼ば​​れるこの事の一番下になってしまう。 656 00:41:22,350 --> 00:41:25,870 メインは、関数を呼び出したときにしかし、何今面白いのはある - 657 00:41:25,870 --> 00:41:28,750 fooという関数を、単に任意の名前を付けるとします - 658 00:41:28,750 --> 00:41:32,330 このメモリのスタックの底に何が起こる主である; 659 00:41:32,330 --> 00:41:35,680 fooは今やメモリにメインの上に置かれます。 660 00:41:35,680 --> 00:41:40,990 fooは概念的にメインのもの上記のようなものを結局した任意のローカル変数は、そう。 661 00:41:40,990 --> 00:41:47,070 fooはbarと呼ばれる別の関数を呼び出す場合、これらの変数はここにたどり着く。 662 00:41:47,070 --> 00:41:50,120 バーでは、こことここに何か他のものを、ここで、呼び出した場合。 663 00:41:50,120 --> 00:41:53,830 だから、プログラムの実行について興味深い何が関数を呼び出すようにすることです 664 00:41:53,830 --> 00:41:57,750 それらの関数は、関数を呼び出すように、それらの関数は、関数を呼び出すと、 665 00:41:57,750 --> 00:42:01,470 あなたは、メモリ内の関数のこのスタックを構築します。 666 00:42:01,470 --> 00:42:06,890 そして唯一の関数の復帰後は、そのメモリを取り戻す始めるのですか。 667 00:42:06,890 --> 00:42:10,860 だから、コンピュータ·プログラムでメモリー不足にする最も簡単な方法の一つ 668 00:42:10,860 --> 00:42:14,360 決して戻らない関数を記述することです。 669 00:42:14,360 --> 00:42:18,900 だから例えば、意図的にバグのあるプログラムと同じくらい示しましょう​​。 670 00:42:18,900 --> 00:42:22,230 私が先に行くと#を含めるやってみましょう、 671 00:42:22,230 --> 00:42:25,000 int型のmain(void)を、 672 00:42:25,000 --> 00:42:32,940 そして、私は(2> 1)しながらやろうとしてんだけど、それはおそらくこれまで、我々に変更されることはありません 673 00:42:32,940 --> 00:42:37,560 と私は今、先に行くとprintfやらせる。 674 00:42:37,560 --> 00:42:40,700 実際のところ、それは少なく視覚的に面白いことになるだろう。これを実行してみましょう。 675 00:42:40,700 --> 00:42:50,240 ためます。int i = 0; i>の0 - のは、このミスをしてみましょう - i + +は。 676 00:42:50,240 --> 00:42:52,720 そしてここでのprintfないようにしましょう​​。私が説教されたことを実践してみましょう。 677 00:42:52,720 --> 00:43:00,190 レッツは、ここにメソッドは、voidコーラスを持って、私たちは、int iを言うよ 678 00:43:00,190 --> 00:43:06,830 そして私は、printf言うつもりだ - いや、してみましょう、これはもっと面白くなる。 679 00:43:06,830 --> 00:43:15,790 実際にはまったく何も印刷されませましょう。コー​​ラスは、(i):ただこれを行うてみましょう。 680 00:43:15,790 --> 00:43:20,390 かしこまりました。なぜので、だから、これはバグですか? 681 00:43:20,390 --> 00:43:23,380 プログラムが実際に興味のある何もしていませんので、私が行くように私はこれを作っています。 682 00:43:23,380 --> 00:43:25,320 >> しかし、それはゴールではありません。 683 00:43:25,320 --> 00:43:29,630 目標は、明らかに、その主な機能は何を行うプログラムを書くことですか? 684 00:43:30,720 --> 00:43:32,860 自分自身を呼び出す。そして、実際に、我々はループを必要としません。 685 00:43:32,860 --> 00:43:37,200 でも、これはただのように本当に根本的なバグを見失わないように簡略化してみましょう。 686 00:43:37,200 --> 00:43:39,640 メインの呼び出しは、いくつかの合唱コーラスを歌う、 687 00:43:39,640 --> 00:43:41,440 その後、私は愚かなことをしたと私は、コーラス·コールコーラスを持っていた 688 00:43:41,440 --> 00:43:43,760 私は他の誰かが多分それを実装しようとしていたと仮定しているため、 689 00:43:43,760 --> 00:43:47,210 そして今、これはまだコンパイルするつもりはない。私は何をする必要がありますか? 690 00:43:47,210 --> 00:43:49,970 私はプロトタイプを必要とする、覚えています。 691 00:43:49,970 --> 00:43:56,110 だから私は(int i)指定ここボイドコーラスを持っている必要があります; 692 00:43:56,110 --> 00:43:59,210 私はここに行けばだから今 - 実際には、大きな窓を使用してみましょう。 693 00:43:59,210 --> 00:44:01,980 先に進み、合唱を作ってみましょう。 694 00:44:01,980 --> 00:44:06,490 先に進み、合唱を作ってみましょう。 695 00:44:06,490 --> 00:44:08,370 iが宣言されていない識別子の使用。 696 00:44:08,370 --> 00:44:12,500 ああ、それは愚かだった。我々は、引数を必要としません。ただ、これをやってみましょう。 697 00:44:12,500 --> 00:44:16,370 私たちはこのように始まっていたと思います。それが書きやすくプログラムされていると思います。 698 00:44:16,370 --> 00:44:25,590 そこ。それでは、私の端末ウィンドウの所へ行くClangのを再実行し、ここで我々は行くことができます。 699 00:44:25,590 --> 00:44:28,460 それは本当に速かった。 700 00:44:28,460 --> 00:44:31,150 実際に何がちょうどしかし、起こったのか? 701 00:44:31,150 --> 00:44:33,730 我々が見ることができるので、さて、今私は、印刷行を追加します。 702 00:44:33,730 --> 00:44:43,490 私は( "私はここにいるよ")printfは言わせない - 変数もありません。我々はそのようにそれを残しておきます。 703 00:44:43,490 --> 00:44:47,480 私はmakeを再実行してみましょう。私はコーラスを再度実行してみましょう。 704 00:44:47,480 --> 00:44:57,380 そして...に来る。続ける。 705 00:44:57,380 --> 00:44:59,930 余談ですが、なぜそれがまだクラッシュしていない? 706 00:44:59,930 --> 00:45:02,080 セグメンテーションフォールトは前に超高速で起こった。 707 00:45:02,080 --> 00:45:06,570 [聞き取れない生徒の応答] >>その通りです。だからそれは、右の印刷に時間がかかる? 708 00:45:06,570 --> 00:45:08,610 それはちょうど、コンピュータの一部に多くの作業を要する。 709 00:45:08,610 --> 00:45:10,620 そして、それはそこにある:セグメンテーションフォールト。 710 00:45:10,620 --> 00:45:12,340 >> だから、プログラムを実行にどれだけ早く気づく。 711 00:45:12,340 --> 00:45:14,130 あなたは何も、超高速の印刷をしていない場合。 712 00:45:14,130 --> 00:45:18,770 しかし、我々はまだ何が起こっていたので、このセグメンテーションフォールトを得たか。 713 00:45:18,770 --> 00:45:21,210 あなたは、コンピュータのメモリがどのようにレイアウトされるかを考えてみれば、 714 00:45:21,210 --> 00:45:28,740 これがメインであることを起こるが、ここのはちょうどこのコーラスを呼ぶことにしましょう​​、そしてこのコーラスを呼び出してみましょう。 715 00:45:28,740 --> 00:45:34,550 私は右の私の美学を行う場合、現在は、これは単なるコーラス、コーラス、コーラスを、言おうとしている 716 00:45:34,550 --> 00:45:40,550 コー​​ラス、合唱、コーラス、コーラス、広告nauseum、最終的には、起ころうとしているのでしょうか? 717 00:45:40,550 --> 00:45:45,630 文字通り大局場合は、これは単に概念的に何が起こるか、ですか? 718 00:45:46,520 --> 00:45:48,630 スタックオーバーランヒープ。 719 00:45:48,630 --> 00:45:51,940 または、悪いことに、あなただけの、テキストセグメントを含むすべてを、オーバーラン 720 00:45:51,940 --> 00:45:54,590 これは、あなたのプログラムを表す0と1です。 721 00:45:54,590 --> 00:45:57,080 要するに、これは単にスーパー、超悪いです。 722 00:45:57,080 --> 00:45:58,830 あなたのプログラムが暴走螺旋た。 723 00:45:58,830 --> 00:46:01,220 あなたが意図したより方法より多くのメモリを使用している 724 00:46:01,220 --> 00:46:03,960 なぜならこの場合は愚かな過ちのすべて、 725 00:46:03,960 --> 00:46:08,040 このケースでは非常に意図的に行わ関数は自分自身を呼び出す。 726 00:46:08,040 --> 00:46:09,500 さて、これはすべての不良ではありません。 727 00:46:09,500 --> 00:46:13,800 あなたが正しくそれを使用するときに自分自身を呼び出している関数は、実際には偉大な力を持っています。 728 00:46:13,800 --> 00:46:15,800 私はここでそれを正しく使用していない。 729 00:46:15,800 --> 00:46:19,780 だから、これはすべての悪いことではありませんが、私は実際に自分自身を呼び出して停止することはありませんという事実 730 00:46:19,780 --> 00:46:23,520 このプログラムのここに根本的な弱点です。 731 00:46:23,520 --> 00:46:26,400 だから我々はこのすべてにどこへ行くのか?本当に何が起こっているの? 732 00:46:26,400 --> 00:46:30,340 我々はこれらの例でやっていたように私はインクリメント関数を呼び出すと、 733 00:46:30,340 --> 00:46:33,420 私が渡した1インチのような値を持っている 734 00:46:33,420 --> 00:46:37,570 私は番号1のコピーを渡しますので、次のことが起こります。 735 00:46:37,570 --> 00:46:44,240 インクリメントの例に入りましょう、右こっちにこの男。 736 00:46:44,240 --> 00:46:46,870 ここでは、実際に何が起こっているかだ。 737 00:46:46,870 --> 00:46:53,400 私はインクリメントを呼び出して、私はここで何が起こっているのか、絵を用いて、xに渡すときです。 738 00:46:53,400 --> 00:46:59,520 >> 私はここに1の値を格納していたと私は実際にインクリメントを呼び出す場合は、 739 00:46:59,520 --> 00:47:04,330 これは、今ではコーラスと呼ばれて - iPadはここに私をオフに投げている。 740 00:47:04,330 --> 00:47:09,760 この増分を呼び出してみましょう、私たちは、この関数は次のことを行っているのか分からない。 741 00:47:09,760 --> 00:47:14,840 だから、実際に何が起こっているのは、私はメモリの塊を持っているメインのどこかにここにある 742 00:47:14,840 --> 00:47:17,000 それは数字の1を格納しています。 743 00:47:17,000 --> 00:47:19,380 私はインクリメントを呼び出すときに、私は、メモリの別のチャンクを使用しています 744 00:47:19,380 --> 00:47:21,230 今私は1のコピーを持っている。 745 00:47:21,230 --> 00:47:26,660 私は、その値をインクリメントするとき、これは、2となる 746 00:47:26,660 --> 00:47:30,560 が、その後できるだけ早くインクリメント戻ると何が起こるか? 747 00:47:30,560 --> 00:47:33,630 このメモリは、単に、オペレーティングシステムに戻される 748 00:47:33,630 --> 00:47:37,450 これはあなたがやったすべては役にも立たないことを意味します。 749 00:47:37,450 --> 00:47:43,120 もともとは主に含まれていた1が実際にまだそこにある。 750 00:47:43,120 --> 00:47:44,890 だから我々はこれでどこへ行くのか? 751 00:47:44,890 --> 00:47:49,770 これは、メモリ内にあなたがこのバイトのバックツーバックのシーケンスを持っていることが判明 752 00:47:49,770 --> 00:47:53,050 あなたにものを置くことができ、それは、我々はすでに何度か見かけたことが判明していること 753 00:47:53,050 --> 00:47:55,390 バックアップするためにバックアップするバックアップすることを背面入れ関与していること。 754 00:47:55,390 --> 00:47:59,860 第1週となりました2週に基づいて、文字列とは何ですか? 755 00:48:00,020 --> 00:48:01,980 それはただの文字のコレクションです。 756 00:48:01,980 --> 00:48:04,310 だから、あなたがメモリ内に数字を置くことができるのと同様に判明 757 00:48:04,310 --> 00:48:06,990 同様にして、メモリ内の文字を入れることができます。 758 00:48:06,990 --> 00:48:10,530 そして、かつて私たちは、背中合わせにし、背中合わせにメモリ内に文字を入れて起動する 759 00:48:10,530 --> 00:48:13,620 それは、ループまたはwhileループのようなものの最も単純なを使用していることが判明 760 00:48:13,620 --> 00:48:17,170 我々は、文字列内の文字の上に左から右に繰り返すことができます 761 00:48:17,170 --> 00:48:20,600 とまったく異なる文字にそれらをマッサージ開始 - 762 00:48:20,600 --> 00:48:23,370 Bになる可能性があり、BがCになるかもしれない - 763 00:48:23,370 --> 00:48:27,780 最終的に、我々は実際に理にかなっている英語の文章を取ることができるように 764 00:48:27,780 --> 00:48:30,310 と一度にそれらの手紙1のそれぞれを変換 765 00:48:30,310 --> 00:48:34,400 私たちのコンピュータのメモリを介して歩くことによって、実際に暗号化するために左から右へ。 766 00:48:34,400 --> 00:48:35,810 それでは、ここで我々の5分間の休憩を取りましょう 767 00:48:35,810 --> 00:48:40,730 そして我々が戻ってくるとき、私たちは情報にスクランブルをかけるのは、このプロセスを開始します。 768 00:48:42,020 --> 00:48:43,520 >> かしこまりました。 769 00:48:43,520 --> 00:48:48,070 、我々はいくつかの暗号に飛び込むと、これらのものは、アレイと呼ぶ前に 770 00:48:48,070 --> 00:48:51,470 私は本当に一種の混乱したように私は感じるので、私に何か質問のために一時停止させ 771 00:48:51,470 --> 00:48:54,080 これらのトピックのいくつか。だから我々は、可能であれば今度は、修正しましょう​​。 772 00:48:54,080 --> 00:48:58,700 我々は、ちょうど戻り値の話、我々は、引数の話 773 00:48:58,700 --> 00:49:03,250 そして我々は、来て、我々は数週間内に戻ってくる、この概念、について話しました 774 00:49:03,250 --> 00:49:08,720 のいわば、これらの積み重ねられたトレーの全体の束のようにメモリを表示して、 775 00:49:08,720 --> 00:49:12,660 このような最高の底からそのスタックに置かれる各トレイ 776 00:49:12,660 --> 00:49:16,530 現在呼び出されている関数を表す。 777 00:49:17,900 --> 00:49:20,260 何か質問? 778 00:49:20,260 --> 00:49:22,640 私はここに質問をさせてください。 779 00:49:22,640 --> 00:49:27,890 私はそれが我々の以前のQ&Aの一部の前にあったものにこのバックを簡素化しましょう 780 00:49:27,890 --> 00:49:35,570 増分は開き括弧、int型の数値を持っているという事実は、括弧を閉じて - 781 00:49:35,570 --> 00:49:39,110 int型の数字は何を表すのでしょうか? 782 00:49:39,110 --> 00:49:42,790 [学生]引数。 >>引数。オーケー。しかし、引数は何ですか? 783 00:49:42,790 --> 00:49:46,370 [聞き取れない生徒の応答] >>これは何ですか?あなたはインチ渡すこと>> [生徒]サムシング 784 00:49:46,370 --> 00:49:49,940 さて、あなたが興味を通過して、より一般的には、それだけで入力だと何か。 785 00:49:49,940 --> 00:49:52,450 あなたは生活の中で関数とその関数の目的を書いていた場合 786 00:49:52,450 --> 00:49:55,770 、少し何か違う、あなたがそれを使用するたびに行うことです 787 00:49:55,770 --> 00:50:00,110 その後、実際に起こるための唯一の方法は、入力とそれを提供することであるように思えるでしょう 788 00:50:00,110 --> 00:50:03,510 その入力とするたびに異なる何かを行うことができますように。 789 00:50:03,510 --> 00:50:06,650 >> ですから、関数が入力を取るときに2つの項目を指定する必要があります。 790 00:50:06,650 --> 00:50:09,590 あなたは、その入力につけたい名前を指定する必要が 791 00:50:09,590 --> 00:50:12,700 純粋に自分の都合のために、あなたはそれを参照できるように 792 00:50:12,700 --> 00:50:16,540 私は32行目でここに行ったように、あなた自身が、書いていると機能が変更されます。 793 00:50:16,540 --> 00:50:20,800 しかし、あなたはまた、Cはプログラミング言語であるため、そのタイプを指定する必要が 794 00:50:20,800 --> 00:50:25,940 それはただ、あなたが変数として使用したいなら、あなたはそれが何であるかのデータ型をコンピュータに指示されている必要があります 795 00:50:25,940 --> 00:50:30,200 大部分はその変数に割り当てる何ビットを知っているように、 796 00:50:30,200 --> 00:50:33,020 それが6である可能性があるため - 申し訳ありません、それは6ではありません。 797 00:50:33,020 --> 00:50:37,080 それが16になることができ、それが8することができます、それは、あっても32個、64個できます 798 00:50:37,080 --> 00:50:39,130 が、コンピュータが認識する必要があります。 799 00:50:39,130 --> 00:50:43,180 さて、左側にintは対照的に、何を表す? 800 00:50:46,350 --> 00:50:48,850 [聞き取れない生徒の応答] >>これは何ですか? >> [生徒]関数のタイプ。 801 00:50:48,850 --> 00:50:53,610 関数のタイプと、より具体的には、その出力のタイプを指定します。右。 802 00:50:53,610 --> 00:50:57,380 だから括弧内のものに対し、その入力があれば、表し 803 00:50:57,380 --> 00:50:59,660 左側にあるものは、その出力を表します。 804 00:50:59,660 --> 00:51:03,530 この場合、増分は明らかに、intを返します 805 00:51:03,530 --> 00:51:07,690 ので、int型では、この関数の戻り値の型です。 806 00:51:07,690 --> 00:51:09,340 それは何を返すためにどういう意味ですか? 807 00:51:09,340 --> 00:51:15,090 文字通りには、キーワードreturnを使用してから、あなたが戻ってきたらどう 808 00:51:15,090 --> 00:51:18,600 キーワードの右側に、整数である 809 00:51:18,600 --> 00:51:21,660 その後、それは我々が約束したことと実際に一致している。 810 00:51:21,660 --> 00:51:26,410 それは、文字列であるため、 - こんにちは、世界 - あなたはこのような何かをすることができませんでした。 811 00:51:26,410 --> 00:51:28,860 >> 明らかに、それは整数ではありません。 812 00:51:28,860 --> 00:51:33,140 だから要するに、負担が特異的であるように、私たちに本当にプログラマです 813 00:51:33,140 --> 00:51:37,770 我々は戻っているし、実際にそれを返すことについては移動するものとして。 814 00:51:37,770 --> 00:51:43,440 ここでコンテキストは、コンピュータのメモリがギガバイト、2ギガバイトであるということです - 815 00:51:43,440 --> 00:51:45,920 何でも - それがさらに多分、多分それは少ないですが、 816 00:51:45,920 --> 00:51:49,050 しかし、コンピュータは、さまざまなセクションを持っているとして、それを見ている。 817 00:51:49,050 --> 00:51:51,200 何かがダウンした場合、何か他のものは、そこに上がる 818 00:51:51,200 --> 00:51:54,290 、別のものは真ん中に行き、今日は我々だけで話をし始める 819 00:51:54,290 --> 00:51:56,340 しかし、我々はこれ以上の時間に戻ってくる。 820 00:51:56,340 --> 00:51:59,980 今のところ、我々は本当に気にメモリの唯一の作品は、テキストセグメントである 821 00:51:59,980 --> 00:52:03,360 ただ、0と1をそのClangのを表すために出力した。 822 00:52:03,360 --> 00:52:06,050 だからあなたがa.outのようなキーボードでコマンドを実行するとき 823 00:52:06,050 --> 00:52:09,110 または、ダブル、Mac OSやWindows上のアイコンをクリック 824 00:52:09,110 --> 00:52:11,880 あなたのプログラムは、あなたのハードドライブからRAMにロードされ 825 00:52:11,880 --> 00:52:16,330 それはいわば、コンピュータのRAMの最上部にそのまま流している。 826 00:52:16,330 --> 00:52:20,450 一方、あなたのプログラムが起動すると実行され、mainが呼び出される 827 00:52:20,450 --> 00:52:23,640 あなたが書いたプログラムまたはプログラムで、MicrosoftやAppleが書いた 828 00:52:23,640 --> 00:52:27,860 そのローカル変数のいずれかは、コンピュータのメモリの最下部にそこに終わる。 829 00:52:27,860 --> 00:52:33,230 メイン自体は変数や引数を持っていることを別の関数を呼び出す場合、しかし、彼らはそれの上に終わる。 830 00:52:33,230 --> 00:52:36,680 その関数が何かを呼び出した場合と、彼らはそれの上に、その上に、それより上になってしまう。 831 00:52:36,680 --> 00:52:41,460 >> と一度だけ関数の実行が終了するトレーのスタックは、いわばんが、 832 00:52:41,460 --> 00:52:43,240 どんどん低く取得を開始する。 833 00:52:43,240 --> 00:52:48,250 そして、これはキューブを呼び出すときに、一言で言えば、理由を説明するものである 834 00:52:48,250 --> 00:52:51,550 あなたはインクリメントを呼び出したり、値のコピーを渡しています。 835 00:52:51,550 --> 00:52:55,520 や絵を用いて何を意味するかすれば、文字通りナンバー1を書いているということです 836 00:52:55,520 --> 00:53:00,460 メモリの別の部分で、その増分変更の場合には1から2 837 00:53:00,460 --> 00:53:04,820 離れて、そのメモリを投げたり、キューブの場合は8とその後 838 00:53:04,820 --> 00:53:09,140 とすぐにインクリメントまたはキューブ関数を返している。質問。 839 00:53:09,140 --> 00:53:12,900 [学生]グローバル変数が保存されますか? 840 00:53:12,900 --> 00:53:18,100 グローバル変数は、現在初期化されたデータまたは未初期化データと呼ばれるものに格納されています 841 00:53:18,100 --> 00:53:21,920 グローバル変数を使用していて、すぐに値を割り当てることがあれば違いがある 842 00:53:21,920 --> 00:53:24,640 等号と、それは、そこに上部に終わる 843 00:53:24,640 --> 00:53:29,200 あなただけのint型のxを言う場合と、値なしで、RAM内にわずかに低く終わる 844 00:53:29,200 --> 00:53:31,710 単に慣例により。 845 00:53:31,710 --> 00:53:34,940 その他の質問は?かしこまりました。 846 00:53:34,940 --> 00:53:37,340 我々はより強力になるように、この絵は戻ってくるだろう 847 00:53:37,340 --> 00:53:39,170 我々はコンピュータを使って何ができるかと、 848 00:53:39,170 --> 00:53:42,720 しかし今のところ、のは暗号化を簡単にイントロを持ってみましょう 849 00:53:42,720 --> 00:53:46,080 世界のすべての問題を解決するわけではありません暗号の特定のタイプ 850 00:53:46,080 --> 00:53:47,720 が、それらのいくつかを解決しますか。 851 00:53:47,720 --> 00:53:51,700 ここでは、このケースでは、我々は、秘密鍵暗号と呼ばれるものを持っています。 852 00:53:51,700 --> 00:53:56,410 秘密鍵暗号では、名前が示すように、秘密からその安全性を導き出します。 853 00:53:56,410 --> 00:54:00,690 >> あなたは小学校に戻っていたとした場合例えば、あなたはちょっとした秘密の愛の手紙を渡していた 854 00:54:00,690 --> 00:54:04,850 あなたが聴衆を介して、そのノートを渡したい場合は、上の破砕された男の子か女の子に、 855 00:54:04,850 --> 00:54:08,380 あなたはおそらく、英語で、ノートを書いたり、何でもあなたの母国語ではないだろう。 856 00:54:08,380 --> 00:54:13,340 むしろ、あなたはそれを暗号化したり、あなただけのこれらの日彼らにテキストメッセージを送信することがあります。 857 00:54:13,340 --> 00:54:15,460 しかし、あなたが実際に教室の中にそれらにメモを渡すことがあります。 858 00:54:15,460 --> 00:54:18,700 お友達や先生にそのような方法で確実にこれを実行するには 859 00:54:18,700 --> 00:54:22,650 あなたが書いているかわからない、あなたは、かなり単純なアルゴリズムを思いつくかもしれません 860 00:54:22,650 --> 00:54:25,920 あなたは若いかもしれないけど、言葉だけをスクランブルする。 861 00:54:25,920 --> 00:54:28,130 だから代わりに書き込むのは、bを書くかもしれない 862 00:54:28,130 --> 00:54:30,220 代わりにCを書くことがあるbの、 863 00:54:30,220 --> 00:54:32,140 Cの代わりには、等dを書き、可能性があります。 864 00:54:32,140 --> 00:54:34,360 それとも、より洗練された翻訳を考え出すこと 865 00:54:34,360 --> 00:54:36,720 異なる文字への手紙。 866 00:54:36,720 --> 00:54:39,740 しかし、漁獲量はこのノートを送っている人に男の子か女の子です 867 00:54:39,740 --> 00:54:45,020 明らかに、何か何かを、知っている必要があります? >> [生徒]あなたは何を送っている。 868 00:54:45,020 --> 00:54:49,720 あなたの秘密はさんとBさんとCさんとDさんの間に、そのマッピングが何であるかのように、何ですか。 869 00:54:49,720 --> 00:54:54,650 それだけでAからB、BからCへ行くの各文字に1を加算していますか? 870 00:54:54,650 --> 00:54:56,670 それはそれよりもっと複雑なのですか? 871 00:54:56,670 --> 00:55:01,540 >> だから、あなたとあなたのときめきは、この秘密情報を持っている必要があります 872 00:55:01,540 --> 00:55:03,190 しかしここでキャッチ22の種類があります。 873 00:55:03,190 --> 00:55:06,830 これは非常に初めての場合は、クラスを使用してこの愛の手紙を送っている 874 00:55:06,830 --> 00:55:10,720 どのようにその男の子か女の子は秘密でも何であるか知っているのだろうか? 875 00:55:10,720 --> 00:55:13,930 だから、秘密鍵暗号では、世界のすべての問題を解決するわけではありません 876 00:55:13,930 --> 00:55:16,320 との関係は、私たちが学期の終わりの方に戻ってくることをここに実際にあるのです。 877 00:55:16,320 --> 00:55:25,110 同様に私たちのほとんどは、Amazon.comで、例えば、働く人を知らない 878 00:55:25,110 --> 00:55:28,190 そしてまだ私たちの多くは、おそらく、Amazon.comでものを買った 879 00:55:28,190 --> 00:55:31,990 そして我々は、これらの電子商取引のトランザクションが安全であることを仮定して教えられてきた。 880 00:55:31,990 --> 00:55:36,470 URLは、愚かな小さな南京錠のアイコンがどこかに多分あり、httpsを多分言う 881 00:55:36,470 --> 00:55:39,930 あなたのクレジットカード情報を保護する暗号技術のいくつかの種類があり 882 00:55:39,930 --> 00:55:42,160 あなたとAmazon.comの間。 883 00:55:42,160 --> 00:55:45,430 暗号が含まれる場合は、まだいくつかの秘密を知っている 884 00:55:45,430 --> 00:55:48,620 そしてまだ私はアマゾンで誰も知らないと私は確かに秘密の任意の種類を配置していないた 885 00:55:48,620 --> 00:55:52,710 Amazonで誰かと、どのように私のコンピュータまたは私のブラウザがこれをやっている? 886 00:55:52,710 --> 00:55:55,720 暗号化の他のタイプは、その問題を解決することを完全にあり、それはアウトになります。 887 00:55:55,720 --> 00:55:57,670 しかし、今日のために、我々は単純なものに焦点を当てていきます 888 00:55:57,670 --> 00:56:00,290 あなたには、いくつかの秘密を知っているため、事前に手配することができますどこに 889 00:56:00,290 --> 00:56:03,760 のような1またはのaとbの間の一部のマッピング。 890 00:56:03,760 --> 00:56:05,840 と暗号化のプロセスは、一般的にこれを伴います。 891 00:56:05,840 --> 00:56:08,620 あなたは左でここに示されているいくつかのプレーンテキストを、持っている 892 00:56:08,620 --> 00:56:12,930 あなたはそれを暗号化するためのアルゴリズムや手順のいくつかの種類を使用してそれを実行 - 893 00:56:12,930 --> 00:56:15,100 多分それだけのBになり、BはCになります - 894 00:56:15,100 --> 00:56:17,490 そして、あなたは暗号文で終わる。 895 00:56:17,490 --> 00:56:20,380 一方、一度あなたのときめきは、この秘密のノートを受け取る 896 00:56:20,380 --> 00:56:24,200 彼または彼女は、一般的にそのアルゴリズムを逆にすることによって、それを復号化しています 897 00:56:24,200 --> 00:56:27,190 プレーンテキストを取り戻すように。 898 00:56:27,190 --> 00:56:28,960 この物理的な化身があります。 899 00:56:28,960 --> 00:56:31,680 >> 例えば、これは、ちょっとした秘密のデコーダリングです 900 00:56:31,680 --> 00:56:35,110 これは2つのダイアルがここにありという意味で、リングです。 901 00:56:35,110 --> 00:56:38,490 この事の外周囲には、AからZまでの文字、そこ 902 00:56:38,490 --> 00:56:40,340 彼らはランダムな順番にしているものの、 903 00:56:40,340 --> 00:56:42,880 そして内側には、いくつかの数字は、実際にはありませ 904 00:56:42,880 --> 00:56:46,620 このリングを使えば、外を回すの一種ではなく、内側にすることができるよう 905 00:56:46,620 --> 00:56:49,140 文字と数字を並べるするために。 906 00:56:49,140 --> 00:56:53,020 クリスマス·ストーリーという映画から、その少しRalphieが表示されます 907 00:56:53,020 --> 00:56:58,000 リトル孤児アニーの秘密のメッセージが彼に何であったかを把握するために熱望していた 908 00:56:58,000 --> 00:57:02,570 そのシリアルの箱に数字メッセージの形で、私が思うに、伝達されていた 909 00:57:02,570 --> 00:57:07,220 そしてあなたは、シリアルの箱に来たすべての小さなカードを蓄積しなければならなかった 910 00:57:07,220 --> 00:57:09,770 あなたがそれらをで郵送しなければならなかった、あなたは秘密のデコーダリングを取り戻す必要があった 911 00:57:09,770 --> 00:57:13,910 あなたは最終的にマッピングは文字と数字の間にあるかを把握できるように 912 00:57:13,910 --> 00:57:15,550 または文字と文字。 913 00:57:15,550 --> 00:57:19,520 我々はこのようなものを実装したり、表現をどのようにコンピュータで行くことができますか? 914 00:57:19,520 --> 00:57:22,560 我々はもう少し柔軟に自分自身を表現する方法が必要 915 00:57:22,560 --> 00:57:25,080 our変数はこれまで許されているよりも。 916 00:57:25,080 --> 00:57:29,000 我々は、我々が文字を持っていたが、int型を持っていた、我々は、floatとdoubleといくつか他の人を見てきた 917 00:57:29,000 --> 00:57:34,200 しかし、それらは本当に私たちが物事を表現することを許していないメモリの個々の部分である 918 00:57:34,200 --> 00:57:36,440 言葉や文章やフレーズのような。 919 00:57:36,440 --> 00:57:38,630 実際、我々はそのようなものの文字列を呼び出しましたが、 920 00:57:38,630 --> 00:57:42,660 しかし、我々はこれが本当にCS50ライブラリ内だけ簡略化したものであることを約束 921 00:57:42,660 --> 00:57:45,540 我々は戻っピールしようとしていること。 922 00:57:45,540 --> 00:57:47,500 ので、ここでそれを行うには始めましょう。 923 00:57:47,500 --> 00:57:49,840 私が先に行くと、ファイルを開いてみよう - 924 00:57:49,840 --> 00:57:54,100 これらのすべてのファイルが利用可能ですが、いつものように、オンライン - いわゆるarray.c 925 00:57:54,100 --> 00:57:58,960 文字列とは無関係の問題を解決するが、それはここで絵を描くために 926 00:57:58,960 --> 00:58:01,520 我々は配列と呼ばれるものを使用する方法の。 927 00:58:01,520 --> 00:58:04,050 >> 配列はデータタイプです。 928 00:58:04,050 --> 00:58:10,730 それはそれの内側に小さな複数のデータ型を持っている一種の変数の型だ 929 00:58:10,730 --> 00:58:12,680 背中合わせに背中合わせにします。 930 00:58:12,680 --> 00:58:16,980 だから例えば、我々はあなたにあなたのクイズの平均を与える小さなプログラムを書きたい場合 931 00:58:16,980 --> 00:58:19,780 2クイズを持っている50のようなコースのため、 932 00:58:19,780 --> 00:58:23,450 あなたは非常に簡単であっても、先週の材料の一部に基づいて、このプログラムを書くことができます 933 00:58:23,450 --> 00:58:28,830 getIntおよびいくつかの変数を使用して:int型quiz1、int型quiz2。 934 00:58:28,830 --> 00:58:30,550 そしてそれはかなり簡単です。 935 00:58:30,550 --> 00:58:33,500 これは、プログラムを実装するために多分10、コードmaxの20行だ 936 00:58:33,500 --> 00:58:38,940 2クイズのスコアをユーザーに要求し、それらの平均値を計算し、その 937 00:58:38,940 --> 00:58:42,020 、それらを加算し2で割って、その結果を印刷します。 938 00:58:42,020 --> 00:58:46,400 我々は、おそらく分をいくつか実行したあとでかなり容易になりましたことを行うことができます。 939 00:58:46,400 --> 00:58:49,450 しかし、問題は50が3クイズや4を持っていたと仮定するということです。 940 00:58:49,450 --> 00:58:52,830 あなたはクイズを毎週持っていたクラスに同じプログラムを使用していたと仮定します。 941 00:58:52,830 --> 00:58:55,100 クイズを毎週持つクラスを考える。 942 00:58:55,100 --> 00:58:58,840 学期中に16人ほど週があれば、今あなたが16の変数を持っている: 943 00:58:58,840 --> 00:59:03,030 int型quiz1、int型quiz2、int型quiz3、int型quiz4。 944 00:59:03,030 --> 00:59:06,870 この冗長性を見始めるとすぐに、これは、コピーしてコードの貼り付け 945 00:59:06,870 --> 00:59:09,810 それはあなたがより良い方法があったならばなあ作るために開始する必要があります。 946 00:59:09,810 --> 00:59:13,610 そしてありがたいことに、なぜなら配列の存在です。だから、これを実行してみましょう。 947 00:59:13,610 --> 00:59:16,700 まず、私たちがこれまで使用されていませんでしたことを非常に単純なものを紹介しましょう​​、 948 00:59:16,700 --> 00:59:18,820 しかし、あなたは、コード内で時折それを見ることができます。 949 00:59:18,820 --> 00:59:21,270 >> これは一般的に定数と呼ばれるものです。 950 00:59:21,270 --> 00:59:24,410 だから、この値が変わることはないという意味では一定です。 951 00:59:24,410 --> 00:59:26,450 定数を作成する人間の慣習 952 00:59:26,450 --> 00:59:30,420 ちょうどので、それが本当にあなたのコードの中で際立っていることを、すべて大文字を使用することです 953 00:59:30,420 --> 00:59:34,270 そしてあなたがC言語で使用する特殊なキーワードは、#defineされている。 954 00:59:34,270 --> 00:59:39,970 だから我々は#次に、その後、あなたは一定の名前に使いたい単語をスペースを定義すると言う 955 00:59:39,970 --> 00:59:41,730 その後一定の値。 956 00:59:41,730 --> 00:59:44,710 これは、変数に何かを割り当てるとは異なることに注意してください。 957 00:59:44,710 --> 00:59:46,430 等号全くありません、セミコロンはありません。 958 00:59:46,430 --> 00:59:49,140 これは、一般的にはプリプロセッサディレクティブとして知られているものである 959 00:59:49,140 --> 00:59:50,840 その別の時間で、より多くの。 960 00:59:50,840 --> 00:59:56,350 今のところ、これはクイズと呼ばれる不変の価値を創造する 961 00:59:56,350 --> 00:59:58,290 その実際の数値は2です。 962 00:59:58,290 --> 01:00:02,180 だから、どこでも、このファイル全体クイズ、クイズ、クイズを参照してください 963 01:00:02,180 --> 01:00:04,230 それはただのナンバー2だ。 964 01:00:04,230 --> 01:00:06,550 私は今、主を見てみると、これがどのように機能するかを見てみましょう。 965 01:00:06,550 --> 01:00:09,770 最初に、それは少し不可解に見えますが、それは第1週からのすべてのものです。 966 01:00:09,770 --> 01:00:12,210 グレードのユーザーに依頼します。どのように我々はこれを行うのですか? 967 01:00:12,210 --> 01:00:17,350 22行目では - これは本当にジューシーな一部である - 私はfloatを宣言する 968 01:00:17,350 --> 01:00:23,240 それだけではない一つの浮動小数点。私は、むしろ、浮動小数点値の配列を宣言しています。 969 01:00:23,240 --> 01:00:27,700 その変数は、ここで暗示として、グレードと呼ばれようとしている 970 01:00:27,700 --> 01:00:31,420 しかし、新しい構文の唯一の作品は、これらの角括弧です。 971 01:00:31,420 --> 01:00:37,280 私はその後、フロートグレードしてから、開き括弧と番号を言ってきたという事実 - 972 01:00:37,280 --> 01:00:40,980 これは、これはちょうど私達がこれをしたようなものである定数であると気付いて - 973 01:00:40,980 --> 01:00:46,840 これは、 "ねえ、コンピュータ、私に2山車を与え、それらを総称グレードと呼びましょう"という意味です。 974 01:00:46,840 --> 01:00:51,780 >> これは、このような多くの退屈なプロセスと対照的になっています。floatグレード1; 975 01:00:51,780 --> 01:00:54,580 grade2フロート(以下同様)。 976 01:00:54,580 --> 01:00:58,310 だから、配列は、私たちはこのアイデアを実装することができますが、あまりだらしなく、 977 01:00:58,310 --> 01:01:04,560 我々は、と言うのではなく、16週間の学期のための16のコードの1行を書き込むことができるような方法で。 978 01:01:04,560 --> 01:01:09,060 あなたが論理的に今、このことを考えるとので、私はハードコード2にしたくなかった、 979 01:01:09,060 --> 01:01:12,560 3〜CS50変更が代わりにクイズ来年仮定 980 01:01:12,560 --> 01:01:15,010 と私はここで数字の2を持っていた、私は、ここに数字の2を持っていた 981 01:01:15,010 --> 01:01:17,210 私はここ2、ここに数値を数字の2を持っていた。 982 01:01:17,210 --> 01:01:19,890 それは非常に面倒で、台無しにするのは非常に簡単になります 983 01:01:19,890 --> 01:01:26,550 と誤って3から1の値を変更し、2のいくつかの他の値を欠場する。 984 01:01:26,550 --> 01:01:30,660 だから私は、この離れて代わりに抽象的に行くと、この定数を使用していること 985 01:01:30,660 --> 01:01:32,520 その名前が示唆するように、決して変化しません。 986 01:01:32,520 --> 01:01:35,870 そして今、我々は別の持っているかどうかに関係なく、今年または次のクイズません 987 01:01:35,870 --> 01:01:39,380 私はちょうど一番上にここに一つの場所でそれを変更する必要があります。 988 01:01:39,380 --> 01:01:41,230 だからそれはすべての定数があるのです。 989 01:01:41,230 --> 01:01:47,100 一方、新しい概念の特徴は、配列のことです。 990 01:01:47,100 --> 01:01:55,030 だから、角括弧は私にこの多くの山車を与えると私は総称して、ここでそれらのグレード呼び出すことができます。 991 01:01:55,030 --> 01:01:56,720 だから今私は何をするつもりか見てみましょう。 992 01:01:56,720 --> 01:01:59,220 ここでは24行目のforループの始まりです。 993 01:01:59,220 --> 01:02:03,380 >> これは本当に何も空想です。それだけでハードコードされた番号の代わりにクイズを使っている。 994 01:02:03,380 --> 01:02:06,740 しかし、先週からそこに知的に異なるものは何もありません。 995 01:02:06,740 --> 01:02:11,650 これは( "%dの%dをクイズ"など)ので、printf関数、printfのです 996 01:02:11,650 --> 01:02:16,670 私はちょうど私が2の番号1をクイズしてから2の2与えるプリントアウトしたいので。 997 01:02:16,670 --> 01:02:18,480 だから、これは純粋に美的なものです。 998 01:02:18,480 --> 01:02:21,000 しかし、興味深い部分は、今や27行になっています。 999 01:02:21,000 --> 01:02:27,840 浮動小数点値を持つ2つのプレースホルダのいずれかを記入するためには、 1000 01:02:27,840 --> 01:02:29,640 あなたは再び角括弧を使用します。 1001 01:02:29,640 --> 01:02:35,170 このforループは明らかに、私がどのような値に等しいを始めているので、この場合、私は私を使用しています? 1002 01:02:35,170 --> 01:02:36,670 [学生] 0。 >> [マラン] 0。 1003 01:02:36,670 --> 01:02:40,990 だから、このループの最初の反復で、それは私がこれをコードで書いたかのようですが、 1004 01:02:40,990 --> 01:02:46,310 私は私のコードでこれを書いたかのように、このループの2回目の繰り返しでは、それはある。 1005 01:02:46,310 --> 01:02:49,970 名前が示すように、ので、しかし、私は変数を使用しているという事実は、完璧です 1006 01:02:49,970 --> 01:02:52,600 それは、繰り返しごとにその値を変化させている 1007 01:02:52,600 --> 01:02:55,900 ので、私はこの配列を一度に1つのスポットを充填しています。 1008 01:02:55,900 --> 01:02:57,380 この配列はどのように見えますか? 1009 01:02:57,380 --> 01:03:01,570 私はここで、画面上の超単純な四角形を描いた理由は前にこのような理由のためだった。 1010 01:03:01,570 --> 01:03:05,590 配列はメモリの別のチャンクが続くメモリの塊です 1011 01:03:05,590 --> 01:03:08,570 メモリの別のチャンクが続くなど。 1012 01:03:08,570 --> 01:03:13,120 私の配列はここで、この場合は大きさが2であるのであれば、すべて私がやっているであろう 1013 01:03:13,120 --> 01:03:20,200 私のクイズの得点を入力してここ好き - 私はこの1つに100を得た後、私はこの1つに99を持って - 1014 01:03:20,200 --> 01:03:24,970 私はコンピュータのみを尋ねてきたので、このメモリがあっても使用できない場合があります 1015 01:03:24,970 --> 01:03:26,840 サイズ2の配列のため。 1016 01:03:26,840 --> 01:03:28,600 これらの四角は右、ま​​だそこにいる? 1017 01:03:28,600 --> 01:03:32,670 あなたはまだ、わずか2山車を求めている場合でも、2 GBのRAMを持っています。 1018 01:03:32,670 --> 01:03:36,840 だから配列の背後にある考え方は、コンピュータは単なるメモリの塊がかかるということです 1019 01:03:36,840 --> 01:03:41,340 その後背中合わせにし、背中合わせに小さなピースをapportions。 1020 01:03:41,340 --> 01:03:43,310 そしてそうそれはすべての配列であるのです。 1021 01:03:43,310 --> 01:03:47,350 >> それはあなたが物事を置くことができるそのうちのメモリ内部の連続するチャンクです。 1022 01:03:47,350 --> 01:03:50,700 そして、これはほんの一部の退屈な算術演算を行うことを起こる。 1023 01:03:50,700 --> 01:03:54,640 私はここで下にスクロールすると、これは私がその配列を反復処理する場所です。 1024 01:03:54,640 --> 01:03:58,020 私は、配列内のすべての値の合計を思い付く 1025 01:03:58,020 --> 01:04:02,470 そして私は実際にクイズで割った値の合計を行うにはここをラウンド関数を使用します。 1026 01:04:02,470 --> 01:04:06,320 しかし、私は今のところ十分な算術の一種としてその時点で私の手を振ってみましょう。 1027 01:04:06,320 --> 01:04:08,370 しかし、私のためにやっていることすべてが、最終的に平均を計算している。 1028 01:04:08,370 --> 01:04:13,580 だから、最初のクイズプラス第二クイズは2で割った後、int型としてそれをプリントアウトする。 1029 01:04:13,580 --> 01:04:17,280 しかし、今ではstring1と呼ばれる別の例に遷移してみましょう 1030 01:04:17,280 --> 01:04:20,700 これは、似たような絵が、使用して文字列を描画します。 1031 01:04:20,700 --> 01:04:23,940 私が先に行くと、ちょっとこれを簡素化することができます。 1032 01:04:23,940 --> 01:04:27,090 今のインデントをお許しください。 1033 01:04:27,090 --> 01:04:30,870 この例の19行目に注目してください、私はユーザから文字列を取得します。 1034 01:04:30,870 --> 01:04:34,640 しかし、私は次の行に22以降をやっていることに気づく。 1035 01:04:34,640 --> 01:04:41,250 私は実際にiから最大反復している - これは新しいトリックです - strlenは、文字列の長さ。 1036 01:04:41,250 --> 01:04:44,880 これはつまり、あなたが文字列を渡す場合、Cが付属機能である 1037 01:04:44,880 --> 01:04:47,730 それは、その文字列内にあるどのように多くの文字がわかります。それがすべてです。 1038 01:04:47,730 --> 01:04:51,550 そして、それは代わりに文字列の長さのstrlenのだという事実は、それがより簡潔だという理由だけです。 1039 01:04:51,550 --> 01:04:55,100 30年前、人々は、簡潔に、できるだけのことを書くのが好きだった 1040 01:04:55,100 --> 01:04:57,630 ので、ここではその規則を守ってきた。 1041 01:04:57,630 --> 01:05:00,660 iは+ +だけで、各反復でiをインクリメントを意味します。 1042 01:05:00,660 --> 01:05:02,990 そして今、本当に興味深いです、これに気づく。 1043 01:05:02,990 --> 01:05:09,180 24行目では、私が言うには、 "コンピュータは、私に8ビット文字を与えると、それをCと呼ぶ。" 1044 01:05:09,180 --> 01:05:12,630 しかし、これは言って右側には何ですか? 1045 01:05:13,490 --> 01:05:16,530 英語では、それが何を表すのでしょうか? 1046 01:05:16,530 --> 01:05:18,730 [学生]配列内の最初の文字。 1047 01:05:18,730 --> 01:05:20,790 その通りです。私の配列の最初の文字を与える。 1048 01:05:20,790 --> 01:05:24,090 または、より一般的には、私に、配列内のi番目の文字を与える。 1049 01:05:24,090 --> 01:05:26,100 そして今、それが重要だという認識のコンピュータ科学者として、 1050 01:05:26,100 --> 01:05:27,890 私たちは実際に0からカウントしている。 1051 01:05:27,890 --> 01:05:29,720 >> あなたはこれをやって起動するようになりました裁量権を持っていない。 1052 01:05:29,720 --> 01:05:34,160 ここでは、コンピュータの期待に従って動作し、0からカウントする必要があります 1053 01:05:34,160 --> 01:05:38,180 [0]があるため、文字列の最初の文字であることを行っている 1054 01:05:38,180 --> 01:05:42,150 [1]第二になるだろう、[2]など第三になるだろう、とされています。 1055 01:05:42,150 --> 01:05:49,720 したがって、このプログラムは、私はそれをコンパイルした場合、これが再びstring1があるので、string1が作る、 1056 01:05:49,720 --> 01:05:54,670 そして今、私は私の端末ウィンドウでstring1が実行しようとしました。 1057 01:05:54,670 --> 01:05:58,330 、これは、入力を待っているので、私は入力して、ダビデに入力するつもりです 1058 01:05:58,330 --> 01:06:02,540 私がやっていることに気づくので、今では別の行にすべてのデイビッドを出力します。 1059 01:06:02,540 --> 01:06:05,820 私は、一度に1つの文字を印刷しています。 1060 01:06:05,820 --> 01:06:10,100 我々は、この上に今日の詳細には触れませんが、私はここに、このチェック前の瞬間を削除しました。 1061 01:06:10,100 --> 01:06:15,480 それは、ユーザーが敵対、ふらちな、あるいは単に混乱していることが判明した場合 1062 01:06:15,480 --> 01:06:20,210 あなたが実際にいくつかの長さの文字列を与えることに失敗することがあります。 1063 01:06:20,210 --> 01:06:22,860 あなたには、キーボード上で誤ったキーを叩いてしまった場合は、まったく文字列を与えないかもしれませんが、 1064 01:06:22,860 --> 01:06:26,950 あなたが悪意なら、または、あなたはエッセイのギガバイトの価値に貼り付けしようとするかもしれない 1065 01:06:26,950 --> 01:06:29,290 コンピュータのメモリが不足した場合、この文字列を入力し、ためには、 1066 01:06:29,290 --> 01:06:32,710 それは我々がNULLと呼ばれるこの特別な値を取り戻すために行っていることが判明した。 1067 01:06:32,710 --> 01:06:35,580 だから今のところ、単にNULLと呼ばれるこの特別な値があることを知っている 1068 01:06:35,580 --> 01:06:39,580 それは、私たちが他のものの間で、メモリが不足しているときにチェックすることができます。 1069 01:06:39,580 --> 01:06:45,630 しかし、私は今、string2を開く場合は、ここに違いに気付く。 1070 01:06:45,630 --> 01:06:48,210 string2でここに一つの違いに注目してください。 1071 01:06:48,210 --> 01:06:51,340 string2で、このforループは少し異なっています。 1072 01:06:51,340 --> 01:06:55,010 >> 我々はそれらの別の時間の話ができるように私はNULLを削除しましょう​​。 1073 01:06:55,010 --> 01:06:57,800 今回は、forループについてなにが違う? 1074 01:06:59,620 --> 01:07:01,670 私は、前の例に戻ることができます。 1075 01:07:01,670 --> 01:07:08,580 バージョン2のように、これはバージョン1です。 1、2。 1076 01:07:08,580 --> 01:07:11,980 1、2。 1077 01:07:13,520 --> 01:07:16,660 strlenの呼び出しはどこにあるのでしょうか? 1078 01:07:16,660 --> 01:07:18,860 これは、forループの最初の部分にあります。 1079 01:07:18,860 --> 01:07:21,830 私はこれをやっている理由として、任意の考え?うん。 1080 01:07:21,830 --> 01:07:24,560 [学生]だからあなたは、関数毎回呼び出すことはありません。 1081 01:07:24,560 --> 01:07:26,440 [マラン]我々は、関数ごとに1つの時間を呼び出すことはありませんので。その通りです。 1082 01:07:26,440 --> 01:07:28,300 彼らは超簡単だというforループを思い出してください 1083 01:07:28,300 --> 01:07:31,770 一度この種の初期化、条件、および更新であることを理解しています。 1084 01:07:31,770 --> 01:07:34,750 問題は、条件がループの繰り返しごとに起こることです。 1085 01:07:34,750 --> 01:07:40,010 ので、ここでは、この例では、これが私の条件であるという事実について悪い何ですか? 1086 01:07:40,010 --> 01:07:41,830 [学生]あなたはstrlenを呼び出しています。 1087 01:07:41,830 --> 01:07:44,340 [マラン]あなたは何度も何度も何度もstrlenを呼び出しています。 1088 01:07:44,340 --> 01:07:47,410 しかし、かつて私は、ダビデに入力した、その文字列の長さが5で、 1089 01:07:47,410 --> 01:07:49,650 そしてそれは、ループの繰り返しごとに変更するつもりはない 1090 01:07:49,650 --> 01:07:51,670 文字列は、まだD-V-I-dであるからである。 1091 01:07:51,670 --> 01:07:55,320 だから、これはますます重要な考え方になるために何が起こっているのかでヒントです 1092 01:07:55,320 --> 01:08:00,410 ちょうどコンピュータが不要な仕事を作らない設計上の決定として知られている。 1093 01:08:00,410 --> 01:08:03,920 >> 同様に標準版でpset2、pset2のスニークプレビュー 1094 01:08:03,920 --> 01:08:07,030 実際に暗号の一部数を実装するためにあなたに挑戦しようとしている、 1095 01:08:07,030 --> 01:08:10,410 あなたは両方の暗号化ができるように、暗号化アルゴリズムのいくつかの数、 1096 01:08:10,410 --> 01:08:13,840 ずっとそこにデコード1 Ralphie様および復号化は秘密のメッセージ。 1097 01:08:13,840 --> 01:08:16,810 pset2のハッカー版では、さらに少し行くつもり。 1098 01:08:16,810 --> 01:08:19,649 我々は、実際のコンピュータシステムからあなたにファイルを渡すつもりだ 1099 01:08:19,649 --> 01:08:23,479 それは、ユーザー名と実際の暗号化されたパスワードの全体の束が含まれています 1100 01:08:23,479 --> 01:08:26,939 やハッカーの版のための課題は、これらのパスワードをクラックすることになるだろう 1101 01:08:26,939 --> 01:08:33,200 そして実際にそれらのパスワードを生成するために使用された暗号化、またはどの秘密を見つけ出す。 1102 01:08:33,200 --> 01:08:36,109 そして、我々はここでCの新しい機能を使用することによって、これをやろうとしている 1103 01:08:36,109 --> 01:08:40,630 私はあなたのコマンドライン引数として知られているだけのデモをやること。 1104 01:08:40,630 --> 01:08:44,229 あなた方のうちの何人かは、セクションまたは教科書で見たことがあることがあるため、判明 1105 01:08:44,229 --> 01:08:48,260 主は必ずカッコ内の空隙である必要はありません。 1106 01:08:48,260 --> 01:08:52,430 それは、主はまた、2つの引数を使用して、このように書くことができることが判明 1107 01:08:52,430 --> 01:08:56,870 argcはワード数でargcとargv、 1108 01:08:56,870 --> 01:09:00,020 あなたのコマンドラインでプログラム名の後に入力することを 1109 01:09:00,020 --> 01:09:03,420 とargvは、実際の言葉です。 1110 01:09:03,420 --> 01:09:07,540 そこに角括弧が示唆するようにと、argvは明らかに配列です。 1111 01:09:07,540 --> 01:09:12,210 これは、メモリ内の文字列の後の文字列の後の文字列になるだろう。 1112 01:09:12,210 --> 01:09:16,010 >> それでは、我々はPSET 2で始まるを行うことができるとしているのは、このようなものです。 1113 01:09:16,010 --> 01:09:21,350 私たちは月曜日にに戻ってきて、それを実行することになるでしょう例ですargv1を行った場合に 1114 01:09:21,350 --> 01:09:23,370 それはまだ何もしていないようにも注意してください。 1115 01:09:23,370 --> 01:09:25,490 それはちょうど自分自身の名前を出力します。 1116 01:09:25,490 --> 01:09:31,479 しかし、私はこのプログラムは明らかに反復しているさようならクラス、通知を言うなら 1117 01:09:31,479 --> 01:09:35,479 プロンプトで入力された単語のそれぞれの上。 1118 01:09:35,479 --> 01:09:41,630 そして、我々は、ユーザーがプロンプトで入力した単語へのアクセスを獲得するための手段 1119 01:09:41,630 --> 01:09:49,160 メインintにint型のmain(void)をこの週末から始まる主な変更することです(argc、argv)の 1120 01:09:49,160 --> 01:09:52,050 したがって、コマンドライン引数を生まれてくるだろう。 1121 01:09:52,050 --> 01:09:57,100 そして、一度これで本当に洗練され得る、あなたは本当に頭がクラクラするようなプログラムを書くことができるでしょう 1122 01:09:57,100 --> 01:09:59,610 などの枠を越えて、更に上に行くここでは、この1、 1123 01:09:59,610 --> 01:10:03,940 我々はこれまでが、すべての非常に強力やった機能の一部。 1124 01:10:03,940 --> 01:10:08,950 >> だから我々は、画面上にこれとこれを残しておきます、そして我々は月曜日にお会いしましょう​​。 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]