DAVIDマラン:すべての権利、戻って歓迎します。 これはCS50です。 これは、週7の始まりです。 だから、それは久しぶりですので、私は、我々がしようと思いました ここで我々の旋風ツアーに参加 中断し、どこ私たちが今行っている。 この事はここにあるかもしれませんので、 最初はいくつかの不安を引き起こした。 しかし、うまくいけば、あなたがし始めている これはここに示したものに順応 - ポインタを表す星であり、 もっと普通の言葉でちょうど何? だから、アドレスです。 だから、のアドレスだ メモリ内の何か。 そして、我々は戻って皮層に開始 数週間前に、物事が好き GetStringメソッドと他のこのような機能 すべてのこの時間は戻ってきた のようなメモリ内のもののアドレス、 の最初の文字のアドレス いくつかのシーケンス。 だから、我々はまた、valgrindのを導入している あなたは、この問題のために使用することから始めましょう 特に次のために、セット 問題は、同様に設定します。 とvalgrindのは、私たちのために何をしますか? これは、メモリリークをチェックし、それ また、メモリの乱用をチェック。 それは、いくつかの確率で検出できる場合 あなたのコードがメモリに触れるために起こっている それは単にべきではないこと。 だから漏れは必ずしも、あなたではない場合 いくつかの境界を越えて行く 配列、あなたが実際にvalgrindの実行 とその動作をしながら誘導 valgrindのは、あなたのプログラムの中で実行されている それの内部で実行すると、買ってあげる このようなメッセージ - "無効な書き込みの のカップルを思い出し、サイズ4、 " 数週間前、私が誤っていたことを意味 遠すぎる1 int型に好き 配列の境界を越えて。 そしてサイズ4は、ここでサイズを意味 その特定のint型の。 だから実際には安心を取ること valgrindのの出力、その形式、 ただ凶悪です。 それは混乱を見抜くのは本当に難しい 興味深い情報のために。 それでは、私たちがここでやったことはただの抜粋です より多くのカップルのいくつか 興味深いライン。 しかし、valgrindの年代のその80%を実現 出力はのビットになるだろう 気晴らし。 ただ、これらのようなパターンを探して - 右の無効、無効、40バイトを読み取る とブロックのいくつか数は間違いなくある そのようなキーワードは、失った。 そして、何あなたがうまくいけば表示されますと、一部である どの機能のトレースの種類 間違いが入っ実際 この場合、ここでの何行目で 私のコードは明らかに誤りでしたか? だっmemory.cのと呼ばれるファイルに26 私たちが遊んでいた例 一度。 だから、malloc関数ではおそらくありません。 それは代わりに私のコードはおそらくあった。 だから我々は再びこれを見るだろう と再び前に長い。 これで思いついたので、scanf関数、 これまでのフォームのカップル。 我々は簡単にsscanf関数を見ました。 それは何かの数だった あなたの中に飛び込んだ クイズの準備。 とscanfは実際に何であるかCS50 ライブラリは、下に使用しています 順番にかなりの時間のためのフード ユーザーからの入力を取得します。 例えば、私はCS50に上に移動する場合 アプライアンスここで、私が開くう scanf関数-0.cと呼ばれています例えば今日 そしてそれは超簡単です。 それはちょうど、数行のコードです。 しかし、それは示して実際にどの場合、getInt 今回のすべてを取り組んできました。 ここで、このプログラムでは、16行目で 、私はint型を宣言することに気づく。 無ポインタ、魔法の何がそう そこには、単にint型。 次に17行目では、私が促す 数のユーザーが、お願いします。 その後、後半18で、私はここでscanf関数を使用しています。 そして私は、一種のprintfのように、指定された 私は引用符を期待していることに パーセント私を引用終わり。 パーセントのIだから、もちろん、 int型を表す。 しかし、何番目に気付く scanf関数の引数です。 どのように秒を説明しますか カンマの後の引数? それは何ですか? それはxのアドレスです。 により提供するため、だから、これは便利です Xのアドレスをscanfのか、何をしない 行うために、その機能に力を与えるのか? だけではなく、そこに行くだけでなく、何をする? それに変更を加える。 あなたがそこに行くことができますので、ソートのだ メモリ内の場所への地図のよう。 そして限り、あなたが提供するようにscanf関数、または このようなマップを持つ任意の関数は、その この関数は、そこに行く、とすることができますだけでなく、 値を見て、それはまたできます 場合に便利です、その値を変更 scanf関数の人生の目的は、ある 具体的には、ユーザからの入力をスキャンする キーボードから。 fは同じように、フォーマットされた意味 printfは、fはフォーマットさを示し 印刷したい文字列を指定します。 要するにだから、このライン18は単に言う、 ユーザーのからint型を読み取ろう キーボードとのでは、xの中にそれを保存 xが住んでたまたま何アドレス。 そして最後に、19行目がちょうど言う、 この場合はint型のおかげで、。 だから私は先に行くと、これを作ってみましょう。 だからscanf関数0を加える。 私が先に行くと、ズームインしましょう 私は一緒に行くと、これを実行することになるでしょう ドットはscanf関数は0をスラッシュ。 数は、してください? 50。 50ありがとうございました。 だから、それはかなり簡単です。 今では何をしていないですか? これは、全体の束をやっていない エラーチェックの。 例えば、私が協力しない場合、 と私は、番号を入力しませんが、 代わりに私は、 "こんにちは"のような何かを書く それはただ奇妙なのようなものだ。 物事のそして1 CS50 ライブラリには、いくつかのために私たちのために行ってきた 時間はその何回でもプロンプトが再表示され と再プロンプト。 リトライフレーズリコールは、cs50.cにあった それはその場合、getIntで理由です CS50ライブラリは実際に全体です 長い行の束、私たちがしているので、 このような愚かなものをチェックする。 ユーザーは与えていない 私たちは、実際には、int型? 彼または彼女は私たちに何かを与えるでした アルファベットのような? もしそうであれば、我々は検出したい そのと彼らに叫ぶ。 しかし、物事はもっと面白く この次の例である。 私はscanf関数-1.Cに行けば、何が一つです 根本的に変更されるもの この次の例では? 私は、もちろん、char *型を使用しています intの代わりに。 だから、これは、char *のため、興味深いです リコールは、本当にただです 文字列と同じもの。 だから、それは多分、これがスーパーですように感じる GetStringメソッドの簡単な実装。 しかし、私はレイヤーを後ろむいた CS50ライブラリの、私はそう 今、このchar *型を呼び出す。 それでは見てみましょうどこで、どこでもあれば、 我々は間違って行く。 17行目 - 私は再び、私に何かを記入してください、と言う この場合、文字列を指定します。 そして、次の行に、私は、scanf関数を呼び出す 再度、それをフォーマットコードを与える しかし今回は、パーセントの。 そして今回、私がよ それにバッファを与える。 今、私が使用していないよ、気付く アンパサンド。 しかし、なぜ、それはここでOKでしょうか? 既にバッファは何ですので? 既にポインタだ。 それはすでにアドレスです。 としましょう​​、この言葉が私を聞かせて、 "混同"だ だけのために、例えば、それの呼び出し シンプル。 しかし、私はそれがであるためバッファと呼んでいる 一般的には、プログラミングでは、次のものがあれば メモリのチャンク、文字列本当に ただ、あなたはそれバッファ呼ぶ場合がございます。 これは、情報を格納する場所である。 ときは、YouTubeのようなものに似て 彼らは、いわば、バッファリングしていること ちょうどそれからビットをダウンロードであることを意味し インターネットとに格納 ローカル配列なので、メモリの局所チャンク 後でなしでそれを見ることができる それはスキップまたはに掛かっ あなたの再生中。 だから問題は、しかしここにあり 私はscanf関数を言っているので、期待してい ユーザから文字列。 ここのアドレスです メモリのチャンク。 そこに、その文字列を入れて。 なぜ、それが与えるバインドされ 私たちは、しかし、トラブル? 何それ? 私は、アクセスさせて頂いております そのメモリの一部? あなたが知っている、私は知らない。 バッファが初期化されているので、 何か? いまいち。 そしてそれは我々が求めてきたものだ そのゴミの価値、 正式な言葉ではない。 それはちょうど私たちが何のビット見当がつかないことを意味し その4バイトの内部です 私はバッファとして割り当てている。 私は、malloc関数と呼ばれていない。 私は間違いなくGetStringメソッドと呼ばれていませんでした。 だから実際に何であるか知っている人 バッファの内側? そして、まだscanf関数を伝えることは盲目的に、そこに行く そして、ユーザが入力したものは何でも置く。 だから、発生する可能性があるもの 我々のコードでは我々はそれを実行した場合? おそらくセグメンテーション。 そうでないかもしれないが、おそらくセグメンテーション。 と私は言ってないかもしれないので、時々 あなたは時々、やる あなたは、セグメンテーション違反を得ることはありません。 時には、あなただけの幸運を得るが、 それにもかかわらずになるだろう 私たちのプログラムのバグ。 だから私は先に行くと、これをコンパイルしてみましょう。 私は古い学校のようにするつもりです。 だから打ち鳴らすダッシュ0、scanf関数-1、 scanf関数-1.C、入力します。 おっと、あまりにも古い学校。 見てみましょう。 私はどこに行ったのですか? ああ、char *のバッファ。 ああ、ありがとうございました - [OK]を、保存する - 非常に古い学校。 すべての権利、それは久しぶりです。 だから、僕は後にファイルを保存した その一時を作る 一瞬前に変更してください。 そして今、私はそれをコンパイルしている 手動Clangのと。 そして今、私は先に行くつもりです と入力し、scanf関数-1を実行します。 文字列ください。 私は、を入力します "こんにちは。" そして今、ここではprintfは、率直に言って、どこだ 少し面倒ですができます。 それは実際にはないだろう このケースではセグメンテーション。 printfは少し特殊ですので、 それは、一般的に使用されるので、スーパーだ 本質的にはprintfをやっている 私たちは好意と実現 それが有効なポインタではありません。 私はただ印刷する際に自分自身それを見てみましょう 外であってもヌル括弧内 それは必ずしもではないけれども何 我々自身が期待した。 だから、私たちは本当に簡単に誘導することはできません これでセグメンテーションが、明らかにこの 私が望んでいた動作ではありません。 だから、簡単な解決策は何ですか? まあ、scanf関数-2で、私はあることを提案してみましょう の代わりに実際には割り当て char *型では、私は少し賢くなりましょうについて これは、と私はバッファを割り当ててみましょう 16文字のシーケンスとして。 だから私はいくつかの方法でこれを行うことができます。 私は絶対に、mallocを使用することができます。 しかし、私は週2に戻ることができたとき 私はただの全体の束を必要としてい 文字。 それはちょうど配列だ。 だから私は、代わりにバッファを再定義してみましょう 16文字の配列であることが。 そして今、私はバッファを渡すとき - そしてこれは我々がなかったものです 週2での話 - しかし、あなたは配列として扱うことができます それはアドレスですが。 我々は見てきたように、技術的に、彼らがしている 少し異なる。 あなたはそれを渡した場合でも、scanf関数は気にしません なぜなら配列の名前、何 打ち鳴らすには、私たちのために尽くします本質的に としてその配列の名前を扱う 16バイトの塊のアドレス。 だから、これは良いです。 これは今、私はうまくいけばできることを意味します 次の手順を実行します。 私は一瞬ズームアウトしましょう​​と OKコンパイルscanf関数-2を作るか。 今私はスラッシュscanf関数-2を持ってやってみましょう。 文字列ください。 "こんにちは。"そしてそれ この時間を動作するように見えた。 誰かがシナリオを提案することができます たそれはまだ動作しない可能性があります? うん? 16文字より長いもの。 そして実際に、私たちはすることができます もう少し正確に。 その後長い何か15文字、 本当に我々は心に留めておく必要があるため 私たちは、そのバックスラッシュゼロを必要とすることを 暗黙的に文字列の末尾に、 それはさておきscanf関数は、一般意志である 私たちのための世話をする。 だから私のような何かをやらせる - 時には我々は単にすることができます そのようにそれを残す。 [OK]を、ので、我々は今、誘発された 当社のセグメンテーションフォールト。 なぜですか? 私は15以上に入力しているので 私たちが実際にしたので文字、および 私は実際にそれに触れた記憶 必要はありません。 だからここに解決策は本当に何ですか? まあ、我々は長い文字列を必要とする場合はどうでしょうか。 さて、私たちは多分それ32バイトにする。 まあ、それは十分な長さではない場合はどうでしょうか。 どのように約64バイト? 何が十分な長さではありません、もし? 約128または200バイトの方法は? 何が本当にここでのソリューションです 私たちがわからない場合は一般的なケースで、 ユーザが入力する何が起こっている進める? それは、ただお尻に大きな痛みのようなものだ 正直に言うと、これは、ある理由 CS50ライブラリは、数十ラインを持って 総称して実装するコード 我々はしないような方法で文字列をGetStringメソッド 事前に知っているか ユーザーが入力しようとしている。 具体的には、場合は、振り返る cs50.c二週間前から、次のように表示されます そのGetStringメソッドは、実際にはありません このようにscanf関数を使用しない。 むしろ、それは1つの文字を読む 一度。 そのため約1素晴らしい事 一つの文字を読むことは私たちができることです 常に自分自身を保証 少なくとも一つのcharを持っている。 私はただのcharを宣言してから、取ることができます ただこれらの本当に赤ちゃんのステップ での1つの文字を読んで キーボードからの時間。 そして、何をGetStringメソッドが表示されます ん、それはうち実行されるたびです 、16バイトのメモリを言い、それ用途 malloc関数、またはいとこのそのへ 古いコピーを、より多くのメモリを割り当てる 新しい、次にクロールにメモリ に沿って、1文字ずつ取得する そのからそれを実行したとき メモリの塊、それを捨て、グラブ メモリの大きな塊、古いコピー 新しい、そして繰り返しに。 そしてそれは実際に本当に痛みです のように単純なものを実装する ユーザからの入力を取得。 だからscanf関数を使用することができます。 あなたは他の同様の機能を使用することができます。 や教科書の多くは、オンライン 例は行うが、それらはすべてしている このような問題に対して脆弱。 そして最終的に、セグメンテーション違反なっ 一種の迷惑である。 これは、ユーザのためによくないです。 しかし、最悪の場合には、どういう それは根本的に自分を置く リスクのあるコード? 攻撃のいくつかの種類、潜在的に。 我々はそのような攻撃について話しました - スタックがあふれ。 しかし、一般的には、あなたがに許可している場合 我々が行ったように、バッファをオーバーフローさせ、 ただ書いた数週間前、 スタック上の "こんにちは"よりも、あなた 確かに、潜在的に、引き継ぐことができます コンピュータ、または少なくともそのデータを取得 あなたに属していません。 我々は持っている理由だから要するに、これは それらの補助輪。 しかし、今、我々は、それらを脱いで始める 我々のプログラムは、もはや必要ないので、 ユーザーから必ずしも、入力。 しかし、問題の場合には、6に設定 あなたの入力が巨大から来る 150一部と辞書ファイル 奇数千の言葉。 だから、心配する必要はありません ユーザの任意の入力。 私たちはあなたにいくつかの仮定を与える そのファイルについて。 ポインタやscanf関数の質問 または一般的に、ユーザーの入力? すべての権利なので、1で、その後簡単に見 二週間前から話題を引きずる。 そして、それは、構造体のこの概念であった。 ていないこと - のこの概念 何だった構造体、? 構造体は、私たちのために何をした? 定義 - 申し訳ありません? 変数の型を定義します。 だから一種の。 私たちは、実際には2つのトピックを組み合わせています。 typedefのとそう、私たちができることを思い出してください 同じように、私たち自身の型を宣言する char *型の文字列のような同義語、。 しかし、typedefのと構造体を使用して、我々はできる 本当に私たちの独自のデータ構造を作成します。 例えば、私はgeditのに戻った場合 ここでちょっと、私は先に行く と私は保存​​させ、のような何かを このように、structs.c、のは言わせて 一時的に、私はちょうど行くよ 先に行くと、含まれるように standardio.h、int型メイン無効。 そしてここでは、私が欲しいと仮定 格納するプログラムを書くこと 複数から複数の生徒 例えば家、。 だからregistrarialようなものだ ある種のデータベース。 私は名前の一人の学生を必要とするのであれば、I 、char *の名のように何かをするかもしれません そして私のような何かをやる - 実際に、のはCS50ライブラリを使用してみましょう ちょっとこのようにし 少し単純なので、借りることができます コー​​ドの行数十もの。 そして、ちょうどそれをシンプルに保つてみましょう。 我々は、それが文字列でおこう そして今GetStringメソッド。 だから私は、私が名前を保存したことを今主張 いくつかの学生、との家の 単に変数を使用して、いくつかの学生、 我々がやったように、週1インチ しかし、私は今、支援したいとし 複数の学生。 すべての権利なので、私の本能がやっています 文字列NAME2、GetStringメソッドは、文字列を取得します house2は、GetStringメソッドを取得します。 そして、我々の第三の学生、 NAME3 GetStringメソッドを実行してみましょう。 すべての権利は​​、これがうまくいけば印象的です 愚かなの一種として、あなた、 このプロセスは実際になることがないため 終わろうとして、そしてそれだけに起こっている 私のコードは悪く見えるように と悪化し、悪化。 しかし、我々は週2であまりにこれを解決しました。 当社の比較的きれいな解決策は何だった 我々は、複数の変数を持っていたとき 同じデータすべて関連しているタイプが、 私たちは、この凶悪な混乱をしたくなかった 同じような名前の変数? 我々は、代わりに何をした? だから私は、私はいくつかの場所を聞いたと思います。 私たちは、配列を持っていた。 あなたは、複数のインスタンスをしたい場合 何か、なぜ我々はこのすべてをきれいにしないでください アップとちょうど私を与える、と言う 配列には、名前と呼ばれる? そして今では、ハードコード3みましょう。 そして、私に別の配列を与える 家と呼ばれ、のために私を聞かせて 今ハードコード3。 そして、私は大規模なクリーンアップしました 私が作成した混乱。 さて、私はまだハード3コーディングされ、それでもき 3動的にから来ることができました ユーザー、またはARGVなど。 だから、これはすでにクリーナーです。 しかし、これについては迷惑なんだと、ということです 今、名前は何とかであっても 基本的にリンク 学生の家 - それは本当に私が学生の 表現したい - 私は今、平行な二つの配列を持っている 彼らがしているという意味で、 同じサイズ、名前ブラケット0 住宅ブラケット0〜おそらくマップ と名前ブラケット1マップ 家屋へのブラケット1。 で言い換えれば、その生徒は生活 その家、そのほかの生徒 そのほかの家に住んでいる。 しかし、確かに、これは可能性があります さらにきれいに行わ。 まあ、それは実際には、することができます。 そして、私が先に行くと開いてみましょう structs.hまで、あなたはよ ここでこのアイデアを参照してください。 私はあなたのように、typedefを使ってきたことに注意してください 前に宣言する瞬間に触れた私たちの 独自のデータ型。 しかし、私はまた、この他のキーワードを使用しています 私に新しいを与えると呼ばれる構造体 データ構造。 そして、私は主張する、このデータ構造が起こっている 内二つを持っている それ - nameという文字列、および 家と呼ばれる文字列。 私は与えるつもりだと名前 このデータ構造は、起こっている 学生と呼ばれていました。 私はそれを私が欲しいものを呼び出すことができ、 しかし、これは意味的に作る 私の心の中で私には意味。 だから今、私はより良いバージョンを開く場合 プログラムを私が書き始めた そこに、私が先頭にスクロールしてみましょう。 コー​​ドのいくつかの詳細行があり ここでは、しかし、私を集中させ 1上の瞬間。 私は定数と呼ばれる学生を宣言した とハード今の3コード化。 しかし、今、どのようにきれいに気づく 私のコードは、取得を開始します。 22行目では、私は宣言します 学生の配列。 と学生が明らかであることに気付く 今データ型。 このファイルの先頭にあるため、予告 私はそのヘッダファイルを用意しました 私はちょっと前にプルアップされていること。 そして、そのヘッダファイルは非常に単純に持っていた 学生のこの定義。 だから今、私は自分のカスタムデータを作成しました 型は、C年の作者 前に、事前に考えていなかった。 しかし、問題ありません。 私はそれを自分自身を作ることができる。 だから、これは、学生と呼ばれる配列である そのメンバーの各 学生構造です。 そして、私はそれらの3が欲しい 配列である。 そして今、何が残りを行い このプログラムのでしょうか? 私は少し任意の何かを必要としていた。 だからオンラインで24以降、 私は、0〜3の反復。 私はその後をユーザーに尋ねる 学生の名前。 そして私は前と同じようにGetStringメソッドを使用します。 それから私は、生徒の家を求める と私は以前のようにGetStringメソッドを使用しています。 しかし予告 - ちょっと新しい 構文のピース - 私は、i番目の生徒へのインデックスまだすることができ、 しかし、私は、特定のデータをどのように入手できますか 構造体の内部のフィールド? まあ、明らかに何 新しい構文の一部? それはちょうどドット演算子です。 私たちは本当にこの前に見ていませんでした。 あなたがした場合は、PSET 5でそれを見てきました ビットマップファイルをすでに潜っ。 しかし、ドットはちょうどこの内部の意味 構造体または複数のフィールドには、ドットを与える 名前、または私にドットの家を与える。 構造体の中に入ることを意味する そしてそれらの特定のフィールドを取得します。 このプログラムの他の部分は何をしますか? それは、そのセクシーなすべてではない。 私は再び0から3までの反復ことに注意してください、 と私は単純に英語を作成 そうとそうのようなフレーズは、このようになっていると からドット名前を渡すような家、 i番目の生徒とその 家だけでなく、。 そして最後に、今、私たちは、取得することから始めましょう 今我々がしていることをこのことについて肛門、 何mallocと精通 他の機能がされている すべてのこの時間をやって。 なぜ、私は両方の名前を解放しなければならないの にもかかわらず、私は、家、 malloc関数を呼び出していませんでした? GetStringメソッドはなかった。 そして、それはのために汚い小さな秘密だった 数週間が、GetStringメソッド持って 上のすべてのメモリをリークされて これまですべての学期を配置。 とvalgrandはついに意志 私たちにこれを明らかにする。 しかし、私は知っているので、それは大したことではありません 私は単に名前を解放することができます と家、しかし技術的には、へ スーパー、超安全で、私は次のようになります ここにいくつかのエラーチェックを行う。 あなたの本能はあなたに何を言っている? 私は何をチェックすべきである 私が何か解放する前に 文字列、char *の別名? 私は本当に学生かどうかをチェックすべきである ブラケットiのドット名にはありません 等しいヌル。 それは先に、自由に行きOKだろう そのポインタ、および同じまたは他の 同様に1。 学生ブラケット私ドット家がされていない場合 ヌルに等しい、これは今では保護されます でコーナーケースに対して GetStringメソッドがnullのようなものを返します。 そして、私たちはprintfの意志、一瞬前に見た ただ言ってここで私たちを守る 奇妙に見​​えるとしているヌル、。 しかし、少なくともそれは、セグメンテーション違反はありません 我々は見てきたように。 まあ、私はここでもう一つのことを行うことができます。 構造-0愚かなプログラムの一種である 私はその後、このすべてのデータを入力し、ため プログラムが終了したら、それは失われている。 しかし、私が先に行くと、これを行うことができます。 私はターミナルを作ってみましょう 少し大きめの窓。 その、私は構造体A-1を作ろう この新バージョンである。 私は少しにズームインします。 そして今、私はドットを実行してみましょう 構造体A-1を大幅に削減。 学生の名前 - デビッド·メイザー、ロブカークランドをしてみましょう、 ローレンLeverettをしてみましょう。 面白いのは、今では予告です - そして私はこのことを知っているので、 私はプログラムを書いた - ファイルには、私の現在の今そこ students.csvというディレクトリ。 皆さんの中には見たことがあるかもしれませ 現実の世界では、これらの。 CSVファイルとは何ですか? カンマ区切り値。 それは貧乏人のようなソートのだ Excelファイルのバージョン。 これは、行と列のテーブルだ あなたは、Excelなどのプログラムで開くことができます Mac上または番号。 そして、私はgeditの上でここにこのファイルを開くと、 通知 - と数字は存在しません。 それはちょうど言ってgeditのだ 私行番号。 これの最初の行に注目してください ファイルには、ダビデとマザーです。 次の行はロブコンマカークランドです。 と三行目はローレンです コンマLeverett。 だから私は何を作成している? 私は今、Cプログラムを書いたこと 効果的にスプレッドシートを生成することができます で開くことができる エクセルのようなプログラム。 すべてではないという説得力のあるデータセットが、 あなたは、はるかに大きな塊を持っている場合 あなたが実際にしたいデータ 操作し、グラフにすると 同じように、これは、おそらく一つです そのデータを作成する方法。 また、CSVを、実際にはスーパー共通です 単純なデータを格納するための - ヤフー·ファイナンス、例えば、あなたが得る場合 彼らのいわゆる経由株価 API、することができます無料サービス 現在のアップに最新の株式を取得 企業のための引用文は、それら 後ろにデータを与える スーパーシンプルなCSV形式。 だから我々はどのようにそれをやったの? さて、このプログラムのほとんどのに気づく ほぼ同じ。 しかし、ここでダウンして気づくのではなく、プリント ライン35上の学生のうち、 以降は、私が保存していると主張している ディスクへの学生なので、ファイルを保存する。 だから私はFILE *を宣言しているに気づく - 今、これはCの異常の一種である 何らかの理由で、ファイルは、すべて大文字です。 これは、ほとんどの他のデータ型のようではありません Cでしかし、これは、組み込みの データ·タイプ、ファイル*。 そして、私は、ファイルへのポインタを宣言しています あなたはそれについて考えることができる方法です。 fopenの開いているファイルを指します。 あなたはどのようなファイルが開くようにしたいですか? 私は意志、そのファイルを開きたい 任意students.csvを呼び出します。 私は私が望むことは何を呼び出すことができます。 そして推測を取る。 第二引数は何を行います fopenのおそらく意味ですか? 右、書き込みのためにW、可能性 読み取りのためにRである。 あなたの場合、追記用あり 行を追加したいとしない 全部を上書きします。 しかし、私はちょうどこのファイルを作成したい かつて、私は引用引用終わりWを使用します。 と私は読んでたからその唯一知っている ドキュメント、またはマニュアルページを参照してください。 ファイルがnullでない場合 - つまり、 何も間違っていない場合 - 私はイテレートう 0〜3の学生。 そして今、何かが気づく ほんの少し異なる ここでは約41行。 これは、printfのではありません。 これは、printfのファイルに対してfprintfのだ。 だから、ファイルに書き込むために起こっている。 どのファイル? そのポインタは、指定した1 最初の引数として。 次に我々は、フォーマット文字列を指定します。 その後、我々は我々が何をしたい文字列を指定 最初パーセントsのプラグイン、および その後、別の変数または 第二パーセントの。 その後、我々はfcloseを使ってファイルを閉じます。 でも、私は以前のようにメモリを解放するよりも、 私はに戻って追加する必要があります ヌルのためのいくつかのチェック。 そして、それはそれだ。 FOPENは、関数fprintf、fcloseを私に与える テキストフ​​ァイルを作成する機能。 さて、あなたは、問題セット5で表示されます 画像が含まれている、あなたが使うことになるでしょう バイナリファイルの代わりに。 しかし、根本的に、考え方は同じですが、 もかかわらず、あなたはよ機能 少し異なっていますを参照してください。 駆け足はそうですが、あなたが得る ファイルのすべての余りに精通I/O-- 入力と出力 - PSET 5と。 とについてのご質問 ここで最初の基本? うん? 何がnull値を解放しようとした場合? 自由は得ていない限り、私は信じている もう少しユーザーフレンドリーな、次のことができます 潜在的にセグメンテーション。 私はしないので、それをnullを渡すと悪いです 自由に信じて、あなたのためにチェックするように気になる それは、潜在的に無駄になるので それがために自分自身を行うための時間の 世界中の人々。 良い質問です、しかし。 そうすべての権利は​​、この種の取得 私たちの興味深いトピックに。 問題セットのテーマ 5人がフォレンジックです。 少なくともそれは部分 問題セット。 フォレンジックは一般を指し 可能性や情報の回復 削除されていない可能性があります 意図的に。 そして、私はあなたに迅速を与えるだろうと思って 本当に何が起こっているの味 下に、この時間 お使いのコンピュータのボンネット。 例えば、あなたがあなたの内側に持っている場合 ラップトップまたはデスクトップコンピュータ ハードドライブは、それはどちらか、機械的だ 実際にスピンデバイス - プラッタと呼ばれる円形のものがあり 非常にどのように見えるかI ただけれども、ここで画面上に持っていた これはますます古い学校です。 これは、3つの半インチである ハードドライブ。 三半インチの指し あなたがそれをインストールするものの持つ コンピュータである。 今、あなたのラップトップで君たちの多くは ソリッドステートドライブ、又はSSDを有する どの可動部品を持たない。 彼らは、RAMのようなより少ないようにしている これらの機械装置。 しかし、アイデアは、まだ同じです 確かに彼らが関係するように 問題は、5を設定します。 そして、あなたは、ハードドライブ今考えてみれば サークルであることを表し、その 私はここで、このように描画します。 あなたのコンピュータ上のファイルを作成するときは、 それはSSDだかどうか、または内 この場合は、古い学校のハードディスクドライブ、 そのファイルには、複数のビットを含む。 それはこの0と1だと言うてみましょう 0と1の全体の束。 だから、これは私の全体のハードドライブです。 これは明らかにかなり大きなファイルです。 そしてそれはその時点で0と1を使用しています 物理プラッタの一部。 まあ、その物理的な部分は何ですか? まあ、それは、ハードドライブ上にあることが判明 このタイプの少なくともあり これらの小さな小さな磁性粒子。 そして、彼らは本質的に北とを持っている それらへの南極ので、もしあなた これらの磁性粒子のいずれかを回す この方法では、あなたはそれがだと言うかもしれません 1を表す。 そしてそれは逆さまに南だ場合 北、あなたはそれがだと言うかもしれません 0を表す。 だから、現実の物理的な世界で、そのう あなたは、で何かを表現することができる方法 バイナリ0の状態と1。 だから、すべてのファイルがあるのです。 磁気の全体の束があります 彼らのこのようかの粒子 この方法で、パターンを作成 0と1の。 しかし、それは、あなたがファイルを保存するときに判明 一部の情報が別々に保存されます。 だから、これは、小さなテーブルである ディレクトリには、いわば。 と私は、この列名を呼ぶと、よ 私は、このコラムの場所を呼ぶことにします。 と私は考えます、と言うつもりです これは私の履歴書です。 私resume.docはに格納され 場所、123を言ってみましょう。 私はいつも、その番号のために行く。 しかし、単に好きなことを言えば十分 RAMには、ハードドライブを取ることができます それはギガバイトまたは200ギガバイトだ またはテラバイト、とのことができます 数バイトのすべて。 あなたは、8ビットのすべてのチャンクに番号をすることができます。 だから私たちはこのことを言うよ 場所123です。 だから、私のオペレーティングシステムの、このディレクトリの中 システムは、私のことを覚えている 履歴書は、位置123にあります。 しかし、それはときに面白い あなたは、ファイルを削除します。 例えばそう - そしてありがたいことに、世界のほとんどは持って この上にキャッチ - 何が起こる お使いのMac OSのファイルをゴミ箱にドラッグする か、Windowsのごみ箱? ことを行う目的は何ですか? それは、ファイルを取り除くためには明らかだ しかし、何をドラッグする行為は行い、 あなたのゴミ箱かに落下 ごみ箱には、コンピュータ上で行う? 本当に絶対に何も、。 それだけでフォルダのようなものだ。 それは確かであるためには、特別なフォルダです。 しかし、それは実際にファイルを削除しますか? いや、まあ、あなたのいくつかは、おそらく いまいましいああ、あなたはしなかった、のようになっている それを行うことを意味します。 だから、ダブルクリック ゴミ箱やごみ箱。 あなたの周りつついてきた、あなたは回復してきた それをドラッグしてファイル そこの外。 だから明らかに、それは必ずしもありません それを削除する。 [OK]を、あなたは賢くそれよりもだ。 あなたが知っているだけにそれをドラッグする ゴミ箱やごみ箱という意味ではありません あなたはゴミ箱を空にしている。 だから、メニューに上がると、あなたが言う ゴミ箱を空にするか、ごみ箱を空に。 次に何が起こる? うん、そうそれはなおさら削除されます。 しかし、起こることすべてはこれです。 コンピュータはどこに忘れてしまった resume.docでした。 しかし、何が明らかに変わっていません 絵の中の? ビットは、私があると主張する0と1 いくつかの物理的な側面のサイト上 ハードウェア。 彼らはまだそこにいる。 それはちょうど、コンピュータが持っているだ 彼らが何であるか忘れてしまった。 だから、それは本質的に解放されているファイルの それらは再利用できるようにビット。 しかし、あなたは、より多くのファイルを作成しないまで およびファイル以上、より多くのファイル意志 確率的に、これらの0と1、 それらの磁性粒子、再取得、 ための逆さままたは右側アップ、 他のファイル、0と1。 だから、時間のこのウィンドウを持っている。 そしてそれは予測可能なのではありません 長さは、本当に。 それはあなたのハードディスクのサイズに依存 ドライブとどのように多くのファイルがあなたが持っていると どのように迅速に新しいものを作る。 しかし、時間のこのウィンドウでは、中にあり そのファイルは完全にまだある 回復可能。 だから、あなたは今までマカフィーのようなプログラムを使用する場合 またはノートンを回復しようとする データは、彼らがやっていることすべてがしようとしています このいわゆるディレクトリに回復する あなたのファイルがあった場所を見つけ出す。 そして、時にはノートンと言うだろう、 ファイルには、93%回復可能です。 まあ、それはどういう意味ですか? ただいくつかの他のファイルことを意味します 偶然、と言う、使用して終了 元のファイルのうち、それらのビット。 だから、実際に関与しているのか データを回復するに? さて、あなたはのようなものを持っていない場合 ノートンは、お使いのコンピュータにプリインストール あなたは時々できる最善の外観です 探しているハードドライブ全体で ビットのパターン。 と問題セットのテーマの一つ 5は、あなたが検索されますということです ハードドライブと同等の、法医学 からコンパクトフラッシュカードの画像 デジタルカメラ、0を捜し その通常と1、高いと 確率、表す JPEG画像の開始。 そして君たちはによってそれらのイメージを回復することができます 私はこのパターンを見れば、仮定 法医学画像上のビットと 高い確率で、マーク JPEGの開始。 そして、私は再び同じパターンを見れば、 それはおそらくの開始をマーク 別のJPEG、および他の JPEG、および他のJPEG。 そして、これは、典型的にはどのように データ復旧は動作します。 何JPEGファイルについての素晴らしいのは、にもかかわらずです ファイルフォーマット自体は多少ある すべてのそのような複雑な、初め ファイルは、実際にはかなり識別可能である あなたが見るように、シンプルで、 あなたは既にいないしている場合。 それでは、下に詳しく見てみましょう てきているかを正確にとしてボンネット 起こって、そしてこれらの0と1のか あなたのもう少しを与えることであり、 この特定の課題のコンテキスト。 [ビデオの再生] あなたのPCはほとんどの店 - どこ その永続的なデータを。 そのために、データはRAMから移動 教えソフトウェア信号とともに どのようにデータを保存するためにハードディスク·ドライブ。 ハードドライブ回路は変換 電圧に変換し、これらの信号 変動。 これらは、順番に、ハードドライブのを制御する 可動部品、少数の一部 に残された可動部品 現代のコンピュータ。 信号の一部は、モータを制御する どの金属被覆プラッタを回転させる。 あなたのデータが実際に格納されている これらのプラッタ上。 他の信号は、読み出し/書き込み移動 読み取りまたはヘッド プラッタ上のデータを書き込む。 人間、この機械はとても精密な 髪があっても間を渡すことができませんでした ヘッド、スピニングプラッタ。 しかし、それはすべて素晴らしい速度で動作します。 [ENDビデオ再生] DAVIDマラン:少しでズーム 深い今何時 実際にそれらのプラッタ上。 [ビデオの再生] まさに我々を見てみましょう - スローモーションで見ました。 電気の短いパルスである場合 反転している場合、読み取り/書き込みヘッドへ送ら のための小さい電磁上 ほんの一瞬。 磁石はどのフィールドを作成 小さな、小さなの極性を変更し 金属粒子の一部は コー​​ト各プラッタ表面を。 これらの小さなのパターンシリーズ、 ディスク上の帯電アップ領域 の単一ビットを表す 進数のデータ コンピュータによって使用されるシステム。 ここで、電流が一方向に送信された場合 読み出し/書き込みヘッドを、地域を通じ 一方向に偏光される。 電流に送信された場合 反対方向、 分極が反転する。 あなたは、ハードディスクからデータを取得する方法は? ただ、プロセスを逆に実行します。 だから、ディスク上の粒子です の電流を得ること 頭が動いて読み取り/書き込み。 これらの何百万人をまとめる 磁化されたセグメント、および このファイルを持っている。 さて、単一のファイルの断片月 すべてのドライブのに散在する 混乱のような種類の大皿、 あなたの机の上の書類の。 だから特別な余分なファイルが追跡し すべてのものがどこにあるの。 あなたが持っていたくない そのような何か? [ENDビデオ再生] DAVIDマラン:OK、おそらくありません。 それでは、どのように多くの人 これらで育った? [OK]を、ので、それは少なくなります 手毎年。 しかし、私はあなたが、少なくとも、慣れてくれてうれしい 彼らと、このために私たち自身の 本デモでは、悲しいことに、非常に死んでいる 馴染みのここで死を遅らせる。 しかし、これはどのような私は、少なくとも、後ろにある 高校、バックアップに使用使用。 そして、それは驚くべきものだった、なぜならあなた に1.4メガバイトを格納することができ この特定のディスク。 そして、これは、高密度であったバージョン HD有し、によって示されるように 今日のHDビデオの前に意味。 標準密度は800キロバイトだった。 とその前に、そこにあった 400キロバイトのディスク。 とその前に、5と1/4があった 本当にフロッピーだっインチディスク、 と少し広いと背 ここではこれらの事より。 しかし、あなたは実際に、いわゆる見ることができます これらのディスクのフロッピー側面。 そして機能的に、彼らは実際にしている でのハードドライブにかなり似て 少なくともこのタイプ。 繰り返しになりますが、新しいコンピュータでSSDを 少し異なる動作します。 しかし、あなたはその小さな金属製のタブを移動した場合、 実際には、少しのクッキーを見ることができます または大皿。 それは、このような金属ではありません。 こちらは、実際にいくつかの安価だ プラスチック材料。 そして、あなたは小刻みに動くの種類、それをすることができます。 そして、あなたはtrully単にいくつかを拭き取った ビット又は磁性粒子の数 このディスクから。 だからありがたい、その上には何もありません。 そのことが邪魔になら - とカバー あなたの目とあなたの隣人のもの - あなただけの種類のこれを引っ張ることができる そのような全体のシースオフ。 しかし、少しバネがあり、そうである あなたの目でその意識。 だから今は本当にフロッピーディスクを持っている。 そして、これについて注目すべき何 これはそのまま、それは同じくらいである 大きいの小規模な表現 ハードドライブは、これらの事は、スーパーです 超簡単。 あなたは今、それの底をつまむ場合は、その 金属製のものはオフだし、皮 彼らは開く、そこにあるすべてが二枚ある 感じ、いわゆるフロッピーディスク 内側に金属片と。 との半分はそこに行く 私のディスクの内容。 それらの別の半分はそこに行く。 しかし、それは内側に回転したことすべてです 往年におけるコンピュータの。 そして再び、大局的にこれを置くためには、 あなたのほとんどは、どのように大きなです ハードは、これらの日ドライブ? 500ギガバイト、テラバイト、多分に デスクトップコンピュータ、2テラバイト、3 テラバイト、4テラバイト、右? これは、与えるか、または取る、1メガバイトです でも典型的なMP3に適合しないことができ もはや、これらの日、またはいくつかの 類似した音楽ファイル。 だから、少しのあなたのためのお土産今日、と また何を文脈に役立つ 私たちは当たり前の取ることでしょう 今問題に5を設定します。 だから、それらは維持するためにあなたのものとなります。 だからされる場所に私は移行せ 同様に次のPSETを費やす。 だから我々は、今のところこのページを設定している - ああ、 すぐに発表のカップル。 ご希望の場合は今週の金曜日、CS50に参加 昼食のために、いつもの場所に移動し、 cs50.net/rsvp。 そして最終的なプロジェクト - そうシラバスあたり、我々が投稿されました すでに最終的なプロジェクトの仕様。 それが意味するものではないことを認識 それは特に、すぐに原因です。 それは、単に取得するには、実際には、掲載されている 君たちはそれについて考える。 そして実際、超重要 あなたの割合が取り組むれる 材料の最終プロジェクト我々 でもクラスでにもらっていない、 しかし来週早けれう。 specはを求めていることに注意してください、しかし、 いくつかの異なるコンポーネント 最終的なプロジェクト。 最初は、数週間であり、 プレ提案にかなりカジュアルなメール あなたの彼に言うにTFか何をしている で、あなたのプロジェクトのために考える 確約はありません。 提案は、特定されます コミットメントは、と言って、ここで、これは何ですか 私は自分のプロジェクトのためにやりたい。 どう思う? 大きすぎる? 小さすぎる? それは扱いやすいでしょうか? そして、あなたはそれ以上の詳細については、仕様を参照してください。 ステータスですその後数週間 同様にある報告書、 どれだけ言ってもあなたのTFにカジュアルメール ずっとあなたが最終的にあるの背後に 続いて、プロジェクトの実施、 CS50ハッカソンみんなに からのイベントになるだろう、これ招待され 7時00分まで一晩で午後8時 翌朝午前。 私は週に言及した可能性があるのでピザ、 ゼロ、ウィル午後9で提供される、 1:00中華料理はAM。 そして、あなたは5時にまだ目を覚ましている場合は、AM、 私たちは朝食のためにIHOPに連れて行きます。 ハッカソンは、より多くの一つですので、 クラスの思い出に残る体験を。 その後、実装が原因であり、 その後クライマックスCS50フェア。 これらのすべての詳細 週間で来ています。 しかしみましょう何かに戻る 古い学校 - 再び、配列。 それが解決するので、それで配列が、よかったよ 我々のような問題は、ちょうど見た 学生の構造を持つ前に瞬間 コントロールの少し外を取得した場合、私たち 、生徒1、生徒2を持ちたい 学生3、学生ドットドットドット、 学生のいくつかの任意の数。 だから配列は、数週間前に急襲 とではない私たちのすべての問題を解決しました いかに多くのことを事前に知っている 私たちが望むかもしれないいくつかのタイプの。 そして我々は、構造体が私たちを助けることができることを見てきました さらに我々のコードを整理し続ける のような概念的に類似した変数は、 名前、家、一緒に、そのように我々 内部に1つのエンティティとして扱うことができます そのうちの小さな部分があります。 しかし、配列はいくつかの欠点を持っている。 欠点のいくつかは何ですか 我々は遭遇した 配列でこれまで? 何それ? 固定サイズ - そうであってもあなたがかもしれないが 用のメモリを割り当てることができる 配列には、かつてあなたが知っているどのように多くの学生が あなたが持っているどのように多くの文字が、持っている ユーザから、一度割り当てられた 配列には、どのような種類の塗装しました 自分のコーナーへ。 あなたは、新しい要素を挿入することはできませんので、 配列の真ん中に。 あなたがより多くの要素を挿入することはできません 配列の末尾に。 本当に、あなたの作成に頼らなければならない 私たちが議論してきたように、全く新しい配列、 新たに古いのコピー。 そして再び、それは頭痛の種である あなたのために情報をGetStringメソッド。 しかし、再び、あなたも挿入することはできません 配列の真ん中に何か レートが完全に満たされていない場合。 たとえば、この配列であれば、ここでサイズの 6は、その中に5つのものを持っている さて、あなたは単にタックできた 末尾に何か。 しかし、あなたが何かを挿入したい場合 の真ん中に 配列は、それが持っている場合でも その中の6物事のうち、5? まあ、我々は、我々はすべてを持っていたとき何をした 私たち人間のボランティアのステージ上で 過去数週間? 我々はここで誰かを入れたいと思った場合は、どちらか これらの人々はどのようにこれを移動する 方法、またはこれを移動する方法をこれらの人々 方法、そして高価になりました。 内部の人のシフト 配列には、加算と原価計算終了 当方故に時間、私たちの多くのN乗 挿入ソートのように時間を実行して、用 最悪の場合には、インスタンス、。 だから、配列は素晴らしいですが、あなたはする必要があります あなたがそれらをしたいどのように大きな事前に知っている。 だからOK、ここでは、ソリューションです。 私が事前にわからない場合はどのように多くの 私が持っているかもしれない、と私は、一度知っている学生 私が決める、しかし、私はそれにこだわっている 私はいつもしない理由の多くの学生が、 倍の多くのスペースを割り当てる 私は必要だと思うかもしれないとして? それが合理的な解決策はありませんか? 現実的に、私たちがしていることはないと思う 50以上のスロットが必要になるだろ 中型クラスの配列で、 これだけ切り上げてみましょう。 私はちょうど、私の配列に100スロットを作ってあげる 我々は間違いなく得ることができるよう 私が期待する学生数 いくつかの中規模クラスになる。 なぜただ切り上げと割り当てられない アレイの一般的に多くのメモリ、、 あなたがあっても必要とするかもしれないと思うよりも、? この単純なプッシュは何です そのアイデアに? あなただけのメモリを無駄にしています。 あなたがして書き、文字通りすべてのプログラム 多分二倍のメモリとして使用しています あなたが実際に必要とする。 そして、それはただのような気がしない 特に洗練されたソリューション。 また、それだけで減少 問題の確率。 あなたは、人気のコースを持ってしまった場合 1学期、あなたは101を持っている 学生は、あなたのプログラムが残っている 根本的に同じ問題に直面して。 だからありがたい、解決策はあり フォーム内の​​この広告は、すべて私たちの問題 次のデータ構造 ものよりも複雑 我々はこれまで見てきました。 これは、私が主張し、リンクされたリストです。 これは数値のリストです - 9、17、22、26、および34 - ところで一緒にリンクされていること 何で私が矢印で描かれてきました。 言い換えれば、私が表現したい場合 アレイは、私が行うことができます このような何か。 そして、私はオーバーヘッドでこれを出してあげる ほんの一瞬である。 私が行うことができます - こんにちは、大丈夫。 スタンバイ。 ここで新しいコンピュータ、明確な - わかりました。 だから私は、配列にこれらの番号を持っている場合 - 9、17、22、26、24 - スケーリングするとは限らない。 すべての権利なので、ここに私の配列です - オーマイゴッド。 すべての権利なので、ここに私の配列です。 なんてこった。 [笑い] DAVIDマラン:ふりをする。 それは戻ってあまりにも多くの努力だ とそうそこ、それを修正 - 26。 だから私たちは、この配列を持っている 9、17、22、26、および34。 あなたのそれらのために見ることができます 恥ずかしい間違い私はただ作った そこにそれがある。 だから私は、これがあると主張 非常に効率的なソリューション。 私はできるだけ多くの整数として割り当てた 私が必要とする - 一、二、三、 四、五、または6 - そして私は、番号を保存しました この配列の内部。 しかし仮定し、その後、私が挿入したい 8番のような値はありますか? まあ、それはどこに行くのでしょうか? 私が挿入したいとしましょう 20のような数字。 まあ、それはどこに行くのでしょうか? どこか途中で、 または番号35は、行かなければならない どこかで終わりに。 しかし、私はすべての領域外だ。 そして、これは基本的な課題である ソリューションですん配列の。 私がGetStringメソッド、一瞬前に主張した この問題を解決します。 あなたは、第六番号を挿入する場合 この配列に、少なくとも一つのものです ソリューションあなたは、確かに頼ることができます ただ私たちは、GetStringメソッドで行うように? 何それ? まあ、それは大きくされていることを確認 言うは易し、行うは難たし。 我々は必然的に配列を作ることができない 大きく、しかし、我々は何ができますか? サイズの大きいです新しい配列を作る 多分6、サイズ10、我々はしたい場合 先んじて物事の取得し、コピーする 古い新しいに配列し、次に 古い配列を解放する。 しかし、実行時間は何ですか 今、そのプロセスの? これは、n個のビッグOだからコピー あなたにいくつかの単位の費用としている 我々がしなければならない場合、時間、まあまあ理想的ではありません 起こっている新しい配列を割り当て、 二倍消費する 一時的にメモリ。 新たに古いコピー - 私が意味する、それだけで頭痛、だた 、再び、なぜ我々は書いている あなたにGetStringメソッド。 だから私たちは、代わりに何をするのでしょうか? さて、どのような場合は、当社のデータ構造 実際のギャップを持っている? 私が持っていることの私の目標を緩和したとし メモリの連続チャンク、どこ9 である17、すぐ隣です 右22の隣に、というように。 と9がここで終わることができると仮定 RAM、および17は、RAMにこっちにすることができます 及び22は、RAMにこっちにすることができます。 言い換えれば、私はそれらを必要としない でももう背中合わせに。 私はちょうど何とか針に糸を通すように持っている これらの数字のそれぞれ、または各を通じて これらのノードの、として我々は呼ぶことにします 私は、それらを集めてきたように長方形 最後に取得する方法を覚えている 最初からそのようなノード。 だからプログラミングコンストラクトものです 私たちは、ごく最近見てきたと私は そのスレッドを実装する、またはすることができます 私はことのできる、ここに描かれた これらの矢印を実装する? だからポインタ、右? 私だけではない割り当てる場合 int型が、ノード - とによって ノードには、私はちょうどコンテナを意味する。 視覚的に、私は長方形を意味します。 ノードには、明らかに必要であるので、 - 2つの値を格納する int型自体が、その後は、などによって暗示 四角形の下半分、 int型のための十分なスペース。 だから、ここで先に考える このノードは、この、どの大きさ 問題のコンテナ? int型のためにどのように多くのバイト? おそらく4、それがあれば いつもと同じ。 そして、どのように多くのバイト ポインタ? 4。 だからこのコンテナ、またはこのノードが、ある 8バイトの構造体になるだろう。 ああ、それは幸せな偶然だ 我々だけでは、この概念を導入しました 構造体、またはC構造。 だから私は、私が一歩を踏み出すために必要と主張している これより洗練された方へ 数のリストの実装 数値のリンクリスト、私が行う必要があります もう少しアップフロント思考と だけではなく、int型ですが、構造体を宣言する 私が呼ぶだろうことは、従来 ここで、ノード。 我々はそれを私たちが欲しいものを呼び出すこともできますが、 ノードには、たくさんのテーマになるだろう 我々は今を見て始めるものの。 そのノードの内部のデータ型はint nです。 そしてこの構文は、少し 一見奇妙な - 構造ノード*次。 まあ画像で、それは何ですか? それはの下半分です。 我々が見た長方形 ちょっと前に。 しかし、なぜ私は、*構造のノードを言っている と同じノード*に反対? そのポインタが指している場合があるため 別のノードでは、それだけだ ノードのアドレス。 私たちがしたものと一致だね これまでポインタについて議論した。 私が主張した場合しかし、なぜ、この構造は ノードと呼ばれ、私は構造体を言わなければならない ここで内部ノード? まさに。 これは、Cの愚かな現実のようなものだ typedefのは、いわば、ではないがある まだ起こった。 Cは超リテラルです。 それはあなたのコードの先頭に読み込む 右へ左下、。 そして、それは上のそのセミコロンを打つまで 一番下の行ではなく、何をするかと思います データ型として存在? ノード、引用引用終わりノード。 しかし、ために、より詳細に 宣言私は、最初の行にしました - ます。typedef structノード - その前に、最初に来たので 中括弧のようなものだ つまり、あらかじめ教育Clangの 何を知っている、私に構造を与える 構造ノードと呼ば。 率直に言って、私は物事を呼び出して好きではありません 構造ノード、構造ノードすべて 私のコード全体。 しかし、私は唯一の、すぐ内側、一度それを使用します ように私は効果的にすることができます 、循環参照のようなものをしない作成 それ自体が自分自身へのポインタが、 別の体へのポインタ 同じタイプ。 だから、結局、そのデータ構造に このように、いくつかはあり かもしれない操作 私たちに興味のある。 私たちは、挿入したい場合があり このようなリストに変換します。 我々は削除する場合があります このようなリストから。 我々のためにリストを検索したい場合があり 値、またはより一般的には、トラバース。 とトラバースはただの空想の方法です 左から開始し、すべてを動かすと言って 右への道。 でも、これで、予告、もう少し 洗練されたデータ構造は、割り当て 私は、我々はいくつかのを借りることができることを提案 過去二週間のアイデアと、 という関数を実装する このような検索。 これは、またはtrueを返すために起こっている 、偽を示す、yesまたは いや、nがリストに含まれている。 その二番目の引数はポインタである リスト自体に、そう ノードへのポインタ。 私は次に何をするつもりだすべてが宣言され 一時変数。 我々は、慣例によりそれPTRと呼ぶことにします ポインタ。 そして、私はと等しく割り当てる リストの先頭。 そして今、whileループに気づく。 だから長いポインタが等しくないとして nullに、私がチェックするつもりです。 あるポインタ矢印nに等しい 渡されたnの? とちょっと待って - 新しい 構文の一部。 矢印が突然何ですか? うん? まさに。 だから一方で、数分前に、我々は、使用される 何かにアクセスするためのドット記法 構造体の内部に、変数であれば あなたは、構造体ではないた そのものではなく、構造体へのポインタ、 ありがたいことに、構文の一部その ついに直感的理にかなっています。 矢印は、ポインタに追従する手段 我々の矢印は、一般的に意味のように 画像で、とで行く データフィールドの内部。 だから矢印はドットと同じものですが、 ポインタを持っているとき、あなたはそれを使用する。 だから、次に要約する場合、n個のフィールド ポインタと呼ばれる構造体の内部に nは等しい等しく、trueを返します。 ここではそれ以外の場合は、この行 - ポインタ 次のポインタに等しい。 だから、これが何をしているか、通知がある場合、I 現在の構造体を指しています 9、および9を含有する数ではありません 私が探しています - 私が探していたとし nは、50に等しい - 私は一時的なポインタを更新するつもりです このノードで指していないため もうが、どのポインタ矢印の隣、 ここに私を置くために起こっている。 今、私は旋風で実現 紹介。 水曜日に、我々は実際にこれをやる いくつかの人間とし、いくつかの詳細と 遅いペースでコード。 しかし、実現する、我々は今我々のデータを作っている 構造は、より複雑なように私たちの アルゴリズムがより効率的に得ることができ、その のために必要になるだろう PSET 6、我々は再び、でロードすると、それらの 15万言葉が、そうする必要があります 効率的に、理想的には、作成 我々のユーザーではないために実行するプログラム 乗が、中のnの線形ではなく、 理想的に時定数、。 私たちは、水曜日にお会いしましょう​​。 SPEAKER:次回のCS50、デービッドで 彼のベースケースを忘れた。 DAVIDマラン:そして、それはあなたが送る方法です 何Cとテキストメッセージ - [さまざまなテキストメッセージ 通知はSOUNDS]