>> [音楽再生]
DOUG LLOYD：すべての権利。
奇妙なトピックの種類、右？
マジックナンバー。
彼がいたとき、彼は何を意味するのDOE マジックナンバーの話？
さて、プログラムの一部 我々はCS50で書かれたこと
これまでにいくつかの奇妙なを持っていました 数字は種類の彼らに投げ。
おそらく理由のために我々にはありません 完全に今理解しています。
例えば、マリオの問題で、我々 23でピラミッドの高さをキャップしました。
私たちは、明示的に述べました 23よりも高くして行くことはできません。
>> しかし、23は何を意味するのでしょうか？
さて、あなたが読めば 、慎重にあなたのスペック
ことを見たかもしれません 我々は23でそれをキャップした理由
ための標準的な高さ ターミナルウィンドウの24です。
そして、私たちが持っている場合 ピラミッドは、それよりも背が高いです、
それは、この奇妙なことを行う可能性があります どこに画面をオフに実行されます。
そして、あなたは何を知っています、 それは右、文脈で意味ですか？
>> 23の意味はすぐに明らかです あなたのプログラムを見て誰かに
多分別のを持っています サイズターミナルウィンドウ？
おそらくない。
これは、[OK]を、のように思えます。
さて、なぜそれが23よりちょうど小さいですか？
一般的に、それはようなものです 悪い癖の実際
あなたのコードに定数を書き込むことができます。
あなたが実際に行う際に、そうすることで あなたのコードに定数を記述し、
それは時々使用してと呼ばい マジックナンバー、何かがあります
我々は、一般的にしようとしないようにします。
>> たとえば、のは見てみましょう ここで、この単純な関数で。
明らかにデータはありません C言語での型は、カードやデッキと呼ばれます。
だから私と一緒にクマ。
それは少しです 擬似コードは、ここで混合。
これは、呼び出された関数であります その外見上のカードを対処します
そのパラメータとしてデッキをとり、 私に意志出力シングルカード。
>> そして、私はどこここで何かをやっています 、0から52まで実行されたループを持っています
私はカードを取り扱っております。
さて、私たちは魔法を持っています ここで番号は、右。
あなたはマジックナンバーが何であるかを見ていますか？
または、より重要なのは、あなたを行います 問題はここにあるものを見ますか？
特に、この場合 ただ一つの関数であります
で、独自のファイルで 含まれているフォルダ
異なるの束 ファイルは、その各々
カードのデッキに別のことを行います。
多分それはそれらをシャッフルするか、手予約します 5枚のカードの代わりに一枚のカードの。
>> あなたは何を参照しています 問題はここだろうか？
あなたはマジックナンバーを参照しています 私は、コードの中に注入しましたか？
それは右、52です。
>> 同様に、直感的にあなたはおそらく知って、[OK]をクリックします。
の標準的なデッキのように カードは52枚のカードが含まれています。
しかし、私たちのプログラムでは、それだけです そこに漂っのようなもの。
突然のすべてが52ありますようなものです。
>> これを解決する一つの方法 問題は、これを行うことです。
我々は現在、非常に明確にしています 52としてデッキサイズを呼び出します。
それはもう少し直感的になります 場合のループ内での意味
後に、私たちはその後、私を言います デッキサイズ未満です。
それはちょうど52を言ってより良さそうです。
さて、これは実際に問題を解決しません。
これは、いくつかの象徴を与えません 定数に意味。
しかし、それは一種の実際に行います 別の問題を導入します
それはすぐに明らかではないかもしれません。
でも、この変数の場合 宣言されglobally--
あなたは何それを思い出すん 私たちが宣言するとき意味
グローバルローカル対変数？
我々は変数を宣言する場合でも、 世界的に、何があるかどう
別の関数で 機能の私達のスイート
カードマジックでその契約 それが誤って、デッキサイズを変更
またはそれを増加させることによって 1または1で、それを減少させます。
そう、問題をもたらすだろうか？
我々はセットを扱っている場合は特に 完全なデッキをシャッフルカード
必要とされている。
デッキのサイズが減少した場合 1によって、例えば、51まで、
私たちは実際にシャッフルしていません おそらくすべてのカード。
私たちは、そのうちの一つを残しています。
そして、その値は、おそらく可能性があり 予測か悪いの俳優によって悪用。
>> Cはと呼ばれるもの提供します プリプロセッサ指令、どの
また、マクロのと呼ばれています シンボル定数を作成します。
そして、実際には、あなたはすでにしました プリプロセッサディレクティブを見て、
あなたはそれを聞いていない場合でも、 #includeでそのと呼ばれます。
これは、マクロのもう一つの例です またはプリプロセッサディレクティブ。
>> シンボル定数を作成する方法、 または定数に名前を与えます
それ以上を有するように つまり、以下の通りです。
#define、名前、交換。
本当に重要なさておき ここでは本当に迅速な。
セミコロンを入れないでください あなたの#defineの終わり。
だからの#define、名前、交換です。
>> あなたのプログラムがコンパイルされると、 何が実際に起こります
行けばコンパイラです あなたのコードを通過します
とのすべてのインスタンスを置き換えます 単語 "名前"何でもあなたと
代替として置きます。
同様に、の#includeがある場合にソート コピーとペーストと同様に、
その後の#defineは一種のです 検索と置換と同様に、
あなたは今までにその機能を使用した場合 例えば、ワードプロセッシングプログラム、。
>> 例えば、もしだから私 3.14159265としての#define PI、
あなたはより良い数学的にしている場合 傾斜して突然
3.14159265飛行を見ます 周りのあなたのコードで、
あなたは、おそらくそれはパイの話を知っています。
しかし、多分私達はそれを与えることができます もう少し象徴的な意味。
そして、我々は代わりに#defineを言うことができます 数字の一口としてπ
私は維持するつもりはないこと 何度も読んで。
>> そして、何がで次に起こるだろう プログラムがある場合、コンパイル時間があります
コンパイルされた、最初にその どうなる、それが通過しますです
そして、それは毎回交換します それは、資本P、資本私を見て
それは文字通りに置き換えますよ 3.14というように、そのようにあなた
それごとに入力する必要はありません 時間まだあなたのプログラムしばらく
あなたの機能を持っています あなたが作業しているので、期待して
操作で、掛けます、 それはπによっては何でも、分割。
>> あなたがこれに限定されるものではありません 数字のみの置換。
例えば、私は#defineすることができ 文字列CS50として当然。
この場合、時 プログラムがコンパイルされ、
#defineが通過します コー​​ドは、毎回交換します
それは、文字列CS50と「コース」を見てい​​ます。
>> あなたがここにわかります また、私は頻繁にそれ
すべての私の定義されている記号を#defineします 定数、いわば、
すべて大文字で常にあります。
それは慣例です。
これは必須ではありません。
一般の人が使用する理由 すべて大文字彼らは#definingています
ちょうどそのそれは本当に明確にすることです 私のコードのこの特定の要素
定義された定数です。
それが小文字だった場合、それがいる可能性があります それは変数と混同される可能性があります。
そして、それはおそらくです 行うにはない良いこと。
>> したがって、この特定の 解決策は、はるかに優れています
以前のもののいずれかよりも。
私最初の#defineデッキサイズ52場合には、 今ここに52、またはデッキサイズの私の使用、
多くは、より直感的で多くの方が安全です。
あなたは定数を操作することはできません。
あなたは52プラスプラスと言うことはできません。
それは53に変換するつもりはありません。
あなたは何かに52を変更することはできません。
>> あなたは、変数を変更することができます その値は52で、
これは、我々の前に持っていた最初の測位ました。
そして、あなたは増加する可能性が 53にその変数。
しかし、あなたは52プラスプラスと言うことはできません 突然53に52を回すことがあります。
52は常に52です。
だから、あなたが誤って変更することはできません。 ここでそれを操作することにより、デッキのサイズ、
>> もう一つの良い側 このかかわらずの効果があります
そのあなたが知っていることではありません 世界中のすべての国
サイズ52のデッキのカードを使うのか？
例えば、それは本当に一般的です ドイツは32のデッキサイズを使用するには、
彼らはいくつかを取り除く場所 低い値カード。
そして、この場合には、私 ポートに私のスイートを望んでいました
対処機能 ドイツのカードマジック。
私は、最初のインスタンスにできた我々 示したが、行くと交換する必要が
32と私のコード内の52のすべてのインスタンス。
>> しかし、ここで、私は#defineした場合、デッキサイズ 私のコードの最上部に32として、
私はそれを変更する必要がある場合は、私がすることができます ちょうどその一つのことを行って、変更します。
私のコードを再コンパイルして、すべての 突然それが伝播します。
実際には、我々は、デッキを変更​​することができます 私たちが望む任意の値に大きさ。
>> 私はであなたの興味をひくことができます デッキサイズピックアップのゲーム？
>> 私はダグロイドです。
そして、これはCS50です。