[Powered by Google Translate] [第4項] [あまり快適] [ネイトHardison] [ハーバード大学] [これはCS50です。] [CS50.TV] すべての権利は​​、セクションに戻って歓迎する。 今週のセクションでは、私たちは二つのことをやろうとしている。 我々は、最初のリキャップ問題セット2に行くんだ シーザーとVigenère問題のセットです。 そして、我々はクイズ0件飛び込むつもりだ そして我々が話した内容を要約し少し時間を費やす 講義のそれぞれで、これまでのところ、我々はまた、いくつかの問題をやる 前年のクイズから。 そうすればあなたたちはそのための準備をするためには、良い方法があります。 開始するには、私は良いソリューションのカップルを起動した 以前の問題セットのため、問題はこの空間に、2を設定します。 あなたたちは、このすべてのリンクをヒットした場合、 そしてあなたが私の名前をクリックして、私の最初のリビジョンをクリックした場合 あなたは、私が見ているものを正確になりcaesar.cを、表示されます。 本当にすぐにこれについて話してみましょう。 これは単なるサンプルソリューションです。 これは完璧なソリューションであるとは限りません。 これを書くために多くの異なる方法がありますが、 しかし、私が強調したかったことがいくつかあります 私はグレーディング、私が思う一般的なミスだったと見ている このソリューションは、取り扱いが非常に良い仕事をしません。 第一は、上部にヘッダコメントのいくつかの並べ替えを持っています。 7行目まで1日にあなたは詳細を参照してください、 このプログラムは、正確に何をやっている。 あなたがCのコードを書いているの良い標準的な実践 関係なく、あなたのプログラムは、一つのファイル内に含まれる場合は それが複数のファイルに分割さているかどうかのいくつかの並べ替えを持っていることである 最初のコメントを方向付ける。 これは、外に出て、現実世界でコードを書いている人も対象としています。 彼らは著作権情報を出してあげるところです。 以下の#含まれています。 16行目で、これは#私たちは少しだけにして戻ってくる、これを定義あり。 そして、一度関数は、かつてメインスタートを開始 このプログラムはすべて、単一の関数に含まれているため、 起こると、これは非常に慣用句とCプログラムの典型である非常にまず最初に コマンドラインにかかるということがすぐにチェックする引数である- 引数countは、argcのために。 右ここでは、このプログラムが正確に2つの引数を期待していることがわかります。 特別なものだと、最初の引数があると覚えておいてください それは、常に実行されているプログラムの名前です 実行可​​能ファイルの名前。 それで、これは何をするかは、それがプログラムを実行したりすることを防ぐためです より多くのまたはより少ない引数を持つ。 私たちは離れて、この権利があるかどうかをチェックする理由はある 私たちは実際に確実に右ここにこのargv配列にアクセスすることはできません 我々はそれがどのように大きく見て確認するまで。 私が見た一般的なエラーの1つは、人々はすぐに行くことだった とargv [1]をつかむ。 彼らは外に配列のキー引数をつかむだろうと私は、それをチェックするか その後彼らは、argcをするためのテストだけでなく、次のテストを行うと思います 最初の引数は、確かに同じ時に整数だったかどうか ケースで供給引数がないことをため、それは動作しません あなたはそこではない引数をつかむか、存在しないものをつかむしようとすることでしょう。 あなたが気付くべきである他の大きなものは、ということです あなたは常に有用なエラーメッセージのいくつかの並べ替えをプリントアウトしたい ユーザへの向きを受けなければならない。 私は、あなたが突然、それがクラッシュのすべてのプログラムの実行をしたと確信しています そしてあなたがポップアップし、言うこのばかげた小さなダイアログを得る 多分恐ろしく不可解な、何かがあなたに、エラー·コード、またはそのような何かを与える それは意味をなさない。 あなたが本当に役立つものを提供したいところです そして、彼らはそれを実行したときに、 "ああ、"顔の手のひらに行くように、ユーザーを対象とした。 "私は何を正確に何を知っています私はこの問題を解決する方法を知っています。" あなたがメッセージを出力しない場合は、実際に終わる あなたのソースコードを調べて行くことにユーザーを残して 何が悪かったのかを把握する。 あなたが別のエラーコードを使用しますことを、いくつかの回もあります。 ここでは、単にエラーがあったと言うために1つを使用し、 エラーが発生した、エラーが発生しました。 大きなプログラムは、他のプログラムによって呼び出されることが多いプログラムは、 さまざまなシナリオでの特殊なエラーコードのいくつかの並べ替えを返します。 プログラムで何がそうでない場合と通信する ただのための素敵な英語のメッセージを使用します。 クール。 私たちが降りていくように、あなたは私たちが鍵を引き出し見ることができます。 私たちは、キーが合うかどうかを確認するためにテストします。 私たちは、ユーザからのメッセージを取得します。 ループと、これは我々がカバーする何かである間、我々はこれを行うには、それを行う理由 少し - しかし、で、それはあなたがコントロールDを入力した場合と判明 あなたは、端末上のGetStringメソッドのプロンプトが表示されたとき 実際に何をするかは、それが特殊文字を送信している プログラムへ。 それはELFまたはファイルの終了文字と呼ばれています。 そして、その場合には、私たちのメッセージ文字列は、nullになります ので、これが問題に自分自身を設定するために我々はチェックものではありませんでした。 我々は上に行くようにしかし、今、私たちは、ポインタの話を始めたこと ヒープ上と動的メモリ割り当て、 あなたは可能性がある関数があるときにnullをチェック 値が何をしての習慣で取得したいと思うこと何かであるように、nullを返す。 これは主に、説明のためにここにある。 しかし、あなたは将来のGetStringメソッドを参照して実行した場合、 そうでセット4問題から、あなたは、このことを覚えておいてしたいと思う。 繰り返しますが、これは、我々はまだそれをカバーしていなかったので、どちらかのセット3問題では問題になりません。 最後に、我々は、我々はメインの暗号化ループに到達この部分を取得 そしてここで何が起こっているものがいくつかあります。 まず、我々は全体のメッセージ文字列自体を反復。 ここでは、条件においてstrlen呼び出しを守ってきた そのあなたの数が指摘してきたが行くのに最適な方法ではありません。 それは、このケースでは、それはまた、素晴らしいではありません判明 我々は、メッセージ自体の内容を変更している理由の一つ 内側ループのために、私たちは10文字の長さのメッセージを持っている場合、 我々はループstrlenは何を返すことを初めて起動したとき? 10。 しかし、我々はそのメッセージを変更した場合、我々はその第五の文字を変更言う そして我々は、第五の位置に '\ 0'文字で投げる 後続の反復ではstrlen(メッセージ)は、それが何をしたかは戻りません 我々は非常に反復初めて、 我々はそのヌルターミネータで投げたので、それは代わりに、5を返します と文字列の長さが定義されています その\ 0の位置による。 このケースでは、これは我々の場所でそれを変更しているので、行くのに最適な方法です。 しかし、あなたが、これは暗号化するために、実際には驚くほどシンプルであることに気づく あなたは数学が正しい得ることができるかどうか。 必要なのは、あなたが見ていることを手紙かどうかをチェックすることです 大文字または小文字です。 我々は唯一それをチェックする必要があり、我々はチェックする必要はありません理由 アルファケースがあるためです 文字が大文字かどうか、またはそれは小文字です それは、間違いなく英字だ 我々は、大文字と小文字の数字を持っていないため。 我々がやると他の事、これは少しトリッキーです - 我々は標準的なシーザー暗号の式を変更したさ 我々は問題セット仕様で与えた。 ここで何が異なるのは、我々が減算ということです 大文字小文字の首都で、それから私達は首都追加 バックエンドでインチ 私はあなたのいくつかは、あなたのコードでこれを行っている知っている。 あなた方の誰もが、あなたの提出物でこれをやったの? あなたがこれをしなかった。あなたは、これが何Sahbを説明できますか? あなたが右のそれの後にMODをやったので、それを差し引くことにより、 あなたは、あなたが[せき]の位置を得るためにそのようにそれを取らなければならない。 そして、後でそれを追加することにより、あなたが欲しかったいずれかの上にシフトした。 ええ、その通りです。 Sahbだった言っている私たちは、追加したいとき 私たちのメッセージと一緒に私たちの鍵 その後モッズ、そのMODそのNUM_LETTERSによって、 我々は、最初に適切な0から25の範囲に私たちのメッセージを拡張しない場合は、 その後、私たちは本当に奇妙な番号を取得するに終わるかもしれない なぜなら、私たちはメッセージ[i]を見たときを見ていることに価値観、 我々は、プレーンテキストメッセージのi番目の文字を見たとき、 値は、この65から122の範囲でどこかにある 小文字のaからzまでの大文字のASCII値に基づいています。 そして私たちは、26によりまたはNUM_LETTERSによってそれをMODのとき それ以来、私たちは#、ここで右上にまで定義されました 私達に0から25の範囲での値を与えるために起こっていること、 そして我々はその背中にスケールアップするための方法が必要 そしてそれ適切なASCII範囲内の取得します。 行う最も簡単な方法は、ちょうどすべてをスケールダウンすることである 0から25の範囲に、始めに それから、末尾にすべてのファイルのバックアップを作成するシフト。 私は人々が陥る見たもう一つの一般的なエラーがある あなたは実際にすぐにこのスケーリングをしない場合 と、言うには、一緒にメッセージとキーを追加し、それらを追加する char型の変数は、その問題に あるメッセージから[i]を開始するための、比較的大きな数であると、 それは大文字の文字であればそれは少なくとも65であることを忘れないで あなたは、大きな鍵と言う、100のような何かを持っていたら、 とあなたがオーバーフローを取得するつもりだがsigned charに一緒にそれらの2を追加します。 あなたは、127より大きいの値を取得するつもりだ これは、char型の変数が保持できる最大の値です。 あなたが最初からそういったことをやってみたいと思いますなぜ、再び、それはです。 一部の人々はif then elseやテストを行うことによって、そのケースを回避した それがオーバーフローした場合、その作業を行う前に確認するには、 しかし、この方法は、その回避しています。 そして、このソリューションでは、我々は非常に最後に文字列全体をプリントアウト。 他の人々は一度に1文字をプリントアウト。どちらも、素晴らしいです。 この時点で、君たちはどんな質問、これについて何かコメントはありますか? あなたが好きなもの、あなたが好きではないもの? 私は疑問を持っていた。 たぶん私はあなたの説明の間にそれを逃したが、どのようにこのプログラム テキストの長さにキーを接続するためのスペースを無視? これはただのシーザー暗号です。>>ああ、ごめん、うん。 ええ、私たちはそれを見ることができます。 シーザー暗号では我々は回避したので、 我々は唯一の文字を反転します。 彼らは大文字または小文字であった場合、我々はそれらだけを回転させる。 君たちはこれについて、かなり良い感じ? このホームをコピーしてお気軽に、それを取る あなたたちが書いたものと比較します。 間違いなくあまりにもそれについての質問を送って自由に感じる。 そして再び、あなたの問題を持つここでの目標は設定していることを実現 あなたたちは、あなたの問題セットに最適なコードを書いてもらうことはありません。 それは、学習経験だ。うん。 戻るためにループしながら、それがnullに等しい場合、 ので、nullがちょうど何の意味もありません、彼らは単にEnterを打つ? nullの場合は、特別なポインタ値です 我々が言いたいとき、私たちはnullを使用 我々は何を指しているポインタ変数を持っています。 それで、一般的に、それはつまり、この変数は、このメッセージの変数 我々はCS50特殊文字列型を使用しているため、ここでは空であり、 CS50文字列型は何ですか? あなたは、ダビデが戻って講義中にフードを引っ張ったときに、それが何であるかを見たことがありますか? それはファンキーなそれはだポインタ、右ですか? 大丈夫、うん。>>それはchar *です。 それで、本当に我々はこれを置き換えることができます 右ここでchar *のメッセージとともに、 などGetStringメソッド機能、それが正常にユーザから文字列を取得していない場合、 それは文字列、それが文字列を解析することはできません1つのケースを解析することはできません ファイルの文字、コントロールD、の終わりには、ユーザーの種類場合です どちらが一般的に行うものではありませんが、それが発生した場合 この関数は口癖のように、このNULL値が返されます "ねえ、私は、文字列を取得できませんでした。" 我々はメッセージ= nullを入れていない場合はどう、どうなるでしょう 我々はまだやっていないことを何かがいるのですか? なぜそれがここでの問題でしょうか? 私は、我々はメモリリークについての講義で少し話していることを知っているので。 うん、そんなこと、そして何が起こるか見てみましょう。 バジルの質問は、私たちが実際に持っていないとどうなるかだった このメッセージ= nullのテスト? 一番上までスクロールしましょう​​。 君たちは、この行をコメントアウトして下さい。 実は、私は改正に保存します。 これは、リビジョン3になります。 あなたがこのプログラムを実行するために行う必要があるでしょうと、あなたはここまで、この歯車のアイコンをクリックする必要がありますです そして、あなたはそれに引数を追加する必要があります。 我々は、コマンドライン引数を渡したいので、あなたはそれをkey引数を与えなければならないでしょう。 ここで私はそれを数字の3を与えるつもりだ。私は3が好きです。 さて、戻ってズームアウトプログラムを実行している。 これは、構築、コンパイル、実行している。 ここに私達は行く。これは、プロンプトが表示されるのを待っている。 私は、hello-それは行かなかったような何かを入力すると? ああ、私のプログラムを実行するには時間がかかりすぎた。私はあまりにも長い間jawingた。 ここに行く。 今、私はハローに入力します。 我々は、それが適切に暗号化していることがわかります。 我々は、nullを返すようにプロンプ​​トがGetStringメソッドをすれば今何が起こりますか? 覚えておいて、私たちは同時にコントロールDキーを押していることをしたと語った。 私はここで上にスクロールします。我々は再びそれを実行することになるでしょう。 建物。そこに行く。 今、私はコントロールDを打ったとき 私は、セグメンテーションフォールトをopt/sandbox50/bin/run.sh言うこの線を得た。 君たちは、その前に見たことがありますか? [学生]なぜ無>>申し訳ありませんがありますか? [学生]なぜこの場合にはコアダンプがないのでしょうか? コア·ダンプは-ここにありなしコアダンプである理由疑問がありますか? 質問があるかもしれないことであるが、コア·ダンプがファイルである それは、ハードドライブ上に保存されます。 このケースでは、コアダンプを無効にしました 実行サーバ上で我々は、断層はseg人々を持っていないように とコアダンプのトンを構築する。 しかし、あなたは1を得ることができます。 コア·ダンプは、あなたが頻繁に無効にすることができるものの夫婦です そして時にはその必要があります。 セグメンテーションフォルト、あなたの質問に答えるために、バジル、 我々はポインタにアクセスしようとしたことを言っている それは何を指すように設定されていませんでした。 BINKYがし​​ようとしたときにビデオにBINKY覚えている 何を指していないポインタにアクセスしに行く? この場合において、私は技術的にポインタが何を指していると思います。 それは技術的に0であるヌル、、を指している それは、アクセスできないセグメントになるように定義され あなたのプログラムで、そのため、セグメンテーションフォールトを取得 有効なセグメントでのメモリにアクセスしていないので ヒープセグメントまたはスタック·セグメントまたはデータ·セグメントのような。 クール。 シーザーについて、これ以上の質問は? のは、先に進みましょう。本当にすぐにリビジョン2を見てみましょう。 それはVigenèreだ。 ここでVigenère 私たちは、再び、のでかなり早く、このいずれかを介して歩くよ Vigenèreとシーザーはよく似ています。 ヘッダコメントは、前にある これらのマジックナンバーを使用しないようにする前に#defineはある。 良い点は、我々は移動したいと言っている そのような別のアルファベットか何か。 のではなくすべての26のコードの変更を手動で移動すること 我々は27にこれを変更したり、それをドロップする可能性が 我々は、異なるアルファベット、異なる言語を使用していた場合。 再び、我々は、引き数の場合は、このチェックを持っている そして実際にあなたはほとんどテンプレートとして、これを取ることができます。 あなたが書くほとんどすべてのプログラムが持っている必要があります - それは、コマンドライン引数-いくつかの行のシーケンスを取る場合 それは冒頭でこのように読める。 それはあなたが最初にしたい健全性テストの一つです。 ここで我々が​​何をしたか私たちはそのことを確認しました キーワードは、有効であり、それは我々がやったことを再度確認しました。 我々はargcおよび2からこれを分離したことに再度注意してください。 この場合、我々がしなければならなかったことが一つではなく、あったことに注意してください iに使用するのでは、我々は、文字列全体を検証したかった そしてあなたが実際に文字単位で行かなければならないことを行うために 文字列の上。 その上に何かを呼び出すためには良い方法はありません さえなぜなら、例えば、iに0を返します それは整数を解析できない場合であっても動作しないように。 繰り返しになりますが、素敵なメッセージは何が起こったかを正確にユーザに通知する。 その後、ここで、再び、我々はまた、ケースを扱う場所 制御Dランダムな文字でユーザータイプ。 そして、シャーロットは、我々はスペースをスキップするように管理する方法については、以前の質問があった ここで我々の文字列インチ これは、我々はMyspaceのプログラムで行ったのと同じようなのようなものだった 私たちは、セクションで行っており、この方法は、働いたこと 我々は我々が見たいという文字の数を追跡したということです。 我々が文字で文字の上に歩いている私たちは、メッセージ文字列の上に歩いていると、 我々は、ループのための私達の一部として索引を追跡し、我々はまた、追跡 文字の数なので、非特殊文字は、数字以外の、非空白 我々は独立した変数で見られると思います。 そして、この解決策は、キーを修正 実際のキーの整数を取得し、それはその場でそれを行うためには、 それは、実際のメッセージの文字を暗号化するために行く直前。 あまりにも完璧に素晴らしかった、いくつかの解決策があります。 鍵の妥当性をテストするとき、それは鍵を変更するでしょう。 確実に加えて、その文字とキーワード 英字は、それはまた、その整数になっていた 0から25の範囲で、次にこのforループの後のことをしなければならないことをスキップする。 繰り返しになりますが、あなたはここを参照してください、これは本当にまったく同じコードである 我々はこの時点ではシーザーで使用されている。 あなたは、まったく同じことをやっているので、本当のトリックは見つけ出すことです 整数にキーワードを有効にする方法。 我々は少し濃厚ですがここにいたことの一つ 我々はこのフレーズを繰り返しですが、私は、あなたがそれを呼び出すことができると思います ライン58、59、および61の3回に分け。 誰かが、まさにこの言葉が何をするのか説明できますか? あなたが言ったようにそれは、文字にアクセスしている。 ええ、それは、キーワードの[聞こえない]の文字です あなただけに沿って移動しているので、ので、それは見られる文字の数だ あなたは手紙を見てきましたら、キーワード、 そう効果的にスペースやそのようなものをスキップするつもりだ。 ええ、その通りです。 あなたの周りに戻って移動するようにしてから、一度あなたが単にMODキーワードを空白にして見てきました。 その通りです。それは完璧な説明を示します。 何ケビンが言ったことは我々がキーワードにインデックスを作成するということです。 可能ならば、我々は、num_letters_seen文字​​を取得したい しかしnum_letters_seenは、キーワードの長さを超えた場合、 我々は適切な範囲に戻ってくる方法は、我々はmod演算子を使用することです 効果的にラップアラウンドします。 たとえば、短いのように、私たちのキーワードは、ベーコンです そしてそれは5文字長いです。 しかし、我々は、この時点で私たちのプレーンテキストで6文字を見てきました と暗号化された6。 我々は、num_letters_seenにアクセスすることになります これは、キーワードのmod長さ、5、6です それで我々は1を取得し、私たちは何をしようと我々はよですよ その時点で私達のキーワードの最初の文字の内部にアクセスすることができます。 すべての権利、Vigenère上の任意の質問 我々は、移動する前に? 君たちはこれについて、かなり良い感じ? 偉大な、クール。 私は君たちがコードを見る機会を得ていることを確認したい 我々はよさそうだと思うし、そこから学ぶ機会を持っていること。 これは、我々は、当分の間はスペースを使用することがあります最後になるだろう 私たちは今、移行するつもりだ、と私はcs50.net/lecturesに行くつもりです 従って私達はクイズレビューの少し​​を行うことができます。 私はクイズのレビューをやって起動すると思う最良の方法 この講義のページに来ることになっている、cs50.net/lectures、 そして週の見出しの下に各ので、私は、0週でここ見れば 私は、我々は0週で扱ったトピックのリストを持っていることがわかります。 これらのトピックのいずれかがあなたに慣れていないと思われる場合 あなたは間違いなく戻って講義ノートを徹底的に調査したいとことによるとします したい場合でも、講義を流し読み、再びそれらを見る これらのトピックのそれぞれで何が起こっているかの感触を得ることができます。 私は、さらに我々が持っているクールなリソースの今年1を言うだろう 我々が作成したこれらのショートパンツです、あなたは0週を見れば、 、我々は、すべてのトピックがカバーされていないが、我々はそれらのかなりの数を持っている ので、もう一度これらのパンツを見てトリッキーなもののいくつか、 高速化するためにあなたを取得するための良い方法です。 特に、私は私がそれらをやっているので、底に3用プラグに入れてするつもりです。 しかし、あなたがバイナリ、ビット、六角、スタッフのようなもので苦労しているならば、 バイナリが開始するのに最適な場所です。 ASCIIはあまりにも見ることが良いことだ別の1つです。 私はあなたのためにあまりにも遅いつもりなら、あなたも1.5倍の速度で私を見ることができます。 それのレビュー以来、それをすること自由に感じなさい。 本当に迅速に開始するために、我々はこれらのクイズの問題のいくつかを使用して行くつもり ちょうどすぐにこれらを通じて解約する。 例えば、私はボードの上で右ここまで持っていることを問題16を見てみましょう。 我々は、バイナリでは、この次の計算式を持っている そして我々はすべての作業を見せてあげたい。 さて、私はこの打撃を与えるつもりです。 君たちは、紙と一緒に従うべきである そして我々はすぐに実際にこれをやる。 我々はバイナリで、次の計算を実行したい。 私は00110010を持っている。 そして、私はそれに00110010を追加するつもりです。 自宅に一緒に以下の数学の天才のために、 これは効果的に2を乗じている。 始めましょう。 我々は、我々が行うのと同じ加算アルゴリズムに従うつもり 私たちは一緒に十進数を追加するとき。 本当にここの唯一の違いは、バックの周りに、我々はループです 我々は10に到達一度一度我々は、1 + 1の代わりを持っています。 我々は本当にすぐに、右から開始する場合、何が最初の数字ですか? [学生] 0 >> [ネイトH.] 0。 偉大な、2桁目? [学生] 1。 [ネイトH.]それは1か? 1 +1は何ですか? [学生] 10。 [ネイトH.]正確には、私が一緒に追加されたもの2真下書いた数字だから何ですか? 次に、[学生] 1,0、または0と1を運ぶ。 [ネイトH.] 0と正確に、1を運ぶ。 次の1まで、バジルは、最大だ。 第三は何ですか?>> [バジル] 1。 [ネイト·H] 1、完璧。ケビン? [ケビン] 0 >> [ネイト·H] 0、シャーロット? [シャルロット] 0 >> [ネイトH.]ええ、私は何をすればいいですか? [学生] 1。 [ネイトH.]そして、私は何をすればいいですか?そして私は1を運ぶ。 パーフェクト、Sahb?>> [Sahb]今あなたが1を持っています。 [ネイトH.]そして、私はここでは何をしますか? [Sahb]次に、1の上まで運ばれたために1を持って次のいずれかの。 [ネイトH.]グレートので、ここで我々はそれを仕上げることができます。 クール。 [学生] 0 + 0 = 0としていますか? 0 + 0 = 0。 1 + 1は、あなたが言ったように、0 10、または1であり、むしろ。 10は私に10は番号10を意味するので、誤った呼称である、 そしてそれは我々がそれを書いているときに我々はそれを表している方法の気まぐれだ。 私たちは、1、0で番号2を表し、数字の10は若干異なります。 バイナリについての素晴らしいの一種は何でしょう本当にその多くはそこにはないということです あなたが学ぶ必要がある例。 0 + 0 = 0、0 +1 = 1は、あります 1 +1は0になり、その後、1を運ぶ そして、あなたは右から3番目のカラムにここで見ることができる 我々はこの1、1、1を持っていた。 と1 + 1 + 1が1である と、別の1を運ぶ。 もしバイナリ加算をやっているときに、非常にシンプル。 私は正気では自分自身をチェックするためにこれらのカップルより多くを行うと思います あなたは、これがあるために行く前に おそらく我々はクイズで見てくれることでしょう。 今だけでなく、この次のいずれかの操作を実行してみましょう。 問題17を実行してみましょう。 我々は、小数に以下のバイナリ数値を変換しようとしている。 私は10100111001を持っている。 私がしたことはバイナリビデオで覚えている 私は例のカップルを通って歩いて、私は方法を示しました あなたは小数でそれをやっているときに、すべてが動作します。 あなたは十進表現で作業しているとき、私は、我々がいると思う そのことで私たちの生活の中で、この時点でとても流暢 それが実際にどのように動作するかの仕組みをうまく取り繕うことは非常に簡単です。 しかし、私は番号137を持っている場合、簡単にまとめを行うこと これは本当に意味と再び、これは10進数で表現され、 進数で数値137は、私が1×100 + 3×10 + 7×1を持っていることを意味します。 これは、すべての画面上に滞在している。 それから、あなたはちょうどここにこれらの数字を見れば、 100、10、1、あなたは、彼らが実際に10のすべての力だということを参照してください。 私は、10㎡、10¹、ゼロ〜10を持っています。 我々は、バイナリ内のものの類似の並べ替えを持っている ことを除いて我々の基地は、我々はそれを呼び出すように、10の2の代わりになります。 私は一番下にここに書き留めておいたこれらの10S、 この10㎡、10¹、ゼロ、10から10までは、私たちの拠点となってい と指数、0、1、2のいずれか、 私たちが書いた数の桁の位置が示されている。 我々はそれを見れば1日、この1は第二の位置にある。 3は、第一の位置にある、と7は0番目の位置にある。 それは我々の拠点については、下記の様々な指数を得る方法です。 このwe'll - 実際に、すべての後、あなたは何を知っていますか? 私たちは、私の元に戻すボタンがdo-どこへ行ったのでしょう? そこに行く。 私はこの事を元に戻すことが大好きです。 これに続いて私は、少なくとも私のためだと思う 進数の変換を開始する最も簡単な方法 baseが16進数または16進数 と10または2ではない先に行くと、書き出すことです 上部にある私の進数の数字のすべての拠点と指数。 我々は、再び右に左から開始する場合、 これは直感に反するの一種であり、 私はここで黒に戻します、我々は、0番目の位置に2を持っている それから私達は2を持っています¹、2²、 その後2〜3、2 4、2から5まで、6、 7、8、9、10。 私が書いたこれらの数字は、すべての指数です。 私はちょうどスペースの最初の3でここに拠点を書きました。 この時点で私は先に行くつもりだと私は実際に消去するつもりです それは大丈夫だ場合、我々は、小数でやったもの。 あなたはすべてのことを持っている。 私は確信してオンラインで見ているあなたの人々は、あなたが好きなら、私を巻き戻すことができるようになります。 ペンに切り替える。 今、私たちがやる - をした場合何ができるかあなたたちが2のあなたの力でスピードアップすることが全くありませんが、 それは完全にクールだ。 それは起こる。分かりました。 私は私が2のすべての力を知っている必要がありますと言われましたここで私は一度就職の面接がありました 最大2〜30日まで。 それは、私が得た仕事ではなかった。 、とにかく、君たちは先に行くことができ、ここで数学を行う ですが、バイナリで、それは本当に、意味がありません そしてまたそれは、10進数または16進数で意味がありません あなたがゼロを持ってどこに数学を行う。 あなたは、私はここ、ここ、ここ、ここ、ここ、ここ0 0 0 0 0 0を持って見ることができます。 なぜそれが実際の数学をやっても意味がないかもしれません その位置に2の適切な電力を計算するために? シャーロットが言ったように正確に、それが0になります。 2のべき乗を計算する場合だけでなく、自分の時間を節約するかもしれないあなたの強いスーツではありません。 この場合、我々は唯一の0から2のためにそれを計算する必要がある - ? [学生] 1。 3〜[ネイト·H] 1、2です - ? [学生] 8。>> [ネイト·H] 8。 2から4? [生徒] 2。私は、申し訳ありませんが1だ。 [ネイト·H] 2〜4正確には、16です。 5から2、ケビン?>> 32。 [ネイトH.] 32、2〜8? [学生] 32×8、256。 [ネイトH.]パーフ​​ェクト。 と10から2? [学生] 1024。 [ネイトH.]うん、1024。 かつて我々は、我々はそれらをすべてまとめることができますこれらの数値を手に入れました。 そして、これは、それが物事のカップルを行うことが本当に重要な場所です。 一つはゆっくり行くとあなたの仕事をチェックすることです。 あなたは、この番号の末尾に1があることを伝えることができます ので、私は間違いなく、私の結果として奇数を取得する必要があります 他のすべてのものは、偶数になるだろうしているので、 それは2進数だと与えられた。 あなたはテストでこの点に着く場合の対処方法他の事はある 、あなたがここまでそれを書きました 、あなたは時間が不足している この問題は価値があるとの点の数を見てみましょう。 この問題は、あなたが参照してください場合にすることができますので、私は本当に私のラップトップにバックフリップをすばやく- この問題は、2点の価値があるので、これはほかのソートではありません あなたは本当に時間に追われている場合は、経由して行く必要があります。 しかし、我々はiPadに切り替えるだろう、と私たちは本当に速くそれを介して行くつもりです。 私は最初の小さな数字をやって好き 私はそれが簡単に見つけるため。 彼らはかなり簡単に一緒に行くので、私は32と8が好きで、我々は50を得る。 16と1は17を取得します。 そこでは、57を得る それから私達は、この残りの部分を行うことができますので、我々は、156〜57を行うことができます。 さあ。 男、まあ、見てみましょう。 我々は、57、256、および1024を持っていた。 この時点で、私はというだけで通過すると思います。 私は手掛かりを持っていません。私は明らかに、この上に読んでする必要があります。 7,6、および4には、17を得る。 1、5、5、2、13。 その後、我々は3を取得してから、我々は1を取得します。 1337年。 イースターエッグは、誰? 誰かがこの番号を認識? クリスが数を認識します。それが何を意味するのでしょう、クリス? [クリス]リート。 すご腕ので、あなたはこれを見れば、それはすご腕のように見えます。 ハッカーのもの。中間試験やクイズではなく、上のもののようなものに気をつけろ。 あなたがもののようなものを見て、あなたが迷っている場合、 "はぁ、" それは実際に何を意味するかもしれません。 知りません。ダビデはそれをインチ入れて好き それは正気はそれをチェックするには良い方法だ。 大丈夫のように、私は何が起こっているかを見ることができます。 それは週1 0/Weekものだ。 我々は今、私たちのラップトップに切り替えた場合、 ズームアウトすると、他の物事のカップル。 我々は問題セットでたくさんやってきた、これはASCIIあります。 資本Aのこの概念は、本当に何ですか? それは10進数の整数です知っている。 65は、それがASCIIテーブルでにマッピングされているものです そしてそれは、コンピュータがそれを書き込む方法ゆえだ そしてそれは我々が実際に書き込みを逃れてきた​​方法です と文字が小文字の資本 これまで行なってきたことを、これらのソリューションと問題セットのいくつかのインチ 他の物事のカップル。 我々は、文、ブール式、条件、ループ、変数とスレッドを持っている。 それらはすべてのほとんどの部分は意味があるように見える? この用語の中には時々少しファンキーです。 私はセミコロンで終了し、ほとんどの部分の何かのためにのような文を考えるのが好きです。 xのような文= 7、変数を設定し、 おそらくx = 7で呼ばれる。 おそらくxは、また7番を格納できる型です ので、それは、intやfloatまたは多分短絡やシャア そのような何か。 ブール式は等しいこれらの二重を使用しています とビッグバンは、より大きい、より小さい、等しい、または等しくない より小さいか等しい、すべてのもののようなもの。 条件ははif then else文です。 私は、あなたがした場合に対応することなく、他のを持つことができないことを覚えているだろう。 した場合に、対応がなければ、同様に、あなたは他のを持つことができません。 ループが、我々はあなたに打ってきたループの3種類を思い出す セクションと問題セットの最後のカップルのために。 使用してユーザー入力を取得しているときのwhile、do 特定の条件が満たされるまで、whileループを使用して あなたがする必要がある場合、次にforループを使用してそれらの あなたは、私はそれについてどのように考えるかである現在の通貨ループのどの反復を知っています。 あなたは、文字列内の各文字のためにやっている場合、または私が何かをしたい、 私は、その要素に何かをしたい配列の各要素に対して。 スレッドとイベント。 これらは、我々は、C言語で、それを明確に説明していない しかし、スクラッチからこれを覚えています。 これは、異なるスクリプトを持つことの概念である。 これはまた、イベントをブロードキャストのこの概念です。 一部の人々は、最初は自分たちのプロジェクトに放送を使用していませんでした これは、完全にクールです しかし、これらは、同時実行と呼ばれるこの大きな問題を扱う2つの異なる方法があります これは、どのようにプログラムが実行されるようになるんです または一見同時に実行? 他のタスクも実行しているときに別のタスクが実行されている。 これは、お使いのオペレーティングシステムが動作するように思われるかということです。 これは、例えば、理由にもかかわらずである 私が実行しているブラウザを持って、私はまた、Spotifyはオンにして曲を再生することができます。 それは理解するための概念的なものなのです。 私は短いのスレッドを見てみましょう あなたはそのことについてもっと知りたければ。 見てみましょう、私はそこにあったかもしれないと信じて これらのいずれかでこの上の問題。 繰り返しますが、私は、スレッドとイベントは、我々はC言語でカバーするものではありませんだと思う それは、ゼロよりも有意に多くの困難だという理由だけで。 あなたは、そこにそれを心配するが、間違いなく概念を理解しておくべきではありません 何が起こっているか理解しています。 先に進む前に、週についてご質問0材? みんながかなり良い感じ? 理解の変数とどのような変数は何ですか? 上を移動する。週1。 特にカバーされていないここで物事のカップル クイズのレビューで必ずしも、また考えることより概念的なものです。 第一は、ソースコード、コンパイラ、オブジェクトコードが何であるかは、この概念です。 誰?バジル。 オブジェクトコード - 私は、ソースコードは、あなたが打ち鳴らすに入れたものであることを意味している とオブジェクトコードが打ち鳴らす、コンピュータがプログラムを読むことができるように出したものです。 その通りです。 ソースコードは、あなたが実際に入力したCコードです。 オブジェクトコードを使用すると、ガチャンという音から抜け出すことです。 それはバイナリ形式で、0と1です。 あなたがオブジェクトファイルの束を持っているときに、次に何が起こるかである、 あなたは、プロジェクトまたは複数のソースコードファイルを使用するプログラムをコンパイルしていると言う その慣例によりcファイルの拡張子が付与されます。 我々はcaesar.c、vigenère.cを持っている理由です。 Javaプログラムを書いている場合は、それらの拡張子を付ける。javaを。 Pythonプログラムの拡張子は。しばしばPY。 一度に複数のcファイルを持って、あなたはそれらをコンパイルします。 Clangのは、すべてこのバイナリジャンクを吐き出します。 次に、あなたは1つだけのプログラムをしたいので、 あなたは、これらのオブジェクトのすべてが一緒にファイルリンカリンクを持っている 1実行ファイルに変換します。 これは、CS50ライブラリを使用するときに、例えば起こることです。 CS50ライブラリがあることでもあります。hヘッダファイル あなたがお読みになることを、#includecs50.hこと。 そしてそれはまた、特別なバイナリライブラリファイルだ それは、0と1であるコンパイルされている その-lフラグを、私達が私達のスペースに戻って、我々は本当にすぐに見えるので、もし 私たちはカーンという音コマンドを見ればここで何が起こっているかで、 私たちが持っていることは、これは右ここに私たちのソースコードファイルです。 これらはコンパイラフラグの集まりです。 そして、一番最後に、これらの-lフラグのリンク 次に、これら2つのライブラリの実際のバイナリファイル、CS50ライブラリと数学ライブラリ。 ファイル '目的の各タイプを理解する コンパイルプロセスであなたのことができるようにしたいと思うものです の少なくとも高レベルの概要を提供します。 ソースコードは、オブジェクト·コードが出てくる出番。 オブジェクトコードファイルは一緒にリンクして、あなたは美しい、実行可能なファイルを取得します。 クール。 あなたが複数のポイントでエラーを得ることができる場所でもあり コンパイルプロセスインチ ここで、例えば、あなたがこのリンクフラグを取る場合、これは あなたのコードを実行しているときCS50フラグ、あなたは、スペースでそれを省略するか、 あなたは、リンクフェーズでエラーが出るところです とリンカはねえ、あなたは関数GetStringメソッドと呼ばれる "、と言うだろう それはCS50ライブラリにだ。 " "あなたはそれがCS50図書館にいた私に言った、私はそれのためのコードを見つけることができません。" あなたはそれをリンクする必要があります場所です、それは別だ コンパイラのエラーから、コンパイラが構文とかその種のを見ているので。 それはときに何が起こっているか知って良いことだ。 知っておくと他のもの。 私は、あなたは間違いなくジョーダンによって行わ型キャストに関する短いを見てみたいと思います intは、ボンネットの下に何かを理解するために、 ボンネットの下に何文字です。 我々は、ASCIIの話、我々が実際にASCIIコード表を見てみると、 何をしては、フードの下で見て私たちに与えている コンピュータが実際に資本と7桁を表す方法で コンマと疑問符。 また、コンピュータは、表現するための特別な方法を持っています 値を整数として7。 これは、浮動小数点数として7番を表すための特別な方法があります そしてそれらは非常に異なっています。 型キャストを使用すると、コンピュータが "ねえ、私はあなたが変換したい言う方法です。 一つの表現から別の表現へ。 " なぜ我々はそれを見ていません。 私はまた、ライブラリやコンパイラの短い上に短いを見てみましょう。 コンパイルのプロセスに関するものトーク、 ライブラリとは何であり、あなたが質問を受けるかもしれない、これらの質問のいくつかに目を通す。 第1週物質に関する質問? あなたがカバーしたいのですが困難に見えるここでどんな話題はありますか? 我々が得ることができるように、私はこれらの以前のトピックのほとんどを爆破しようとしている ポインタと再帰の少しを行う。 考えですか? カバーするために何か? おそらくいくつかのチョコレートのための時間? 君たちはそれを介して取り組んでいます。 私はコーヒーを飲み続けるつもりです。 2週目。 グッドコール、良いコール。 週2では関数についてもう少し話をしました。 最初のいくつかの問題セットでは、私たちは本当に全く任意の関数を書いていない どの関数以外の? [学生]メイン。>>メイン、正確に。 そして私たちは主が身に着けているさまざまな衣装を見てきました。 それは引数を取らないものでは、あります 私達はちょうど、括弧の間に空隙を言う その後、我々は、コマンドラインの引数を取るようにしたいです他の1つしかありません あなたがint argcとargvのストリング·アレイを使用していると我々が見たように、それはだ または、今、私たちは実際にそれがあることをchar *で文字列を公開したことを 我々は、char * argvと、ブラケットとしてそれを書き始めるつもりです。 問題セット3では、君たちは機能の束を見て、 そしてあなたは、関数の束を実装し、ルックアップ、スクランブルを描く。 プロトタイプはすべてあなたのためにそこに書かれていました。 私は本当に迅速な機能と一緒にここの話をしたいのか 関数を書くとき、それらに3つの部分があるということです。 あなたは、関数の戻り値の型を指定する必要があります。 これは、関数の名前を指定する必要がありますし、次のように指定する必要があります 引数リストまたはパラメータ·リスト。 私は関数を記述した場合例えば、整数の束を総括する その後、私に私の戻り値の型がどうなるか和を返す 私は整数を合計してから合計を戻りたい場合はどうなりますか? 次に、関数の名前です。 私が先に行くと緑色で書いた場合、この部分は、戻り値の型です。 この部分は名前です。 そして、括弧の間に 私は引数を与える場所であり、 しばしば、時にはパラメータのparamsを呼び、引数と略す。 あなたがいずれかを持っている場合と、あなただけのいずれかを指定します。 あなたが複数ある場合はコンマでそれぞれを区切ってください。 と各引数に対してあなたはそれをケビンアール2物事を与えるか? [ケビン]あなたがタイプしてから、名前を付ける必要があります。 そして、名前、および名前は、使用しようとしている名前です。 sum関数内でその引数を参照するために、 あなたが現在書いていることを関数内。 あなたは、私が総括するつもりなら、例えばツーのために持っていない 言う、整数-we'llの配列は、int型の配列を行う と私はそこに、自分自身にいくつかの中括弧をあげる その後、私はsum関数に配列を渡すとき 私は、引数リストの最初の位置にそれを渡します。 しかし、私が渡した配列は名前arrを持っている必要はありません。 ARRは、私は関数の本体内でその引数を参照する方法になるだろう。 我々は考慮する必要がある他の事、 そして、これは機能とは若干異なりますが、私はそれが重要なポイントだと思う C言語で、私はこのような関数を書いている時ということです どのように私はこの配列内の要素数を知っていますか? これはトリックの質問の幾分である。 我々は先週のセクションで、このことについて少し話をしました。 どのように私はC言語で配列内の要素の数を知っていますか? 方法はありますか? それは知っている方法は存在しないことが判明した。 あなたは、別途で渡す必要があります。 あなたが行うことができますトリックがあります あなたは配列が宣言された関数と同じ関数内にあるならば、 そしてあなたは、スタック配列で作業している。 あなたは、同じ関数内で使っているのであればそれにのみ機能します。 たら、別の関数に配列を渡すか、配列を宣言した場合 そしてあなたは、ヒープ上にその配列を言えば、あなたは、mallocを使用してきました  とかのようなものは、すべての賭けがオフになっています。 次に、実際に周りを通過しなければならない 特別な引数または別のパラメータ 配列がどのように大きなことを伝える。 この場合、私は申し訳ありませんが、それは画面をオフに起こっているのコンマは - 私を使用したいと思いますここで、 と私は別の引数を渡したい  それ長のint len​​の呼び出し。 クイズに出てくるかもしれない一つのこと 何かと呼ばれる特定の関数を書くか、または実装を求めている。 私たちはあなたにプロトタイプを与えていない場合は、ので、ここでこの全体のこと、 この全体の混乱は、関数宣言や関数プロトタイプと呼ばれています これは、それが与えられていない場合には漕ぎ着けたいと思うことを最初のものの一つである あなたにすぐにクイズに。 私が学んだ他のトリックはということです 私たちはあなたに関数のプロトタイプを与えるかと言うと、我々が言うには、 "ねえ、あなたはそれを書くために持っている。" あなたがクイズに持っているカッコ内 あなたは、戻り値の型があることがわかり、あなたが気付いた場合は、その戻り値の型 関数は何も返されないことを意味するvoid以外の何かが、ある その後、あなたは間違いなくやってみたいことが一つ書くことです 関数の最後のreturn文のいくつかの並べ替え。 戻って、我々は空白で埋めたいので、この場合には、我々は空白を置くことにしましょう​​。 しかし、これはあなたはどのように私はこの問題にアプローチしようと思って約正しい方法で思考されますか? そして、それはあなたが値を返さなければならないとしていることを思い出させる 関数の呼び出し元に。 うん。>> [学生]私たちはクイズにコードを書いているときにスタイルが適用されますか? インデントやもののようなもののような?>> [学生]うん。 いや、同じくらい。 私は、 - これの多くは、我々は当日のクイズを明確になるだろう何かだと思う が、通常は心配する#含まれており、スタッフのようなもの、それは外のようなものだ。 [学生]は、手書きのコードをコメントアウトする必要がありますか? あなたの手書きのコードにコメントをする必要はありますか? あなたが部分的信用を心配しているならコメントアウトは常に良いです または年生に自分の意図を伝えたい。 しかし、私は、再び、クイズ自体に、クイズの日に明らかにします しかし、私はあなたが、いや、コメントを書き込むことが必要になるだろうと信じていません。 典型的ではないが、それは間違いなく事どこのようなものだ あなたが好き、あなたの意図を伝えることができる "私は、それと付き合ってるところねえ、これは。" そして、時には、それは部分的な信用を支援することができます。 クール。 バジル。 [バジル]と言う、int型langを宣言するの違いは何ですか 関数内で変数を宣言対引数またはパラメータで? うわー、コーヒーが気管を下りた。 [バジル]我々は引数に入れたいものと同様。 ええ、それは素晴らしい質問です。 どのようにあなたが引数に入れたいものを選ぶ事ない どんな物事に対しては、関数の内部ですればいいですか? このケースでは、引数としてこれらの両方が含まれていた 彼らは、sum関数を使おうとしている人は誰でもいるものだから それらのものを指定する必要があります。 sum関数は、我々が話しのように、知る方法はありません それは、その呼び出し元または誰から取得する方法に大きな配列であるsum関数を使用しています。 それは、その配列がどの程度の大き知る方法はありません。 我々は、引数として、右ここにこの長さを渡す理由 それは、我々は基本的には、関数の呼び出し元に言っていることを何かだからです sum関数を使おうとしている人は誰でも、 "ねえ、あなたは私たちに配列を与えなければならないだけでなく、 intの、あなたはまた、私たちに与えてきた配列がどの程度の大き教えなければならない。 " [バジル]それらは両方のコマンドライン引数になりますか? いいえ、これらは、関数に渡すだろうと実際の引数です。 私はここに新しいページをやってみましょう。 [バジル]名前と同様にパススルーでしょう [ネイト·H]私は(void)をint型のmainを持っている場合は、 と私は、下部には、ここ私のリターン0で下に置くつもりです と私は、sum関数を呼び出したいと言う。 私が言いたいのint X = SUM(); sum関数を使用するには、私は総括したいアレイの両方に合格する必要があり と配列の長さは、これがどこにあるの 私は、intの配列を持っていたと仮定して 私が持っていたと言うのint numbaz [] = 1、2、3、 すぐそこの構文をハック使用の種類、 その後、私は何であろうと、私は合格したいと思うの和である numbazと番号3の両方 "さて、ここで私はあなたが合計する配列です。" sum関数を伝えるために "ここでは、その大きさだ。" お分かりでしょうか?それはあなたの質問に答えるのですか? いろいろな意味で、それは我々がメインでやっている平行ん 我々は、コマンドライン引数を持っているとき。 シーザー暗号のようなプログラムは、例えば、それが必要とされる コマンドライン引数は何もできないでしょう。 あなたがそれを言わなかった場合は、キーを使用するかを暗号化する方法を知っているだろう またはあなたが暗号化するために何を望むか文字列にそれを言わなかった場合。 我々は2つ​​の異なるメカニズムを持っている場所の入力を求めることは、これは ユーザーからの情報を取るために、ユーザからの入力を取るため。 問題1を設定するため、我々はこの場合、getIntは、GetString、getFloatは道を見た 入力を求めるプロンプトが表示され、その標準の入力ストリームを使用して呼ばれていた。 それは少し違う。 それはとは対照的に、一度に行うことができます何か あなたは、プログラムが実行を開始し、プログラムを起動したとき。 あなたがプログラムの実行を開始するときに、コマンドライン引数はすべて指定されています。 私たちはそれらのうちの2つを混合してきました。 我々は関数の引数を使用する場合、それははるかに主にコマンドライン引数のようなものだ。 あなたがそれを指示する必要があります関数を呼び出すときに、それはだ まさにそれは、そのタスクを実行するために必要。 でと見て、私は、あなたがお暇な時にはそれを見てみましょうもう一つの良いこと そしてそれは、スコープのこの概念だった - クイズで覆われていた 変数とグローバル変数とローカル変数。 それに注意を払うか。 今、私たちは、この他のものに乗っていること、 第3週で、我々は、検索とソートの話を始めました。 、少なくともCS50で、検索とソート 非常にコンピュータサイエンスの理論的な部分のいくつかを紹介します。 探索問題、並べ替えの問題 ビッグ、カノニカル問題です。 どのように整数の十億の配列内の特定の番号を見つけるのですか? どのようにして、電話帳内の特定の名前を見つけるのですか あなたのラップトップに保存されているということ? そして私たちは漸近実行時間の概念を導入する 実際にどのくらいの時間、どのようにハード、これらの問題は、アール定量化する どのくらいの時間が解決するのを取る。 2011年のクイズ、私は信じて、で、私はメリットを考えている問題があります この1は、問題12である、非常に迅速にカバーしています。 無O、それがオメガです。 ここでは、最速の実行時の話をしている 特定のアルゴリズムのために、次に最も遅い可能なランタイム。 このオメガとOは実際には単なるショートカットです。 彼らは言うために表記しているショートカット 最良のケースで我々のアルゴリズムが実行されますどのくらいの速さ、 とどのように考えられる最悪のケースの遅い我々のアルゴリズムは実行するのだろうか? これらのカップルを行うレッツ、これらも覆われていた 私は非常にお勧め漸近記法、上の短いインチ ジャクソンは本当に良い仕事をした。 二分探索では、我々は、アルゴリズムとして二分探索の話 そして我々は、通常、そのビッグOの面でそれについて話す ビッグOとは? 二分探索の中で最も遅い可能ランタイムとは何ですか? [学生] N²? 閉じる、私はそれに似てますね。 それはそれよりはるかに高速です。 [学生]バイナリ?>>ええ、二分探索。 [学生]それはログnです。 n個のログを記録されるので、ログnが何を意味するのか? それは、各反復の半分になります。 正確なので、最も遅い可能な場合には、 あなたはソートされた配列を持っている場合と言う 百整数と、あなたが探している番号の どちらかの配列の配列または非常に最後の要素の一番最初の要素である。 覚えておいて、バイナリ·サーチ·アルゴリズムは、中央の要素を調べることで動作します それはあなたが捜している試合だか見てください。 それは、偉大である場合は、それを発見した。 最良のケースでは、どのくらいの速バイナリ検索を実行しますか? [学生] 1。 1、それは、1のビッグOの時定数です。うん。 [学生]私は質問があります。あなたはnのログを言うとき、あなたは右、ベース2に対して意味ですか? はい、だからそれは他のことだ。 我々は、nを記録するようにしていて、私が高校生だったとき、私は推測する 私は常にログがベース10であったと仮定した。 ええ、はいそう、一般的に我々が使用しているものですベース2をログに記録します。 あなたはどちらかを探している場合は、再度、バイナリ検索に戻って 一番最後の要素または非常に最初の要素、 あなたが途中で起動しているため、あなたは捨てる いずれかの半分は、あなたが捜している基準を満たしていない そしてあなたは、次の半分と次の半分と次の半分にアクセスしてください。 私は百整数配列内の最大の要素を探している場合 私は1万回のほとんどのログでそれを半分にするつもりです 私は最終的にテストし、要素は私が探していることを見る前に は、最大で、または配列の最大インデックスである それはN、1万回のログのログを取る。 バブルソート。 あなたたちは、バブルソートアルゴリズムを覚えていますか? ケビンは、あなたは私にバブルソートアルゴリズムで何が起こったのかの簡単な要約を与えることができますか? [ケビン]基本的には、リスト内のすべてのものを通過します。 それは、最初の2つを見ている。 最初のものは、それがスワップそれらを1秒より大きい場合。 そして、それは2番目と3番目、同じこと、スワップを比較して、 3番目と4番目の、すべての方法ダウン。 大きな数字は最後まで続く。 としかし、多くのループ後にすれば完了です。 正確なので、ケビンが言ったこと、我々はより大きな数を見てよということです 配列の最後にバブルアップ。 たとえば、あなたは、これが私たちの配列である場合、この例を通して私たちを歩いて気にしますか? [ケビン]あなたはテイク2と3があります。 3が2よりも大きいので、それらを交換します。 [ネイト·H]右ので、我々はこれらを入れ替えるので、私たちは、2、3、6、4、および9を得る。 [ケビン]次に、図3及び図6を比較します。 、3は6よりも小さいので、それらを残す 4は6よりも小さいので、6と4は、それらを交換したいと思います。 [ネイト·H]右ので、私は2、3、4、6、9を得る。 [ケビン]そして9は6よりも大きいので、そのままにしておきます。 そして、あなたは再びそれを通って行くと思います。 [ネイト·H]私はこの時点で行うのでしょうか?>> [ケビン]いいえ そして、なぜ私がこの時点で行われていないのですか? 私の配列がソートされているように見えますので。私はそれを探しています。 [ケビン]再びそれを介して移動し、それ以上のスワップがあることを確認してください する前に、完全に停止することができます。 正確なので、スルーを続けると全くスワップがないことを確認する必要があります この時点で作ることができる。 あなたが言ったように、それは我々が終わったことを、実際には単なるラッキーだった を介してのみ1パスを作るために持って、私たちはソートしています。 しかし、一般的なケースでこれを行うには、我々は実際に何度もこれを行う必要があるでしょう。 そして、実際には、これが最良の例の例であった 同じように、我々は問題を見ました。 我々は可能な限り最高のケースがnされたことを見た。 私たちは、アレイ1時間を経て。 このアルゴリズムの最悪のケースは何ですか? [ケビン] N²。 そして、それは何のように見えるのでしょうか?どのような配列の外観はそのようなn個の²の時間がかかるだろうか? [ケビン] [聞こえない]ソートされます。 まさに、私は配列9、7、6、5、2、持っていた場合 最初の9は、最大バブルのすべての方法であろう。 1反復の後に我々は7、6、5、2、9を持っていると思います。 その後7を上方にバブル、6、5、2、7、9、などといったようになります。 我々は、配列全体をn回通らなければならないと思います そして実際にはこれよりわずかにより正確な取得することができます かつて我々は、その最後の可能な位置に最大9つすべての方法を移動したので、 我々は再びその要素と比較する必要がないことを知っています。 かつて我々は7バブルアップ開始 私たちは、7右9の前になったら、我々は止めることができることを知っている 以来、我々はすでにそれに9を比較しました。 あなたは、スマートな方法でこれを行う場合、それは、私が推測する、本当にそのくらいの時間はありません。 あなたはすべての可能な[聞こえない]の組み合わせを比較するつもりはない 毎回、各イテレーションを通過します。 しかし、それでもまだ、私たちはこの上限について話すとき、我々は言う あなたは、nを見ている²の比較はすべての道を通って。 戻ろう、と我々は時間に少し短いを取得し始めているので 私は、あなたは間違いなく、この表の残りの部分を通って行くべきだと思います それをすべて記入してください。 例を考えてみてください。具体的な例を考える。 それはやることは本当に便利と便利です。 それを引き出す。 これは、コンピュータサイエンスの通って行くようにした表のようなものです あなたは本当に心のことで、これらを知って開始する必要があります。 これらはあなたがインタビューで得る質問の種類があります。 これらは、知っておくと良いです物事のソートです と本当に考えるする方法を考え出す、それらのエッジケースを考える バブルのために考えられる最悪の配列をソートすることを知っている それでソートすると、逆の順序での一つです。 ポインター。ポインタについて少し話してみましょう。 最後の数分後には、ここにある 私は、これは比較的新しいですファイルと一緒に何かのI / Oであることを知っている。 我々は、我々はポインタのポインタについて話をしたい理由について話をするとき 我々はC言語で作業している1、なぜならば、 我々は、最も近代的なプログラミング言語に比べてかなり低い水準で本当にです。 我々は、実際にメモリ内の変数を操作することができるしている 彼らは実際に私たちのRAM内に位置している場所を把握する。 一度あなたが表示されます、オペレーティングシステムのクラスを取ることで行ってきた それは、再び、抽象化のようなものだ。 それは実際にそうではない。 私たちは、私たちからこれらの詳細を隠している仮想メモリを持っている。 しかし、今のあなたは、あなたがプログラムを持っているときと仮定することができます 例えば、あなたが起動したときには、シーザー暗号のプログラムを実行している 私は本当に迅速に私のiPadに切り替えます とあなたは言う、持っている場合には、非常に、あなたのプログラムを開始すること あなたのラップトップ上のRAM 4ギガバイト、 この塊を取っておく取得し、我々は、このRAMと呼ぶことにします。 そしてそれは、我々は0を呼び出すつもりだ場所で開始 そしてそれは我々が4ギガバイトを呼ぶだろうという場所で終わる。 私は実際に書き込むことはできません。ハッキングされた男。 あなたのプログラムが実行されると オペレーティングシステムは、RAMを刻む そしてそれは住むあなたのプログラムの異なる部分に異なるセグメントを指定 ダウンここでこの領域がない人の土地のようなものです。 あなたは少し遠く、ここに行くとき あなたは実際に場所を持っている場所 あなたのプログラムの生活のためのコード。 その実際のバイナリコードは、その実行可能ファイルは、実際にメモリ上にロードされる あなたがプログラムを実行し、それがコード·セグメントに住んでいたとき。 あなたのプログラムの実行時に、プロセッサはこのコードセグメントを見て 次の命令が何であるかを把握するには? 私は実行する必要があるコードの次の行では、何ですか? そこにデータセグメントもだし、これはどこでそれらの文字列定数である あなたが使用してきたことが格納される。 そして、遠くまでヒープと呼ばれるこの場所はそこだ。 我々は、mallocを使用してそこにメモリをアクセス して、プログラムの最上位に向かって スタックは、そこ 私たちは初めのほとんどのためにプレーしてきたところ、それはです。 これは、スケールや何かにありま​​せん。 これの多くは、非常にマシンに依存します オペレーティングシステムに依存しますが、これは物事がアップチャンク化させる方法を相対的になります。 あなたがプログラムを実行すると、次呼ばx変数を宣言する場合 私はダウンの下に別のボックスを描画するつもりですが、これはだけでなく、RAMになるだろう。 そして、私は見に行くよ。 我々は、これは単にRAMの小さなセクションであることを示すためにギザギザの線を描画します それのすべての私たちが一番上に描画されないように。 私はxという名前の整数変数を宣言する場合は、 その後、私が実際に取得するマッピングです 私のプログラムのシンボル·テーブルに格納されている それは私が描いたことをこのメモリ領域に名前xを結ぶ 右ここに縦線の間。 私はx = 7と言う私のプログラムのコード行を使用している場合 プロセッサは知っている "ああ、大丈夫、私は知っているメモリ内のこの場所でxに住んでいます。" "私が先に行くと、そこに7を書くつもりだ。" それはどのようにこれはメモリにあるものの位置を知っていますか? まあ、それはすべてコンパイル時に行わている。 変数の各々が行くに行くところコンパイラが割り当てるの面倒を見る と特別なマッピングを作成したり、むしろ、点と点を繋ぐ 記号とそれが起こっているのは、その変数の名前の間に どこでそれがメモリに生きるために起こっている。 しかし、それは我々が実際にだけでなく、私たちのプログラムの中でそれにアクセスできることが判明した。 我々は、データ構造のいくつかについて話し始めるとき、これは、重要になっ これは、我々は後で紹介しようとしている概念である。 しかし、今のところ、何を知ることができると、私はx、この場所へのポインタを作成することができるということです。 たとえば、私はポインタ変数を作成することができます。 我々はポインタ変数を作成するときに我々は、星の表記法を使用します。 このケースでは、これは私はint型へのポインタを作成するつもりだと言う。 それはちょうど他のどのようなタイプだ。 我々はそれをyのような変数を与えて、 それから私達はアドレスに、アドレスに等しく設定します。 この場合において、我々はxを指すようにyを設定することができます このアンパサンドで我々はxのアドレスを取ることによって、 それから私達はそれを指すようにyを設定します。 我々は、RAMを見れば、これは本質的には何ですん これは別の変数を作成します。 それはyを、呼び出すために起こっている そして、このコード行が実行されたとき それは実際に、我々は一般的に矢印として描く少しのポインタを作成するために起こっている そしてそれは、xを指すようにyを設定します。 はい。 xはすでにポインタの場合[学生]は、あなただけで行うだろう int *にy = xと代わりにアンパサンドを持つ? はい。 xは既にポインタである場合、あなたは、互いに等しい2ポインタを設定することができます yはxを指していないでしょう、その場合、 それが指しているものは何でもXを指してしまうことになります。 残念なことに、我々は時間がありませんが。 私は、我々は、このオフラインについて話すことができ、この時点では何と言うだろう しかし、私は、この問題を介して作業を開始14位だと思います。 あなたはあなたのために充填された少しはここにすでにある見ることができます。 あなたは、int * xと* yを、我々は2のポインタを宣言するときに見ることができ と変数の横に*を指すことに注意してくださいは、昨年行われたものだった。 これが我々が今年やっていることに似ていることが判明した。 あなたはポインタを宣言しているときは、*を記述する場所は問題ではありません。 しかし、我々はタイプの横に*を書かれている それはそれは非常に明確ではポインタ変数を宣言していることになるので。 あなたは2点のポインタを宣言すると、私達に2箱を与えていることがわかります。 ここでは、malloc関数に等しいxを設定したとき これが何を言っていると、ヒープ内のメモリを確保しておくことさ。 右ここにこの小さなボックスに、このサークルは、ヒープ上に位置しています。 Xはそれを指している。 yはまだ何を指していないことに注意してください。 メモリ - xに数値42を格納するを取得するには 私たちは何の表記を使うのでしょうか? [学生] * X = 42。 まさに、* X = 42。 それは矢印をたどると、そこに42を投げることを意味します。 ここでは、yとxに設定したか、我々はY Xを指しています。 繰り返しますが、これはちょうど私達がxにyを等しく設定どこにケビンが言ったことのようです。 YはXを指していない。 むしろ、それはxは同様に指しているものを指している。 そして最後に、この最後のボックスに我々は何ができるという2つの可能なものがあります。 一つは、我々が* X = 13と言うことです。 他の事は私達ができると言う、アレックス、あなたは私たちがここで何ができるか知っていますか? あなたが言うことができる* X = 13または- [学生]は、int何を言うことができる。 [ネイト·H]これはint型の変数と呼ばれていましたなら、私たちはそれを行うことができます。 彼らは両方とも同じ場所を指しているので、我々はまた、* Y = 13と言うことができる ので、我々はそこに着くために、変数を使用することができます。 うん。>> [学生]私たちはただのint xが13であると言う場合と同じように見えるのでしょうか? それは働いていないでしょうXと呼ばれる新しい変数を宣言することになる。 我々はここで、xはポインタアップであると宣言されているため、我々は衝突があると思います。 [学生]我々はちょうどそれ自体でその文を持っていた場合、それがサークルの面で、どんな風に見えるのでしょうか? 我々はx = 13を持っていたならば、我々は箱を持っており、むしろ矢を持つのではと思います 箱から出てくる私達はちょうど13としてそれを描きたいと思います。 ボックスで[学生]。オーケー。 見ていただきありがとうございます、とクイズ0の幸運。 [CS50.TV]