1 00:00:00,000 --> 00:00:02,200 [Powered by Google Translate] [第3週] 2 00:00:02,200 --> 00:00:03,950 [デビッド·J·マラン - ハーバード大学] 3 00:00:03,950 --> 00:00:07,140 [これはCS50です。 - CS50.TV] 4 00:00:07,140 --> 00:00:10,720 私は我々が前回中断したところの方向で私たちを操縦しましょう​​、 5 00:00:10,720 --> 00:00:13,890 構文についてのよりも少し考え始めた 6 00:00:13,890 --> 00:00:17,150 と特徴点のすべてについて、少し少ないと思いますしようとしている 7 00:00:17,150 --> 00:00:20,630 セミコロンの面でこれまでに順応するには少し時間がかかり、その 8 00:00:20,630 --> 00:00:22,360 と括弧と中括弧、 9 00:00:22,360 --> 00:00:25,630 上位概念レベルに物事を少し取って開始する 10 00:00:25,630 --> 00:00:28,800 そう、我々は今、次の数週間に渡って解く問題開始 11 00:00:28,800 --> 00:00:32,340 より高いレベルの概念的な問題に多くを巻き込むつもりです 12 00:00:32,340 --> 00:00:36,310 あなたの足が濡れるような構文で、ビット未満 13 00:00:36,310 --> 00:00:40,090 構文のいくつかのこれらの過去数週間からで汚れ、あなたの手。 14 00:00:40,090 --> 00:00:43,690 >> だから先週我々は配列の概念を導入していることを思い出してください。 15 00:00:43,690 --> 00:00:49,320 と英語で配列がどのように記述することができますか? >> [聞こえない学生の応答] 16 00:00:49,320 --> 00:00:51,710 申し訳ありませんが? 17 00:00:51,710 --> 00:00:54,810 のコレクションですか? >> [聞こえない学生の応答] >>さて、良い。 18 00:00:54,810 --> 00:00:57,820 アイテムのコレクション。だから我々はスクラッチで配列を見た。 19 00:00:57,820 --> 00:01:01,880 あなたは物事をドラッグすることができたスクラッチのリストの0 1 psetに対する使っていた場合 20 00:01:01,880 --> 00:01:05,410 、一種の目録、オレンジやバナナのように 21 00:01:05,410 --> 00:01:07,100 ことは、配列が何であるかのような種類のものだ。 22 00:01:07,100 --> 00:01:10,980 そして、より多くの技術的には、実際のコンピュータの文脈では、 23 00:01:10,980 --> 00:01:14,730 アレイは、単にメモリの連続するチャンクです。 24 00:01:14,730 --> 00:01:18,590 言い換えれば、あなたは、その後、別のバイトして、その後、別のバイト、別のバイトを、バイトを持っている 25 00:01:18,590 --> 00:01:21,330 そして、写真でそれらのバイトを描くした場合、 26 00:01:21,330 --> 00:01:24,510 彼らは、背中合わせにし、背中合わせになる。それは我々が連続して何を意味するかだ。 27 00:01:24,510 --> 00:01:26,690 >> だから、その後、バイト数が1、2、3です。 28 00:01:26,690 --> 00:01:29,680 それはここまで、ここまで、ここまで、ここまでというわけではありません。 29 00:01:29,680 --> 00:01:33,800 配列は0バイト以上の連続した​​塊です。 30 00:01:33,800 --> 00:01:36,160 それでは、彼らはのために有用である? 31 00:01:36,160 --> 00:01:40,090 我々はプログラムの中で、人々のクイズの成績を格納する不自然な例のこの種を持っていたリコール 32 00:01:40,090 --> 00:01:42,580 いくつかのコースのためにあなたのクイズの平均を計算し、 33 00:01:42,580 --> 00:01:46,780 そして我々は変数quiz1を宣言することによって、そのプログラムを書き始めることができることを思い出してください。 34 00:01:46,780 --> 00:01:49,550 その後、我々はquiz2と呼ばれる別の変数を持つことができます。 35 00:01:49,550 --> 00:01:52,030 しかし、その後、このクラスでクイズquiz4 3があった場合。 36 00:01:52,030 --> 00:01:55,710 または毎週のクイズがあった場合、それは、quiz7 quiz6 quiz5だろう。 37 00:01:55,710 --> 00:01:58,520 だから、メインの中で宣言これらの変数のすべてを持っているでしょう 38 00:01:58,520 --> 00:02:00,470 またはどこか他のプログラムの中で、 39 00:02:00,470 --> 00:02:03,870 そのアプローチの問題は、それは、単にコピーして貼り付けるのは簡単ですが、 40 00:02:03,870 --> 00:02:06,120 それだけで非常に迅速に手に負えなくなります。 41 00:02:06,120 --> 00:02:09,360 禁じる神は実際には30または50クイズクイズを持っています。 42 00:02:09,360 --> 00:02:12,080 それは高校の毎日のスタイルのポップクイズのようなものだ場合は、 43 00:02:12,080 --> 00:02:15,910 あなただけの、宣言された変数の途方もなく長いリストを持っている 44 00:02:15,910 --> 00:02:17,780 これはちょうど非常に迅速に制御不能になる。 45 00:02:17,780 --> 00:02:20,820 それは醜いですが、それを維持するのは難しい、それはタイプミスをするので、はるかに簡単だ 46 00:02:20,820 --> 00:02:23,910 あなたが得る場合、1番号は、プログラムのどこかで入力ミス。 47 00:02:23,910 --> 00:02:26,800 >> だから我々は、代わりに配列の概念を導入しました。 48 00:02:26,800 --> 00:02:30,760 そして、我々はこのように少し何かをすることで、このプログラムを実施していることを思い出してください。 49 00:02:30,760 --> 00:02:33,950 私は、今日のソース3月曜日ディレクトリに行ってみよう 50 00:02:33,950 --> 00:02:37,160 我々は最後の時間を見て配列を開く。 51 00:02:37,160 --> 00:02:39,940 と新しいCのトリックのカップルがここにあったにもかかわらず、 52 00:02:39,940 --> 00:02:41,920 それらの間の一定の概念、 53 00:02:41,920 --> 00:02:47,140 この構文を使用して、我々は本質的に、複数の浮動小数点数を宣言したことを思い出してください。 54 00:02:47,140 --> 00:02:51,750 float型は、変数の名前が、次に私たちが初めて本当に角括弧を使用し、 55 00:02:51,750 --> 00:02:55,450 我々はそれらの角括弧の中に何をしたかを効果的に番号を入れた。 56 00:02:55,450 --> 00:02:59,780 しかし、代わりに番号を入れて、私はクイズ、この大文字の単語を入れた。 57 00:02:59,780 --> 00:03:03,220 とクイズのように大文字で始まる単語を置くための動機は何だった 58 00:03:03,220 --> 00:03:08,170 その後、実際にその数を与えるためにここに17行目のトリックを使用していますか? 59 00:03:08,170 --> 00:03:11,240 そこに動機は何でしたか?うん。 60 00:03:11,240 --> 00:03:13,360 >> [聞き取れない生徒の応答] >>その通りです。 61 00:03:13,360 --> 00:03:16,630 我々は値2を変更したい場合、我々は1つだけの場所でそれを変更する必要が 62 00:03:16,630 --> 00:03:19,680 考慮するために - 私もこのプログラムが正確に何をしたか覚えていない、 63 00:03:19,680 --> 00:03:22,040 しかし、あなたはそれをすくい取る場合は、クイズ、クイズを参照してください。 64 00:03:22,040 --> 00:03:24,720 あなたがダウンしてここにもっとクイズ、クイズを参照してください。 65 00:03:24,720 --> 00:03:28,180 我々は、これは一定持っていなかったのであれば、シャープのこの使用が定義する、 66 00:03:28,180 --> 00:03:33,320 我々は、罰金である、次に2の場合、2の場合、2、2を入力したと思います。それはちょうどとして正しいだろう。 67 00:03:33,320 --> 00:03:36,220 しかし、我々はCS50で3クイズを持って、来年と仮定します。 68 00:03:36,220 --> 00:03:39,190 私は、コードを移動して、更新する必要があるので、私はそれを再コンパイルする必要があり、 69 00:03:39,190 --> 00:03:43,820 私は愚かな何かをする場合、私は2の1の言及を見落とすようですが、問題があり、 70 00:03:43,820 --> 00:03:46,750 と3プラグインに忘れ、全体のプログラムは非常によく壊れる可能性があります。 71 00:03:46,750 --> 00:03:48,720 だから我々はちょうどトラブルを求めている。 72 00:03:48,720 --> 00:03:53,170 >> だから、一定の概念は、データの一部のうちファクタリングがすべてです 73 00:03:53,170 --> 00:03:56,070 それは、文字列またはcharやfloatや何なのか 74 00:03:56,070 --> 00:04:00,070 あなたがより容易に将来的にそれを変更できるようにし、それを1ヶ所を宣言。 75 00:04:00,070 --> 00:04:03,660 そしてそれは、あなたがちょうど今これを考えるなぜならもし読んで、率直に言って、また少し簡単だ 76 00:04:03,660 --> 00:04:07,840 それはクイズですか、私たちもそれをNUMBER_OF_QUIZZESのようなものの名前を変更することができる 77 00:04:07,840 --> 00:04:09,430 より明示的に、または何か。 78 00:04:09,430 --> 00:04:11,830 コー​​ドだけで、それが何をするとしてもう少し明らかになる 79 00:04:11,830 --> 00:04:15,780 と、番号2が意味するように何が起こるか少し疑問に思う。 80 00:04:15,780 --> 00:04:18,920 アレイと根本的には何の関係もありませんでした定数がそう。 81 00:04:18,920 --> 00:04:22,990 配列は、これらの角括弧の方法が紹介されました。 82 00:04:22,990 --> 00:04:26,610 >> だから、23行目では、我々はユーザーに尋ねることがわかり、 "クイズの得点は何でしたか?" 83 00:04:26,610 --> 00:04:31,120 その後、我々はちょうど明らかに彼らのグレードのユーザーに尋ね、このループを持っています。どうやって? 84 00:04:31,120 --> 00:04:37,460 これは、0〜2の繰り返し処理を行います。すべて大文字でクイズが現在2であるので、私は2を言う。 85 00:04:37,460 --> 00:04:42,310 ので、最大0〜2の繰り返し処理を実行して、それは#何かの何かをクイズプリントアウト 86 00:04:42,310 --> 00:04:45,830 そして、次に、それはユーザから値を取得するgetFloatはを使用しています。 87 00:04:45,830 --> 00:04:49,050 だから、これは先週の水曜日から、構文の唯一の他の新しい作品であることに気づく。 88 00:04:49,050 --> 00:04:53,120 あなたは、その配列内の特定の場所で何かを保存したい場合は、 89 00:04:53,120 --> 00:04:55,460 あなたは再び角括弧を使用します。 90 00:04:55,460 --> 00:04:57,030 >> だから二分法のビットがここにあります。 91 00:04:57,030 --> 00:04:59,040 あなたは、角括弧を初めて使用するとき 92 00:04:59,040 --> 00:05:02,250 あなたは配列になりたいどれくらいの大き指定するためにそれを使用します。 93 00:05:02,250 --> 00:05:06,580 しかし、ここではこの次のコンテキスト私たちは再びこれらの角括弧を採用場所 94 00:05:06,580 --> 00:05:10,540 その配列には、いくつかの値を入れたいですかどこ意味ですか? 95 00:05:10,540 --> 00:05:13,650 そしてここでの区別は文脈から推測することができます。 96 00:05:13,650 --> 00:05:17,130 我々は、データ型を持ってここで注目し、我々は、変数の名前を持っている 97 00:05:17,130 --> 00:05:20,770 次に我々は、セミコロン、内部番号との角括弧を持っています。それはそれだ。 98 00:05:20,770 --> 00:05:22,290 だから宣言だ。 99 00:05:22,290 --> 00:05:28,390 フロートgrade2、それは我々がフロートグレード1のような何かをやったかのようにです; 100 00:05:28,390 --> 00:05:31,730 しかし、再び、これは非常に迅速に、あまりにも多くのコピー、ペーストに委譲 101 00:05:31,730 --> 00:05:34,260 ので、代わりに私達はちょうどそういうものとしてそれを簡略化し、 102 00:05:34,260 --> 00:05:38,800 これは、今後我々は、ブラケット0で保存することができるグレードを持っていることを意味 103 00:05:38,800 --> 00:05:41,760 我々は、ブラケット1で保存することができる別のグレードを持っている 104 00:05:41,760 --> 00:05:46,890 しかし、私がへまいただくと、例えば、私のループはこれまで行く - 105 00:05:46,890 --> 00:05:48,740 例えば、私は、これより小さいか等しいこと 106 00:05:48,740 --> 00:05:50,620 そのリコールは、以前のバグの原因だった - 107 00:05:50,620 --> 00:05:55,590 を効果的にこのループのいくつかのサード偶発的反復であることを意味 108 00:05:55,590 --> 00:06:00,380 私はブラケット2を使用します。効果的に、ここで何が起こるのでしょうか?申し訳ありませんが? 109 00:06:00,380 --> 00:06:02,860 [学生]それを交換する必要が起こっている。 >>それは交換するつもりですか? 110 00:06:02,860 --> 00:06:04,520 何を交換するか? 111 00:06:04,520 --> 00:06:10,890 これは文字通りgetFloatはの戻り値を持つ位置2にあるものを置き換えると言っています。 112 00:06:10,890 --> 00:06:13,690 しかし、問題は、物語の中で、この時点で配列がどのくらいですか? 113 00:06:13,690 --> 00:06:17,730 [聞き取れない生徒の応答] >>配列のサイズが2の唯一残っている 114 00:06:17,730 --> 00:06:22,730 我々はそれを使用する前に、アレイは、任意の変数と同様に、最初に宣言されたため、 115 00:06:22,730 --> 00:06:27,220 そして我々は、私が入れてするつもりだ2グレードを持っているので、この定数のここで指定された。 116 00:06:27,220 --> 00:06:29,930 >> しかし、覚えて、コンピュータ科学者は0からカウントを開始します。 117 00:06:29,930 --> 00:06:33,620 だから、その配列内の最初の位置はブラケット0です。 118 00:06:33,620 --> 00:06:40,210 次の位置は1です。このことは、側に上すぎて、ほんの少しです。 119 00:06:40,210 --> 00:06:42,870 だから、他の言葉で、私は実際にこの配列を持っている場合 - 120 00:06:42,870 --> 00:06:46,790 そして私は、この私たちのためにここに協力する方法も見てみましょう - 121 00:06:46,790 --> 00:06:52,360 私は、単に次のように描かれてきた配列を持っている場合 122 00:06:52,360 --> 00:06:56,750 と私は2つの要素のためのスペースを割り当てられましたが、私はメモリではこのように、これを描くかもしれません 123 00:06:56,750 --> 00:06:58,020 どこでこの大きな白いキャンバスです。 124 00:06:58,020 --> 00:07:00,920 それはちょうど私が私のコンピュータを持っているのRAM、RAMのギグ、RAMの2ギグ、何でも、 125 00:07:00,920 --> 00:07:05,400 しかし、これら2つのボックスは、今個別にフロート、32ビットを表します。 126 00:07:05,400 --> 00:07:10,860 私は1.0のようにここに1番号を入れてもしそうなら、私は3.2のようにここに別の番号を入れて 127 00:07:10,860 --> 00:07:15,280 しかしその後、私はここで何かを置くようなものだブラケット2を、行う。 128 00:07:15,280 --> 00:07:17,820 絵が示唆するようにと、何もそこにはありません。 129 00:07:17,820 --> 00:07:20,450 私は、オペレーティング·システムを求めていないので、それは人の土地のようにソートの一つだ 130 00:07:20,450 --> 00:07:23,550 私は、この第三クイズを得た。 131 00:07:23,550 --> 00:07:26,940 私は第三のクイズをしたいやった場合、私は深慮があったはず 132 00:07:26,940 --> 00:07:31,700 宣言することによって、それのためのオペレーティング·システムに依頼することはしない2となるようにクイズ 133 00:07:31,700 --> 00:07:34,210 その代わりに3と等しくなる。 134 00:07:34,210 --> 00:07:39,000 >> だから、他の言葉で、我々は効果的に手に持っている絵は、ここでこのように見えます。 135 00:07:39,000 --> 00:07:42,260 これは再びノーマンズランドです。私たちはより良い値をここに書いてみません。 136 00:07:42,260 --> 00:07:45,300 しかし、再び、コンピュータ科学者は、0からカウントするので、 137 00:07:45,300 --> 00:07:49,520 我々は配列にこの場所について話すとき、それは、0の位置することになっている 138 00:07:49,520 --> 00:07:53,890 この場所は1であることになっているが、これはあっても存在しません 139 00:07:53,890 --> 00:07:57,380 ので、我々は2つ​​しかそのような場所のためにオペレーティング·システムを尋ねた。 140 00:07:57,380 --> 00:08:00,130 他の言語のプログラミング経験を持つあなたのそれらだから 141 00:08:00,130 --> 00:08:04,150 これは常にベクトルと呼ばれる配列や物事の場合ではないことを知っているかもしれません。 142 00:08:04,150 --> 00:08:06,930 むしろ、あなたはただ、配列に物事を追加し、追加し、追加し続けることができ 143 00:08:06,930 --> 00:08:10,720 れ、率直に言って、我々は、スクラッチでその能力を持っていたし、まだ我々はここでそれをあきらめているように見える 144 00:08:10,720 --> 00:08:15,160 Cであるため、はるかに明示的にプログラミングされています。 145 00:08:15,160 --> 00:08:17,980 それは今あなたとコンピュータだけだし、コンピュータだけやろうとしている 146 00:08:17,980 --> 00:08:19,530 あなたは何をすればいいか指示してくれる。 147 00:08:19,530 --> 00:08:24,270 ですから、ここでしかライン22を介してあなたに2山車を与えるためにそれを指示した場合、 148 00:08:24,270 --> 00:08:27,640 それはあなたがオペレーティングシステムから戻って得ようとしているすべてのです:2のためのスペース。 149 00:08:27,640 --> 00:08:34,049 >> だからますますあなたのプログラムは時々、配列に関してバギーになるだろうしている。 150 00:08:34,049 --> 00:08:37,520 私たちのすべてが誤りを犯しがちなアールそれによってこれは、ただ獣の性質のようなものです 151 00:08:37,520 --> 00:08:42,490 といくつかの点であなたの配列の境界を越えて非常に高いインデックスます。 152 00:08:42,490 --> 00:08:45,980 そして、それはちょうどあなたが何かのブラケットに入ったしゃれた言い方だ 153 00:08:45,980 --> 00:08:49,970 と何かが数あまりにも大きかった。あなたの配列の範囲を超えました。 154 00:08:49,970 --> 00:08:51,530 しかし、逆さまには今これです。 155 00:08:51,530 --> 00:08:54,990 このプログラムの残りの部分は本当に配列とは根本的に何もしています。 156 00:08:54,990 --> 00:08:58,180 それはちょうど、コンピューティング平均のためのいくつかの単純な算術演算が全てだ。 157 00:08:58,180 --> 00:09:03,200 だから我々は我々が0に初期化した変数と呼ばれる和最初にここにこのforループでここに持っている。 158 00:09:03,200 --> 00:09:09,020 その後、我々は再び0から2まで反復し、我々はその総和変数に追加 159 00:09:09,020 --> 00:09:12,620 i番目のグレードなので、ブラケット0次にブラケット1。 160 00:09:12,620 --> 00:09:15,130 そしてあなたは、平均を計算するために小学校で行われるように 161 00:09:15,130 --> 00:09:19,420 我々は、単に、その総和を取るクイズの総数で割っ 162 00:09:19,420 --> 00:09:22,520 その後ついでに我々はラウンドと呼ばれるここで関数を呼び出します。 163 00:09:22,520 --> 00:09:28,580 >> さて、余談ですが、34行目では、この括弧内のint型との契約は何ですか? 164 00:09:28,580 --> 00:09:31,730 それはセクションで既に出ているかもしれませんが、本当に、正式にここでそれについて話をしていない 165 00:09:31,730 --> 00:09:35,210 しかし、括弧内のこのintはおそらく何をやっている? >> [聞こえない学生の応答] 166 00:09:35,210 --> 00:09:38,500 ええ、これは、鋳造や型キャストを指し 167 00:09:38,500 --> 00:09:41,690 これは、1つのデータ型を取り、別のに変換することを意味します。 168 00:09:41,690 --> 00:09:45,400 時にはそれは少し奇妙になるので、あなたは、すべてのデータ型を使用してこれを行うことはできません。 169 00:09:45,400 --> 00:09:49,640 しかし、この場合には、ラウンドの場合、戻り値は浮動小数点数です 170 00:09:49,640 --> 00:09:53,880 なぜなら、2のように、すべての後、私はfloatを取っていると数で除算し 171 00:09:53,880 --> 00:09:55,840 私はfloatを取り戻すつもりです。 172 00:09:55,840 --> 00:10:00,760 しかし、小学校の人々は彼らの平均は93.4であったことを知って本当に好きではない 173 00:10:00,760 --> 00:10:04,420 彼らはこれまでの95丸めポイントにとても近かったので、気づくでしょう。 174 00:10:04,420 --> 00:10:09,540 >> だから我々は、代わりに最も近いintに皆を丸めるためにintを使用したい 175 00:10:09,540 --> 00:10:12,730 このケースではそれはそれの後にノーポイントで94になるだろう。 176 00:10:12,730 --> 00:10:14,530 だからほんの少し数学的なトリックです。 177 00:10:14,530 --> 00:10:17,570 それが意味を持つことになるため、我々は、鋳造のこの概念に戻ってくる 178 00:10:17,570 --> 00:10:21,640 あなたは既に発見されていない場合、問題は2を設定します。 179 00:10:21,640 --> 00:10:25,210 配列その後だから、あなたが考えることができます - それは私が一日中笑顔にすることになるだろう。 180 00:10:25,210 --> 00:10:27,830 あなたはそれの絵を描く場合は、次のようになります。 181 00:10:27,830 --> 00:10:31,460 しかしキーはサイズがまたあなたによって選択されていることである 182 00:10:31,460 --> 00:10:34,050 あなたは、オペレーティングシステムからそれを要求したとき。 183 00:10:34,050 --> 00:10:39,460 アレイ上次に何か質問はありますか?うん。 184 00:10:39,460 --> 00:10:47,080 [聞こえない学生の質問] 185 00:10:47,080 --> 00:10:49,310 ああ、良い質問。 186 00:10:49,310 --> 00:10:53,150 質問は、配列内のNULLを0に何が起こるか?それは、このコンテキストに存在しません。 187 00:10:53,150 --> 00:10:57,430 それが唯一の私たちが一瞬でに来て約ている文字列のコンテキスト内に存在します。 188 00:10:57,430 --> 00:11:02,300 しかし、配列のため、この場合のように、あなたが得るすべてはあなたができるようにオペレーティング·システムを求めるものである。 189 00:11:02,300 --> 00:11:04,050 >> そして余談ですが、これがはっきりしないことがないように、など 190 00:11:04,050 --> 00:11:07,030 私はあなたのオペレーティングシステムを尋ねると、オペレーティングシステムに頼む言い続ける。 191 00:11:07,030 --> 00:11:10,090 オペレーティングシステムは、あなたはおそらく知っているように、Mac OSは、Windows、Linuxです。 192 00:11:10,090 --> 00:11:13,560 あなたはgetFloatはのような関数を呼び出しているとき 193 00:11:13,560 --> 00:11:19,280 またはあなたは、グレードのような変数を宣言している 194 00:11:19,280 --> 00:11:23,200 一日の終わりには、効果的に他の誰かがあなたにそのメモリを与えるように求めている 195 00:11:23,200 --> 00:11:25,940 意欲的なプログラマーとしてなぜなら我々 196 00:11:25,940 --> 00:11:28,800 実際にメモリへの物理的なアクセスを取得する方法はわかりません。 197 00:11:28,800 --> 00:11:31,100 しかし、誰かのことを行います。オペレーティングシステム。 198 00:11:31,100 --> 00:11:36,630 だからほかにかなりのアイコンとメニューやフォルダなどを私たちに提示 199 00:11:36,630 --> 00:11:39,050 あなたは、MacまたはPCかどうかを、あなたのデスクトップ上に表示される 200 00:11:39,050 --> 00:11:42,240 オペレーティングシステムも、低レベルの平凡なものを行う 201 00:11:42,240 --> 00:11:44,680 ギガバイトの管理の高度に技術的なもの 202 00:11:44,680 --> 00:11:48,780 またはあなたが持っているメモリの2ギガバイト、あなたが持っているCPUを管理する、など。 203 00:11:48,780 --> 00:11:50,170 ですから、コードを書いているときに、 204 00:11:50,170 --> 00:11:53,900 あなたは本当にその意味では、ご使用のオペレーティング·システムにフッキングしている。 205 00:11:53,900 --> 00:11:55,720 私はそれを最小限にするために持っているつもりです。かしこまりました。 206 00:11:55,720 --> 00:11:59,980 >> アレイに関するその他の質問は? 207 00:12:00,330 --> 00:12:02,520 いいえ?オーケー。 208 00:12:02,520 --> 00:12:06,680 だから当然、配列からの移行は少し馴染みのトピックに実際にある。 209 00:12:06,680 --> 00:12:09,570 そして、我々はあまりにも、この最後の時点でそう簡単に今までに見た。 210 00:12:09,570 --> 00:12:12,500 これは、水曜日からの文字列の例であった。 211 00:12:12,500 --> 00:12:15,060 この文字列の例では、非常に単純なプログラムだった 212 00:12:15,060 --> 00:12:18,120 と私は実際に今日の目的のために、数行でそれを簡略化しました。 213 00:12:18,120 --> 00:12:22,680 それは19行で行うすべては、ユーザから文字列を取得することですsという変数に格納します。 214 00:12:22,680 --> 00:12:28,670 次に22行目以降では明らかに行につき、その文字列1文字を印刷している。 215 00:12:28,670 --> 00:12:30,730 しかし、それはどのようにこれをやっている? 216 00:12:30,730 --> 00:12:33,350 我々は0と等しい値に設定することは、変数iを宣言している、 217 00:12:33,350 --> 00:12:35,770 これは現在、古い習慣になってきています。 218 00:12:35,770 --> 00:12:39,270 我々は水曜日までこれを見ていなかったが、あなたは、その名前から推測する一種の缶 219 00:12:39,270 --> 00:12:44,610 strlenは、単にsを与えられたときに何を返す?文字列の長さ。 220 00:12:44,610 --> 00:12:47,940 だから私はそれを文字列、俗に言うデイヴィッドに渡した場合、 221 00:12:47,940 --> 00:12:51,810 それがうまくいけば、私には理由ダビデの5番を返すために起こっている。 222 00:12:51,810 --> 00:12:55,600 だから、生活の中でのその目的は、ハードコーディングされているかどうかをあなたによって、文字列を取ることであることを 223 00:12:55,600 --> 00:12:58,840 このケースでは、引数として、変数としてプラグイン 224 00:12:58,840 --> 00:13:01,980 そしてそれはその文字列の長さが何であるかを割り出し。 225 00:13:01,980 --> 00:13:06,470 >> だからここに、今、私たちは以前のクイズの例からいくつかの表記を借りています。 226 00:13:06,470 --> 00:13:09,390 これは、浮動小数点数とは何の関係もないクイズとは何の関係もない、 227 00:13:09,390 --> 00:13:13,100 それは小さな白い嘘我々は第1週以来、あなたに言ってきたことが判明 228 00:13:13,100 --> 00:13:16,330 C言語で文字列が実際には存在しないということです 229 00:13:16,330 --> 00:13:20,230 一日の終わりに文字列が実際には単なる配列です。 230 00:13:20,230 --> 00:13:25,140 これは、リコールはわずか8ビットですバイトの配列なので、バイト、バイト、バイト、バイト、、だ 231 00:13:25,140 --> 00:13:28,130 ので、メモリの塊、メモリの塊、メモリの塊、メモリの塊。 232 00:13:28,130 --> 00:13:31,210 と文字列が実装される手段 233 00:13:31,210 --> 00:13:33,070 、ここで最初の文字を入れることである 234 00:13:33,070 --> 00:13:37,470 次にここ、ここ、ここ、バック、コンピュータのメモリにバックアップするバックアップします。 235 00:13:37,470 --> 00:13:42,160 あなたはハローのような単語を綴るたいならだから、あなたは1文字Hをかけることになり、 236 00:13:42,160 --> 00:13:48,240 その後、E、次にLをL、その後O - 合計で5文字 - どこかにコンピュータのRAMインチ 237 00:13:48,240 --> 00:13:52,080 しかし、ここで重要なディテールは、彼らが背中合わせにし、背中合わせになってしまうだろうということです 238 00:13:52,080 --> 00:13:54,200 互いのすぐ隣。 239 00:13:54,200 --> 00:13:58,820 私が言うときs [i]は、英語で何をすること、これが私に与えますか? 240 00:14:01,240 --> 00:14:04,550 S [i]は、このケースでは何を表しているのでしょうか?うん。 241 00:14:04,550 --> 00:14:07,800 >> [学生]文字列中のi番目の文字。まさに>>。文字列中のi番目の文字。 242 00:14:07,800 --> 00:14:12,260 今、私は、ここでループのために私の当たりとして、0から開始する予定です 243 00:14:12,260 --> 00:14:14,850 すべてが0から​​カウントを開始しますので、それは良いことだ。 244 00:14:14,850 --> 00:14:19,160 ので、s [0]は、helloのような単語に文字Hを表すために起こっている、 245 00:14:19,160 --> 00:14:24,530 S [1]などのHELLOのような単語でEのような文字を表現しよう、とされています。 246 00:14:24,530 --> 00:14:27,130 と私たちはこのループの繰り返しごとにやっているように見える 247 00:14:27,130 --> 00:14:32,780 一時的にだけchar型である、cという変数にi番目の文字を格納している、 248 00:14:32,780 --> 00:14:35,010 その後、我々は、cをプリントアウトしている 249 00:14:35,010 --> 00:14:37,620 ように、このプログラムが何をするのか、一日の終わりに、次のとおりです。 250 00:14:37,620 --> 00:14:42,900 私は、ソースディレクトリに移動し、私は、string1を作り、私が先に行くと、string1が実行している場合は、 251 00:14:42,900 --> 00:14:51,920 その後、私はハローのような単語を入力し、入力し、それはないすべては、一度にこの1文字を印刷しています。 252 00:14:51,920 --> 00:14:54,010 >> そこでここでは改良のための機会はある。 253 00:14:54,010 --> 00:14:58,150 私はそれが必要以上に、このように多分より明確には言っても、それ以上の仕事をしているのようなものだ。 254 00:14:58,150 --> 00:15:03,270 コー​​ドのどの行については、ここでは私はおそらく完全に捨てることができますか?うん。 255 00:15:03,270 --> 00:15:08,290 24行目。 24行目では、私は変数cを宣言しています。 256 00:15:08,290 --> 00:15:14,320 私はそれにsのi番目の文字を格納しているんだけど、その後、私はここでcを使用しています。 257 00:15:14,320 --> 00:15:20,160 だから私は、cを使用していますので、私はわずか24行目を投げることができないような気がします。 258 00:15:20,160 --> 00:15:23,850 [聞こえない学生のコメント】>>その通りです。 259 00:15:23,850 --> 00:15:26,240 だから、プログラムの設計の話になると、 260 00:15:26,240 --> 00:15:30,740 同じように読みやすいコードのこのわずかな簡素化を、、気づく 261 00:15:30,740 --> 00:15:34,680 しかし、sがただの変数であり、そのデータ型が配列であることを実感 262 00:15:34,680 --> 00:15:38,610 のように[i]がちょうど瞬時に、その文字列のi番目の文字に戻すために起こっている。 263 00:15:38,610 --> 00:15:40,620 あなたがそれを印刷する場合と、それは大丈夫です。 264 00:15:40,620 --> 00:15:43,680 あなたはただ、あなたは文字列を出力していないため、%cを使用する必要が 265 00:15:43,680 --> 00:15:48,520 あなたは、文字列内の文字を印刷しているが、これはあまりにもi番目の文字を印字するという効果があります。 266 00:15:48,520 --> 00:15:51,390 とprintfを使用して、先週から本当に唯一の違いを思い出す 267 00:15:51,390 --> 00:15:54,220 週間のに対し、我々は超簡単な何かを、過去のことである 268 00:15:54,220 --> 00:15:58,510 %sのプレースホルダーのようにし、ここに文字列の名前、 269 00:15:58,510 --> 00:16:01,190 今、私たちはフードの下に少し深くにダイビングしていると、言って 270 00:16:01,190 --> 00:16:06,090 文字列を出力しません。そこに単一の文字を印刷してください。 271 00:16:06,090 --> 00:16:10,570 >> バグではない - 他の1があるので、だから我々はここでは少し違う何かを行うことができます 272 00:16:10,570 --> 00:16:14,090 このプログラムは右ですが、私は愚かな何かをやっているので、 273 00:16:14,090 --> 00:16:16,810 私は水曜日に簡単に述べている。 274 00:16:16,810 --> 00:16:22,680 しかし、戻って考え、どのようにこのプログラムのデザインはさらに改善されるだろうか?うん。 275 00:16:22,680 --> 00:16:28,280 [聞き取れない生徒の応答] >>ああ、いい。 276 00:16:28,280 --> 00:16:32,120 だから我々はと呼ばれる第二変数n最後の時間を導入したことを思い出し、 277 00:16:32,120 --> 00:16:34,850 前記第2の前に私の目標ので、自分自身を否定しているように見える 278 00:16:34,850 --> 00:16:37,380 、不要として変数を捨てることだけだった 279 00:16:37,380 --> 00:16:40,700 しかし、水曜日に私たちが実際にこれをしなかったことを思い出してください。 280 00:16:40,700 --> 00:16:46,170 私は、その後、n = strlenは、実際にここにカンマを持っているために、forループに変更 281 00:16:46,170 --> 00:16:52,120 その後こっち私は私が 00:16:57,660 私はこれに私の初期設定を変更することで達成していることが根本的な利得とは何ですか 283 00:16:57,660 --> 00:17:01,590 そしてこの今の私の状態? >> [聞こえない学生の応答] >>その通りです。 284 00:17:01,590 --> 00:17:06,170 どのようにループ作品の思い出すので、私は何度も何度もstrlenをリコールしていない。 285 00:17:06,170 --> 00:17:08,790 彼らは、より複雑な見栄えの取得を開始した場合でも、 286 00:17:08,790 --> 00:17:12,480 最初のセミコロンの前に事が一度起こる初期化、であることを思い出してください。 287 00:17:12,480 --> 00:17:14,359 条件は、しかし、真ん中にある、 288 00:17:14,359 --> 00:17:17,710 これは、ループを通過するたびに確認されます。 289 00:17:17,710 --> 00:17:22,420 >> だから、愚かなの一種で、何度も何度もコンピュータにも同じ質問をされるべきだ - 290 00:17:22,420 --> 00:17:25,920 HELLOの長さは何ですか? HELLOの長さは何ですか? HELLOの長さは何でしょうか - 291 00:17:25,920 --> 00:17:29,740 今日我々が見て、水曜日に説明するように、これは間違いなく時間がかかるために起こっているので、 292 00:17:29,740 --> 00:17:34,320 文字列の長さを把握するために、それは時間の非常に良い使用ではありません 293 00:17:34,320 --> 00:17:37,030 実際努力には多少時間がかかります。 294 00:17:37,030 --> 00:17:39,760 それはいくつかの言語であるとして、それは、瞬間的ではありません。 295 00:17:39,760 --> 00:17:43,920 だから、nにこれを変更することによって、私が払っている価格はいくらですか? 296 00:17:43,920 --> 00:17:45,640 我々は、ここでのトレードオフを見ている。 297 00:17:45,640 --> 00:17:49,460 私は、何度も何度も同じ質問をする気はないことで時間を節約できます 298 00:17:49,460 --> 00:17:51,740 それは私に何かを、コストになるだろう? 299 00:17:51,740 --> 00:17:55,050 >> [学生]あなたは、一定量のメモリを失う。まさに>>。それは私にいくつかのメモリをコストになるだろう。 300 00:17:55,050 --> 00:17:56,670 したがって、この場合、それは私に何の費用? 301 00:17:56,670 --> 00:18:01,530 別の32ビットここに単語をintで含意として、nが、ちょうどint型であるためです。 302 00:18:01,530 --> 00:18:03,300 しかし、それは大丈夫ですか? 303 00:18:03,300 --> 00:18:05,800 あなたが考えてみれば率直に言って、それがあるため、おそらく大丈夫だ、 304 00:18:05,800 --> 00:18:09,030 長い文字列は、私は無駄にするつもりだ、より多くの時間です 305 00:18:09,030 --> 00:18:11,920 strlenは、何度も何度も呼び出されるために行っているので 306 00:18:11,920 --> 00:18:13,520 ループの反復ごとに。 307 00:18:13,520 --> 00:18:18,070 そして、これらの日、私のMacには、RAMの2ギグ、このごろたまにRAMの4ギグを持っています。 308 00:18:18,070 --> 00:18:22,420 私は実際に物事をスピードアップするためにそれらのバイトの4を買う余裕ができると思います。 309 00:18:22,420 --> 00:18:26,590 しかし、これはトレードオフとプログラミングとコンピューターサイエンスの本当にテーマになるだろう 310 00:18:26,590 --> 00:18:28,320 本当に無料で何かを得ることはありませんの。 311 00:18:28,320 --> 00:18:32,880 あなたはここで何かを改善したい場合は、何らかの形で他の手でそれを支払う必要があります。 312 00:18:32,880 --> 00:18:35,880 この場合の空間と時間の関係。 313 00:18:35,880 --> 00:18:40,700 >> だから、これはすべて、このような不可解な何かに向かってリードしていた 314 00:18:40,700 --> 00:18:44,070 トしますが、おそらく今で考え出したように、実際に言った? 315 00:18:44,070 --> 00:18:47,420 [聞き取れない生徒の応答] >>うん、そうこれは、あなたのオヴァルを飲むようにしてください 316 00:18:47,420 --> 00:18:52,490 実際にROT13と呼ばれるアルゴリズム、ROTは1から3を使用して、 317 00:18:52,490 --> 00:18:55,500 ただの文字の全13箇所を、回転を意味する 318 00:18:55,500 --> 00:18:58,720 それは取るし、それに13を追加し、ドット、ドット、ドットに行く意味 319 00:18:58,720 --> 00:19:04,640 離れて13日の手紙にすべての方法は、A、BおよびCの等Dのと同じことを行う。 320 00:19:04,640 --> 00:19:10,850 そうだとすれば、我々は実際に、13箇所のシフトを使用して、ここでこれを変換 321 00:19:10,850 --> 00:19:14,580 我々は少しRalphieがあった、なかったものに戻りましょう、あなたのオヴァルを飲むようにしてください。 322 00:19:14,580 --> 00:19:18,160 しかし、今の問題のために、少なくとも、標準版には、2を設定する 323 00:19:18,160 --> 00:19:21,680 あなたは、これは自分自身を暗号化するかの種類に持っている 324 00:19:21,680 --> 00:19:25,990 そして我々は何らかの形でこのような入力に取ると、それか、それを復号化を暗号化する必要があります。 325 00:19:25,990 --> 00:19:29,850 >> それでは、これらのファンダメンタルズのソートのどれがその機会に私たちを導く? 326 00:19:29,850 --> 00:19:32,650 のがここでこの第3の例を見てみましょう。 327 00:19:32,650 --> 00:19:38,430 まず第一に、それは、ASCIIと呼ばれています。 ASCIIに戻って何を指しているのでしょう? 328 00:19:38,430 --> 00:19:40,460 情報交換用米国標準コード、 329 00:19:40,460 --> 00:19:43,850 これは何を言ってのは本当に長い道のりですか? ASCII文字とは何ですか? 330 00:19:43,850 --> 00:19:47,890 [聞き取れない生徒の応答] >>これは何ですか? >> [生徒]キャラクターマップ。 >>キャラクターマップ。 331 00:19:47,890 --> 00:19:51,390 世界は標準化されているので、それはただの文字に数字をマッピング 332 00:19:51,390 --> 00:19:55,380 私たちのすべてがコンピュータを使用できるように、どのような文字は何の数字を表します 333 00:19:55,380 --> 00:19:59,340 と私たちのプログラムはすべて、画面上のものをプリントアウトしに来るときだけ互換性があります。 334 00:19:59,340 --> 00:20:04,680 だから65が表すように起こることを思い出して、97は小文字表現するために起こります。 335 00:20:04,680 --> 00:20:08,510 ので、ここでは、この単純なプログラムは、ASCII、その事実を利用している - 336 00:20:08,510 --> 00:20:12,770 世界は資本が65であることを知っている - そしてそれは単にマッピングの印刷だ。 337 00:20:12,770 --> 00:20:16,320 >> 我々は、このコードに飛び込む前に、私が代わりにターミナルウィンドウを開いてみましょう。 338 00:20:16,320 --> 00:20:21,550 私が先に行くとASCII作成し、そのちょうど出力を台無しにするために、この事を実行してみましょうましょう。 339 00:20:21,550 --> 00:20:25,960 そして、それはまさにこのことを行います私だけに様々なコードのすべてを伝えます本当に大きなチャート 340 00:20:25,960 --> 00:20:27,950 様々な文字のすべてのため。 341 00:20:27,950 --> 00:20:32,100 超簡単なプログラムでは、だから、私はハードコードへの出力のものと52のラインを持っていなかった: 342 00:20:32,100 --> 00:20:34,860 26個の大文字、小文字の26。 343 00:20:34,860 --> 00:20:37,790 代わりに、私はループのカップルを使用してプログラムでこれをしなかった。 344 00:20:37,790 --> 00:20:39,720 私がここで何をしたかに注目してください。 345 00:20:39,720 --> 00:20:44,790 私は、26文字をプリントアウトしたいと思ったので、私は最大65 + 26日に65歳であるから繰り返さ 346 00:20:44,790 --> 00:20:49,860 英語のアルファベット、i + +は、各繰り返しで、今では再びこれを注意してください。 347 00:20:49,860 --> 00:20:52,540 それは私たちの友人に型キャストの再発だ 348 00:20:52,540 --> 00:20:54,620 それによってあなたが別のものに1つのデータ型を変換する 349 00:20:54,620 --> 00:20:57,480 私は、この特定のプログラムではどのように過ごしたいですか理由? 350 00:20:57,480 --> 00:21:02,650 など、65 66、67、 - 私はそれは私が数えて育った方法なので、数値的にカウントしたい - 351 00:21:02,650 --> 00:21:04,420 しかし、私は数字だけを印刷したくない。 352 00:21:04,420 --> 00:21:08,030 私は数字が続く文字列を印刷したい。 353 00:21:08,030 --> 00:21:18,640 数、B:私が印刷したい番号を、私はまったく同じ変数でこれを行うことができます。 354 00:21:18,640 --> 00:21:21,630 だから私は、文字のプレースホルダとして%cをプリントアウト 355 00:21:21,630 --> 00:21:25,080 数字または数字のプレースホルダとしては%d。 356 00:21:25,080 --> 00:21:27,750 それから私は、それらの2つのプレースホルダのために何を差し込むのですか? 357 00:21:27,750 --> 00:21:33,960 私はiの文字と等価の最初のプラグ、そして、私はi自身プリントアウト。 358 00:21:33,960 --> 00:21:36,400 >> だから、これはあまりにもただ働きに気づく。 359 00:21:36,400 --> 00:21:39,320 私はintにfloatからキャストすることができるのと同様に 360 00:21:39,320 --> 00:21:41,750 、実数から整数に行くために 361 00:21:41,750 --> 00:21:46,100 ここで私はintから少し変だchar型、に行くことができます - 362 00:21:46,100 --> 00:21:48,680 非常に現実の世界にマップされていません - しかし、コンピュータで 363 00:21:48,680 --> 00:21:51,140 charは、ボンネットの下にただの数字です 364 00:21:51,140 --> 00:21:53,590 ので、我々は、コンピュータにここに今までので、明示的であると言っている、 365 00:21:53,590 --> 00:21:58,920 printfは、iが65としてではなくプリントアウトし、それに相当する数値として、それをプリントアウトする。 366 00:21:58,920 --> 00:22:02,110 私は技術的にも、これを必要としない、それがアウトになります。 367 00:22:02,110 --> 00:22:05,020 私は少し前にやっていたことは、明示的にキャストされている 368 00:22:05,020 --> 00:22:08,760 私から行くとしたいデータの種類を指定することによって。 369 00:22:08,760 --> 00:22:11,840 しかし、私はすでにこのプレースホルダ%cを持っていることに気付く 370 00:22:11,840 --> 00:22:14,930 ここでは、この他の%cのプレースホルダです。 371 00:22:14,930 --> 00:22:18,880 これはint型でなくても、コンピュータは、そのcharを実現 372 00:22:18,880 --> 00:22:21,080 それはちょうどフードの下にint型です。 373 00:22:21,080 --> 00:22:25,100 >> だから私は実際にこれを再コンパイルおよびASCIIプログラムを再実行した場合、 374 00:22:25,100 --> 00:22:31,210 コンピュータはこの対応関係があることに気づくので、それはまだただ働きに気づく。 375 00:22:31,210 --> 00:22:34,870 さて、それはintにfloat型の世界では明示的なキャストを行うことの方が重要です 376 00:22:34,870 --> 00:22:37,460 そこにあるため、実際には計算された意思決定をしている: 377 00:22:37,460 --> 00:22:40,140 小数点以下のすべてを捨てる。 378 00:22:40,140 --> 00:22:44,990 ここでは文字はただの数字なので、捨てるのには本当に何もありません 379 00:22:44,990 --> 00:22:48,220 と文字列は文字の配列だけです。 380 00:22:48,220 --> 00:22:52,530 だから、いくつかの暗号化または復号化を実装するための時間が来るとき、 381 00:22:52,530 --> 00:22:56,770 それは我々が実際に、このナンセンスのような何かを簡単に翻訳できることをどのように 382 00:22:56,770 --> 00:22:58,670 あなたのオヴァルを飲むようにしてください? 383 00:22:58,670 --> 00:23:02,700 我々は今何を知っていれば - 、そのキーを - のは前提として任せる 384 00:23:02,700 --> 00:23:08,010 我々は、することによって、これらのすべての文字を回転させていた番号は13番ですか? 385 00:23:08,010 --> 00:23:11,800 だから我々は、文字Bから文の先頭にOにすべての方法を行った 386 00:23:11,800 --> 00:23:14,710 私はBを行う場合があるので、iPodオヴァルを飲むようにしてください 387 00:23:14,710 --> 00:23:19,600 そして私は、C、D、E、F、G、H、I、J、K、L、M、N、Oを行く 388 00:23:19,600 --> 00:23:23,760 文字Bの暗号化は、Oになる理由だ 389 00:23:23,760 --> 00:23:26,570 ので、私はちょうどそれに13を追加しました。 390 00:23:26,570 --> 00:23:33,460 >> 私はこの解読したいのであれば、私は基本的にOを取ると、そこから13を減算する必要があります。 391 00:23:33,460 --> 00:23:36,880 アルファベットで26文字があるため、または、率直に言って、これは、素晴らしく対称である 392 00:23:36,880 --> 00:23:41,260 我々はまた、ちょうど13を追加することができ、我々は手紙Bに戻りましょう 393 00:23:41,260 --> 00:23:44,290 しかし、あなたはカイザルに、このようなものを実装する方法を教えてください。 394 00:23:44,290 --> 00:23:46,600 または本当に一般的に文字列を操作する? 395 00:23:46,600 --> 00:23:51,380 文字Bは何番ですか? 396 00:23:51,380 --> 00:23:55,290 Bの文字は何ですか?だからそれは右、66ですか? 397 00:23:55,290 --> 00:23:59,220 もしそうなら手紙は65であり、Bという文字は66であり、 398 00:23:59,220 --> 00:24:03,940 66だから、私がしなければならないすべてはそれに13を追加しており、これは私に79を与える。 399 00:24:03,940 --> 00:24:09,150 そして、我々は少しチートシート、Oの上に79確かにマップに行けば 400 00:24:09,150 --> 00:24:11,290 >> しかし、コーナーケースのビットがここにあります。 401 00:24:11,290 --> 00:24:15,170 文字Z、と言う、何ですか? 402 00:24:15,170 --> 00:24:20,180 我々はアルファベットの最後にすべての方法を得るために66 + 25をすれば、我々は91にいる。 403 00:24:20,180 --> 00:24:24,520 91 + 13は私に104を与えて、どうなったと思う? 404 00:24:24,520 --> 00:24:29,200 104は、大文字と等しくありません。 405 00:24:29,200 --> 00:24:31,610 のは、ここで少しチートシートに戻りましょう。 406 00:24:31,610 --> 00:24:38,070 私はアプライアンス、予告でこのプログラムを再実行した場合、その104、私は端末ウィンドウに戻ってしまったら、 407 00:24:38,070 --> 00:24:41,800 104は明らかに小文字のhです。 408 00:24:41,800 --> 00:24:46,400 だから我々は、我々はZで起動したときにことを確認するために、ここでいくつかの重要なトリックが必要 409 00:24:46,400 --> 00:24:50,260 そして我々は我々だけでどんどん大きく数字に前進し続けたくないそれに13を追加します。 410 00:24:50,260 --> 00:24:52,600 私たちは本当に何をしたいのですか? 411 00:24:52,600 --> 00:24:54,570 あなたの周りをラップしたい。 412 00:24:54,570 --> 00:25:00,250 >> だから、あなたが今、セクションまたは問題セットのスペック自体は、おそらく見てきたように、結局 413 00:25:00,250 --> 00:25:05,730 また、パーセント記号はCで、この他の演算子があることに気づき、 414 00:25:05,730 --> 00:25:11,020 しかし、我々はプレースホルダを指定するここで%を使用していたのに対し、 415 00:25:11,020 --> 00:25:15,420 特に問題セット2に、このようなものもあり、ことを知っている: 416 00:25:15,420 --> 00:25:18,990 int型のX = Y%Z。 417 00:25:18,990 --> 00:25:22,770 私はちょうどこの非常に一般的な形として、これを提示しましょう​​。 418 00:25:22,770 --> 00:25:25,580 パーセントは、プログラミング言語で何を意味する? >> [生徒]モジュロ。 419 00:25:25,580 --> 00:25:28,790 残りをしゃれた言い方ですモデューロ、。 420 00:25:28,790 --> 00:25:31,620 そこの定義と若干の違いがありだとしても、 421 00:25:31,620 --> 00:25:37,210 この手段は、zをy​​に分割するが、その除算の結果を返すことはありません。 422 00:25:37,210 --> 00:25:39,650 代わりに、残りの部分を返す。 423 00:25:39,650 --> 00:25:47,390 >> yは実際には3であり、zは、2で割った実際には2、3であるのであれば、1の残りの部分との1である 424 00:25:47,390 --> 00:25:51,550 だから何このシナリオでは、xが実際に等しいのですか? 1。 425 00:25:51,550 --> 00:25:54,540 これは、このような単純な低レベルのアイデアです。 426 00:25:54,540 --> 00:25:56,480 それはあなたの心がそれを包ん得るために少し時間がかかり 427 00:25:56,480 --> 00:25:58,740 あなたも、余り気にしなければならなかったので、それはおそらく、しばらくしているので、 428 00:25:58,740 --> 00:26:01,160 そして実際に、意図的な何かのためにそれらを使用する 429 00:26:01,160 --> 00:26:05,290 しかし、この場合には、3のように大きい数から行くことができるという単純な事実 430 00:26:05,290 --> 00:26:08,920 その後2など比較的少数に効果的に包み込む 431 00:26:08,920 --> 00:26:14,160 1のような小さい値に、残りを使って、非常に貴重なトリ​​ックであることを行っている 432 00:26:14,160 --> 00:26:17,690 私たちはカエサルのような何か、この他の事Vigenereの両方を使用することができます 433 00:26:17,690 --> 00:26:22,240 問題に2を設定しますが、これは学期を通して繰り返しトリックであることを行っている。 434 00:26:22,240 --> 00:26:24,880 ちょうど一般の剰余を取るのはこの単純な、シンプルなアイデア 435 00:26:24,880 --> 00:26:26,530 私達が一周できるようにするつもりです。 436 00:26:26,530 --> 00:26:31,140 そして、我々はメモリ自体でより多くの再生を開始するように我々は、配列でもっと遊んで開始すると、 437 00:26:31,140 --> 00:26:35,800 これは強力なトリックのより多くなろうとしています。 438 00:26:35,800 --> 00:26:43,420 >> ASCIIまたは配列として文字列の表現上の、任意の質問がそう? 439 00:26:43,420 --> 00:26:47,430 そして、我々は更に1ノッチそれを取るよ。うん。 440 00:26:47,430 --> 00:26:52,350 [聞こえない学生の質問】>>良い質問です。 441 00:26:52,350 --> 00:26:55,370 変数はそれの前にアスタリスクがある場合、それはどういう意味ですか? 442 00:26:55,370 --> 00:26:57,720 、私は詳細に答えることを延期しましょう 443 00:26:57,720 --> 00:27:00,100 それはポインタとして知られているトピックを参照します。 444 00:27:00,100 --> 00:27:03,440 ポインタはメモリに関係しており、我々は実際には今日だ 445 00:27:03,440 --> 00:27:06,330 その議論に向かって第一歩を踏み出し、 446 00:27:06,330 --> 00:27:08,600 しかし今のところ、私はスターが存在しないことを考えてみましょう 447 00:27:08,600 --> 00:27:15,380 そして我々は、char *を使用するのではなく、文字列の文字列を呼び出し続けます 448 00:27:15,380 --> 00:27:19,530 そのあなたがおそらく今まで見てきたと私はティーザーとして一瞬で画面上に置くことにしましょう​​。 449 00:27:19,530 --> 00:27:23,010 だから我々は、おそらく好きになるでしょうあなた方の多くよりもずっと詳細にそれに戻ってくる。 450 00:27:23,010 --> 00:27:25,760 結局、今日は説明しません。うん。 451 00:27:25,760 --> 00:27:42,810 >> [聞こえない学生の質問] 452 00:27:42,810 --> 00:27:47,080 どのようなコンテキストでは、文字の符号を提供する必要がありますか? >> [生徒]うん。 453 00:27:47,080 --> 00:27:52,130 だからデフォルトでは、+を入れていないときに、ちょうど正の数値が想定されます。 454 00:27:52,130 --> 00:27:55,390 単に数字の1を書くのであれば、それは正の1だ。 455 00:27:55,390 --> 00:27:57,710 あなたが実際に値の否定を指定したい場合は、 456 00:27:57,710 --> 00:28:01,060 あなたは文字通り、キーボードの-1をしなければならない。 457 00:28:01,060 --> 00:28:20,440 しかし、これはおそらく、あなたの質問ではありません。 >> [聞こえない学生の応答] 458 00:28:20,440 --> 00:28:22,200 >> 良い質問です。オーケー。 459 00:28:22,200 --> 00:28:24,970 だから、これはあなたがぶつかったバグのいくつかの種類で、私が収集し、関係している 460 00:28:24,970 --> 00:28:27,640 あなたは、整数を文字に変換されたため 461 00:28:27,640 --> 00:28:29,780 何とかネガティビティは、関与した 462 00:28:29,780 --> 00:28:32,380 などの文字がちょうど何とかmunged出てきた。 463 00:28:32,380 --> 00:28:36,710 だから今のところ、我々はこの種の話題に戻って来るまで、私は少し単純化し過ぎることができます。 464 00:28:36,710 --> 00:28:39,570 これは単純化しすぎであると - 今のところは、この事物の方法だと思う。 465 00:28:39,570 --> 00:28:43,500 しかし、整数の世界では、あなたの処分でどのように多くのビットを持っている? 466 00:28:43,500 --> 00:28:45,190 あなたは32ビットを持っています。 467 00:28:45,190 --> 00:28:49,030 そしてこれまで、我々はあなたが故に表現できる整数の総数について説明しました 468 00:28:49,030 --> 00:28:52,430 あなたは32ビットを持っているので、約40億合計であり、 469 00:28:52,430 --> 00:28:55,100 そう、それは約40億だので、32から2です。 470 00:28:55,100 --> 00:28:58,810 しかし、我々はあなたが本当に数字の範囲を持っていないことを一週間か前に見た2 471 00:28:58,810 --> 00:29:01,240 アップ時に0〜4億円となりました。 472 00:29:01,240 --> 00:29:06,340 範囲ではなく、ポジティブにほぼ負の2億人から20億人になる。 473 00:29:06,340 --> 00:29:10,990 しかし、これはその後、負の2億ドルの概念をどのように表現するか、質問しておきたい 474 00:29:10,990 --> 00:29:13,260 1負おろか? 475 00:29:13,260 --> 00:29:17,960 今のところ、我々は単純化し過ぎると、ちょうど我々が左端のビットを使用するつもりだと言うことができます 476 00:29:17,960 --> 00:29:22,380 それは1の場合、これらの32ビットの、そして、それは、負の数だ 477 00:29:22,380 --> 00:29:25,090 もし0を指定した場合、それは正の数です。 478 00:29:25,090 --> 00:29:28,570 負の数の表現を簡略化し、その問題 479 00:29:28,570 --> 00:29:33,700 あなたが意図的に巧妙であると文字から数値に変換しようとしていた場合ということです 480 00:29:33,700 --> 00:29:37,190 (またはその逆)は、負の文字のようなものはありません。 481 00:29:37,190 --> 00:29:42,550 8ビットのみを使用するASCII、これらのビットの主題のすべての8の世界では 482 00:29:42,550 --> 00:29:46,810 そして左端のビットは陰性とは何の関係もありません。 483 00:29:46,810 --> 00:29:49,670 そして、ちょうど、私は一番左のビットを言うときに、明確にすること 484 00:29:49,670 --> 00:29:54,610 我々は最初の週に私たちのビット関連の例をしたときにことを思い出してください 485 00:29:54,610 --> 00:30:02,570 我々はこのような何か、1001101のようなものを描いていることを思い出してください。 486 00:30:02,570 --> 00:30:07,210 私は左端のビットを言うとき、私は文字通りあなたが左に上のすべての方法を記述した1を意味します。 487 00:30:07,210 --> 00:30:11,910 だから、文字の世界では否定的な概念はありません、 488 00:30:11,910 --> 00:30:16,360 ので、左端のビットは実際にはASCII、陰性とは何の関係とは何かを持っている。 489 00:30:16,360 --> 00:30:19,390 >> だから、のように聞こえる - と突拍子もそれが正確に答えるのは難しい - 490 00:30:19,390 --> 00:30:25,840 どういうわけか、あなたのコードは、負の値を表すものとして、その左端のビットを混乱させた 491 00:30:25,840 --> 00:30:29,160 それは本当に問題になっている文字の一部だった。 492 00:30:29,160 --> 00:30:32,250 コンピュータが実際には少し手の込んだ何かをするために、もう一度、私が過ぎたりしています 493 00:30:32,250 --> 00:30:37,080 ちょうど0対負の符号のために1にその左端のビットを変更するよりも。 494 00:30:37,080 --> 00:30:41,270 あなたがGoogleに興味があれば、彼らは代わりに、典型的には2の補数と呼ばれるものを使用、 495 00:30:41,270 --> 00:30:43,830 アプローチのもう少し洗練されている 496 00:30:43,830 --> 00:30:45,490 しかし、アイデアは、最終的には同じです。 497 00:30:45,490 --> 00:30:50,530 >> だから簡単に言えば、それはあなたが数値を文字にマッサージしていたという事実に関係していた 498 00:30:50,530 --> 00:30:53,750 (またはその逆)が、あなたのコードは、事実を認識しませんでした 499 00:30:53,750 --> 00:30:56,510 これらのビットの1は数字の世界で重要性を持っていたこと。 500 00:30:56,510 --> 00:30:59,940 それは文字の世界ではそうではありません。 501 00:30:59,940 --> 00:31:04,270 あなたが今、議論の余地があるその場合には、固定されたようですが、それが聞こえる。その他の質問。 502 00:31:06,030 --> 00:31:07,110 オーケー。 503 00:31:07,110 --> 00:31:11,560 だからこれまで、私たちが書いてきたすべてのプログラムは、ユーザーから多分入力をとっている 504 00:31:11,560 --> 00:31:14,330 場合、getInt、GetStringメソッドのような関数の形で 505 00:31:14,330 --> 00:31:16,990 またはあなたが様々な書籍やオンラインの参考文献に先読みしてきた場合、 506 00:31:16,990 --> 00:31:21,390 あなたがたは、率直に言って、我々はCS50ライブラリで使用、scanfのような関数を使用していたかもしれません。 507 00:31:21,390 --> 00:31:25,370 しかし、週または2に、我々は実際にCS50ライブラリが実装されている方法を紹介します 508 00:31:25,370 --> 00:31:27,890 我々は完全にそれらの補助輪を外すことができるように。 509 00:31:27,890 --> 00:31:31,340 >> ユーザーからの入力を取得する別の方法があるが、それはアウトになります。 510 00:31:31,340 --> 00:31:34,670 実際には、我々自身は、コマンドライン引数を使用してきました 511 00:31:34,670 --> 00:31:36,500 今では数週間のために。 512 00:31:36,500 --> 00:31:41,150 我々はClangのを実行しているか、我々は、makeを実行しているたびに、 513 00:31:41,150 --> 00:31:45,050 私達はちょうど打ち鳴らすを入力していませんが、入力して、我々は、入力、確認入力していない。 514 00:31:45,050 --> 00:31:49,340 我々は、通常、私たちのターミナルウィンドウプロンプトでワードカーンという音の後に何を書かれている? 515 00:31:51,110 --> 00:31:52,900 [学生]ファイル名。 >>ファイル名、右か? 516 00:31:52,900 --> 00:31:57,560 hello.cのか、または何mario.c該当するファイル名です。 517 00:31:57,560 --> 00:32:01,910 その意味で、あなたが本当に何をやったかはClangのの行動に影響を与えてきている 518 00:32:01,910 --> 00:32:05,750 確かにClangのを書いた人々はその少し古い見当を持っていなかったため 519 00:32:05,750 --> 00:32:08,890 mario.c年後と呼ばれるプログラムを書こうとしていた。 520 00:32:08,890 --> 00:32:13,150 だから、何とかして、そのプログラムの動作に影響を与える必要があった 521 00:32:13,150 --> 00:32:18,140 そのプログラムのClangのは、それはあなたからの入力を受け入れることができるような方法で書かれなければなりませんでした 522 00:32:18,140 --> 00:32:23,480 ユーザーのヒットの前にプロンプ​​ト上の単語を添加することによって入力します。 523 00:32:23,480 --> 00:32:27,860 >> だから、しばらくの間、我々は、ほとんどすべての我々のプログラムのを宣言されていることが判明 524 00:32:27,860 --> 00:32:32,840 このように起動します - int型のmain(void)を - そして、我々は先に行ってきた 525 00:32:32,840 --> 00:32:35,110 と私たちのコードを書き始めた。 526 00:32:35,110 --> 00:32:37,910 そして、我々は、ファイルの先頭に含まれていますいくつかのシャープを持っているかもしれません 527 00:32:37,910 --> 00:32:40,660 しかし、ほとんどすべての我々のプログラムのは、これまでこれを始めている 528 00:32:40,660 --> 00:32:44,200 あなたの本に、セクションで見た場合でも、オンラインリファレンス 529 00:32:44,200 --> 00:32:46,570 これは、実際には無効である必要はないこと。 530 00:32:46,570 --> 00:32:55,820 これを有効にするため、他の正規の形式はint argcと次に文字列のargv []である。 531 00:32:55,820 --> 00:32:57,500 だから今、これが暗示されているでしょうか? 532 00:32:57,500 --> 00:33:01,320 それは人間の慣習ですargcは、ことが判明した - あなたはこのfooを呼び出すことができ、 533 00:33:01,320 --> 00:33:03,710 それだけで読者にはるかに少ない明らかになる - 534 00:33:03,710 --> 00:33:09,330 argcはちょうど何を表すメインと呼ばれる関数への引数のですか? 535 00:33:09,330 --> 00:33:12,450 argcは精通している人は何の略ですか? 536 00:33:12,450 --> 00:33:14,980 >> [聞き取れない生徒の応答] >>うん、引数または引数のカウント数。 537 00:33:14,980 --> 00:33:16,510 それはそれと同じくらい簡単です。 538 00:33:16,510 --> 00:33:19,160 このプログラムにどのように多くの引数が渡されたのですか? 539 00:33:19,160 --> 00:33:20,630 どういう意味ですか? 540 00:33:20,630 --> 00:33:27,090 コマンドライン上で私はこのような何かを実行している場合 - 打ち鳴らすmario.c- - 541 00:33:27,090 --> 00:33:35,440 私はEnterキーを打つargcは2、やや紛らわしいが、の値をとるとしている。 542 00:33:35,440 --> 00:33:40,150 だからそれは、argcは引数の数であることが判明 543 00:33:40,150 --> 00:33:46,280 しかし、歴史的な理由により、プログラム自体の名前は、その数に含まれます。 544 00:33:46,280 --> 00:33:51,950 私はmario.c打ち鳴らすを書いたときにそうargcは2です。 545 00:33:51,950 --> 00:33:54,290 argvは何が含まれているのですか? 546 00:33:54,290 --> 00:33:57,020 まず、argvは文字列のように見えなく、かなり 547 00:33:57,020 --> 00:33:59,310 なぜなら前水曜日のように、すべてのより多くの今日、 548 00:33:59,310 --> 00:34:02,890 これらの角括弧は何を意味する?これは配列です。 549 00:34:02,890 --> 00:34:07,110 そこに指定された配列に番号がありません、それは直感的に意味を持ちます 550 00:34:07,110 --> 00:34:10,790 Clangの数年前に書いた人は、確かにわからなかったので、 551 00:34:10,790 --> 00:34:16,300 私たちのようにどのように多くの単語の人はEnterキーを押す前に、プロンプトに入力します。 552 00:34:16,300 --> 00:34:22,280 >> そこでここでは、このケースでは、それらは、引数の配列を取るようにmain関数を宣言しています 553 00:34:22,280 --> 00:34:24,590 0個以上の引数。 554 00:34:24,590 --> 00:34:26,460 彼らは、いくつあるのか事前にわかっていない 555 00:34:26,460 --> 00:34:29,690 ので、これらの角括弧の内部には、数は意図的にありません。 556 00:34:29,690 --> 00:34:32,750 しかし、角括弧があるという事実は、コンピュータを言っている 557 00:34:32,750 --> 00:34:34,639 配列を期待しています。 558 00:34:34,639 --> 00:34:37,489 argvは引数ベクトルのためだけの簡単な表記法です。 559 00:34:37,489 --> 00:34:39,889 ベクターは、配列をしゃれた言い方です 560 00:34:39,889 --> 00:34:42,980 配列はリストまたはコレクションをしゃれた言い方です。 561 00:34:42,980 --> 00:34:47,360 だから、これはちょうどあなたがこのようなメイン書けばことを意味します 562 00:34:47,360 --> 00:34:51,100 代わりに我々は過去数週間のためにそれを行ってきた方法のように、 563 00:34:51,100 --> 00:34:54,699 あなたのプログラムは、コマンドライン引数を受け入れる力を持っている 564 00:34:54,699 --> 00:34:58,520 もはやあなたは、Enterを押すのマリオを記述する必要はないとないように、 565 00:34:58,520 --> 00:35:01,610 その後、あなたはピラミッドになりたい、何ブロック高のために番号を入力 566 00:35:01,610 --> 00:35:03,100 再度Enterを押してください。 567 00:35:03,100 --> 00:35:07,720 私たちも、そのことについてはもう、または場合、getIntまたはgetFloatはGetStringを使用する必要はありません。 568 00:35:07,720 --> 00:35:12,370 我々だけで、ユーザーがプロンプトに自分自身をそれらの単語を入力することを期待することができます 569 00:35:12,370 --> 00:35:16,850 Clangのの作者は、それが本当に迷惑なプログラムになることを決めたのと同じよう 570 00:35:16,850 --> 00:35:20,550 あなたが最初に入力打ち鳴らすコードをコンパイルする場合は、Enterキーを打つ 571 00:35:20,550 --> 00:35:24,090 それから私達はユーザーによると、は、コンパイルするファイルの名前を入力してください 572 00:35:24,090 --> 00:35:26,920 それから私達はmario.cで入力してEnterを押してください。 573 00:35:26,920 --> 00:35:29,850 しかし、それは我々のユーザーに数週間をやってきましたがまさにそれだ。 574 00:35:29,850 --> 00:35:33,550 我々は、GetStringを使用して、プログラムの入力のためにそれらを求めるように実行されるまで、我々は待つ。 575 00:35:33,550 --> 00:35:36,710 ケースのように必要としなくなったこと。 576 00:35:36,710 --> 00:35:41,160 >> そこでここでは、この例では、我々は今、文字列argvを持っている 577 00:35:41,160 --> 00:35:43,390 これは、あまりにも単純化しすぎである 578 00:35:43,390 --> 00:35:45,610 補助輪は非常にすぐに外れます。 579 00:35:45,610 --> 00:35:50,860 これは、メインのこの代替宣言を作成するための、より適切な方法です。 580 00:35:50,860 --> 00:35:54,740 それは私たちが列を呼び出しておくと、実際には、星を持っていることが判明したので、 581 00:35:54,740 --> 00:35:58,440 その実際の定義でアスタリスクが、これは単に複雑に見えますが、 582 00:35:58,440 --> 00:36:02,600 それは、最初は混乱しますので、我々だけである種のシノニムを作成することにより、簡素化 583 00:36:02,600 --> 00:36:09,340 これよりユーザフレンドリーな単語列へのマップはchar *そのCS50ライブラリインチ 584 00:36:09,340 --> 00:36:13,180 >> それでは、実際にはこの後、試してみましょう。私が先に行くと、ここでgeditを開いてみましょう。 585 00:36:13,180 --> 00:36:17,010 私が先に行くと1のargvを開いてみましょう。 586 00:36:17,010 --> 00:36:21,620 このプログラムは明らかに引数を出力するだけでなく、英語の用語で、 587 00:36:21,620 --> 00:36:26,290 このコードを見て、これは、より具体的に何をするのでしょうか? 588 00:36:26,290 --> 00:36:35,910 私は黒と白のウィンドウに出力される内容をコマンドのa.out fooバーに入力した場合は? 589 00:36:35,910 --> 00:36:41,260 a.outのfooバー、入力します。 590 00:36:43,120 --> 00:36:48,300 どうぞ召しあがれ。うん。 >> [聞こえない学生の応答] 591 00:36:48,300 --> 00:36:52,730 グッド。だからa.outの場合、新しい行は、foo、新しいライン、バー、新しい行。 592 00:36:52,730 --> 00:36:54,980 これはなぜですか?我々は確かに一瞬で確認することができます。 593 00:36:54,980 --> 00:36:56,940 これはコードのふわふわラインの一種である。 594 00:36:56,940 --> 00:36:59,560  それはただ単に画面上で物事をよりきれいにするために、新しい行を出力します。 595 00:36:59,560 --> 00:37:03,730 これは、argcは最大で0から繰り返し処理のループです 596 00:37:03,730 --> 00:37:07,210 これは繰り返しのたびにインクリメントされている+ +。 597 00:37:07,210 --> 00:37:12,270 だから、これは今ではこの%sが示すように、文字列を印刷すると言っている。 598 00:37:12,270 --> 00:37:16,460 ARGV [i]は、かなり前の例と同じ考えです。 599 00:37:16,460 --> 00:37:19,580 我々は、変数sを呼び出すために使用されるが、今それは、argv、任意に、呼ばれています。 600 00:37:19,580 --> 00:37:24,270 これは、コマンドラインで入力されたi番目の引数をプリント意味 601 00:37:24,270 --> 00:37:28,690 この全体のことが行われた後、その後、ちょうど良い測定のために別の新しい行を印刷します。 602 00:37:28,690 --> 00:37:31,600 >> だから、これを見てみましょう。私は、ターミナルウィンドウを開いてみましょう。 603 00:37:31,600 --> 00:37:37,470 私は1のargvをコンパイルしてみましょう、そして今私は1のargvを実行させて入力してください。うーん。オーケー。 604 00:37:37,470 --> 00:37:40,850 fooのバーを実行してみましょう。興味深い。バズ。 605 00:37:40,850 --> 00:37:42,640 私はこれを入力すると、なぜあなたが今まで疑問に思ったことがあれば、 606 00:37:42,640 --> 00:37:45,010 これはまた、単に愚かなコンピュータサイエンスの規則です。 607 00:37:45,010 --> 00:37:48,050 世界は、多くの場合、言葉のためのちょうど口頭プレースホルダを必要とします。 608 00:37:48,050 --> 00:37:50,090 だから、あなたには、いくつかの一般的な文字列について話をしたい場合は、 609 00:37:50,090 --> 00:37:53,250 コンピュータ科学者はただ、彼らはランダムな単語を必要なときにfooを言う傾向がある 610 00:37:53,250 --> 00:37:55,530 彼らは第二ランダムな単語が必要な場合、彼らは、バーを言う 611 00:37:55,530 --> 00:37:59,100 その後、彼らは、彼らは3番目のワードを必要としたら、彼らは4番目のワードを必要とする場合、それらはかんぬん言ううんぬん言う 612 00:37:59,100 --> 00:38:01,520 その後かんぬんの後に来るものなどのオンライン巨大な宗教的な議論は、そこ 613 00:38:01,520 --> 00:38:04,940 ので、他の任意の単語がどうあるべきかを把握することをGoogleができます。 614 00:38:04,940 --> 00:38:07,480 しかし、これらは、全く意味を持たない 615 00:38:07,480 --> 00:38:10,100 しかしfooバーは、Googleが、それが意味を持っていませんが、その場合 616 00:38:10,100 --> 00:38:12,780 それはここに語源の一部です。 617 00:38:12,780 --> 00:38:17,550 >> だから、すべてこれは、行ごとに、これらの文字列の1を印刷してやっている。 618 00:38:17,550 --> 00:38:19,900 私は代わりに、しかし、少し手の込んだしたかったのであれば、 619 00:38:19,900 --> 00:38:22,550 私はラインごとに各文字列を印刷したくなかったと仮定してください。 620 00:38:22,550 --> 00:38:26,220 私は、1行ごとに各文字列から各文字を印刷したい。 621 00:38:26,220 --> 00:38:28,550 私の代わりに、どのようにそれを行うだろうか? 622 00:38:28,550 --> 00:38:33,720 私ではない、各単語を印刷したい場合、私はこのプログラムについて変更するには何が必要ですか 623 00:38:33,720 --> 00:38:37,290 しかし、私は、文字ずつで各単語の文字を印刷したい 624 00:38:37,290 --> 00:38:40,590 手紙で手紙でその後次の単語の手紙? 625 00:38:40,590 --> 00:38:43,650 どのように我々はこれまで、これらのアイデアを組み合わせるのですか?うん。 626 00:38:43,650 --> 00:38:47,390 [学生]%C。 >>すべての権利。だから私たちはどこかに%cを必要とする。 627 00:38:47,390 --> 00:38:50,680 良い、私は全体の文字列を出力したくないので、私は、文字を印刷したい。他に何が? 628 00:38:50,680 --> 00:38:54,290 >> [聞き取れない生徒の応答] >>面白い。 629 00:38:54,290 --> 00:38:56,860 だから我々は今ここに2番目の次元の並べ替えが必要 630 00:38:56,860 --> 00:39:02,300 なぜなら配列としてargvのと思うが、それは文字列の配列です。 631 00:39:02,300 --> 00:39:07,170 しかし、の、のように、15分前に、文字列は何ですか?それは文字の配列です。 632 00:39:07,170 --> 00:39:12,320 だから本当に、argvは、文字の配列の配列です。 633 00:39:12,320 --> 00:39:14,870 文字の配列の配列。 634 00:39:14,870 --> 00:39:19,170 だから、我々はちょうどより多くの角括弧表記を使用できることが判明した。だから、これを実行してみましょう。 635 00:39:19,170 --> 00:39:23,650 19行目では、このループの先頭では、私はiからのargcに反復するつもりですが、 636 00:39:23,650 --> 00:39:25,760 しかし、私はこれを行うにするつもりです: 637 00:39:25,760 --> 00:39:27,580 ために - 私は今、私を使用することはできません。 638 00:39:27,580 --> 00:39:30,300 私は言葉を反復したいので、私は、別の変数を必要とする 639 00:39:30,300 --> 00:39:32,640 しかしその後も単語の文字の上 640 00:39:32,640 --> 00:39:37,280 ので、私は一種の縦軸と横軸、概念的の並べ替えを持っている。 641 00:39:37,280 --> 00:39:43,930 だからint型jは0を取得し、私は​​jは未満である限り、jをやってみたい - と私はビットでこれを片づけます。 642 00:39:43,930 --> 00:39:48,410 どのように私は、文字列内の文字を反復するのですか?我々は少し前これをしなかった。 643 00:39:48,410 --> 00:39:54,670 argvのstrlenの[i]とする。グッド。 644 00:39:54,670 --> 00:39:57,860 そして再び、私は、nまたは何を、作成しないことで、ここで少し非効率性を作ってるんだ 645 00:39:57,860 --> 00:39:59,610 しかし、我々はそれに戻ってくる。 646 00:39:59,610 --> 00:40:03,270 >> だから今はJ + +。今、私はここではこれ以上インデントしなければなりません。 647 00:40:03,270 --> 00:40:06,950 私は今、各反復に印刷するには何をしたいですか? 648 00:40:06,950 --> 00:40:09,720 [聞き取れない生徒の応答] >>だから[i]が私に言葉を与えるだろう。 649 00:40:09,720 --> 00:40:12,910 [i] [j]は、マトリックスのような一種の。 650 00:40:12,910 --> 00:40:14,810 数学 - yの背景を持つあなたのそれらの、 651 00:40:14,810 --> 00:40:19,340 我々は、さらに深くこの行列や配列のこの配列へのインデックス付けの一種だ 652 00:40:19,340 --> 00:40:21,380 この2次元構造。 653 00:40:21,380 --> 00:40:25,070 だから今ここで何が起こるか見てみましょう。私は私の大きなターミナルウィンドウを開いてみましょう。 654 00:40:25,070 --> 00:40:28,170 私は1のargvのmakeを再実行してみましょう。 655 00:40:28,170 --> 00:40:33,090 そして私は私があまりにもこれを行うのを忘れたので、良い教訓である、ここでめちゃくちゃになってきました。 656 00:40:33,090 --> 00:40:37,150 暗黙的に型 'の符号なしでCライブラリ関数' strlenは 'を宣言 - 657 00:40:37,150 --> 00:40:40,360 、私もその手段の残り何かわからないが、私は前にこれを見てきました 658 00:40:40,360 --> 00:40:42,000 暗黙的に宣言する。 659 00:40:42,000 --> 00:40:45,540 我々は、このエラーが表示されるたびに、これは通常、何を意味するのでしょうか? 660 00:40:45,540 --> 00:40:48,520 >> [聞き取れない生徒の応答] >>私はトップアップライブラリを忘れてしまった。しかし、少しお待ちください。 661 00:40:48,520 --> 00:40:51,690 私はCS50ライブラリを忘れてしまったので、通常、私はめちゃくちゃになってきたが、それはそこだ。 662 00:40:51,690 --> 00:40:54,480 私は標準のI / Oを忘れてしまったので、通常私がしくじった 663 00:40:54,480 --> 00:40:57,960 率直に言って、私もこれを必要としません。今日はGetStringメソッドを使用していない。 664 00:40:57,960 --> 00:40:59,900 だから私は、何が足りないのですか? 665 00:40:59,900 --> 00:41:04,860 今、私たちは時折呼ばstring.hを使用する必要がある別のライブラリーには、あります 666 00:41:04,860 --> 00:41:08,980 そしてこれはまだ標準I / Oに含まれていない多くの機能を持つ別のライブラリです 667 00:41:08,980 --> 00:41:11,640 >> それでは、私の大きなターミナルウィンドウに戻りましょう。 668 00:41:11,640 --> 00:41:16,670 オーケー。さて、畜生、私は私が間違っていたと思います。私はCS50ライブラリを使用していました。 669 00:41:16,670 --> 00:41:18,460 だから我々は2つ​​の方法のいずれかでこれを修正することができます。 670 00:41:18,460 --> 00:41:21,510 我々は、現在補助輪を外して、ただこれを行うことができます 671 00:41:21,510 --> 00:41:26,600 またはしてみましょう一種のは、この後ろに貼り付けるだけで、今のところその簡素化を保つ 672 00:41:26,600 --> 00:41:30,180 その問題を解決するため、現在はターミナルウィンドウに戻ります。 673 00:41:30,180 --> 00:41:33,080 だからCS50ライブラリで、明確にするだけの機能ではありませんが、 674 00:41:33,080 --> 00:41:36,920 それはまた、そのエラーが起こったの理由であるキーワード文字列、です。 675 00:41:36,920 --> 00:41:43,010 >> だからここに私達は行く。私は、ライブラリの問題の両方を修正しました。入力します。グッド。 676 00:41:43,010 --> 00:41:49,250 1のargv、fooバー、入力します。優れています。 677 00:41:49,250 --> 00:41:52,830 だから今我々は、1行に1を印刷し、各単語の各文字を持っている 678 00:41:52,830 --> 00:41:55,290 、非常に興味深いプログラムのために作るしない 679 00:41:55,290 --> 00:41:59,350 しかし、今我々は言葉だけをイテレートしない能力を持って気付く 680 00:41:59,350 --> 00:42:04,090 もやけに聞き覚えの言葉で、個々の文字、上 681 00:42:04,090 --> 00:42:10,330 このような文字列のスクランブル文字のようなアプリケーションの最も単純にさえ。 682 00:42:10,330 --> 00:42:12,410 先に進み、ここで我々の5分間の休憩を取りましょう。 683 00:42:12,410 --> 00:42:14,410 そして、我々が戻ってくるとき、私たちは効率の話から始めましょう 684 00:42:14,410 --> 00:42:17,670 いると私たちはより良いこれらのことを行うことができます。 685 00:42:19,370 --> 00:42:21,900 >> かしこまりました。我々は戻ってきた。 686 00:42:21,900 --> 00:42:26,970 bananagramsの多くを担っている私たちのTFの1のおかげで、 687 00:42:26,970 --> 00:42:30,000 私たちは実際に今日ここに私達と文字の全体の束を持っている 688 00:42:30,000 --> 00:42:32,520 物理的に、これらの小さなプラスチック片と転生 689 00:42:32,520 --> 00:42:36,910 そしてこの空白のスレートはここに私のコンピュータのRAMを表していることを私は提案させて - 690 00:42:36,910 --> 00:42:39,790 ラップトップ、デスクトップ、何でも - そこはそれの多くのように見える 691 00:42:39,790 --> 00:42:44,090 なぜなら、私たちは小さなバイトサイズの断片にこのRAMをチョッピング起動した場合、 692 00:42:44,090 --> 00:42:48,970 任意のサイズとそのぼやけが表している何かを言ってみましょう - 693 00:42:48,970 --> 00:42:52,430 そこに私達はここに移動して、少し外に出すのズーム - 694 00:42:52,430 --> 00:42:56,120 サイズは1バイトを表している何かを言うてみましょう。 695 00:42:56,120 --> 00:43:00,400 だから我々は確かに、このメモリの内部バイトまたは文字の全体の束を収めることができます 696 00:43:00,400 --> 00:43:02,860 としてここに相対的なサイズによって示唆された。 697 00:43:02,860 --> 00:43:06,780 >> だから目標は文字列用のメモリを確保していることを今仮定します。 698 00:43:06,780 --> 00:43:08,680 これはどのように実際に動作しますか? 699 00:43:08,680 --> 00:43:11,380 私たちが書いてきたプログラムでは、我々は通常、GetStringメソッドを使用してきた 700 00:43:11,380 --> 00:43:16,300 しかし、今、明らかに、我々はargvのユーザー入力を取得することができ、それを介して、この他のチャンネルあり 701 00:43:16,300 --> 00:43:18,190 コマンドライン引数を経由して。 702 00:43:18,190 --> 00:43:20,580 しかし、本当にフードの下に起こっているのでしょうか? 703 00:43:20,580 --> 00:43:24,920 我々が呼ぶなら、それは判明 - GetStringメソッドに戻ってスクロールしてみましょう - 関数GetStringを 704 00:43:24,920 --> 00:43:28,190 CS50ライブラリで、ユーザは、文字列の入力を求められます 705 00:43:28,190 --> 00:43:30,780 いくつかの単語でユーザータイプ - のがHELLOそれを呼び出すことができます。 706 00:43:30,780 --> 00:43:35,410 そして、我々は過去数週間のために言ってきたことがGetStringメソッドの戻り値 707 00:43:35,410 --> 00:43:37,750 ハロー単語のように、実際には文字列です。 708 00:43:37,750 --> 00:43:39,660 >> しかし、実際に何をしてgetStringで? 709 00:43:39,660 --> 00:43:45,230 入力し、ハロー内のユーザー·タイプとしては、GetStringは、考え出すされている 710 00:43:45,230 --> 00:43:47,930 大丈夫、これは何文字ですか?これは、H-E-L-L-Oです。 711 00:43:47,930 --> 00:43:52,500 だから、割り当てる必要がある、それは、オペレーティングシステムに依頼する必要があります - この場合はLinuxを - 712 00:43:52,500 --> 00:43:55,410 少なくとも5バイトのhello格納する。 713 00:43:55,410 --> 00:43:59,570 それは、オペレーティングシステムから戻ってそれらの5バイトを取得したら、それは次に何をすべきかを進める 714 00:43:59,570 --> 00:44:04,120 バックアップするためにバックアップするバックアップするハローバックレイアウトすることです。 715 00:44:04,120 --> 00:44:11,070 それで本当にGetStringメソッドから返されると、次のようなデータの塊です。 716 00:44:11,070 --> 00:44:16,850 それは簡単ではないことが判明したので、しかし、これは少し不正確である 717 00:44:16,850 --> 00:44:20,310 ただ、コンピュータのメモリに格納するなどのHELLO 718 00:44:20,310 --> 00:44:24,140 なぜなら、私はC言語で書いているというのが私のプログラムは、再度GetStringメソッドを呼び出しているとし 719 00:44:24,140 --> 00:44:28,210 そして、ユーザーがタイプで次の単語は、BYE、BYEです。 720 00:44:28,210 --> 00:44:31,300 まあ、私はメモリのどこかに、その単語のBYEを適合する必要があります。 721 00:44:31,300 --> 00:44:33,790 私はHELLO上書きすることはできません。 722 00:44:33,790 --> 00:44:37,320 例えば、私はちょうどこのような上書きを開始するには、コンピュータをしたくない 723 00:44:37,320 --> 00:44:41,400 私はまだ変数にhelloという単語を使用しているかもしれないので、元の単語 724 00:44:41,400 --> 00:44:43,070 どこか私のプログラムインチ 725 00:44:43,070 --> 00:44:45,900 >> だから、B-Y-Eはメモリのどこかで終わる必要があります。 726 00:44:45,900 --> 00:44:50,460 しかし、大会は通常、次の文字列を使用すると、割り当てられていることである 727 00:44:50,460 --> 00:44:54,940 おそらく、常にではないが、次の使用可能なメモリ位置になってしまうために起こっている。 728 00:44:54,940 --> 00:44:57,370 そして、私は任意のメモリにオペレーティング·システムを求めていない場合 729 00:44:57,370 --> 00:45:01,380 私がGetStringメソッドと呼ばれる最後の時から、オッズは、ワードBYEアール 730 00:45:01,380 --> 00:45:05,790 ハローメモリ内のワードの後に​​右に終わろうとしている。 731 00:45:05,790 --> 00:45:10,550 潜在的な問題が発生した場所が、この時点であなたはおそらく見ることができます。 732 00:45:10,550 --> 00:45:13,310 - メモリの次のチャンクだけ自由だったので、次のバイト 733 00:45:13,310 --> 00:45:18,230 白い石板をきれいに - コンピュータのメモリに、ハローのすぐ隣にあった 734 00:45:18,230 --> 00:45:23,670 それは私が今突然変更される可能性がありますを求めた最初の文字列のように感じている 735 00:45:23,670 --> 00:45:26,410 私は基本的に変更したので、それはHELLOBYEする 736 00:45:26,410 --> 00:45:31,310 代わりに何とかBYEとHELLOの終わりの始まりをdemarcingの。 737 00:45:31,310 --> 00:45:33,920 >> だから、何が本当にフードの下で起こっていることが判明 738 00:45:33,920 --> 00:45:37,570 あなたは、オンラインで参照またはセクションや書籍でちらっと見たかもしれない 739 00:45:37,570 --> 00:45:41,780 かどうかはまだ全く意図的デマが実際に存在することである 740 00:45:41,780 --> 00:45:45,890 コンピュータのメモリ内の単語間。 741 00:45:45,890 --> 00:45:52,480 そして、実際には、ここで、この場合に、だけではなく、すぐ隣のHELLOにBYEを置く 742 00:45:52,480 --> 00:45:58,610 代わりに、コンピュータは特殊文字、特殊ヌル文字を、いわば置き 743 00:45:58,610 --> 00:46:03,050 そのバックスラッシュ0のマーカーで表されます。 744 00:46:03,050 --> 00:46:06,700 だから長い話を短く、文字はASCIIで表現されていることを思い出してください。 745 00:46:06,700 --> 00:46:09,680 ASCIIは、ただ数字と文字の間のマッピングです 746 00:46:09,680 --> 00:46:13,870 そしてそれらの手紙のほとんどは、資本、Aのために約65を起動する 747 00:46:13,870 --> 00:46:19,780 あなたは確かに整数として、またはバイナリの番号0を表すことができますアウトそれは、ターン 748 00:46:19,780 --> 00:46:22,690 それはずっと前に、長いことを決めた世界が判明、 "あなたは何を知っている?" 749 00:46:22,690 --> 00:46:27,550 キーボード上の任意の文字を表していないとして "レッツ·リザーブ番号0 - 750 00:46:27,550 --> 00:46:30,810 "は、文字、数字なし、句読点。0は特別ではありません。" 751 00:46:30,810 --> 00:46:35,830 "それは特別なnull文字になるだろう、と我々は\ 0としてそれを記述するつもりです。" 752 00:46:35,830 --> 00:46:41,170 我々だけで0,0を書いた場合、違いは文字です。 753 00:46:41,170 --> 00:46:45,700 1、2、3のために、0のASCIIコードがあることを思い出してください 754 00:46:45,700 --> 00:46:50,570 文字0は数字の0とは異なるため。 755 00:46:50,570 --> 00:46:54,270 そして、あなたは、あなたが週1から振り返って、我々は最初のASCII話をするときことがわかります 756 00:46:54,270 --> 00:46:59,130 最大9から0と1と2と3のすべての方法は、独自のASCIIコードを持っていた。 757 00:46:59,130 --> 00:47:02,300 彼らは、偶然にも、0から9までではありません。彼らは非常に異なっている。 758 00:47:02,300 --> 00:47:08,770 だから、0は単に "私は特別な思い"を意味し、\ 0は、文字通り、 "私は0文字ではありませんよ。" 759 00:47:08,770 --> 00:47:11,360 "私はこの特別な値、ヌル文字です。" 760 00:47:11,360 --> 00:47:16,930 私は二度同じ過ちを犯すことができないので、それで、私は実際にこれらの別のものを必要としています。 761 00:47:16,930 --> 00:47:21,550 >> だからワードBYE後に我々はまた、これらのヌル文字の別のものが必要になるだろう。 762 00:47:21,550 --> 00:47:27,090 私はここに私のペンをつかむと、私はすぐに別の\ 0を描きましょう 763 00:47:27,090 --> 00:47:30,480 ので、私は2つの文字列については、オペレーティングシステムを依頼した後に 764 00:47:30,480 --> 00:47:33,270 GetStringメソッドへの別のコールに続いてGetStringを経由して、 765 00:47:33,270 --> 00:47:35,640 これは、メモリ内に実際にあるものです。 766 00:47:35,640 --> 00:47:39,900 だから私は戻って文字列を取得するとき、私は本当にそれが戻ってきている、 767 00:47:39,900 --> 00:47:43,450 と私は次の文字列を取得するとき、私は本当にそれが戻ってきたよ。 768 00:47:43,450 --> 00:47:47,910 だから、これは、まず第一に、strlenは、質問しておきたい、それは何を返すべきでしょうか? 769 00:47:47,910 --> 00:47:54,650 私は、文字列sとsにstrlenを呼び出したときに、ユーザーが入力した言葉だったのHELLO 770 00:47:54,650 --> 00:47:57,800 我々は明らかにハローの長さは数分前にあったものを言いましたか? 771 00:47:57,800 --> 00:48:01,290 それは右、5でしたか? H-E-L-L-O。そして、それは確かにどのようにstrlenの作品だ。 772 00:48:01,290 --> 00:48:05,670 それは普通の人間であるために、文字列の長さを期待するものを返します。 773 00:48:05,670 --> 00:48:11,030 しかし、現実には、hello保管の文字の配列の大きさは? 774 00:48:11,030 --> 00:48:12,770 これは、実際には6だ。 775 00:48:12,770 --> 00:48:15,740 strlenのようにあなたにその事実を言及していない。 776 00:48:15,740 --> 00:48:20,300 しかし、フードの下にコンピュータが実際には、5文字の単語を格納するために6バイトを使用しています 777 00:48:20,300 --> 00:48:22,380 これは言葉がどんなに長くても真実ではありません。 778 00:48:22,380 --> 00:48:26,470 常に文字列の末尾に特別なNULL終端文字があるように起こっている 779 00:48:26,470 --> 00:48:28,800 その長さの合計を分界する。 780 00:48:28,800 --> 00:48:33,430 >> それでは、あなたが今、30年前にはstrlen 20を実装する人、ある場合には、 781 00:48:33,430 --> 00:48:35,520 あなたはstrlen自体を実装する方法を教えてください。 782 00:48:35,520 --> 00:48:39,980 当たり前のprintf関数が存在することを当然のことと私たちが取るのと同様、我々は、それが存在することを取る、 783 00:48:39,980 --> 00:48:42,850 しかし、HELLO、問題の単語である場合 784 00:48:42,850 --> 00:48:45,220 と私は記憶しているのは、このようなものである 785 00:48:45,220 --> 00:48:48,130 あなたはあなたがするように求めていたので、strlen関数を再実装する必要があった場合 786 00:48:48,130 --> 00:48:50,260 またはので、率直に言って、あなたは存在してstrlenを知りませんでした - 787 00:48:50,260 --> 00:48:54,280 あなた自身でこの1を転がしていた - どのようにあなたはstrlenを実装することができます 788 00:48:54,280 --> 00:48:57,760 このようなものが与えられたとき? 789 00:48:57,760 --> 00:49:02,750 今、私たちは、文字列が配列であることがわかっている、我々は、個々の文字のそれぞれを反復することができます 790 00:49:02,750 --> 00:49:06,320 のようなものを使用すると、 - その場でこれを実行してみましょう。 791 00:49:06,320 --> 00:49:12,060 >> 私はアプライアンスに行こう。私は、新しいファイル、strlen.cを作成してみましょう。 792 00:49:12,060 --> 00:49:19,260 私は今、先に行くと我々は、printfへのアクセス権を持つようにstdio.hをインクルードやってみましょう。 793 00:49:19,260 --> 00:49:25,820 私はint型のmain(void)をやってみましょう。ああ。私はちょうどその時、今の自分でこれをやる。 [笑い]を 794 00:49:25,820 --> 00:49:28,300 ありがとう。 795 00:49:28,300 --> 00:49:31,000 これは私がやっていることです。かしこまりました。 796 00:49:31,000 --> 00:49:34,820 私は、画面をオンにする前に、だから、私はそれのすべてを入力しました。 797 00:49:34,820 --> 00:49:37,550 そして今、私がやろうとしているものは次のとおりです。 798 00:49:37,550 --> 00:49:40,360 ( "私に文字列を教えてください:")のprintf 799 00:49:40,360 --> 00:49:42,700 それはちょうどフワフワの命令だ。 800 00:49:42,700 --> 00:49:45,700 今私は、文字列s = GetStringをやらせる。 801 00:49:45,700 --> 00:49:47,260 私はすでに今変更を加える必要があります。 802 00:49:47,260 --> 00:49:52,740 私は突然CS50ライブラリを使用していますので、私が先に行くとcs50.h.を入力せ 803 00:49:52,740 --> 00:50:00,720 そして今、これを実行してみましょう:のprintf( "長さは次のとおりです。%dは、strlenは[S] - 804 00:50:00,720 --> 00:50:03,540 と私はまだいないよ。他に何私はこのプログラムに追加する必要がありますか? 805 00:50:03,540 --> 00:50:05,740 >> [学生] string.hで。 >> string.hで。 806 00:50:05,740 --> 00:50:10,800 だから今のところ、我々はstrlenを使っているので、のはそれがどこにあるか、コンパイラが知っていることを確認しましょう 807 00:50:10,800 --> 00:50:12,390 ので、少し正気をチェック。 808 00:50:12,390 --> 00:50:16,400 私は、8行目で文字列を取得していて、9行目で、私は%dで、その長さをプリントアウトしています。 809 00:50:16,400 --> 00:50:19,400 それでは、先に行くとこの上を開いてみましょう。 810 00:50:19,400 --> 00:50:23,380 我々は、strlenを作成してもらって - 大丈夫コンパイル - 811 00:50:23,380 --> 00:50:30,120 strlenは - 私は、ズームインできます - 入力は、H-E-L-L-O、入力します。長さは5です。 812 00:50:30,120 --> 00:50:32,730 >> わかりましたので、strlenは、動作しているようですが、世界は知っていた。 813 00:50:32,730 --> 00:50:37,310 それでは、今、自分自身を次のようにstrlenを実装してみましょう。 814 00:50:37,310 --> 00:50:39,490 私は離れて、このライブラリを見てみましょう。 815 00:50:39,490 --> 00:50:42,590 我々はもはや、私もそれは存在を知らなかったのでstring.hでために必要なアクセス権がありません。 816 00:50:42,590 --> 00:50:45,970 私はstrlenを自分で実装することができるので、しかし、それは大丈夫だ 817 00:50:45,970 --> 00:50:50,200 そして、それは入力と呼ばれる文字列を取ることがある 818 00:50:50,200 --> 00:50:53,830 そして今、私はこの文字列の長さを把握する必要があります。 819 00:50:53,830 --> 00:50:55,880 だからどうすればこれを行うことができます? 820 00:50:55,880 --> 00:51:00,190 私がしなければ何をする - あなたは何をしたい - さんがこれを行う方法を見てみましょう? 821 00:51:00,190 --> 00:51:04,130 >> [聞き取れない生徒の応答] >>オーケー。 822 00:51:04,130 --> 00:51:05,970 だから我々は方法の束でこれを行うことができます。私は、このアプローチを取ることにしてみましょう。 823 00:51:05,970 --> 00:51:10,220 私は自分自身にint型の変数iを挙げてみましょう、そう私は0から始まります。 824 00:51:10,220 --> 00:51:19,380 そして私はこれを言わせて:入力中に[i]が何に等しくないですか? \ 0。 825 00:51:19,380 --> 00:51:23,480 だからそれは、プログラムの中で文字通りに書き込むすべての文字を含んでいる場合と同様に、判明 826 00:51:23,480 --> 00:51:25,940 あなたは、単一引用符ではなく二重引用符を使用する必要があります。 827 00:51:25,940 --> 00:51:29,250 私は手紙を書いていたので、もし私が文字b、以下のことを行うだろう、私はそれを行うだろう。 828 00:51:29,250 --> 00:51:33,440 これは、対照的に、ではなく、個々の文字列になります。 829 00:51:33,440 --> 00:51:38,470 >> だから私は、文字通り\ 0としたい。私はこのループ内で何をするかをしたいですか? 830 00:51:38,470 --> 00:51:42,650 実は、私は別の変数が必要なので、intの長さが0を取得します。 831 00:51:42,650 --> 00:51:46,190 あなたは、私たちがやった方法を始めた理由を確認されていない場合でも、 832 00:51:46,190 --> 00:51:50,110 今、私たちはこの道を行っている、私は、9行目で何をするかをしたいということ? 833 00:51:50,110 --> 00:51:55,820 長さ+ +とダウンしてここに10行目、戻りの長さ。 834 00:51:55,820 --> 00:51:58,370 だからstrlenをどのように実装されている? 835 00:51:58,370 --> 00:52:00,550 それは実際にこのように、おそらく実装されています。 836 00:52:00,550 --> 00:52:03,470 多分ループに対して使用者は、多分Do Whileループ - 誰が知っている? 837 00:52:03,470 --> 00:52:05,940 私たちは本当に、実際のソースコードでフードの下を見なければならないだろう 838 00:52:05,940 --> 00:52:08,520 いくつかのファイルはおそらくstring.cと呼ばれる。 839 00:52:08,520 --> 00:52:10,480 >> しかし、ここでは私がやっていることについて考えてみましょう。 840 00:52:10,480 --> 00:52:13,640 私は0と等しい値に設定することは、iという変数を宣言しています。 841 00:52:13,640 --> 00:52:17,520 私はその後、0と等しい値に設定する、という別の変数の長さを宣言しています。 842 00:52:17,520 --> 00:52:25,440 それから私は、入力中のi番目の文字が特殊文字で、ヌル文字\ 0に等しくないときに言っている 843 00:52:25,440 --> 00:52:27,070 長さを増加させます。 844 00:52:27,070 --> 00:52:32,550 しかし、すぐにi番目の文字は特殊文字であるため、何がループになりますか? 845 00:52:32,550 --> 00:52:36,540 それは短絡。それは、我々はその後、瞬時に長さを返すことを意味し、停止します。 846 00:52:36,540 --> 00:52:40,740 >> 私が台無しにしなかった場合それでは、先に行くと、私の端末ウィンドウに戻りましょう。 847 00:52:40,740 --> 00:52:43,550 私は再コンパイルしてみましょう。そして、私は台無しでした。 848 00:52:43,550 --> 00:52:46,320 ライブラリ関数strlenの互換性のない再宣言。 849 00:52:46,320 --> 00:52:48,650 だから私はここに私自身のためにあまりにも巧妙取得しようとしていた。 850 00:52:48,650 --> 00:52:51,610 コンパイラは、実際にはstrlenという関数があることを知っている 851 00:52:51,610 --> 00:52:55,290 我々は、ライブラリが含まれていないにもかかわらず。それで結構です。ものは何でも。 852 00:52:55,290 --> 00:52:58,230 我々は、ちょうどその後に協力するつもりです。この長さの名前を変更してみましょう。 853 00:52:58,230 --> 00:53:04,110 私はここに長さにそれの使用を変更しましょう​​、これはClangのが幸せでしょう。 854 00:53:04,110 --> 00:53:08,900 余談ですが、これらの機能のいくつかは、一般的なので、くそあるので - 855 00:53:08,900 --> 00:53:12,390 strlenは、prinf - 彼らは実際に特別なステータスのようなものを持っている。 856 00:53:12,390 --> 00:53:15,310 そしてそうClangのはちょうどそれらについて特別な少し何かを知っています。 857 00:53:15,310 --> 00:53:18,760 常に最新の機能を持つ場合ではないですね、私たちは怒鳴らてしまった理由だそう。 858 00:53:18,760 --> 00:53:21,350 >> 私はもう一度試してみましょう。ありがたいことに、それはその時間を働いた。 859 00:53:21,350 --> 00:53:23,560 だから今、私は私自身のstrlenのプログラムを実行してみましょう。 860 00:53:23,560 --> 00:53:29,740 私に文字列を与える:H-E-L-L-O、入力します。そして、私はしくじった。 861 00:53:29,740 --> 00:53:34,750 なぜですか? >> [聞こえない学生の応答] >>その通りです。 862 00:53:34,750 --> 00:53:39,180 だから私は、私自身はここで非常に見栄えの良い無限ループを持っている 863 00:53:39,180 --> 00:53:42,270 私は、各繰り返しで長さをインクリメントしているにもかかわらずあるので、 864 00:53:42,270 --> 00:53:47,860 私ははっきりと何をやっていないのですか?私は、iをインクリメントしていない。オーケー。簡単な修正。はい? 865 00:53:47,860 --> 00:53:52,430 オーケー。私はブラケットを必要な場所号今、私たちはいくつかの他の一般的な間違いに抵触だろう。 866 00:53:52,430 --> 00:53:54,430 率直に言って、このコードは、不細工に見えるし始めている 867 00:53:54,430 --> 00:53:56,460 ので、私たちは一瞬にして、これをクリーンアップで刺しを取るよ。 868 00:53:56,460 --> 00:53:58,810 しかし、今私は長さとiの両方をインクリメントしています。 869 00:53:58,810 --> 00:54:02,630 率直に言って、私はすでにここに改善の機会を参照してください、しかし、我々はそれに戻ってくる。 870 00:54:02,630 --> 00:54:05,270 >> だから今、私たちは少なくとも進歩していることを確認してみましょう。 871 00:54:05,270 --> 00:54:08,320 これはあなたのいくつかに起こっている、と私は事前にこれを言及することを怠っ。 872 00:54:08,320 --> 00:54:12,420 あなたがこのようなシナリオの不幸を持っているときは、これをどのように修正すればよい 873 00:54:12,420 --> 00:54:15,130 アプライアンスまたはコンピュータを再起動したり、ウィンドウを閉じたときの短い? 874 00:54:15,130 --> 00:54:16,860 これは、実際には簡単です。 875 00:54:16,860 --> 00:54:21,680 コントロールCは、この小さなニンジン記号Cを送るでしょう、そして、それはちょうどほとんどのプログラムを終了します。 876 00:54:21,680 --> 00:54:25,990 あなたは無限に何回もものを印刷している本当に悪い無限ループを持っている場合は、 877 00:54:25,990 --> 00:54:29,960 時にはあなたは、それが実際にそれを聞くことには、Ctrl + C千回をヒットする必要があります。 878 00:54:29,960 --> 00:54:33,910 私はかなり簡単だったものを、印刷していないためこのようにしていますちょうど今実現しています。 879 00:54:33,910 --> 00:54:37,970 そして技術的には、一度で十分ですが、私はイライラしてくると私は通常何回もあること、それをヒット。 880 00:54:37,970 --> 00:54:43,400 >> strlenのようにします。私に文字列を与える:こんにちは。それはこの時間を仕事に行くのですか? 881 00:54:44,580 --> 00:54:47,490 オーケー。別のよくある間違い。再コンパイルする必要があります。 882 00:54:47,490 --> 00:54:50,430 つまり、その1意図的であった。かしこまりました。 883 00:54:50,430 --> 00:54:54,260 strlenのように、H-E-L-L-O、入力します。優れています。 884 00:54:54,260 --> 00:54:55,910 だから我々は現在、5にstrlenを持っています。 885 00:54:55,910 --> 00:54:58,100 だから我々は文字通り、その車輪を再実装しました。 886 00:54:58,100 --> 00:55:02,080 これは私が感銘を受けたものではないので、だから今はこの上をきれいにしてみましょう 887 00:55:02,080 --> 00:55:04,080 私のコードの設計と。 888 00:55:04,080 --> 00:55:07,200 我々は明らかにこれをクリーンアップするために、このプログラムで何を排除することができますか? 889 00:55:07,200 --> 00:55:11,840 [聞き取れない生徒の応答] >>うん。文字通り、我々は同じように私と長さを扱っている。 890 00:55:11,840 --> 00:55:16,440 では、なぜ我々だけでスマート取得し、長さながら、言うことはありません? 891 00:55:16,440 --> 00:55:20,450 むしろ、それだけの長さを0に初期化し、初めに、呼び出してみましょう 892 00:55:20,450 --> 00:55:23,340 我々はそれが何であるかを把握するまで、デフォルトでは文字列は長さを有していないため。 893 00:55:23,340 --> 00:55:26,160 >> 今、私たちはこれを行うには、今ではこれはかなり洗練されたプログラムです。 894 00:55:26,160 --> 00:55:28,660 一つの変数。私は、それをクリーンアップし、それを強化した。 895 00:55:28,660 --> 00:55:31,980 だから今の私の端末ウィンドウに戻りましょう。先に進み、これを実行してみましょう。 896 00:55:31,980 --> 00:55:35,670 strlenを作る。よさそうだ。入力し、再びstrlenを実行します。 897 00:55:35,670 --> 00:55:40,680 私に文字列を与える:こんにちは、入力します。そしてそれは5として動作しているようだ。 898 00:55:40,680 --> 00:55:45,580 今、私は書かれていなかった場合、例えば、明確にするために、ハロー1の文字列で 899 00:55:45,580 --> 00:55:48,840 その後別のBYEは、我々は確かに複数の単語を持つことができます。 900 00:55:48,840 --> 00:55:53,150 私は実際に入力したいと思った表現はHELLOはありませんでしたが、例えば、場合 901 00:55:53,150 --> 00:55:58,920 世界、私たちが持っていないでしょうがここでこのような状況であることに注意して、右もしもし? 902 00:55:58,920 --> 00:56:00,580 それはそれは2つの文字列のことを示唆している。 903 00:56:00,580 --> 00:56:06,060 あなたは確かに私たちが実際に長いフレーズで入力しそうだとすれば、スペースバーの文字を持つことができます 904 00:56:06,060 --> 00:56:08,390 Hello Worldのように、我々は実際にはメモリに何を持っているでしょう 905 00:56:08,390 --> 00:56:12,730 そこにそのような少し何かを探します。 906 00:56:12,730 --> 00:56:18,910 >> かしこまりました。次に文字列のここに表現についてのご質問? 907 00:56:18,910 --> 00:56:20,450 いいえ?かしこまりました。 908 00:56:20,450 --> 00:56:25,130 だから私は、そのように意図的に何度も何度もstrlenを呼び出していること以前言った 909 00:56:25,130 --> 00:56:28,070 あなたが仕事の全体の多くを行うことになるだろうので、おそらく最高のアイデアではありません 910 00:56:28,070 --> 00:56:30,280 何度も何度も。 911 00:56:30,280 --> 00:56:36,150 実際には、作業の種類は明らかに、文字列の長さを把握するために必要ですか? 912 00:56:36,150 --> 00:56:40,720 あなたが初めに開始し、その後見て、見て、見て、見て、見なければならない 913 00:56:40,720 --> 00:56:44,930 あなたが最終的にその特殊文字が表示されるまで、その時点で、ああ、今私は長さを知っている。 914 00:56:44,930 --> 00:56:48,040 だから、以前の我々はstrlenが何度も何度も呼び出されていたとき、 915 00:56:48,040 --> 00:56:52,080 再び、その文字列は以下のようになりますので、愚かのようなものだった、私が提案した理由があります。 916 00:56:52,080 --> 00:56:54,880 それはあなたには、いくつかのループを反復するたびに変更するつもりはないが、 917 00:56:54,880 --> 00:56:56,890 そのため、不必要な仕事をしている。 918 00:56:56,890 --> 00:57:00,620 あなたが知っておくべき同時に、余談ですが、Clangのようなコンパイラは、これらの日は、その 919 00:57:00,620 --> 00:57:02,530 長年にわたって開発されてきた、 920 00:57:02,530 --> 00:57:05,690 とコンパイラライター、プログラマーは、かなりスマートです。 921 00:57:05,690 --> 00:57:10,170 そしてそれは、Clangのと他のコンパイラでは、実際にそれを見つけ出すことができることが判明 922 00:57:10,170 --> 00:57:13,650 大丈夫、はい、あなたは、あなたの状態にstrlenを書いた 923 00:57:13,650 --> 00:57:17,520 これは、技術的に我々は何度も何度もそれを呼ぶであろうことを意味する。 924 00:57:17,520 --> 00:57:21,880 しかし、スマートコンパイラは実際に貧しいユーザの意思決定のこれらの種類を最適化することができます 925 00:57:21,880 --> 00:57:23,870 物事を是正するため、コードの外に。 926 00:57:23,870 --> 00:57:27,360 >> だから時には、コンパイラには我々よりも賢いであることを認識しない 927 00:57:27,360 --> 00:57:29,210 そして一種の私達の自身の過ちを隠すことができます。 928 00:57:29,210 --> 00:57:31,620 しかし、確かにそれは問題セットなどになると、 929 00:57:31,620 --> 00:57:35,340 それらの根本的に間違った設計上の意思決定について考えることがない 930 00:57:35,340 --> 00:57:38,110 我々は方法より多くの仕事をしているはずだという単純な理由のための潜在的に 931 00:57:38,110 --> 00:57:41,330 よりも私たちが実際に行う必要があります。しかし、どのように多くの作業? 932 00:57:41,330 --> 00:57:44,960 HELLO WORLDの場合には、この問題の大きさを一般化することから始めましょう。 933 00:57:44,960 --> 00:57:48,100 問題の長さや問題の大きさは何ですか 934 00:57:48,100 --> 00:57:50,770 時ワードで入力したユーザーはHELLOですか? 935 00:57:50,770 --> 00:57:53,790 それは多分、明らかに6 5です。プラスまたはマイナス1。ものは何でも。 936 00:57:53,790 --> 00:57:55,680 それは、我々はちょうどそれ5と呼ぶことにしますので、近いです。 937 00:57:55,680 --> 00:58:00,480 >> HELLOの長さを把握しようとしたときに、問題の大きさはここで何ですか? 938 00:58:00,480 --> 00:58:06,790 それは、最後の文字を多分1、2、3、4、5、6ですが、一般化してみましょうnとその。 939 00:58:06,790 --> 00:58:10,300 ので、n、単に変数nは、コンピュータ科学者は、一般的に使用されるものである 940 00:58:10,300 --> 00:58:13,890 当面の問題の大きさ、問題を説明すると、helloとどのくらいですか? 941 00:58:13,890 --> 00:58:17,050 strlenは、どのくらいの時間がかかりますか? 942 00:58:17,050 --> 00:58:21,010 それは、各ステップは文字を見て意味し、nステップの順序を取る 943 00:58:21,010 --> 00:58:23,350 文字を見て、文字を見てみましょう。 944 00:58:23,350 --> 00:58:26,850 そして、我々は、しばらく前に何かがかかる操作の数を、この議論を交わしました。 945 00:58:26,850 --> 00:58:29,910 私たちは誰もがぎこちなく立ち上がっていたクラスの非常に最初の日、 946 00:58:29,910 --> 00:58:32,060 その後、誰もがお互いにオフペアリング開始 947 00:58:32,060 --> 00:58:35,990 実際に部屋にあった理想的にどのように多くの人がカウントするため。 948 00:58:35,990 --> 00:58:39,860 そして、我々はまた別のことをしたことにより、私は代わりに古い学校の道行った場合 949 00:58:39,860 --> 00:58:44,800 ちょうど1、2、3、4、5、6、などを、出発の 950 00:58:44,800 --> 00:58:49,360 それも、その問題の大きさは、サイズnのだった。部屋のn人の人がいた。 951 00:58:49,360 --> 00:58:52,010 しかし、私は右、それをスピードアップできますか?小学校のスタイルは、私が2秒でカウントを開始することができます。 952 00:58:52,010 --> 00:58:55,560 2、4、6、8、10、12。そして、それはそんなに速く、確かにそれは感じている。 953 00:58:55,560 --> 00:59:01,720 もう400人はこの部屋に足を踏み入れたなら、それは、再び文字通り2倍高速だが、 954 00:59:01,720 --> 00:59:08,250 すべてを一度に、これらのアルゴリズムは、他の400または200多分手順を取るだろう。 955 00:59:08,250 --> 00:59:13,310 >> 私たちは本当にスマート取得し、私たちの代わりに持っている場合でも、これとは対照的に、あなたのすべてが、自分自身を数える 956 00:59:13,310 --> 00:59:15,280 そのアルゴリズムが働いたかを思い出してください。 957 00:59:15,280 --> 00:59:17,110 あなたはすべて立ち上がった。これに早送りさせて頂いております。 958 00:59:17,110 --> 00:59:20,430 あなたはすべて、あなたの半分は座った後、あなたがオフにペアになって、立ち上がった 959 00:59:20,430 --> 00:59:22,510 あなたの半分は、あなたの半分は座って、腰を下ろした 960 00:59:22,510 --> 00:59:27,350 そして0週からこのループの繰り返しごとに、我々は手で問題を半減 961 00:59:27,350 --> 00:59:30,040 そしてその後、n / 8には、n / 4、N / 2に行ってきました。 962 00:59:30,040 --> 00:59:35,350 との意味は、つまり別の400人は、部屋、大したことない、中に入る場合 963 00:59:35,350 --> 00:59:40,120 それは、私たちにはない400以上のラウンドではなく、200以上のラウンドを、他に1ラウンドがかかります。 964 00:59:40,120 --> 00:59:43,640 それで、私たちはしばらく前に言った話はこれで少し何かをしなければならなかった。 965 00:59:43,640 --> 00:59:47,750 この赤い線がここに線形であるが、それはまっすぐだし、それをnとしてラベル付け 966 00:59:47,750 --> 00:59:50,250 問題のサイズが大きくなるにつれてので、 967 00:59:50,250 --> 00:59:54,690 あなたのアルゴリズムやプログラムがこれであなたが解決しようとしている場合、それは、n個のステップを実行します 968 00:59:54,690 --> 00:59:58,620 我々はそれが問題の大きいサイズより時間がかかり直線としてそれをプロットすることができます。 969 00:59:58,620 --> 01:00:03,280 と2をカウントtwosiesアプローチは、4、6、8、まだ直線が、ほんの少し良い。 970 01:00:03,280 --> 01:00:08,440 それは黄色のラインがポイントの下に赤い線がポイントですので、少し時間がかかります。 971 01:00:08,440 --> 01:00:12,580 >> しかし、より良い我々は対数時間と呼んだこの聖杯だった 972 01:00:12,580 --> 01:00:14,830 さえあれば再びここで我々は、部屋にいる人々の数を倍増 973 01:00:14,830 --> 01:00:18,240 私たちは、授業の初日からその電話帳のサイズを倍にする 974 01:00:18,240 --> 01:00:22,310 大したことは、それが1以上のページ·涙をとり、座って1以上をとりません 975 01:00:22,310 --> 01:00:25,550 倍の大きさの問題を解決するためである。 976 01:00:25,550 --> 01:00:27,460 そして、我々が今持って開始することを得るの会話がある 977 01:00:27,460 --> 01:00:30,380 どのように我々は、実際には効率的に問題を解決するのですか 978 01:00:30,380 --> 01:00:32,510 我々はこのような問題の最も簡単な場合を考えてみ? 979 01:00:32,510 --> 01:00:36,210 我々はいくつかの数字は8扉その後ろに持っていると仮定し、 980 01:00:36,210 --> 01:00:39,720 そして、これらの数字の各々は、どのような方法でソートされていません 981 01:00:39,720 --> 01:00:42,830 彼らは、これらのドアの後ろにちょうどランダムな整数だ 982 01:00:42,830 --> 01:00:47,290 知っている - 私たちはどのように番号を見つけに行くのですか質問をする - 983 01:00:47,290 --> 01:00:50,250 これらのドアの後ろに7? 984 01:00:50,250 --> 01:00:53,400 もし、人間が、私に7番を見つけるために何をするでしょう 985 01:00:53,400 --> 01:00:56,810 再び場合は、これらの各々は、ドアであり、あなたが扉を開かなければならない値を参照してください? 986 01:00:56,810 --> 01:00:59,650 あなたのアルゴリズムは、おそらく何でしょうか? 987 01:00:59,650 --> 01:01:05,310 >> [聞き取れない生徒の応答] >>だから左から開始して、ドアを開け、ドアを開け、ドアを開ける。 988 01:01:05,310 --> 01:01:08,570 最悪の場合、どのくらいの時間が7番を見つけるために私たちを取るつもりですか? 989 01:01:08,570 --> 01:01:12,800 そして再び、彼らがソートされていないしているので、同じように簡単ではありません、まあ、私は第七の扉を開くつもりです。 990 01:01:12,800 --> 01:01:15,240 それは、最大限に、8つのステップ私たちを取ることができます。 991 01:01:15,240 --> 01:01:19,940 最悪のケースでは、図7に示すように、ドアのラインの一番最後にランダムである 992 01:01:19,940 --> 01:01:22,090 ので、我々はすべてのnドアを試す必要があるかもしれません。 993 01:01:22,090 --> 01:01:24,440 だからここでも、我々は、線形アルゴリズムを持っているように思われる。 994 01:01:24,440 --> 01:01:27,030 実際には、我々は数年だけのカップル前にこれをしなかった。 995 01:01:27,030 --> 01:01:29,910 あなたの前任者の1つはこの正確でチャレンジしました 996 01:01:29,910 --> 01:01:32,050 私たちがデジタル版を持っていなかった場合、我々はその代わりに黒板を持っていた 997 01:01:32,050 --> 01:01:33,780 その上に紙のいくつかの作品である。 998 01:01:33,780 --> 01:01:36,940 と私は私は何だろうと思ったことは、これはどうだったのバックざっと目を通してくださいです 999 01:01:36,940 --> 01:01:40,760 ステージ上で最高の、そしておそらく最も厄介な機会の一つ 1000 01:01:40,760 --> 01:01:42,530 サンダースの上で右ここにデモを持っている。 1001 01:01:42,530 --> 01:01:44,000 私たちは、数字の2行を持っていた。 1002 01:01:44,000 --> 01:01:47,280 私たちは、これらの行の一番上のためショーンと一緒にここに何が起こるかを見ていくつもりです。 1003 01:01:47,280 --> 01:01:49,660 しない限り、二度と誰もCS50のボランティア、 1004 01:01:49,660 --> 01:01:52,010 私たちは、カメラの前でこれを維持するためにショーンの祝福を持っていた 1005 01:01:52,010 --> 01:01:54,670 ので、彼は何百人もの人々が何年も今これを見ていることを知っています。 1006 01:01:54,670 --> 01:01:59,500 しかし、ショーンは素晴らしい仕事をしてくれた - あるいは彼をした - ?実際に私達に特定の番号を見つけるに。 1007 01:01:59,500 --> 01:02:04,570 >> だから我々はずっと前にこの会話を再開しますように、彼は、このアルゴリズムをどう解決してみましょう 1008 01:02:04,570 --> 01:02:08,300 我々は効率的に物事を見つける方法の。 1009 01:02:08,300 --> 01:02:12,300 [ビデオオンマラン]私は、これらのドアの後ろに数字の7を非表示にしている 1010 01:02:12,300 --> 01:02:16,710 しかし、他の非負の数であるだけでなく、これらのドアの一部にひっそりと 1011 01:02:16,710 --> 01:02:19,980 あなたの目標は、単に配列としてこの数値の一番上の行に考えることです 1012 01:02:19,980 --> 01:02:22,920 またはそれらの後ろの数字を書いた紙の部分のちょうどシーケンス、 1013 01:02:22,920 --> 01:02:26,960 あなたの目標は、ここでしかトップアレイを使用して、私に7番を見つけることです。 1014 01:02:26,960 --> 01:02:30,800 そして、我々は、あなたはそれをやって行く方法批判しようとしている。 >>すべての権利。 1015 01:02:30,800 --> 01:02:33,880 [マラン]ください、私たちの7番を検索します。 1016 01:02:36,210 --> 01:02:38,350 [笑い] 1017 01:02:41,610 --> 01:02:44,460 [マラン]いいえ[笑い] 1018 01:02:45,760 --> 01:02:58,080 5、19、13、[笑い]。それはトリックの質問ではありません。 1019 01:03:00,560 --> 01:03:02,390 1。 1020 01:03:04,560 --> 01:03:06,910 [笑い] 1021 01:03:06,910 --> 01:03:10,760 この時点で、あなたのスコアは非常に良いではありませんので、あなたにも続けるかもしれません。 [笑い] 1022 01:03:12,490 --> 01:03:14,070 3。 1023 01:03:17,340 --> 01:03:23,480 進んでください。率直に言って、私は助けることは、あなたも考えているのだろうことはできません。 [笑い] 1024 01:03:25,010 --> 01:03:28,870 最上行のみなので、あなたは3点の左を持っている。だから私は7を見つける。 1025 01:03:28,870 --> 01:03:45,360 [学生がさらさら] 1026 01:03:46,270 --> 01:03:49,870 [マラン] 17。 1027 01:03:49,870 --> 01:03:55,460 [学生がさらさら] 1028 01:03:56,920 --> 01:04:01,550 [マラン] 7! [拍手] 1029 01:04:01,550 --> 01:04:06,080 >> だから、水曜日に私たちは、物事を見つけるために、この、より洗練されたアルゴリズムに飛び込みましょう。 1030 01:04:06,080 --> 01:04:10,200 今のところ我々はショーンであなたを残しておきますと、水曜日にお会いしましょう​​。 1031 01:04:11,280 --> 01:04:13,000 [CS50.TV]