[音楽再生] DAVID J.マラン:これはのようなものです 新入生セミナー今日。 OK。 アウトとても雨。 これは、水曜日に発生する傾向があり、 しかし、すべてのより多くの機会 質問のための今日。 それでは、実際に始めてみましょう 一瞬でフィルムと。 しかし、我々はいつものように盛大に開始します。 これはCS50であり、そしてこの 4週の終わりです。 だから、あなたが今まで見てきた場合 テレビや映画の特徴 一部のコンピュータの専門家がありますし、 警察、またはFBI、またはいくつかの代理店 いくつかをキャッチしようとしています 敵、さて、あなたはしました おそらく「強化」という表現を聞きました それによって、その技術者は何とか 魔法無限に拡大されます 犯罪者を見てはるかに 同一またはナンバープレートの番号 ミラーのさえきらめきで または誰かの目の輝き。 だから確かに、のを見てみましょう ハリウッドから数などのシーン。 [ビデオ再生] -OK、今のあなたをよく見てもらいましょう。 -持て。 そのバックを実行します。 -ちょっと待って。 右移動します。 -There、それを凍結します。 -全画面表示。 -OK、それを凍結します。 その上に-Tighten、あなただろうか? その上で - ベクトル 後輪によって男。 右ここでこの場でで-Zoom。 適切な機器、画像-with 拡大して先鋭化することができます。 -あれは何でしょう? - それは、強化プログラムです。 それまでの任意の明確なあなたが-CAN? -知りません。 のは、それを強化しましょう​​。 セクションA6 -Enhance。 -Iは、詳細を増強しました and--私はそこだと思います 向上させるのに十分な、 私の画面にそれを解放。 -Iは、彼女の目の中の反射を強化しました。 介してこれを実行するのを-LEt ビデオエンハンスメント。 -Edgar、あなたはこれを強化することができますか? -待って。 この反射に取り組んでき-I've。 -Someoneの反射。 -Reflection。 人間の顔の反射が-Thereです。 -The反射。 反射が-Thereです。 鏡にで-Zoom。 - あなたは反射を見ることができます。 あなたはここからイメージを高める-CAN? あなたはここに彼を高める-CAN? あなたはそれを強化-CAN? あなたはそれを向上させることができますか? 我々はこれを強化する-CAN? あなたはそれを強化-CAN? 第二に-hold、私が高めます。 ドアに中-Zoom。 10倍と。 -Zoom。 で-move。 -もっと。 -wait、停止します。 -停止。 それを-pause。 私たちに75度を-rotate 垂直のまわりでお願いします。 -停止。 部分に戻ります 再び、ドアについて。 ビットマップすることができ、画像増強剤を-Got? -Hey、多分私達は、プラディープを使用することができます ウィンドウに表示するにはセン方法。 - このソフトウェアは、最先端の技術です。 -The固有値がオフになっています。 右-with algorithm--の組み合わせ -HEの撮影排除 次のレベルへのアルゴリズム、 私はにそれらを使用することができます この写真を高めます。 上-lockおよびz軸を拡大。 -Enhance。 -Enhance。 -Enhance。 -freezeと高め。 [END再生] DAVID J.マラン:すべての権利なので、 それらのすべては、実際に言葉です。 彼らはただでつなぎ合わせています 実際には賢明ではない方法。 そして、実際には、CS50そのようなコース テレビや映画の多くを台無しにする傾向があります あなたのために。 ときに、それらのコンピュータの専門家ので、 用語をオフ威嚇と言っています 以下のような派手なもの 固有ベクトル、及びz軸、 および他の任意の数 実際にはより技術的な用語、 彼らは本当にちょうど糸います 言葉一緒にあまりにも頻繁に。 私たちの希望の一つがそれであることです、 コー​​スを取るの副作用として このように、より多くの人々ます 世界は実際に比較検討することができます ちょうどほんの少し影響を与えます これらの膜の品質と精度? 実際には、のは、現実を見てみましょう。 だからここのスタッフの写真です メアリー、私たちの教育の仲間の一つ。 そして、彼女があるとし 何かの疑いがあります。 そして、まだ、かすかあります 彼女の目の中の証拠のいくつかの作品は、 または彼女の眼鏡の反射インチ さて、私たちは映画のように正確に行う場合 私たちはズームインして「強化」ここで、提案、 これは、どのくらいの情報であり、 メアリーの顔であります あなたはイメージをキャプチャするとき その元の解像度を持ちます。 そして、実際には、あなたがこれらのドットを見ることができます。 そして、これらは何です 画素P-I-X-E-L-Sと呼ばれ、 これは典型的にはちょうど正方形であります すなわち、画像を構成する点です。 そして、戻って一日で、実際にあっても 今日のLEDテレビの一部で今日 あなたが持っている場合は、液晶テレビ、 お部屋や自宅で1、 あなたが上がる場合は、それに超近いし、 それはやや古いテレビの場合は特に、 あなたは多分、これらのドットを見ることができます それは、画像を構成するものです。 そして何よりはありません これ以上の情報。 私たちは、の意味で、「強化する」ことができ 超えると、ソートのものを平滑化 何の種類のソートを推論 色は、メアリーの目の隣にあるべきです それは実際にそのようにピクセル化ではありませんように。 しかし、私はそこに、ズームインし続ける場合 彼女の目の中の悪い男です。 そのようなすべてのです 私たちが持っている情報。 あなたが作成することはできません 無から情報。 唯一の有限あります そこにビット数。 問題セット4、でそう あなたは機会を持っています 世界のこの種で再生します。 問題セット4では、見ていきます グラフィックス、およびフォレンジックの世界、 実際にコードを書きます それが失われた画像を回復します。 あなたはそのコードを書きます 既存のイメージを操作します そして最終的に何を理解します ボンネットの下に起こっています。 そして、結局のところ、実際です すべてが複雑ではありません。 たとえば、私たちがしたい場合 どこスマイリーフェイスを表します これらの黒画素と、 またはこれらの黒点、 よく、我々は単純に表すことができ 彼らは、真のビットマップ。 そして、あなたが今までと聞いていた場合 おそらく表現ビットマップ、 それが今作るために開始します もう少し意味今日。 我々はすでにビットが何であるかを知っています。 それは、0または1です。 そしてマップがちょうど何かであります 一枚の紙のような それはあなたに指示を与え、持っています 多分x座標とy座標の格子。 そこでここでは、ビットマップです。 これは、ビットのマップです これにより1は明らかです 白画素を表現します。また、 0は黒画素を表現しようとしています。 しかし、我々は確かにそれを周りの反転ができます。 それはそう本当に重要ではありません 我々は一貫している限り。 そして、ここでは内部binary--で、どのように コンピュータのメモリ、あるいは内部 ハード上のファイルの drive--あなたは格納することができます スマイリー顔画像の最も簡単な。 しかし、我々は何をしている、もちろん、 この画像に欠けていますか? 色、右? これは明白な次のステップですか 色でこれを改善するための強化。 だから、残念ながら1つだけで ビットは、0または1、我々は色を表すことができます。 すなわち赤、青、またはかもしれません 黒、または白、緑、またはピンク、 または色のいずれかのペア。 しかし、簡単にするため、我々はよ ちょうど黒と白を前提としています。 だから論理的に私たちが必要とする場合に何をすべきか、我々 画像の色を実現したいですか? 私たちは何をする必要がありますか? ここでの制限因子の場合と同様に 1ビットを使用すると、唯一できることです 白、二つの状態、0または1を表します または黒、何をやりたいのですか? 者:より多くのデータ。 DAVID J.マラン:より多くのビット、 ええ、より多くのデータ、より多くのビット。 そして、確かに、それは正確にどのようです カラー画像が表現されます。 単一のビットを使用するのではなく、 各画素について0または1であり、各ドット あなただけの複数を使用しています。 多分多分、より一般的に、8を使用 問題セットで、実際に24を使用し、 4、あなたは、ファイルに再生されます 一般的に24ビットを使用する形式。 しかし、あなたのほとんどはおそらくあります JPEGファイルに精通しています。 あなたは今までに撮影した場合 お使いの携帯電話上の写真、 またはアップロードまたは上で何かを見て フェイスブック、またはFlickrの、任意の数 写真ベースのウェブサイトの、あなたはしました おそらく前のJPEG画像を見て。 そして、それは結局のところ、これはファイルです 我々はPSET 4で使用するつもりフォーマット、 それによって、あなたがしようとしています 画像を回復する必要が 私が誤ってから削除したこと カメラ内の破損したメモリカード、 あなたがする場合。 そして、それは判明しているにもかかわらず JPEGはかなりsophisticated--です それははるかに、より洗練されたのです 黒と白のドットより ありますので、我々は、先ほど見ました 実際に空想のアルゴリズムこと そのように、JPEG圧縮に使用されています あなたは本当に素晴らしいを持つことができ、 品質の画像が、使用して 比較的少数のビット。 そして、我々は戻ってくるだろう 長い前に圧縮。 これは最初のことが判明 JPEGで3バイトimage-- 関係なく、あなたが写真を撮影したもの of--は値255、216、255です。 言い換えれば、あなただけの場合 ビットのパターンを参照してください、 3としてここで表さ バイト、または24ビットは、合計します 高い確率であなたはそれを推測することができます あなたは、この最初の三つのことを見ています JPEGのバイト。 そして、これは知られています JPEGの署名として。 ファイル形式の多く そこに開始する傾向があります 0と1の特定のパターンで、 そのWindows、およびMac OS、およびiOSのように、 Androidは、ファイルの種類を彼らが知っています いわゆるファイルに加えて、あります 拡張子のファイルの多くが持っていること。 あなたがの.jpgれている場合、それはです コンピュータに別の手がかり。 それでは、今、これを見てみましょう もう少し技術的に。 私たちは、小数点以下を知っています システムは、0〜9です。 私たちは、バイナリが0と1であることを知っています。 そして、あなたはPSETに戻ってと思われる場合 0、我々はあなたが持っていたと格闘、 少し、何かのため 進と呼ばれます、 あなたは16桁の数字を持っている場合は、 代わりに、10または2の代わりに。 そして、それらの数字、慣例により、 0〜9、次にあります f、ここで、fは何を表しています ちょうど迅速正気10進数、 チェック? だから、15。 そして、ちょうどによって、10を表している必要があります 私が与えてくれた順序の性質。 それはちょうど任意の慣例です、 しかし、それはかなり標準です。 だから我々は、このパターンを見れば 3 bytes--レッツの ただでそれを見始めます どのように一致する方法 一般的にコンピュータ科学者 見て、ファイルを考えます。 あなたは確かに考えることができます 0内のファイル、と1、および小数点、 実際には、我々はバイナリを使用する傾向があります またはより典型的にはhexadecimal-- バックPSET 0から。 だから、私はその255、216、および255を提案してみましょう 0と1のちょうどこれらのパターンです。 そして、あなたはあなたの場合は、これを確認することができます 0週から数学をやってみたいです。 しかし、今のところ、ちょうどと仮定 これが実際に正しいこと。 私は小数点以下3桁を書き換えました 3バイナリ値として数。 今私は何をするつもりだものです ただ、いくつかの空白を追加し、 ちょうど読みやすさのために。 そして、通知は、私は行きますよ 物事を離れて移動します。 だから前、後、前、後。 私は他の興味深い何もしませんよ ちょうどそう物事を広げるより それは、8つの各セットに気付きます ビットは、現在の4ビットの二組です。 これは、16進数のために便利です 特にファッショナブルです なぜなら、各進数0から F、またはより具体的には0〜15、 表すことができます。 正確に4ビットで。 言い換えれば、あなたの場合は16進数で 0を表現したい、それだけで0000ですが、 4ゼロ。 そして、あなたは15を表現したい場合は、 それは4ビットである、1111年です。 そして、あなたは数学を行う場合には、 これは一の位である場合、 これは、16Sの場所です それは与えるために起こっていますyou-- むしろそれが起こっています 申し訳ありませんto--、バイナリで、 それは15あなたを与えるために起こっている、一の位、 補数場所、四つんばいとエイト場所。 だから、私はそのことを提案してみましょう 左側の4ビットのセット 我々は、Fを呼び出すために起こっているものです。 それは最大の数あなたです 4ビットで表すことができます。 そして、我々はすでに進から知っています、 fは16進数で最大の数字です。 私たちは、そこに別のFを持って あそこより2。 そして今のところ、ちょうど信仰​​を取ります 私は数学の権利を行っていること その左半分 これらのビットの、1101年、 16進数でdと同じものです。 そして右手、1000年には、わずか8です。 そして、それは自分の見やすい、右? 8 represents--は権利であります そのエイト場所の下に。 だから我々はエイト列のいずれかを持っています そして、四つんばい、補数またはものに何もありません。 だから今より従来、人間は傾向があります このような16進数を書くために、 あなただけの、一緒にそれらをスキッシュ そして、あなたは0xでそれらを付けます。 これは、以外の何を意味します human--への視覚的な手掛かり ここ進value--が来るので、 それは、そうでなければ明白ではないかもしれません。 もの、最終的に、言うことです 0と1のパターン、 または16進数のパターン あなたがしていることを同等に数字 探して開始する予定 問題にセット4はthis--です 問題セット4仕様が歩いていきます もっとdetail--このを通してあなた しかし、難解なの一種であるとして実現 これは、一見見えるかもしれません あなたはこのロットを見て開始するつもりです。 そして実際に、でもGDBで、 我々は月曜日に導入デバッガ そして、ダンは、PSET 3に導入されて起こっています 多くの場合、あなたの16進数値を表示します 彼らはよりになる傾向があるという理由だけで 10進数またはバイナリよりも、従来の コンピュータの世界です。 それでは、コンテキストにこれを入れてみましょう。 あなたの多くは、このを覚えているかもしれません 何から来たここで絵、? Vistaの場合は、そうであっても、以前より それは、Windows XPは、このデビューをしました。 だから、これは美しい風景です。 そして、実際には、あなたの周り突く場合online-- 私はそれはWikipediaの記事だと思います、 ここで誰かが非常に驚くほど出て行きました 見つかった世界でこの場所を設定 彼または彼女のカメラで 正確に右place-- これは本日、like--見えますが、 それは全く同じ設定です。 この画像は、しかし、ファイル内にあります ビットマップ形式と呼ばれる、B-M-P。 そして、我々はスーパーを取るつもりです それが何を意味するのかでチラッ。 しかし、ビットマップは、ちょうど別の方法であります 代表画像は、まだ画素を用いて 0と1で、最終的に。 しかし、一目で、それは持っています もっと面白い署名 ファイルの先頭に。 それはちょうど3ではありません バイトは、かなりあります バイトのパターンの全体の束 それは意味が所定ました。 例えば、どこかで ビットマップ画像の最初の数バイト の大きさになるだろう 画像、画像の幅、 画像の高さなので、 便利なメタデータを、可能ならば。 お役立ち情報Photoshopのこと または任意のグラフィックスは、あなたが使用しているプログラム 実際に気にすることがあります。 だから、もっとこの中に 問題は4を設定しますが、これを 言うことだけです 一日の終わりに あなたが使用しているすべてのファイル形式 years-- Microsoft Wordファイルのために、 数値ファイル、Excelファイル、 ファイル形式の任意の数 それは、いくつかがあるかもしれません 既知のファイル拡張子 フードの下にちょうど0と1です。 そして、人間が決定しました 規則がありますか、 何0と1のパターンを表します Wordは、Excelファイルに対するファイル 他のファイル形式の任意の数の対。 だから、PSET 4に、あなたが持っているでしょう それにプレイする機会。 しかし、それは、構造体を持つことを意味します。 これは今、実際に素敵なセグエです 唯一のカップルを持っているにC、 その追加機能の 我々はまだ見ていません。 それはかなり小さな言語との一つです Cについての素晴らしい機能は、構造体です。 たとえば、あなたの場合 みましょうrepresent--したかったです あなたがその変数を持っていると思ったと言います いくつかのプログラムの学生を表します。 たぶん、あなたはコースを書いていました 登録プログラム、またはコア買い物 ツール、またはそのような何か。 関連データの部分は何ですか 気になる生徒に? 学生のようなものです どんな値で表現? うん? あなたは学生として名前を持っています。 典型的な学生は、他に何がありますか? 聴衆:[聞こえません] DAVID J.マラン:だから、申し訳ありません。 聴衆:年齢。 DAVID J.マラン:年齢や 同等の誕生日、うん。 ほかに何か? 聴衆:ID番号? DAVID J.マラン:だからID番号、多分 電話番号、多分寮、または家、 や大学、またはそのような何か。 そのデータの任意の数 あなたの連絡先リストを持っている可能性があります 学生を定義するかもしれないものです。 だから、私たちはコードの中で、これを実行したい場合、 我々はこのような単純な何かをする可能性があります。 私たちはそのようにプログラムがあるかもしれません (空隙)メインint型、のは言わせました。 そして、私が表現したい場合 例えば、私が持っているかもしれない学生、 その学生の名前と呼ばれる文字列、 その学生のための寮と呼ばれる文字列、 多分int型は、その学生のためのIDと呼ばれます。 そして私は、私は、文字列を使用していますので、 戻ってCS50.h.を設置する必要があります たぶん私はstdio.hのを必要とするつもりです。 だから、私は先制それらをやらせると私はよ 今のところ、このstudent.cを呼び出すために行きます これを保存します。 そして今私は何かを行うことができます これらの変数を持ちます。 そして、私たちはただ書くつもりです その擬似コードでコメントとして、 それは面白くないだから 我々は今のために何をすべきか。 [OK]を、これは、そのプログラムであります 何とか学生を格納します。 私は場合にどうするかをしたいです 二人の学生を保存したいですか? だから、私の最初の本能が起こっています すべての権利であることが、ちょっと待って、 私は他の生徒を持っている場合、なぜ私にはありません ちょうど行う文字列名2、文字列の寮2、 int型のID2。 そして、我々はなくなってやりました 前にこの道 そして、思われるものに私たちのソリューションは、何でした ハックコピーペーストのようなものであることを ここでの仕事? 聴衆:配列。 DAVID J.マラン:ええ、 我々は、配列を使用することができます。 右この非常に迅速に 扱いにくくなります。 あなたは、任意の並べ替えする必要があります これらの変数のすべてを命名開始。 そして、あなたは、人間は、維持する必要があります そのOK NAME2の対応を追跡 dorm2とID2に対応します。 それはちょうど混乱になります。 だから、非常に簡単です、 数週間前からリコール、 ちょうどと呼ばれる文字列名を有するに 多分私たちにそれらのうち3つを与えます。 そして多分私達は持っています 文字列の寮としています それらの3つ、または定数と、 IDS int型とそれらのうち3つを持っています。 しかし、今でも、これは感じています 右、少しずさん。 私たちはまだ学生と話をしています 私は本当に低レベルで住居です 実装の詳細。 学生は名前と寮とIDです。 なぜ私は、変数を宣言することはできません 学生と呼ばれ、それがよ呼び出します。 そして、私は別の学生をしたい場合は、 なぜ私はちょうどトンそれを呼び出すことはありません。 または私は全体の束をしたい場合 学生の、なぜ私はちょうどありません 私は全体のクラスを持っていると言います 学生、それはそれらの3です。 つまり、なぜ私が来ることができません 私自身のデータ型と、最大と呼ばれます であるの内側学生、 名前は、IDで、寮で、 他のフィールドの任意の数です。 そして、それはあなたが判明 まさにそれを行うことができます。 だからCは構造体と呼ばれるこの機能を持っています。 それは、その言語の機能です 私たちは正確にこれを行うことができます。 私は先に行くつもりです そして、structs.hを開きます 我々が見に行くている場所 学生の定義は次のとおりです。 それは、判明 - と、この1の偶数 IDを含む1よりも簡単 少し前。 あなたが思い付くしたい場合 あなたの自家製のデータ型、 そして、int型に加えて、チャー中と フロートと存在するすべてのこれらの他、 あなたは、文字通りして行うことができます typedefは構造体を書き込み、 その後、いくつかの中括弧、 その内部ます あなたがしたい変数を表示 この新しいカスタムデータに関連付けます 名前と寮のように入力し、 して、中括弧の後 あなたは、新しいデータ型に名前を与えます。 だから、例えば、学生。 そして、何今、このことについての素晴らしいのは、ということです 我々は、対応するコードを見れば、 最初の大会、 すべての、これを置くことです 何かドットHと呼ばれるファイルで、 私たちが持っていないヘッダファイル、 あまり自分自身を使用して開始。 しかし、我々は開始するつもりです 今かなりを使用。 そして、私たちはこれで何ができますか、 最終的に、これらのコード数行で まさにそれを宣言しています データ型、学生。 そして今のは、それを使用してみましょう。 私は今に行くつもりです structs1.cと呼ばれるファイル。 そしてのは、見てみましょう ここではいくつかの特徴。 だから、ここまでのものがあります ほとんど馴染みの、私たちはよ 何ではないに戻ってきます 一瞬でおなじみ。 もちろん、これは私自身を含めています 同様に新しく追加されたヘッダファイル、 PSET 3を除いて、 リコール、我々はhelpers.hを持っています。 だから、の#include helpers.hを思い出すかもしれません。 なぜ私は、引用符を使用していても 代わりに、山括弧の? とき、私はそれらの間に選ぶのですか? ほとんどの場合私が見えます 角度付きブラケットを使用しています。 そして、すべての突然の ライン6私は二重引用符を使用しています。 それはなぜでしょうか? うん? 聴衆:[聞こえません] DAVID J.マラン:それは実際のですが、何? 聴衆:あなたのIDEでです。 DAVID J.マラン:ええ、 それは私の実際のIDEのです。 そしてので、のは、IDEにこだわるわけにはいきません それはちょうど私が使用しているツールです。 それは私の現在にです ディレクトリ、特に。 だからstructs.hは自分のファイルです IDEでインストールされていません、 オペレーティングシステム自体で、 むしろそれは、私の現在のディレクトリにあります。 あなたがたいのであれば慣例があります 独自のヘッダーファイルをインクルードするには、 あなただけの二重引用符を使用します。 このことを私たちに何と言います 8行目、一般的に言えば? これは何ですか? #define何か。 これは右、定数を表しますか? あなたが持っているしたい場合は あなたのプログラムに値 あなたは全体を使用すること 回の束が、それはです それを考慮するのは良い慣習、 ハッシュ記号で、それを宣言 すべての中で、慣例により、その後、定義 それはないですけれどもword--大文字 厳密には必要ではなく、 それは人間の慣習です 定数を大文字にします 彼らが飛び出すように あなたvisually--スペースでと その後、必要な値であることが判明しました その定数の名前に相当します。 セミコロンませんが、単にあなたなし そこにそのパターンに従ってください。 だから私はこの実際のコードで何をしています。 それでは、見てみましょう ここでの主なプログラム。 12行目では、私のため structs.hが含まれています、 私は今、私に魔法のように持っています 廃棄新しいデータ型。 私は、intへのアクセス権を持っていません チャー、フロート、文字列、 、青など。 私は今へのアクセス権を持っています 生徒データ型。 だから、12行目では、私は2つを組み合わせています 1つのカスタムデータ型と2つのideas-- アレイを用いました。 だからこのプログラムであれば 私は実際にサポートしたいです 三つの異なる学生 私のプログラムでは、私 単に私の変数を与えると言うことができます それぞれが、学生と呼ばれます タイプの学生、のです 私のカスタムデータ型です。 そして、具体的には、私を与えます 私の配列のものの3。 だから今、私たちはこのプログラムで何をしますか? ここだけのループ反復のためです 0から3まで、それがだから 学生の価値は何ですか。 私は、ユーザーにメッセージを表示してい 私は学生の名前を付けます。 そして、17行目では、我々 ほとんどおなじみのラインを持っています。 私たちは、古くからの友人を持っています 右側にはgetString。 構文の何個 、明らかに新しく追加されました あなたは前にC言語でプログラミングしたことがない場合は、 そして、構造体を使用したことがありませんか? うん? 聴衆:.NAME。 DAVID J.マラン:.NAME。 しかし、これは、跳躍のも過言ではありません 今の学生は私を囲むので、 あなたのi番目の学生を提供します。 そして、あなたがダイビングをしたい場合 その構造の内部に、 あなただけの単一期間を使用し、 その後、内部変数の名前、 またはその内のプロパティ あなたはへのアクセスを取得したいです。 同様に、その後、私は、プロンプト場合 ユーザーは、私の学生の寮を提供し、 あなたは同様にそれを保存することができます 内部の寮の変数内の文字列 その学生の構造の。 そして今、物事は少し空想を取得します。 そして、これは見に行くされています おそらくたくさんで非常にすぐに。 しかし、あなたはPSETで、このはるかに多くが表示されます 4、今それでちょうど一見してみましょう。 これは、ライン23の貫通ことが判明 38、あなたは私はおそらくやってるどう思いますか? 私は、コメントを削除しました 今日は、しかし、バージョン コー​​ドのオンラインのために 参照は、すべてのコメントを持っています。 私がやっている何をしているようですか? 聴衆:すべてのファイルを保存します ユーザーが入力した情報。 DAVID J.マラン:ええ、 まさに、これは新しい方法です 我々は2を見ていること、 Cの他の特徴、 それによって私は自分自身のファイルを作成することができます。 これまでのところ、ほとんどすべてのプログラム あなたはステートレスで書きました。 すぐにそれが動作して行うのように、それはそれです。 それのないメモリまたは記憶はありません。 保存されたファイルはありません。 しかし、あなたがしたい場合 持っている入力を保存 ゲームやプログラムのように、起こりました このように、それは我々がそうすることができるが判明しました。 そして、あなたはこの多くを参照してくださいよ PSET 4とセクションインチ しかし、このライン23は、基本的に students.csvというファイルが作成されます。 そして、あなたは前にこれを見ている可能性があります。 あなたが前にCSを勉強したことがない場合であっても、 CSVはカンマで区切られた変数です。 それは非常に貧乏人のようなものです Excelファイルのバージョン、 これは、それが開かれることを意味 Excelでアップルの数字で、 それは、行と列を有しています。 しかし、それは独自のではありません マイクロソフトやアップルのような形式。 これは、分離だけでカンマです 私たちはその瞬間に表示されます値。 そして、ちょうど推測を取ります。 非常に、23行目で 最後に、私の第二引数 呼ばれるこの新しい機能に Fファイルのオープンのために開いワットです。 W何を意味するのでしょうか? うん? 観客:それはあなたがファイルに書き込むことができますか? DAVID J.マラン:それはすることができます あなたはファイルに書き込みます。 だから、バリアントのカップルがあります ことを、私たちはここにプラグインすることができます。 しかし、あなたはちょうど読みたい場合 それを見ているファイル、 そして、メモリにあなたをそれを読みます ちょうど引用引用終わり "R"を使用します。 あなたがに書き込みたい場合 ファイルは、 "W"引用終わり引用符を使用します。 追加もありますし、 他の物事のカップル あなたは既存のファイルを変更する場合。 今、私たちはこれを見て維持するつもりです 24行目に事は、我々は戻ってくるだろう。 NULLは、結局のところ、あります 特別な値その 特定の機能によって返すことができます 何かがwrong--てしまった場合 ファイルが存在しない場合、 あなたがメモリを使い果たしてしまった場合、 またはその他のエラーの束。 しかし、今のところ、ちょうどこのことを前提としてみましょう ただ、従来のエラーチェックがあります。 ここでは26行目では、私は反復です 0から3までのすべての私の学生を超えます。 そして、これは一種の一種であります 新機能の、関数fprintf、 ちょうど推測を取ります。 printf関数は、単に印刷の場合 フォーマットされた文字列、 関数fprintfは、おそらく何を意味するのでしょうか? 聴衆:ファイルに印刷します。 DAVID J.マラン:プリントA ファイルにフォーマットされた文字列。 それはどのような追加です fはファイルであることを意味します。 また、新しい最初の引数は、である必要があります あなたのファイルを表す変数。 その後、我々は単にフォーマットを持っています ちょうどprintfのような文字列。 とにもかかわらず、この 構文はちょうどこの、新しく追加されました 、学生の名前でプラグインを意味 学生寮にプラグインした後、 fcloseをして、ファイルを閉じます。 そして、これは新しいものでlastly-- 私たちはこれに戻ってきます long--前に私が解放してい 理由のための学生 それが上まで起こりました。 しかし、我々は戻ってくるだろう long--前と それがためのGetStringがどの程度のです 実際にボンネットの下に取り組んでいます。 それでは、ここで簡単に見てみましょう。 私は自分のディレクトリにlsコマンドを入力すると、 私がいないことに注意してください 、students.csvと呼ばれるファイルを持っています ただそこに存在するものではありません。 だから私は今、このプログラムをコンパイルする場合、 、構造体-1を作ります。 /構造体-1、 私は先に行くと入力するつもりです エールでバークレーに住んでいるアンディ、。 我々はロブを持っているとしている人 これらの日セイヤーに住んでいます。 そしてのはどこを思い付くしましょう ですが、私が思うに、マリアは、マザーであります 私は正確に覚えています。 だから、何も起きていないようにみえます。 しかし、私は今、lsコマンドを入力すると、 students.csvがあります。 それでは、先に行くとオープンstudents.csvましょう。 これも非常にあります 軽量ファイルフォーマット。 しかし、私は単純に規則を採択しました 私はここでは2つの行と列を持っています。 最初の列は、 人の最初の名前。 2番目の列は、学生のです 寮、または大学、または家、またはその他もろもろ。 そして今、私はこれを保存しました 永久にファイルインチ だから、すべてが面白いではありません。 しかし、これは単なる足がかりは今 情報を保持することができることに 永久。 それでは、何より私たちができるようになりました見てみましょう これらおよび他の機能で行います。 しかし、最初に、何か質問? それがたくさんあって、それは高速でした。 しかし、あなたは多くのことを参照してくださいよ PSET 4より、同様に。 うん? 聴衆:への道があります そのファイルに名前を追加し続けますか? DAVID J.マラン:良い質問。 継続する方法はあります そのファイルに名前を追加? はい。 そして、実際には、あなたが終了した場合 再オープンするファイルをバックアップし、 あなたが引用符を使用します 引用終わり ""を追加するため、 これは、単に新しい行を追加し、 新しいライン、何度も何度も、正確に。 良い質問。 その他の質問? うん? 観客:あなたが実行した場合 今再びプログラム、 それはに名前を追加し続けるだろう ファイルまたは、新しいファイルを開くのでしょうか? DAVID J.マラン:ああ、良い質問。 あなたは正しいプログラムを再度実行した場合 今、多分新しい名前で入力し、 これはファイルに追加します またはファイルを上書き? 私はだから、後者 追加モードを使用していません。 そして、私はちょうど盲目的だから 書き込み用にファイルを開いて、 それだけでファイルを上書きするだろう。 だから私は実際に追加され行う必要があるだろう、 私は実際に長期を持っているしたい場合 データベース。 今CSVはあっても、率直に言って、便利です 等のためのあなたはwriting--している場合 そして、私たちは最終的には、これを参照してくださいよ 後でとき学期中 我々は、他の目的のためにCSVを使用しています。 あなたは、人々のすべてを格納する場合 誰が、いくつかのイベントに登録されています またはあなたの学生にサインアップ グループ、またはそのような何か、 この種のデータを格納します フォーマットの超便利です。 文字通りので、私の場合 このファイルをダウンロードすることでした。 私はdouble--可能性があり、 それでは、実際にこれを試してみましょう 私はここにExcelや数字を持っている場合。 私は右クリックするつもりです または、私のファイルをコントロールクリックします。 おっと。 右クリックするか、私のファイルをコントロールクリックします。 さあ、私のマウスは、連携されていません。 私はするつもりですDownload-- ので、ここですべてのファイルをダウンロード ちょうどそう私はこの1つをつかむことができます。 そして、これが動作するかどうかを見てみましょう 初めてstudents.csv-- 私は、アクティブにしました。 今、彼らは私の連絡先を確認したいです。 今、私は登録する必要があります。 それはCSVを使用することがいかに簡単であるかを参照してください? はい、今日までそれを維持します。 [OK]を、今、私たちはクラスの準備が整いました。 ああ、[OK]を、新しい何ですか? [OK]を、近接しています。 それは魔法でした。 [OK]を、今、私たちは更新する必要があります。 そして今、それは何を忘れてしまいました 私はもともとオープンされたファイル、 そこA--何私達は行きます。 [OK]を、今私たちは、Excelファイルを持っています。 ありがとう。 [OK]を、私がしたので、どのような簡単な部分でした。 もちろん、私はプリインストールされている可能性が Excel、または番号、または任意のプログラム。 しかし、これはので、いいです 今私が操作することができます 標準フォーマットのデータ。 だから今の状況を聞かせて 我々はオフに左場所に切り替えます 起動することであった最後の時間、 補助輪を脱いで。 しかし、最初に、あなたはしませんでした この先に昼食を参照してください。 再び火にここで起こっていると ニューヘブンのケンブリッジ、シタールアイス。 できるだけ早くCS50sウェブサイトにサインアップ CS50の学生やスタッフに参加します。 だから我々は、補助輪を取りました follows--として月曜日にオフ 文字列がで宣言されています しばらくの間CS50sライブラリ。 それができるため、そして、それは、うれしいです 私たちはあるとして変数について話をします 完全な単語や文章など。 しかし、それは存在しない文字列が判明。 それはちょうど同義語、または別名です、 我々はその何かのために作成されていること 実際にはもう少しです 技術的にはchar *型と呼ばれます。 そして実際、我々は例を見ました 月曜日にプログラムの それは我々が期待し、かなりのように動作しませんでした。 これは、比較-0を、ファイルしました。 そしてあれば、それは比較-0をリコール 私は月曜日のプログラムを再コンパイル 実行0を比較し、でお母さんを入力 再び小文字小文字、およびお母さん。 プログラムは、私の主張しました 異なるものを入力し、 でもママかかわらず、すべてで 小文字は、視覚的に同じです。 だから、短い答えは何でした コンピュータが考える理由について これらの二つの文字列が異なっていますか? うん? 聴衆:[聞こえません] DAVID J.マラン:右。 だから、お母さん、初めて 私は、それを入力されています 私のコンピュータの中にどこかに保存 メモリが、別の場所で 二回目よりも私がお母さんに入力します。 今では確かに最適化することができます。 コンピュータは、スマートすることができ、 これら2つの文字列を実現する、ちょっと、 これらは同一です。 私は冗長に保管しないようにしましょう​​。 しかし、コンピュータは、ということをしません あなたがそれらを指示しない限り、最適化。 だから、デフォルトでは、彼らがしています ちょうど終わるつもり メモリ内の2つの異なる場所です。 そしてそうするとき、より明確にします 我々は2つ​​の文字列を比較し、 最初に呼ばれたの、 第二が呼び出されました トン、特に私が何でした 13行目で、ここで比較しますか? うん。 観客:それはメモリ内の場所です 変数が指し示すようにします。 DAVID J.マラン:その通り、私がいました メモリ内の場所を比較します これらの変数は、指されています。 そこで具体的には、もしお母さんがでました バイト番号1、2、3、 そして、4--が原因バックスラッシュを覚えています 0最後にすべての方法であることが必要です。 そしてお母さん、M-O-Mの他のインスタンス、 アドレス10、11、12、および13でした。 私は1、そのアドレスを比較して、 メモリ内のその場所、 である10、反対 明らかに同じではありません。 1は10ではありません。 だから、これはその中でいいです それはかなり簡単です。 しかし、それは限り、問題です 私たちは、文字列を比較するように見えることはできません。 だからfundamentally-- この低レベルで、 あなたが実現したい場合 比較するプログラム 二つの別個の言葉 ユーザーは、品質のために入力しました 彼らはのために文字を並べるん ただ一般的な用語のchar、 我々は明らかに、何をすべきかが必要ですか? それだけに十分ではありません これらの二つのアドレスを見てください。 私たちは何をする必要がありますか? うん? 聴衆:を繰り返し処理 文字列[聞こえません]。 DAVID J.マラン:うん、してみましょう 文字列を反復。 それでは、ループ、whileループのために使用してみましょう、または あなたが最も快適だものは何でも。 そして、私たちはどこかに2つの文字列を持っている場合 メモリに、の各のを見てみましょう 最初の文字が、その後、それぞれが第二です 文字、第3、第4、 そして第五に、我々はヒットするまで どのような特別なセンチネル値はありますか? 聴衆:[聞こえません] DAVID J.マラン:ええ、バックスラッシュ ゼロ、いずれかの文字列内のポイントで 私たちは、それはそれだ決めることができます。 我々はすべての単一の文字にマッチしたことがありますか? そうでない場合、falseを返します。 その場合は、trueを返します。 そしてそうそれはまさにこのバージョンです プログラムの比較 - 1.Cはありません。 それは、私たちと同じです その私のきを除き月曜日を見て しかしstring--単語の脱却 それが全く機能impact--を持っていません 私は今やってる削除しています いくつかの視覚的な補助輪、 しかし、明らかにそれを表示するには sおよびtはアドレスです。 そして、それは、どのようなスターです アスタリスクを表し、 それ以外の場合は、既知のアドレスであり、 より技術的にポインタとして。 だから私は、上の宣言時 ライン9とのchar * sのを言います、 それは私に文字列を与えることを意味するものではありません。 それは私に、その変数を与えることを意味します 生活の中での目的は、アドレスを格納することです。 私は置くことを約だから そこに文字列のアドレス。 そして実際、のGetStringは、することが 明確な、文字列を返しません。 それはお母さんを返しません。 バックスラッシュゼロ、それ自体。 具体的に何をするのgetStringありません かつ正確に返しますか? 聴衆:[聞こえません] DAVID J.マラン:アドレス、 最初の文字のアドレス いくつかの文字列では得ています。 そして今、私たちは見ています 再び特殊なキーワード。 そして、私はこの以前に言及しました。 これは良い大会になるだろう 私たちは今、何度も何度も表示されますこと。 私はそのことを確認するチェックしています sがnullでなく、tがnullではありません。 本当に私に基づいているため 迅速な言及以前、 GetStringがない返された場合に何を意味するかもしれません アドレスが、再び、N-U-L-L、 いくつかの特別な値はありますか? 聴衆:エラー。 DAVID J.マラン:それは誤りです。 何かが間違っていました。 そして、何通常、 特に、起こるかもしれません strings--となる可能性があります advance--で未知の長さの 多分コンピュータの メモリのうち、多分 あなたは、このようなAで入力 長い単語や文 またはこのような巨大なエッセイを貼り付け だけでは十分なメモリがあります。 だからのGetStringを返すことはできません。 全部のアドレス、 それだけで何も返しません。 そして、それはエラーが発生したと言います 特別なNULL値を返すこともできます。 それはいわば、ゼロアドレスです。 今では判明Cが付属しています その繰り返しを行う関数。 私たちは、でこれを実装する必要はありません ループまたはwhileループ自分のために。 我々は、機能を使用することができ、 簡潔に呼ばれ、 コンプをかき混ぜる、または文字列の比較、その 生活の中での目的は、まさにそれを行うことです。 あなたはそれを二つのポインタ、2つのアドレスを与え、 そして、それはそれらのアドレスに移動します そして、その後のために手紙を比較 品質のための文字のための文字、 真のものである場合にのみ停止? 直感的にコンプをかき混ぜる必要があるとき ただ明確にすることが、反復を停止しますか? それはどちらかにバックスラッシュ0に達すると 文字列、その時点でそれは決めることができます すべてが一致した、または 矛盾がありましたか? だから、私たちは今、これを実行するとしようとした場合 私たちの小さな大文字ゲーム、 そう比較-1、./compare-1を行い、 小文字の両方の時間でお母さんを入力します。 今では同じことです。 そして、私は再びそれを行う場合 小文字と大文字多分。 今では確かに区別します 大文字と小文字の間。 だから、すべてではないこと、ハードまたは 魔法が、それは、今説明しません 何がボンネットの下に起こっています。 だから我々は、より多くの何を抽出することができます レッスンのこの種から? それでは、これを見てみましょう。 私が先に行くと書くつもりです コピー-0と呼ばれ、ここで迅速なプログラム。 そして今のは先に、実際に行ってみましょう 、のコピー-0でthis--やらせます 私がここに持っているものを見てみましょう。 私が最初に何かを言う、ユーザーに伝えます。 それから私は、文字列を取得 私はSにそれを保管していました。 sが等しい場合、私はチェック わずか1を返し、NULLに等しいです。 だから、これは標準的なエラーチェックです。 興味深い何も起こりませんでした。 そして実際に、我々は、エラーを取り除く場合 チェック、これは週1のコードのようになります。 現時点では。 しかし、私は取得するために開始しました それについて少し良く。 今16行で、一週間前に、多分 でも、数日または数分前に、 あなたは16行目があると言うかもしれません トンという変数を作成します そして、コピーがそれにです。 そして、それは完璧です 合理的な持ち帰り。 しかし、今より正確に。 16行目では何が起こっているのでしょうか? 何がコピーされつつあります 右から左へ? うん? 観客:tは秒のアドレスを取得していますか? DAVID J.マラン:その通り、T Sのアドレスを取得しています。 私は行くのであれば、今明確にします バックその先の例に 私は私が入力したものを引き出します。 そして、私が入力したもの in--ここのだし、ここで 私はどこかに入力したものです その後、メモリ、ママとバックスラッシュ 私のために追加されています0。 私はここに保存され、リコール、 これは、位置1、2、3、4であります これはSで現在何です。 ライン16にあれば、私は私を与えると言います トンとストアと呼ばれる別の変数 sの値では、どのような ここに格納されるお母さんではないでしょう むしろちょうど数1。 だから我々は、このプログラムに先に見れば 今、何が起こるだろうか? だからがあることに気付きます この機能を使用すると、かもしれません シーザーのためにいくつかの時間前に、これを使用しています、 またはVigenere、またはそうでないかもしれない、まったく。 私は、私は、私のprintfと主張します コピーtを活用する予定。 まず19行、迅速正気で チェック、strlen関数Tの長さをチェックします。 私はしたくないので 何かを大文字にしてみてください 場合そこには文字列はありません。 ユーザーは単にEnterを押した場合は、 活用するものはありません。 だから私は、ライン21を行うにはしたくありません。 だから、ライン21を生かしています これは明らかに手紙、トンで? 聴衆:M? DAVID J.マラン:それが見えます 以下のようにそれは、コピーは1ですか? 聴衆:メートル。 DAVID J.マラン:ええと、M。 [OK]を、最初のmので、 私はことを通知理由 TOUPPERに渡す、これ あなたがそれを見たことがない場合にはです ちょうど機能 その入力として活用。 Tブラケットゼロが与える意味します 私トンのゼロ文字。 だからどのようにこれを行います 画像の変更は、明確にするには? 何が書き換えまたは変更を取得する必要があります Sに対してとtとママと バックスラッシュゼロ。 聴衆:[聞こえません] DAVID J.マラン:ええ、 ので、ここでこの1は、単に this--修正to--変更を取得する必要があります 資本メートルに変更を取得する必要があります。 しかし、今、後で見に プログラム、私はプリントアウトした場合 sとt私は、ここにきれいに何見ながら、 sとtをプリントアウト起こるだろう。 だから./copy-0、コピー-0にします。 私が先に行くと入力してみましょう すべて小文字でお母さんインチ オリジナルとの両方に注意してください コピーは、資産計上されています。 なぜ? まあ、sおよびtは両方を指しています、 あなたがする場合は、メモリの同じチャンク。 そして率直に言って、これはなっています 本当に事実をuninteresting-- ここでは、アドレスゼロを使用していること。 私は意味、私は本当に気にしません ものは、メモリのどこにありますか。 申し訳ありませんが私は少し多すぎるを消去しています。 しかし、私は本当に気にしません 物事は、メモリのどこにいますか。 だから、実際にどのような プログラマは考える傾向にあります あなたはについて話すときということです アドレス、またはポインタ、 それはメモリのどこにあるか誰が気に。 それはATの場合、私は気にしません バイト1または1億円となりました。 私はこのことを気に 変数が効果的です メモリのチャンクを指します。 だから、今後、よりもむしろ屁理屈 任意のメモリアドレスより、してみましょう 単にポインタを描画するために開始 矢印などのポインタ、など。 それでは、s及びtは本当に、あります このプログラムによれば、 私はトンを作成する方法のため、 それは、ちょうど2つの別々の変数です メモリの同じチャンクを指します。 彼らがどこにいるそして、我々は気にしないでください。 だから我々は離れてその詳細を抽象化することができます。 それでは、どのよう私はこの問題を解決するのですか? 私はコピーのバージョンを書きたい場合 プログラム実際にコピーした文字列 そして、だけ大文字 コピー、ただ直感的に、 であることを何持っています 当社のソリューションの成分? 聴衆:[聞こえません] DAVID J.マラン:私たちは、何が必要ですか? 聴衆:メモリのチャンク。 DAVID J.マラン:我々は必要 メモリの別のチャンクは、右? 私たちはどのように知りません 必ずしも、まだそれを行います。 しかし、私は一種のように起こるためにこれを必要とします その小文字で元のママ メモリの余分なチャンクで終わります。 そして、私は、コピーを変更したときに、私 ここで、このコピーを変更する必要はありません。 私の代わりにこれだけを変更したいです コピー元は変更されませんように。 それでは、我々はこれを行う方法を見てみましょう。 すでに持っているコピー-1では、 コメントを剥奪され、 しかし、オンラインでコメントしています。 私たちは、代わりにfollowing--これらの操作を行います ラインは同一であり、私は文字列を取得 sを呼び出します。 しかし、今私たちのほとんどの一つを見てみましょう 複雑であるが、複雑の最後 しばらくの間、ライン16は、まさにこれを行います。 であなたの快適なので、もし 私達はちょうどdrew--画像 私はメモリの新しいチャンクを与え、 それにすべてをコピーし、 我々はコードにそれを変換する方法を見てみましょう。 そこでライン16、左側に、 char * tは私にこっちには、このボックスを提供します。 それはそれがないすべてです。 右側に、 m個のalloc、またはmalloc関数、 メモリ割り当て、超空想であり、 ちょうど言うの不可解な方法 私はメモリのチャンクを与えます。 我々はどのくらいのメモリが必要なのでしょうか? まあ、大きな表現の一種です。 しかし、ここではそれがここで言っていることを見てみましょう。 これは、もちろん、与えるあります 私のの文字列の長さ。 だから、お母さんはそれが何をすべきですか? だから3、右? お母さんは3文字です。 あなたはカウントされません。 バックスラッシュゼロあなたを それはだ文字列の長さについての話 実際に人間の目に見える文字。 だからお母さんは、これは私に3を与えます。 しかし、私は今1を追加している、ちょっと待って。 なぜ私が実際にしたいです わずか3 4バイトを割り当てていませんか? うん? 聴衆:センチネル値については? DAVID J.マラン:その通り、 そのセンチネル値のため。 バックスラッシュゼロの場合、 私は、4バイトの合計が必要です。 だから私は、長さが必要です 文字列のプラス1。 そして、ちょうど良いmeasure--用 でも、このシステムにかかわらず、 それは常に私が言っている1--になるだろう 文字のサイズによって、これを乗算します。 あるのsizeof判明 C言語で演算子こと ちょうどあなた伝えます だバイト数 特定のデータタイプに必要。 これは、配列のために動作しません、 一般的に、時にはそれはありません。 しかし、一般的なケースで、ありません。 多くのバイトをどのようにしかし、それは私に教えてくれます 判明char型であるが、常に1です。 だから、これは1を掛けるようなものです。 コー​​ドのだからスーパー不可解探しライン。 しかし、それがないすべてのですができます 私のメモリの塊。 しかし、それはコピーしているように見えるん そのメモリには何? 未だに。 だから、私はライン22上で行うと、どのような 23、24、25、まあ、私は単純にこれを行います。 そして、これは一種のです 今古い学校のもの。 これはPSET 2、のようなものです あなただけのものを移動しています メモリ内、あるいはむしろ文字列で周り。 だから私は0からに反復しますよ 文字列sの長さ。 そして私はi番目の文字をコピーしています s内のTのi番目の文字に。 そしてので、私は、プログラマは、作られました 正確に同じ数のバイトを割り当ててください 私が必要として、それは完璧です 1対1の関係。 そして、私はでママをコピーします 新しいものに小文字。 そして最後に、私はこの行を行います。 それで効果があるだけで ここで、このTを大文字にします。 吸収するそう多くはなく、 あなただけ考慮すれば、 本当に何が起こっています ボンネットの下に ただこれらを移動しています すべてのことは、周りのバイト この問題を解決することで必要とされます ちょうど私達にこのメモリの塊を得ました。 今のリスクがあります 圧倒的な、私がお見せしましょう ほとんどですつの他の例 この1を除いて、同一の コー​​ドの行。 だから、これはハッカーのバージョンです このプログラムの、可能ならば。 しかし、ちょうど蒸留しましょう その上で何が起こっているのかに。 24行目は、このトンにするために使用します ブラケット私はSブラケット私を取得します。 今、私はこれを変更しています ずっと不可解星トン プラス1は、星のプラス1に等しいです。 だから、何が起こっているのか、なぜ 私たちは星の文字を持っていますか? 私たちは前に星を見てきましたし、 それは異なって、ここで使われています。 我々は以前、char *型を見た今私は見ています 先頭の星、それは大丈夫です。 それは我々が判明するので 種類のちょうど推測することができます 最初のものから 原則は何が起こっているのか。 だから明確にする、のは何ですか? 先週、それが文字列でした。 それはもはや十分ではありません。 具体的には、Sは何ですか? 聴衆:[聞こえません] DAVID J.マラン:それはポインタです。 これは、のアドレスです 私たちが最初に入力された文字。 [OK]を、tは何ですか? 聴衆:[聞こえません] DAVID J.マラン: 最初のバイトのアドレス トンで、メモリのチャンクは再割り当て。 だから、そのときに我々が判明 文字列までに0から反復処理 length--まず、私 ので、0でオフ開始 ループもののために、この古い学校の。 だから簡単にするために、してみましょう コー​​ドの最初の行と仮定 右、本当にこれだけです。 iがゼロを追加する、ゼロの場合 おそらく何かに 効果を持っているつもりされていません。 だから、この言葉は何ですか? それは星のことが判明 この文脈でのオペレータ 間接参照は、 ちょうどであることをオペレータ、 行くというのがファンシーな方法 以下のアドレスに。 だからSは最初のアドレスである場合 このメモリのチャンクの文字、 * sがそこに行くことを意味します。 そして、我々は描かれてきましたので、 このように画像、 あなたが採用することができます メンタルモデルを以下に示します。 これはsであり、あなたは* S * S言えば 種類のシュートとはしごのような、 あなたは子供の頃からゲームを覚えていれば、 その矢印に従って行くようなものです アドレスへ。 * tは同じものです。 だからここに開始し、そのチャンクにアクセスしてください。 私はちょうどに描くことができません この画面にそのように。 * tはここに行くことを意味します。 そして、ループのためだけです この文字は、ここに移動と言って、 ここでこの文字を移動し、 ここでこの文字を移動します。 しかし、私はその増分をどのよ​​うに行うのですか? 私はちょうど削除何元に戻す必要があります。 これは、一般的に呼ばれるものです ポインタ演算、どの アドレスで数学を意味します。 もし、このループのために、 私は私をインクリメント保ちます、 sはアドレスであり、Tは アドレス、私はちょうど1を追加し続けるならば、 それはただ前進し続けることを意味します、 そして、転送、およびメモリに転送します。 それは、オックスフォード・ストリートのようなものです CSの建物がオンになっている通り。 CSの建物は33オックスフォードストリートにあります。 だから、33を行うした場合 オックスフォードストリートプラス1、 それは34オックスフォードにあなたをもたらします ストリート、その後35オックスフォードストリート、 その後、36オックスフォードストリート、どのようなもの 建物は実際にある - 彼らが存在する場合。 だから、それは我々がやっているすべてです ここでポインタ演算と。 だから、超難解な方法です 自分自身を表現します。 しかし、すべてのことが起こっています フードの下に ただ、これらのアドレスに従っています、 あなたがする場合は、マップを次のように、 などの矢印を次の 私たちは、画面上に描画されてきました。 [OK]を、多くは消化します。 構文上の任意の質問、概念、 ポインタ、malloc関数など。 うん、こっち最初。 聴衆:だからここでそれ tはTOUPPERの* tを等しく*と言い、 活用しようということです すべての文字またはjust-- DAVID J.マラン:ああ、 本当に良い質問です。 ここでこの行のだから、31、 これは、大文字としています 最初の文字または文字のすべて。 それでは、行くことによってそれに答えてみましょう バック第一原理に。 ここで私は平均と第一原理 ただ基本的な定義に行きます 関与何の。 だからTOUPPERは、関数の それは、charを大文字にします。 それで全部です。 * tはfirst--に行く意味します T内のアドレスにアクセスしてください。 そのように、画像に、このチャンクがある場合 メモリの私たちは、malloc関数で割り当てられ、 これはトンで、* tはここに行くことを意味します。 一方、あなたが渡しています その値、小文字メートル TOUPPERに、あなたが戻って取得しています あなたはそれを入れている資本M、? あなたは、同じ場所でそれを入れています。 だからそれらのロジックによる それだけだ基本的な定義 最初の文字を大文字 あなたは私またはAで反復しない限り、 ループまたはwhileループのために、それはないだろう あなたがそれを頼むよりも何かをします。 良い質問。 うん? 聴衆:なぜあなたは使用しました この方法ではなく、逆参照 配列? DAVID J.マラン:ああ、良い質問。 なぜあなたは間接参照を使用します 代わりに、アレイ法の方法? 特段の理由は、正直言っていませんでした。 そして、実際には、このための 例のようなもの、右、 私はちょうど作っ主張しています より複雑なプログラム、 より多くの目には、以上のグレージングされています 人々はチェックアウトされています これは、超難解に見えますので、しかし、 それは同じことをやっているにもかかわらず。 だから、率直に言って、これは 必要以上に視覚的に複雑なソリューション 問題に。 それはまだ良いデザインですが、 5設計のための5つのうち、 それはブラケットですか 表記またはポインタ表記。 我々が得るときに特にBut-- 後で過程でPSET 5で 我々はその辞書を実装するときに 私はtimes--のカップルを述べました 私たちは実際に気にします 低レベルのメモリ・アドレス 私たちは本当に理解しています どうしたの。 しかし、今のところ、それは、このことが判明 コー​​ドの行ここでは、角括弧 実際には存在しません。 彼らはと呼ばれるものです シンタックスシュガー、これ のがちょうど不気味クールな方法です コンパイラがあることを角括弧に変換 その数学的表現。 だから、人間の慣習です ただ書くことができるようにします これらは非常にユーザーフレンドリーブラケット。 しかし、どのようなコンパイラ、打ち鳴らします、 本当にすべての時間をやっています あなたはラインで強調表示されているもの書きます 24、ボンネットの下に、それは本当にです これに変換します。 それは人間としてちょうどより楽しいです ライン24のようなコードを読み書きします。 しかし、最終的にそれら 補助輪はあまりにも外れ 自分の快適さが強くなったとき。 すべての権利なので、このことを思い出して、その後 最大の問題のようなものでした 我々はに走りました。 そして、それはこの全体を巻き起こしたものです ポインタについて気会話、 アドレス、およびコピーの事。 私たちがつまずいからです この愚かな、愚かな問題、それによって 私はローレンとlogically--実装しました ここでのデモとオレンジジュースのアップ milk--で完全に アルゴリズム正しい関数 2つの変数を「スワッピング 値が、こいつ 任意の永続的なを持っていなかった、または 私のコードに恒久的、効果。 そして、なぜそれがでしたか? 一言で言えば、これはなぜです スワップの実装 論理的に正しいが、影響を与えることはありません それに渡された変数に、 メインのためのxとyのような? 問題の要点は何でしたか? うん? 聴衆:変数が作られているので パス内の変数のコピー スルー機能。 DAVID J.マラン:その通り、ときに渡します 関数に変数、または引数 関数に、彼らがしています コピーによって渡されます あなたが探している同一のを得ることを意味 xとyの両方のビットパターン AとBのここと呼ばれます。 そして、あなたが何かを行うことができます あなたはそれらのコピーをしたいです、 しかし、彼らはありません必要があるとしています 呼び出し元の関数への影響。 そして、実際には、我々はそれを描きました 画面上の画像、リコール 前回、それによってあなたの場合 本当に何を考えます 場合hood--の下で起こっ これはあなたのコンピュータのメモリであり、 ここでダウンの塊です メモリは、主に使用されています これはの塊です メモリは、スワップのために使用されています 主が持っているので、場合でも、 2つの変数xとy、 スワップは、同一の探している場合があり 1および2はどちらの値、 しかし、彼らは完全にしています メモリの異なるチャンク。 だから我々は、これに対する解決策を必要としています。 そして率直に言って、それは今ように思われます 右、この問題の解決策を持っています。 我々は今の能力を持っている場合 アドレスにより物事を操作します そして、、ソートのシュートとはしご スタイル、これらの矢印に従ってください そして私たちが望むどこにでも行きます メモリでは、できませんでした することによって、この問題を解決します メインからスワップに渡します 我々はしたくない値 スワップが、ちょうど直感的に 私たちは、代わりにスワップするために渡すことができますか? 【声を挟ん] DAVID J.マラン:なぜ我々だけではないん それは右、アドレス渡しますか? なぜ我々はスワップaを与えていません 宝の地図、あなたがする場合は、 それはそれを導きます 実際の値xとy。 レッツスワップ、実際に変更 それらのオリジナルのビットではなく、 ちょうどビットのコピーを渡します。 だから、実際には、それが何です 解決策になるだろう。 このバージョンはこちら 明らかに悪いと欠陥があります。 そして今、一見、それだけに見えます 以下のような我々は、ランダムに星の束を追加しました 私たちの指を交差させ それはコンパイルすることを。 しかし、それは今、コンパイルします。 しかし、それでは、これらの事は何を意味するのか見てみましょう。 のと、残念ながら、作者 Cは別のシンボルを選択している可能性が この小さなを作ります 明確にするが、スター・オペレーター で異なる意味を持っています 二つの異なる文脈。 そして、我々は両方を見てきました、 しかしそれでは、区別してみましょう。 だから、一番上にアップし、 私はAとBを変更したとき 悪いではint型のであるから、 星、AとBをintへのバージョン、 以前、整数でした。 今、bは何ですか 良い、緑のバージョン? 彼らはアドレスです。 明確にするもの、のアドレス? 整数のアドレス。 私は事実そう int型のスター手段を言って これは、のアドレスです 整数、特に。 だから今、コードの行に気付きます 何か他のものはあまりにも変更されています。 tmpがあるため、同じまま それだけで一時的な整数ですが、 そこにはメモリ魔法ません。 しかし、今の星を必要とします。 そして、実際には、すべての aとbの他の言及、 すべてのことだということに気づきます 赤から緑に変化します 私は接頭辞だということです 星とそれらの変数。 私はaとbをコピーしたくないので。 ので、私はちょうどaとbとのスワップをコピーする場合 AとB、私は実際に何を交換するのですか? ただアドレスは、私が交換したいです これらのアドレスを散策。 そこに行きたい。 だからスター・オペレーター 私の関数の内部で、 ないパラメータリストの内側に、 あなたがそれらのアドレスに行くことを意味 実際にこれらの値を変更します。 だから何画像を行います 今の代わりのように見えます。 まあ、そうではなく私が渡しています aとbはない1のためにあると2-- 私は実際に追加する必要があります ここで一つの他の定義。 したがって、このチャンクと仮定 メモリの位置10にあります。 これは、位置11であるが、この 簡略化のビットは、 私は今、2つの選択肢があり、私はX渡すん yまたは私はそれらのアドレスを渡すのですか? 私はそれらのアドレスを渡す場合 このような、私はちょうど 今実装する必要があります 緑のコードあたりのスワップ それは見ているときに、いつそう Bを見て、それだけでAとBをコピーしません 牛乳とオレンジジュースを移動します。 牛乳とオレンジジュース 隠喩は今、ブレークダウン それらはコップであるため、 液体ではなく、マップの。 私たちは、代わりに移動する必要があります 10私たちに対処します 11に対応するために行く必要があり、 そのスワッピングロジックを実行。 だから、ロジックは同じですが、 我々はわずかに異なる方法が必要です これらの変数にアクセスします。 だから最終的には、どのような プログラムでは、これがあるように見えることがあります。 swap.cで文字通りコピー 緑のバージョンを貼り付けました。 しかし、私は1つの変更を行う必要があります。 それはちょうど、スワップを変更するのに十分ではありません。 他にどのようなコードの行 私は変更する必要がありますか? うん? 観客:それは引数を取ります。 DAVID J.マラン: それは、その引数を取ります。 だから私は、メインまでスクロールした場合、私は ただ、xとyに渡すことはできません、 そして、私は、最後の約束します 新しい構文の作品今日。 私はないのxに渡す必要があり、 Yが、xとyのアドレス。 そしてそれは、シンボルが判明 Cの著者が選んだこと あなたがここにアンパサンドを使用している場合ではないと、あります ビット単位のアンパサンドと混同され、 あなたはアンパサンドを使用する場合 こことここアンパサンド、 これはあなたのために割り出し、 xのアドレスは何ですか、 多分それは何、10です Yのアドレスは、多分それはです 11、代わりのものを渡します。 だから、一度にすべてを吸収するためにたくさん。 しかし、ここでは、迅速で今見てみましょう 私たちの残りの4分 どこに物事がゆがんで行くことができます。 そして余談ですが、実際には 私はこの写真を撮りました、 TFは1年か2年前にこの写真を撮りました。 だから、これは背面の角です エリオットダイニングホール。 ポインタは、おそらく最も難しいです 我々はCS50でカバーするトピック。 ですから、並べ替えを心配している場合 多分それはだような斜面であります ホッケースティックのより このように、実現 我々は種類の中でピークに近づいています 概念的な複雑さの点。 そして、私はこれを持ち出します 写真、私は誓う理由 私が撮った秋1996年の神、に 私の指導員とCS50、 Nishatメータ、彼は私を座っ ランチオーバーエリオットD.ホールの隅、 または夕食、またはしようとするもの 私はポインタを理解するのに役立ちます。 私は数週間後にあった場所そしてこれはあります それは講義時に導入されました 私は最終的にポインタを理解していました。 そして、私はこのことを期待しています あなたのためにはるかに早くクリックします。 しかし、絶対の間でこれを実現 より洗練されたトピック 我々は見てきました。 しかし、それは最も強力な間です。 あなたはそれを得るとき、それは本当にすべてです ただ、最終的に一緒に来るつもり。 だから、残りはそれがない安心しました 今日のすべてのシンクにする必要があります。 そこでここでは最後のプログラムです 我々が見てするつもりです。 そして、我々はで終了するつもりです クレイメーションの迅速な3分 私たちの友人、ニックParlanteによって作ら。 ここでは、プログラムは、その上の2つに、です 行は、変数xとyを宣言します。 アドレスでどちらも 整数の、AKAポインタ。 我々は、次に、十分に割り当てます 整数を格納するためのメモリ そして、アドレスを格納 xのそのメモリの。 だから、それはさらに簡単です 前の例よりも。 私は4バイトのメモリを与え、 それは、int型のサイズですが、 そしてxにそのアドレスを置きます。 この行は、ここで意味します xのアドレスに移動 との意味を置きます 人生、そこに数42。 しかし、この行は私を心配します。 スターY手段は、yのアドレスに移動 そしてそこに不吉な数13を置きます。 なぜそれが、この時点で、危険です story--で急速に語ったとはいえ 私たちの衰退分で here--なぜそれが悪いです 私が言うの、yのアドレスに行きますか? 観客:あなたが持っていない[聞こえません]。 DAVID J.マラン:私はそうではありません Yには何も入れて。 だから、yの値が何でありますか、 物語の中で、この時点では? 我々は考えています。 これは、いくつかのゴミ値です そして、もBinkyは知りません。 私たちはこのノートに終了することができれば。 [ビデオ再生] -Hey、Binkyは、目を覚まします。 これは、ポインタの楽しみのための時間です。 -あれは何でしょう? ポインタについては、こちらをご覧ください! ああ、グッディ。 型ウェル、始めるために、私たちは推測しています カップルのポインタが必要になります。 -OK。 このコードは2つのポインタを割り当て、 これは整数を指すことができます。 -OK、よく私が見ます 二つのポインタが、彼ら 何を指しているようには見えません。 -そのとおり。 最初のポインタ 何を指していません。 彼らが指すものがあります 指示先と呼ばれ、それらを設定します 別のステップです。 -OH、右、右。 私はそれを知っていました。 指示先は別のものです。 それでは、どのように指示先を割り当てていますか? -OK、よくこのコード割り当て 新しい整数ポインタの指示、 この部分集合Xがそれを指すように。 -Hey、それが良く見えます。 だから、何かを作ります。 -OK、私はよへのポインタのx間接参照 その指示に数42を格納します。 このトリックのために、私は私が必要となります 逆参照の魔法の杖。 逆参照の - あなたの魔法の杖? ええと、それは、それは素晴らしいことです。 - これは、コードがどのように見えるかです。 私はちょうど数を設定しますand-- [POP SOUND] -Hey、それが行くそこに見えます。 そこで、X上で間接参照を行うと、以下の 矢印は、その指示にアクセスします。 この場合には、そこに42を格納します。 ねえ、番号を格納するためにそれを使用してみてください 他のポインタを介して13、Y。 -OK。 私はちょうどyにこっちに行きますよ、 その数13セットアップを取得します。 そしての杖を取ります 逆参照とjust-- [ブザー音] -OH、ちょっとそれは動作しませんでした。 、Binkyええと、私はしない、と言います 逆参照思います 設定するのでyは、良いアイデアです 指示先までの別のステップです。 そして、私たちは今までそれをやったとは思いません。 -Hmm、良い点。 -Yeah、我々はポインタ、Yが割り当てられますが、 我々は、指示先を指すように設定することはありません。 -Hmm、非常に注意深いです。 -Hey、あなたは、そこにBinkyの良い探しています。 Y指すようにあなたはそれを修正することができます xと同じ指示先へ。 -Sure、私は私の魔法の杖を使用 ポインタ代入の。 なるだろうということ-is 前のような問題は、? - いいえ、これは指示先に触れていません。 それはちょうど1ポインタを変更します 同じthing--を指すように 【ポッピングSOUND] 別の--as。 -OH、私が参照してください。 xと同じ場所に今のyポイント。 だから、今yが固定されている、待ってください。 これは、指示先があります。 だから、の杖を試すことができます 13オーバーを送信するために再び逆参照。 -OH、[OK]を、ここに行きます。 -Hey、その見てください。 今すぐYの作品を参照解除。 そして、ポインタが共有しているため、 1指示先ことを、彼らは両方の13を参照してください。 -Yeah、共有、ええと、何でも。 そこで、我々は今の場所を切り替えるするつもりですか? -OH、我々は時間の外出に見えます。 -だけど - 3ポインタのルールを覚えて-Just。 ナンバー1、基本的な構造 あなたはポインタを持っているということです、 それは指示先にポイント以上。 しかし、ポインタと 指示先は別のものです。 そして、一般的なエラー ポインタを設定することです しかし、それを指示先を与えることを忘れています。 ナンバー2、ポインタの参照解除 ポインタで始まり、 オーバーその矢印をたどります その指示にアクセスします。 我々はすべて知っているように、これだけあった場合に動作します 種類のバックを取得指示先であり、 番号1を支配します。 ナンバー3、ポインタ 割り当ては1ポインタを取ります とを指すように変更 別のポインタと同じ指示先。 そこで割り当てた後、 二つのポインタ 同じ指示先を指すようになります、 時にはそれは、共有と呼ばれています。 そして、それは本当に、これだけです。 バイバイ今。 [END再生] DAVID J.マラン:それはCS50のためにそれです。 教授ニックParlanteに感謝します。 私たちは来週お会いしましょう​​。 [電子音楽の演奏]