[音楽再生] 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です。