Tip:
Highlight text to annotate it
X
>> 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]