1 00:00:00,000 --> 00:00:02,350 >> [音楽再生] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD:すべての権利。 4 00:00:06,360 --> 00:00:07,770 奇妙なトピックの種類、右? 5 00:00:07,770 --> 00:00:09,050 マジックナンバー。 6 00:00:09,050 --> 00:00:12,012 彼がいたとき、彼は何を意味するのDOE マジックナンバーの話? 7 00:00:12,012 --> 00:00:14,220 さて、プログラムの一部 我々はCS50で書かれたこと 8 00:00:14,220 --> 00:00:16,660 これまでにいくつかの奇妙なを持っていました 数字は種類の彼らに投げ。 9 00:00:16,660 --> 00:00:19,680 おそらく理由のために我々にはありません 完全に今理解しています。 10 00:00:19,680 --> 00:00:23,950 例えば、マリオの問題で、我々 23でピラミッドの高さをキャップしました。 11 00:00:23,950 --> 00:00:26,880 私たちは、明示的に述べました 23よりも高くして行くことはできません。 12 00:00:26,880 --> 00:00:28,702 >> しかし、23は何を意味するのでしょうか? 13 00:00:28,702 --> 00:00:30,410 さて、あなたが読めば 、慎重にあなたのスペック 14 00:00:30,410 --> 00:00:32,493 ことを見たかもしれません 我々は23でそれをキャップした理由 15 00:00:32,493 --> 00:00:36,160 ための標準的な高さ ターミナルウィンドウの24です。 16 00:00:36,160 --> 00:00:38,860 そして、私たちが持っている場合 ピラミッドは、それよりも背が高いです、 17 00:00:38,860 --> 00:00:41,290 それは、この奇妙なことを行う可能性があります どこに画面をオフに実行されます。 18 00:00:41,290 --> 00:00:45,140 そして、あなたは何を知っています、 それは右、文脈で意味ですか? 19 00:00:45,140 --> 00:00:48,880 >> 23の意味はすぐに明らかです あなたのプログラムを見て誰かに 20 00:00:48,880 --> 00:00:51,550 多分別のを持っています サイズターミナルウィンドウ? 21 00:00:51,550 --> 00:00:52,330 おそらくない。 22 00:00:52,330 --> 00:00:53,080 これは、[OK]を、のように思えます。 23 00:00:53,080 --> 00:00:55,005 さて、なぜそれが23よりちょうど小さいですか? 24 00:00:55,005 --> 00:00:56,880 一般的に、それはようなものです 悪い癖の実際 25 00:00:56,880 --> 00:00:58,940 あなたのコードに定数を書き込むことができます。 26 00:00:58,940 --> 00:01:02,190 あなたが実際に行う際に、そうすることで あなたのコードに定数を記述し、 27 00:01:02,190 --> 00:01:05,630 それは時々使用してと呼ばい マジックナンバー、何かがあります 28 00:01:05,630 --> 00:01:08,030 我々は、一般的にしようとしないようにします。 29 00:01:08,030 --> 00:01:12,830 >> たとえば、のは見てみましょう ここで、この単純な関数で。 30 00:01:12,830 --> 00:01:15,726 明らかにデータはありません C言語での型は、カードやデッキと呼ばれます。 31 00:01:15,726 --> 00:01:16,600 だから私と一緒にクマ。 32 00:01:16,600 --> 00:01:18,910 それは少しです 擬似コードは、ここで混合。 33 00:01:18,910 --> 00:01:21,050 これは、呼び出された関数であります その外見上のカードを対処します 34 00:01:21,050 --> 00:01:26,570 そのパラメータとしてデッキをとり、 私に意志出力シングルカード。 35 00:01:26,570 --> 00:01:30,990 >> そして、私はどこここで何かをやっています 、0から52まで実行されたループを持っています 36 00:01:30,990 --> 00:01:33,394 私はカードを取り扱っております。 37 00:01:33,394 --> 00:01:35,310 さて、私たちは魔法を持っています ここで番号は、右。 38 00:01:35,310 --> 00:01:38,790 あなたはマジックナンバーが何であるかを見ていますか? 39 00:01:38,790 --> 00:01:42,280 または、より重要なのは、あなたを行います 問題はここにあるものを見ますか? 40 00:01:42,280 --> 00:01:44,310 特に、この場合 ただ一つの関数であります 41 00:01:44,310 --> 00:01:48,030 で、独自のファイルで 含まれているフォルダ 42 00:01:48,030 --> 00:01:49,970 異なるの束 ファイルは、その各々 43 00:01:49,970 --> 00:01:51,670 カードのデッキに別のことを行います。 44 00:01:51,670 --> 00:01:57,310 多分それはそれらをシャッフルするか、手予約します 5枚のカードの代わりに一枚のカードの。 45 00:01:57,310 --> 00:01:59,420 >> あなたは何を参照しています 問題はここだろうか? 46 00:01:59,420 --> 00:02:03,220 あなたはマジックナンバーを参照しています 私は、コードの中に注入しましたか? 47 00:02:03,220 --> 00:02:04,390 それは右、52です。 48 00:02:04,390 --> 00:02:06,440 >> 同様に、直感的にあなたはおそらく知って、[OK]をクリックします。 49 00:02:06,440 --> 00:02:09,740 の標準的なデッキのように カードは52枚のカードが含まれています。 50 00:02:09,740 --> 00:02:12,570 しかし、私たちのプログラムでは、それだけです そこに漂っのようなもの。 51 00:02:12,570 --> 00:02:15,280 突然のすべてが52ありますようなものです。 52 00:02:15,280 --> 00:02:18,290 >> これを解決する一つの方法 問題は、これを行うことです。 53 00:02:18,290 --> 00:02:22,724 我々は現在、非常に明確にしています 52としてデッキサイズを呼び出します。 54 00:02:22,724 --> 00:02:25,390 それはもう少し直感的になります 場合のループ内での意味 55 00:02:25,390 --> 00:02:28,650 後に、私たちはその後、私を言います デッキサイズ未満です。 56 00:02:28,650 --> 00:02:32,666 それはちょうど52を言ってより良さそうです。 57 00:02:32,666 --> 00:02:34,290 さて、これは実際に問題を解決しません。 58 00:02:34,290 --> 00:02:38,460 これは、いくつかの象徴を与えません 定数に意味。 59 00:02:38,460 --> 00:02:40,820 しかし、それは一種の実際に行います 別の問題を導入します 60 00:02:40,820 --> 00:02:43,770 それはすぐに明らかではないかもしれません。 61 00:02:43,770 --> 00:02:45,859 でも、この変数の場合 宣言されglobally-- 62 00:02:45,859 --> 00:02:47,650 あなたは何それを思い出すん 私たちが宣言するとき意味 63 00:02:47,650 --> 00:02:50,500 グローバルローカル対変数? 64 00:02:50,500 --> 00:02:53,340 我々は変数を宣言する場合でも、 世界的に、何があるかどう 65 00:02:53,340 --> 00:02:55,500 別の関数で 機能の私達のスイート 66 00:02:55,500 --> 00:02:59,750 カードマジックでその契約 それが誤って、デッキサイズを変更 67 00:02:59,750 --> 00:03:02,727 またはそれを増加させることによって 1または1で、それを減少させます。 68 00:03:02,727 --> 00:03:04,060 そう、問題をもたらすだろうか? 69 00:03:04,060 --> 00:03:08,261 我々はセットを扱っている場合は特に 完全なデッキをシャッフルカード 70 00:03:08,261 --> 00:03:08,760 必要とされている。 71 00:03:08,760 --> 00:03:12,804 デッキのサイズが減少した場合 1によって、例えば、51まで、 72 00:03:12,804 --> 00:03:14,970 私たちは実際にシャッフルしていません おそらくすべてのカード。 73 00:03:14,970 --> 00:03:16,500 私たちは、そのうちの一つを残しています。 74 00:03:16,500 --> 00:03:21,680 そして、その値は、おそらく可能性があり 予測か悪いの俳優によって悪用。 75 00:03:21,680 --> 00:03:24,920 >> Cはと呼ばれるもの提供します プリプロセッサ指令、どの 76 00:03:24,920 --> 00:03:27,764 また、マクロのと呼ばれています シンボル定数を作成します。 77 00:03:27,764 --> 00:03:30,180 そして、実際には、あなたはすでにしました プリプロセッサディレクティブを見て、 78 00:03:30,180 --> 00:03:32,916 あなたはそれを聞いていない場合でも、 #includeでそのと呼ばれます。 79 00:03:32,916 --> 00:03:37,150 これは、マクロのもう一つの例です またはプリプロセッサディレクティブ。 80 00:03:37,150 --> 00:03:41,290 >> シンボル定数を作成する方法、 または定数に名前を与えます 81 00:03:41,290 --> 00:03:43,740 それ以上を有するように つまり、以下の通りです。 82 00:03:43,740 --> 00:03:47,030 #define、名前、交換。 83 00:03:47,030 --> 00:03:49,140 本当に重要なさておき ここでは本当に迅速な。 84 00:03:49,140 --> 00:03:54,180 セミコロンを入れないでください あなたの#defineの終わり。 85 00:03:54,180 --> 00:03:57,310 だからの#define、名前、交換です。 86 00:03:57,310 --> 00:03:59,540 >> あなたのプログラムがコンパイルされると、 何が実際に起こります 87 00:03:59,540 --> 00:04:01,740 行けばコンパイラです あなたのコードを通過します 88 00:04:01,740 --> 00:04:06,770 とのすべてのインスタンスを置き換えます 単語 "名前"何でもあなたと 89 00:04:06,770 --> 00:04:08,860 代替として置きます。 90 00:04:08,860 --> 00:04:13,060 同様に、の#includeがある場合にソート コピーとペーストと同様に、 91 00:04:13,060 --> 00:04:15,700 その後の#defineは一種のです 検索と置換と同様に、 92 00:04:15,700 --> 00:04:19,180 あなたは今までにその機能を使用した場合 例えば、ワードプロセッシングプログラム、。 93 00:04:19,180 --> 00:04:26,345 >> 例えば、もしだから私 3.14159265としての#define PI、 94 00:04:26,345 --> 00:04:28,720 あなたはより良い数学的にしている場合 傾斜して突然 95 00:04:28,720 --> 00:04:31,640 3.14159265飛行を見ます 周りのあなたのコードで、 96 00:04:31,640 --> 00:04:33,517 あなたは、おそらくそれはパイの話を知っています。 97 00:04:33,517 --> 00:04:35,850 しかし、多分私達はそれを与えることができます もう少し象徴的な意味。 98 00:04:35,850 --> 00:04:39,850 そして、我々は代わりに#defineを言うことができます 数字の一口としてπ 99 00:04:39,850 --> 00:04:42,110 私は維持するつもりはないこと 何度も読んで。 100 00:04:42,110 --> 00:04:45,560 >> そして、何がで次に起こるだろう プログラムがある場合、コンパイル時間があります 101 00:04:45,560 --> 00:04:48,530 コンパイルされた、最初にその どうなる、それが通過しますです 102 00:04:48,530 --> 00:04:51,520 そして、それは毎回交換します それは、資本P、資本私を見て 103 00:04:51,520 --> 00:04:55,610 それは文字通りに置き換えますよ 3.14というように、そのようにあなた 104 00:04:55,610 --> 00:04:58,090 それごとに入力する必要はありません 時間まだあなたのプログラムしばらく 105 00:04:58,090 --> 00:05:00,631 あなたの機能を持っています あなたが作業しているので、期待して 106 00:05:00,631 --> 00:05:05,090 操作で、掛けます、 それはπによっては何でも、分割。 107 00:05:05,090 --> 00:05:08,230 >> あなたがこれに限定されるものではありません 数字のみの置換。 108 00:05:08,230 --> 00:05:12,279 例えば、私は#defineすることができ 文字列CS50として当然。 109 00:05:12,279 --> 00:05:14,070 この場合、時 プログラムがコンパイルされ、 110 00:05:14,070 --> 00:05:16,236 #defineが通過します コー​​ドは、毎回交換します 111 00:05:16,236 --> 00:05:19,900 それは、文字列CS50と「コース」を見てい​​ます。 112 00:05:19,900 --> 00:05:21,720 >> あなたがここにわかります また、私は頻繁にそれ 113 00:05:21,720 --> 00:05:26,090 すべての私の定義されている記号を#defineします 定数、いわば、 114 00:05:26,090 --> 00:05:28,130 すべて大文字で常にあります。 115 00:05:28,130 --> 00:05:28,960 それは慣例です。 116 00:05:28,960 --> 00:05:30,170 これは必須ではありません。 117 00:05:30,170 --> 00:05:33,900 一般の人が使用する理由 すべて大文字彼らは#definingています 118 00:05:33,900 --> 00:05:37,590 ちょうどそのそれは本当に明確にすることです 私のコードのこの特定の要素 119 00:05:37,590 --> 00:05:38,820 定義された定数です。 120 00:05:38,820 --> 00:05:43,730 それが小文字だった場合、それがいる可能性があります それは変数と混同される可能性があります。 121 00:05:43,730 --> 00:05:46,120 そして、それはおそらくです 行うにはない良いこと。 122 00:05:46,120 --> 00:05:48,910 >> したがって、この特定の 解決策は、はるかに優れています 123 00:05:48,910 --> 00:05:50,550 以前のもののいずれかよりも。 124 00:05:50,550 --> 00:05:59,950 私最初の#defineデッキサイズ52場合には、 今ここに52、またはデッキサイズの私の使用、 125 00:05:59,950 --> 00:06:01,850 多くは、より直感的で多くの方が安全です。 126 00:06:01,850 --> 00:06:03,280 あなたは定数を操作することはできません。 127 00:06:03,280 --> 00:06:05,259 あなたは52プラスプラスと言うことはできません。 128 00:06:05,259 --> 00:06:06,800 それは53に変換するつもりはありません。 129 00:06:06,800 --> 00:06:09,390 あなたは何かに52を変更することはできません。 130 00:06:09,390 --> 00:06:12,470 >> あなたは、変数を変更することができます その値は52で、 131 00:06:12,470 --> 00:06:14,870 これは、我々の前に持っていた最初の測位ました。 132 00:06:14,870 --> 00:06:17,000 そして、あなたは増加する可能性が 53にその変数。 133 00:06:17,000 --> 00:06:21,100 しかし、あなたは52プラスプラスと言うことはできません 突然53に52を回すことがあります。 134 00:06:21,100 --> 00:06:23,350 52は常に52です。 135 00:06:23,350 --> 00:06:28,860 だから、あなたが誤って変更することはできません。 ここでそれを操作することにより、デッキのサイズ、 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> もう一つの良い側 このかかわらずの効果があります 138 00:06:32,390 --> 00:06:38,310 そのあなたが知っていることではありません 世界中のすべての国 139 00:06:38,310 --> 00:06:40,690 サイズ52のデッキのカードを使うのか? 140 00:06:40,690 --> 00:06:45,630 例えば、それは本当に一般的です ドイツは32のデッキサイズを使用するには、 141 00:06:45,630 --> 00:06:48,020 彼らはいくつかを取り除く場所 低い値カード。 142 00:06:48,020 --> 00:06:50,960 そして、この場合には、私 ポートに私のスイートを望んでいました 143 00:06:50,960 --> 00:06:55,390 対処機能 ドイツのカードマジック。 144 00:06:55,390 --> 00:06:59,440 私は、最初のインスタンスにできた我々 示したが、行くと交換する必要が 145 00:06:59,440 --> 00:07:03,570 32と私のコード内の52のすべてのインスタンス。 146 00:07:03,570 --> 00:07:07,940 >> しかし、ここで、私は#defineした場合、デッキサイズ 私のコードの最上部に32として、 147 00:07:07,940 --> 00:07:11,730 私はそれを変更する必要がある場合は、私がすることができます ちょうどその一つのことを行って、変更します。 148 00:07:11,730 --> 00:07:15,010 私のコードを再コンパイルして、すべての 突然それが伝播します。 149 00:07:15,010 --> 00:07:18,850 実際には、我々は、デッキを変更​​することができます 私たちが望む任意の値に大きさ。 150 00:07:18,850 --> 00:07:22,500 >> 私はであなたの興味をひくことができます デッキサイズピックアップのゲーム? 151 00:07:22,500 --> 00:07:23,430 >> 私はダグロイドです。 152 00:07:23,430 --> 00:07:25,840 そして、これはCS50です。 153 00:07:25,840 --> 00:07:27,772