[Powered by Google Translate] セクションの問題セット2:ハッカー版 ロブボーデン、ハーバード大学 これはCS50です。 CS50.TV だから、私はロブだ。私はカークランドの先輩だ。これはCS50をTFing 3年目です。 それは、我々は伝統的な講義形式のセクションから変化しているのは初めてのことである 講義の中で起こった、その後皆さんが質問を何件どこ我々はちょうど一種、 今我々は空白を使ってどこで、より多くの問題がベースであることに、そして - ああ、だからアイデアは私が送ったそのリンクへ行くことであると、あなたは私のスペースになるでしょう。 誰もがラップトップを持っていないのですか?オーケー。 だから我々はこれを使用することになるだろう、と我々はセクションに住んで問題をやっているつもりだ そしてそれらの議論と何が悪いかを考え出す と私はあなたのコードの一部を引き上げるかもしれない、と私はあなたのアイデアを議論することがあります。 だから誰も苦労しました? あなたが側にチャットすることができ、我々はそれには理由があるでしょうかどうかは分からない。 あなたは、そのクラスにいた場合、今、前のスーパーセクションと同様に、あなたはそれが約何を知っています。 Pのすべての上では、これらのセクションがあるように起こっているのが設定されます。 だからP-SET 2、仕様は、私はあなたが既にP-SET 1でそれを見たと思います。 しかし、我々は我々が今日上に行くことになるだろう何のために、P-2セットを見ることができます。 そして、あなたが質問のセクションが表示されます。 だから、これは、P-セットのすべてになります。質問のセクションがあるだろう。 これまでのところ、我々は "この練習する機会を検討してください。"と言ってきた あなたは、このプログラムを提出するよう求められることはありません。 アイデアは、これらの種類のあなたが問題セットを使い始めるための助けになっているということです。 私はハッカー版に推測、それらの多くは、単に学ぶために新しい、面白いものであることになっている。 彼らは、問題セットに直接適用できない場合があります。 そして今、我々はあなたがそれらを送信することが、理論的にはしていない、 後で問題セットのために、あなたはそれらを提出する可能性があり、その結果、あなたはどちらのセクションに来ることができる または答えを得るためにセクションを見たり、あなたは自分自身でそれらを得ることができます あなたは私の存在感を楽しんでように感じていない場合。 だから - 私は、これが最初のものであると思います。 ああ。あなたも、質問のこれらのセクションの下に我々はまた、ショートパンツについての質問をしました。 だから、私が推測する、理論的には、節に来る前に、これらを鑑賞することになっている そうしない場合、それは大丈夫です、我々はとにかくそれらをチェックするでしょう。 だから我々はこれらを起動することができます: "どのようにwhileループはdo-whil​​eループとはどう違うのですか? とき、後者は特に便利ですか? " だから誰もが何かを持っている - ? [学生] do-whil​​eループは常に少なくとも一度は実行されます。 はい。だから、その差である。 whileループ - I'llはちょうどここでそれを行う - ループしながら、我々は条件があります 我々がここで降りるまで、右ここでは、do-whil​​eのに対し、条件を持っていない。 だから、あなたのプログラムが実行、そしてそれは、whileループに到達したときに、 この条件が真であれば、それはすぐにチェックします。 その条件が真でない場合、それだけで完全にループを飛ばします。 do-whil​​eループプログラムが実行されると、それは "何"になる 何もこの時点では起こりません、単に実行を継続します。 条件が真の場合、それが当たったときに "しばらく"は、ループバックがありますし、再びそれを行う と何度も何度も条件が真でないし、ただ通って落ちるまで。 だから、違いは、これは非常に最初からスキップできること、である。 これは、必ずしも一度だけ実行され、条件がまだ本当であるなら複数回実行してもよい。 whileループは一度だけそれを行うことができるようになるので、または - whileループ - 我々は、すべてでそれを行う必要はありません 条件がfalseの場合は、できるだけ早く我々はそれに着いて以来、我々はそれの上で右をスキップします。 do-whil​​eループのに対し、我々は必ずしも、それを1回実行します。 それがtrueまたはfalseの場合、我々は条件に到達したとき、我々は確認してください。 それが本当なら、我々は再びそれをやる、それがfalseであれば、私たちはちょうど行く続けるつもりです。 だからとき、後者は特に役立ちましたか? だから私は、その4年間の全体を、3年間で、何でも、言うことができます 私はプログラミングをしてきたことに、私は10回で、好きで、これを使用している。 我々はdo-whil​​eループを導入しているときに、おそらくそれらの5 CS50にある。 だから、これは、do-whil​​eループをするときに使用しますか? いつです - ええ? [学生]とき、あなたがチェックしたいユーザー入力、または何かを取得しようとしている - うん。だからこれは、do-whil​​e、ユーザー入力の大きな一つであるループ。 なぜ最初のカップルの問題セットでそれは、あなたが好きで、ユーザーに質問したいときには、だ あなたは、その文字列を取得するまで、 "私に文字列を与えて、"あなたは続行できません。 そしてあなたは、必然的に、少なくとも一度文字列を求める必要がある。 しかし、彼らは何か悪いことを答えた場合、その後、あなたは戻ってループする必要があると再び尋ねる。 しかし、ユーザー入力以外の、それは私が事件に遭遇したことは非常に稀だ 私は、 "1回以上"ループにしたいが、多分もっとある。 質問や - ?誰もがdo-whil​​eループ、他の場所で使用していますか? オーケー。だから次は、未宣言の識別子は何 "です ガチャンという音が出力した場合、通常示す? " だから、どのようなコードの私が取得する書き込みでした "宣言されていない識別子ですか? ' [学生]は、x = 2? だから我々はちょうどここでそれを試すことができ、x = 2である。 我々はこれを実行することになるでしょう - ああ、私はそれをクリックしなかった。そこでここでは、取得する - すべての権利。 "宣言されていない識別子xの使用。" だからそれは、未宣言の識別子は、変数です。 それは頻繁に変数識別子と呼ぶことにします。 だから、それが実際に変数の知らないかもしれない、それはそれが何であるかを知りません。 だからそれは識別子です。 では、なぜそれが宣言されていないか?うん。 だから用語、変数の宣言に明確にすること あなたは "int型のx、"または "文字列yを、"何でも言うときです。 変数の初期化、または変数の代入、 あなたが言うたびに、 "X = 2"である。 だから我々は別々のステップでこれらを行うことができますが、int型のx、x = 2、までは - 私たちはここで何かの束を持つことができます - しかし、この行が発生するまで、xがまだ初期化されていますが、それが宣言されています。 それで、我々は明らかに1行でそれを行うことができます、そして、今、私たちは宣言および初期化されています。 質問はありますか? そして最後に、 "なぜ、シーザー暗号は非常に安全ではないですか?" だから最初は、誰でも、シーザー暗号とは何かを言いたいのでしょうか? [学生]シーザー暗号はちょうどあなたがマップされていることです、あなたは、すべての文字をシフト 文字の特定の番号は、上に行くと、上に戻し、そして、それは非常に安全ではないので、 わずか26使用可能なオプションは、だとあなたはちょうどあなたがそれを取得するまで、それらの各1を試してみてそこに。 ああ。だから、私は繰り返す必要がありますか? シーザー暗号、it's - 私はあなたがその問題にそれを扱うことでしょう、という意味 - または私はハッカーのエディションではない問題セットの標準版を推測する。 だから問題セットに標準版では、 "こんにちは、世界"のようなメッセージが出る そして、あなたはまた、6のような番号を持っていて、そのメッセージを受け取り、個々の文字 あなたはアルファベットで6ポジションでそれを回転させます。 だから、 'h'はハローのH-I-J-K-L-M-Nになるだろう。 だから、最初の文字はnになります。我々は電子と同じことを行う。 我々は、のような、zまたは何かを持っているなら、私たちは周りのために戻ってラップ '。' しかし、それぞれの文字がアルファベットで6文字後で入れ直す取得し、それは非常に安全ではありません あなたは、単一の文字をラップすることができますどのように多くの方法のための唯一の26の可能性がありますので。 だから、あなただけの、十分な長さのメッセージを、おそらく、それらのすべての26を試すことができ それらの可能性26のものの1つだけでは、読みやすいものであるために起こっている 読みやすい1は、元のメッセージになるだろう。 だから、まったく何を暗号化するのは非常に良い方法ではありません。 これらのショートパンツとは無関係の、 "機能は何ですか?" だから、機能は何ですか?はい。 [学生]それはあなたが通過し、その後何の戻り値を取得するために呼び出すことができるコードの別々の作品のようだ。 うん。だから私は、また次回に答えることによって、それにお答えします - あるいはまた、単に次のいずれかを答えることによって、繰り返してください。 あなたはただコピーして何度も何度もコードを貼り付けるのではなく、関数を使用することができます。 ただ、そのコードを取るのfuctionに入れて、その後、単に関数を呼び出すことができます どこには、コピー&ペーストされています。 だから機能が便利です。 だから今我々は実際の問題をやる。 最初の1つ。最初のアイデアはあるので、あなたはそれを文字列を渡すとにかかわらず - またはそれはすべて小文字と言っていますか?これは、すべて小文字を言うことはありません。 メッセージは何でもかまいませんので、と - ああ、いや。それはありません。 "簡単にするために、ユーザーが入力小文字とスペースのみと仮定するかもしれません。" だから我々はそれを小文字のみでメッセージを渡し、その後、私たちは交互に 大文字と小文字の間で - 私たちは、文字列が交互に、大文字と小文字になるように変更。 だから前に、私たちは、あなたにも問題に飛び込む第二を与える 私たちが行う必要がある最初のことは何ですか? ああ、私はちょうど上にあるものをクリックしましたか?ああ、私はちょうどここで電子メールをクリックしました。 だから我々は最初にやるべきこと - 私は間違ったもので探しています? これはこの1の部分になるのでしょうか? いいえ、それらは、しかし、そこに残っている。 さて、まだここにいる。 今我々は仮定することはできません - ?はい。ここでは、それが唯一の小文字とスペースだと仮定することはできません。 だから今我々は手紙は、私たちがそれらになりたいものは何でもすることができるという事実に対処する必要があります。 それで、我々は最初にしたいことは、ただメッセージを取得しています。 私たちは、単なる文字列、文字列s = GetStringメソッド、大丈夫を取得する必要があります。 今、この問題は、それを行うためのいくつかの方法があります。 しかし、我々はここでビット演算子を使用したいとしている。 スーパーセクションのどちらかではなかった人々は、そこにある か何か、とビット演算子が何であるか分からないのですか? または、彼らはどのような方法でASCIIにどのように関連するか? [学生]私はスーパーセクションではなかったが、私はビット演算子が何であるかを知っている。 オーケー。それでは、私はそれらの基礎の上に行く必要はありませんが、私は説明しましょう 私たちは、ここで使用するつもりだ。 だから '':資本のバイナリ表現、その数は65です。 私はただ見に行くよ - 41は01000001になるだろう。 だから10進数で65でなければなりません。ので、これは文字資本Aのバイナリ表現である さて、文字のバイナリ表現は '小文字 ほぼ、同じことになるだろう。 6ええ、 - それはです。これは正しいです。 だからバイナリー資本、バイナリ小文字の '。' だからと 'a'はこの単一のビットとの差があることに気づく。 そして、これは、番号32を表すビット、32ビットであることを起こる。 65であるので、それは理にかなっている、 'A'は97です。 両者の差は32です。 だから今我々は、我々が取ることによって 'へ'から変換することができます知っている およびビット単位で、それを論理和(OR) - 1のように見える。 これは0010万とビット単位の論理和(OR)、であり、それが私たちに与えるでしょうに '。' そして、我々はビット単位のAND演算によって 'から得ることができる その場所に付き11、0、11111。 が、この個々のビットを打ち消し、だから、これはその後、 'a'があった正確に何を私たちに授けてくれます ので、我々は01000001があるでしょう、私は右のカウントかどうかは分からない。 しかし、ビット単位の論理和のこの技術は、小文字に資本から取得する およびビット単位は小文字から資金を得るために論理積をとると、Aに排他的ではありません すべての文字、対K、K、Z対Z、 それらのすべては、ただこのシングル·ビットによって異なるとしている。 そしてあなたは、任意の大文字、またはその逆に任意の小文字から変更するには、これを使用することができます。 オーケー。ので、代わりに持っていることの - これから取得する簡単な方法は、そう 何であれ1011111書き出す - この数を表すのに簡単な方法が、これはものではありません ことを私はスーパーセクションに渡ったが、チルダ(〜)は別のビット単位の演算子です。 どういう〜をすることは、ビット表現を見ています。 の任意の数字を見てみましょう。 これは、単にいくつかのバイナリ数であり、〜はないものを、それだけですべてのビットを反転させます。 だからこれは1でしたが、現在0、これは今では0、1、010100です。 だからそれはすべての〜んだ。だから32は数になるだろう - それを取り除く - そう32は数0010万であることを行っているので、この中には〜になるだろう 私は 'をAND演算しているここでは、この番号まで。 誰もがそれを見ていますか?これはあなたが把握したいときのように、かなり一般的です 我々がどうかを確認したいときに我々は、見ているかもしれないもののために後で - あるいは、我々は1を除いてすべてのもの、すべての単一のビットがセットされて欲しい あなたは私たちが設定したくない少しの〜のことをする傾向がある。 だから我々は32ビットがセットされたくないので、我々は32の〜ん。 オーケー。だから我々はここでそれらのすべてを使用することができます。 すべての権利は​​、あなたが完了していないでいるならそれは結構だが、我々はゆっくりと一緒に歩いていくものとし、 またはそう、この上を歩く - これを通じて。この中を歩く。 だから我々は文字列を持って、私たちは、その文字列内の各文字をループしたいし、そこに何かを行います。 では、どのように文字列をループしますか?我々は何を使うべきでしょうか? 私はそれをここでやるつもりはない。うん。 だから、私はイテレータを持っており、彼はそれを言ったが、どのように私は、文字列内の文字数を知っていますか? strlenは(S)の場合、i + +は。 それでは、私はここでやったことをやっての最善の方法ではありません。 なぜ誰もが知っていますか? あなたは、文字列毎回の言語をチェックしているので。 だから我々は、strlen、私がここまで言うことが、int型の長さ=はstrlen(s)を移動したいとしている、 その後私が行う<長さ、場合にあなたは前にそれを見ていない、 私もint i = 0のとき、長さ=はstrlen(s)を行うことができます。 それで、これは今ので、私は範囲を制限した、やや望ましい 代わりに前にそれを宣言する 'for'ループちょうどこれに可変長の そして、それは常に存在し、それが悪いといわれる理由の場合には聞き取れませんでしたことを あるいは、なぜオリジナルit's、悪かった - forループで開始。 私は状態をチェックしました。 iはsの長さを<されていますか? sの長さはそう、全体の時間の "hello"で作業してみましょう。 sの長だから、H-E-L-L-O。長さは5です。 それで、i = 0のとき、長さが5であるので、私は<5ではないので、ループが繰り返されます。 それから私達は再度行く。我々は状態を確認してください。私はハローの長さを<されていますか? だからハローの長さをチェックしてみましょう。 H-E-L-L-O。私は<5ではないので、我々は再び続ける;それは5だ。 だから我々は、ループが繰り返されるたびに、私たちがハロー数えて、計算している たとえそれが変更するつもりがないだと思った、それは常に5になるだろう。 だから我々はちょうど正面に5を覚えていて、今ではすべてが良いです。 だから、文字列全体を反復する。 我々は、文字列の各文字に何をしたいですか? [学生に言えば、理解不能] うん。だから、文字が英字以外であれば、我々はそれを飛ばしたいと思います。 我々は唯一の英字を気にするので、私たちは数を大文字にすることはできません。 それでは、どのように我々はこれを行うことができますか?我々が何かをしたい場合は私たちの条件SO、SO - それはアルファベットだかどうかを確認します。 それでは、どのように我々はこれをチェックしますか? あなただけの機能を使用することができます[学生]がアルファです。 これらのいずれか、またはいずれにも含まれているようですが、char.hか何か含まれていますか? レッツアルファ関数であり、明示的な使用を使用しない - 私たちは、s [i]は、持っている sの8番目の文字、つまり、文字列は文字の配列であることを覚えて、 sの8番目の文字はそう。 それが大文字であれば、今、私たちは、それが特定の範囲内にある必要があります知っている。 その範囲は何ですか? うん。場合ので、s [i]は≥65であり、s [i]は≤90ですが、私は代わりに何をすべきか? うん。だから、絶対にあっても、これまで何のASCII値を知っておく必要はまったくありません。 番号65、90、97、102、または何でもそれは考えることはありません。 あなたが必要としない - 112 - かあなたはすべてでそれらを知っている必要はありません。それはあまりにも間違っている。 唯一の単一引用符文字は、単一引用符定数を使用します。だから 'と90未満は "Z.'です そして、これはかなり良いです - 私はZは90であることが私の頭の上をオフに知ることはできません。 私は、 'Z'は資本Zであるというのが私の頭の上をオフに知っていますか だから限り、これは資本Z、または私達への資本の範囲内にあるように、小文字をチェックすることができます またはそれは範囲内の場合≥ 'a'と≤zである。 だからそれは私たちの状態だ。 これらの事をどこに置くかのスタイルが異なります。 私はこのようにそれをやる。 今、私たちは何をすべきかをしたいですか? 我々は、この手紙は文字、アルファベット文字であることを知っている。 だから我々は、これは今では大文字または小文字にするかどうかを交互にする必要があります。 どのように我々は、我々はそれになりたいかを追跡するのですか? [生徒の声、不明朗] そうです、が、私は確認してみましょう。 0から2までは言われていたモジュールは、投げ出さ提案だった、と私はそれに同意する。 のように、その予告を除いて - これは事実ですか?うん。 それは他のすべての一つだが、我々はiのモジュール2できないか、または以来私はmod 2を、 Eは首都であり、 'a'が小文字であることに気づく?しかし、それらを分離する空間がそこですか? そこで、彼らは同じモッズ2であることを行っているが、彼らは別の例だ。 [学生の質問、不明朗] うん。だから我々は単にカウントを維持するつもりだ。 私たちが望んだ場合、また、ここでそれを行うことができ、少し扱いを受けるかもしれない ループ宣言のために、私はここでそれを置くことにしましょう​​。 だからint型のカウント= 0から始まります。 それで今、私は我々が持っていたどのように多くのアルファベット文字カウントするつもりです。 だから我々は必然的に我々は別のアルファベットの文字を見つけました+ +ので​​カウントするつもりだ。 しかし、今あなたは、カウントのmod 2の場合と言っている。 だから何カウントmod 2をすれば?ああ。私は今のところ== 0をやる。 我々はまた、上に行くよ。それでは次に、モッズ風の2 == 0を数えたら? [学生の答えは、不明朗] だから我々はそれが大文字を終わりにしたい。 2例がありますが、大文字と小文字が2例である。 我々は小文字でならだから我々はそれを大文字にする必要があります。 それが大文字の場合、私たちは何もする必要はありません。 しかし、方法は何ですか - shouldn'tが反転している - 我々もそれは大文字または小文字のかどうかチェックする必要がないこと? 我々は常に我々は常に大文字で終わることを確認するために何ができますか? だから我々は小文字の ''のためにやったことに気づく、我々は大文字にこのまったく同じことをやった場合はどうなりますか? 変化を大文字、または値の変更を行いますか? うん。ビット演算が〜32とAND任意の大文字はその同じ大文字の文字であることを行っているので、 任意の大文字の文字を32ビット目がセットされていないためです。 我々は、s [i]が、我々はそれが小文字または大文字になりたい文字を持参したいのであれば。 それが小文字であったのであれば、それが大文字だった場合、それはまだ大文字だし、それはそれだが、今では大文字です。 私は、スーパーセクションでこれを言った:もしあなたが望むなら、32を使用することができますが、私は 'をやって好む傾向にある - 、 代わりに単なる32の、それは他のビットとすることがあるからです。 32ビットの後、それはこれらのいずれかにすることも、我々は十分を持っていないだろう すべての文字を表現するための番号。 あなたが32ビットを得るのであれば、それは64ビットであること、それは、128ビットである可能性があります。 これらのビットのいずれかは、大文字と小文字が区別されます少しである可能性があります。 私はそれが32ビットであることを知っている必要はありません。 私は、これは 'a'を使用することができます - 2つの間で異なるビットを得るために 32のマジックナンバーに頼る必要なし。 そして、今、他の奇数だった数えるので、私は何をしたいのですか? [生徒の解答、不明朗] [学生]それは何ですか? 私は1秒でそれを行います。 だから今私がしたい場合 - 私は文字が小文字であることを確認することを望み、 ので、私がすることができます、32分、および32の意味 ' - A しかし予告、前回と同じ論法で、その場合 手紙は、その後32で論理和(OR)がちょうどそれを小文字保ち、すでに小文字だった。 これは、元の文字が変更されていません。 しかし、今私は、それが小文字の場合は、単にそれを忘れる "と言って避ける必要はありません それが大文字の場合は、それを変更します。 " それがこれを行うには、はるかに便利です。 [学生]は、それが32でなかったら仕事小文字から大文字を減算し、その戦略でしょう? それがあった場合は、34か何が好きですか? だから、あなたは2点の違いがあることを知っておく必要があります - ? >> 1ビット。 それがある限り、この位置より下のすべてのビットが同じであるように、1ビット以上である可能性があります。 26文字があるか、 - だから我々は、少なくとも26文字が必要。 だから我々は違いを表現するために少なくとも26の番号が必要になる - と 'の違いは少なくとも26でなければならない、 さもなければ、我々はすべての資本の数値を表すことはなかっただろう。 、我々は1から開始した場合、それはこれらのすべてのビットを使用するように起こっていることを意味し、 Zまですべてのものを表現するためにこれらの最初の5ビットのすべて、 それはなぜ次のビット、またはこのビットだが、次のビットはとを区別するために選んだものである '。' まただからこそ、ASCIIテーブルで、小文字から大文字を分離5シンボルがあります。 それらは、シンボル、それらの間の差である32が表示されます余分な5であるので。 [学生]だからASCIIがそのように設計されているので、我々は、それを行うことができます。 はい。しかし、ASCII - の違いは、これらのビットの両方の可能性があります。 10000001たし、 'a'は11100001だった場合、同じように - 私は何でも、忘れている。 A. - それはこれだったしかし、もし我々はまだ 'を使用することができます それはまだ、これらの2ビットである今だけと 'A'の違いだ。 私はそれが48を書いていると思う。それは32 +64ですか?私はそれだと思う? すべての単一の文字、のように、ZとZ、KとK、、それはまだ2ビットになり 彼らはまだそれらの2ビットを除いて設定したのと同じ正確なビットを持っているでしょう。 我々は、ASCIIまたはいくつかの他のシステムを使用している場合ように、それは常に真であるかぎりかかわらず、 限り、各キャラクタごとに異なる​​ビットが設定された数しか存在だとして、 その後、それが正常に動作します。 それは、我々はおそらく使うことができます最初のものですので、32が設定されたというだけです。クール。>> 私は、ブロックは、単一の行である場合は、見ていない場合には、好む傾向にある あなたは、中括弧を取り除くことができ、ので、私はこれをやって好む傾向にある。 また、我々はs [i]は+ = 1のようなものを行うことができます知っている? また、s [i]はビット単位の論理積(AND)= 32を行うことができます。 とビット単位の論理和(OR)= 32。 また、モッズ風の2 == 0をカウントします。 だから、それを覚えている - 私はそれを書き込むことはありません - ゼロ以外の値がtrueで、0はfalseです。 "カウントあればモッズ2 == 0"がそう言って同じである "モッズ2を数えていない場合。" 私はたぶん、行を反転し、IFカウントモッズ2 "と言っただろう または1を行うには、他にはない "私は必要としなかったので"と、1やる。 " しかし、これも同様に動作します。 そして、私はここで、他に何を行うことができますか? あなたが望んでいる場合三、それらを組み合わせることもできますが、その物事が乱雑作ると思いますその と読むことがおそらくより難しいので、我々はそれを行うことはありません。 誰もが何か他の提案はありますか? すべての問題が求めているのですか?そうとも。 だから今我々は、fを刷る、これらの空行を取り除くため、%sは文字列のための一つである、 我々は、F、Sを出力します。 今それを実行してみましょう。私は何も悪いことをしたのか? つまり、 "\だ、私は、nを求めています。 オーケー。今、私たちはそれを実行することになるでしょう。それはおそらく、私に向かって怒鳴ります。 strlenはstring.hである。 だから、これは、それがに何があるかがわかりますですClangのいいところです だけではなく、言うGCCの "ねえ、あなたが何かを忘れて、私はそれが何だったかわからない。" しかし、これは私に教えてくれる、 "あなたはstring.hを含むことを意味する。" だから私は何のために要求されなかったので、それは何も言っていない。 しかし、我々は彼らの例をやる、 "4 addはありがとうございました"。 右に見えます。めでたしめでたし。 だからあなたのメインに戻って、私はほとんどそれを行うことはありません。 これはオプションとなっています。そして主は、それが任意である唯一の関数です。 あなたは主から何かを返さない場合は、0を返すことを意味していることを前提にしています。 質問はありますか? オーケー。だから今、第二の問題。 "渡すことによって、2変数の値を交換することが週2の第二の講義を思い出して 正確に動作しない機能(スワップと呼ばれていても)にそれらの2つの変数は、少なくともではないとせずに "ポインタ" "。 我々は彼らに到達するまでとポインタを無視します。 我々は2つ​​の変数を入れ替えたい、我々はそれを行うには、関数を使用していない。 我々はまだそれが言うようにメインでそれをやろうとしている。 しかし、これら2つの変数を使用するように、我々は一時的な変数を使用する必要はありません。 これを行うには2通りの方法があります。 あなたは、あなたの伝統的な二項演算子を使用してそれを行うことができます。 だから誰もがあることを行うための手っ取り早い方法を知っていますか? これは、実際的な思考の分かかることがあります。私が持っている場合 - 彼らが求めるように私は問題を設定してみましょう。だから、僕は整数であり、2つの変数、持っている場合 彼らは私を与える、と私が与えられていることを別の整数であるsum変数Bのこと。 私はこれらの2つの変数を持っているなら、今、私はそれらを交換したいと思います。 伝統的な、あなたの通常のバイナリ演算子を使用して、私が言いたいのは、+のような、 - 、÷。 バイナリに作用ビット演算子ではない。 だから使用して+、 - 、÷、そしてすべてのそれら。 我々は以下のようなやり方で交換できる= a + bを、aとb = a - bを、A = A - B。 だから、正気をチェックした後、我々は、なぜその作品を見ることができます。 レッツは言う= 7、B = 3、Bは10になるだろう+。 だから我々は今= 10を設定しているし、我々はB = Aをやっている - と、b。 だから我々がやっているB = A - 7であることを行っているB、A、aとb = a - bをもう一度、 または= A - B。 7 3 - 10であることを行っている。 だから今、正しく、 'A'はbが3であった、7歳、今bは7であり、 'a'は3です。 だからそういうのは理にかなっている、 'a'は2つの数値の組み合わせです。 この時点では、 'A'は組み合わせですし、我々は元のBを引いている それから私達は元の何であったかを引いている '。' しかし、これはすべての数字に対しては機能しません。 これを確認するには、のシステムを考えてみましょう、私たちは通常、32ビット整数として考える。 4ビットのみのようだ何かで作業してみましょう。 うまくいけば、私は今は良い例を思い付く。 だから、私は知っている、これは簡単なことでしょう。 Let 'sは、私たちの2数字は1111と1111であると言う、申し訳バイナリにしているので。 実際の小数では、あなたがそれをそのように考えるようにしたい場合は、= 15、B = 15。 それで、我々はそれらを交換した後、我々は期待して - 彼らも、同じ番号である必要はありません しかし、私はこのようにそれをやった。 それらは同一の番号確認してみましょう。 1111および0001を実行してみましょう。 だから= 15、b = 1である。 我々はそれらを交換した後、我々は 'a​​'が1になるように、aとbが15であることを期待しています。 だから私たちの最初のステップです= a + bを。 私たちの番号は0001です1111年である '、'、+ B、、そう、唯一の4ビット幅である 万のままで終わるつもりが、我々は唯一の4ビットを持っています。 だから今= 0。 - B - 実際に、これはまだ完全にうまくいくと、今、私たちはB = Aに設定したいと思います。 = A - B - これは完璧に動作するかどうか見てみましょう。 それでは、b = 0である - 当時はまだ15だろう1、および= a - bを、これは1になります。 多分これは仕事をしません。 それは正規の使用して動作しない理由があるような気がします。 わかりましたので、それは通常のバイナリ演算で機能しないことを前提に取り組んで、 と私は探します - 私はそれが本当であるかどうかを確認するためにGoogleます。 だから我々はビット演算子を使用してそれをやってみたい、ここで手がかりはXORです。 だから、あなたはまだそれを見ていない場合、XOR(^)を導入。 それはちょっと、とit'sによってビット働くので、それは、再び、ビット演算子です - あなたはビット0と1を持っている場合、これは1になります。 あなたはビット1および0を持っている場合、それは1になるでしょう、あなたはそれが、0になりますビット0と0を持っている あなたはビット1と1を持っている場合、それは0になるでしょう。 だから、まるで、ORです。ビットのいずれかが真である場合、それは1ですが、ORとは違って、それが真である両方のビットにすることはできません。 またはこれが1になるでしょうが、XORは、これは0でなければならないでしょう。 だから我々はここでXORを使用するつもりだ。 分のためにそれについて考えて、私はGoogleに行くよ。 さて、あなたはそれを読み取ることができない、私は、XORスワップアルゴリズムのページで現在です。 私はマストアイテムなぜうまくいけば、これは説明します - これはまさに我々がちょうどやったアルゴリズムです。 私はまだ理由を見ていない - 私はちょうど悪い例をピックアップしている必要があり、 しかし、 'a'は、今 'が0で、5ビットに取得した後、0になることが起こった、この場合、 それはと呼ばれるものである "整数オーバーフローが発生しました。" ウィキペディアによると、 "XORのスワップとは異なり、この変化は、それがいくつかのメソッドを使用している必要があります x + yは整数オーバーフローが発生しないことを保証します。 " だから、これは問題を持っていませんが、これは整数のオーバーフローでしたが、私は何か間違ったことをしました。 私はよく分からない。私は別のものを思い付くしようとするでしょう。 [学生]さて、あなたはそこに数字を入れしようとしている整数オーバーフローではありません あなたが割り当てられたビットの量よりも大きい? うん。我々は、4ビットを持っています。 That'sは - 私たちは4ビットを持っていた、我々はそれに1を追加しようとするので、我々は5ビットで終わる。 しかし、第五ビットがちょうどええ、切断される。 それは実際にかもしれない - [学生]は、はエラーを投​​げるか、それをしないか - そのエラーをスローしていました? いいえ、だからエラーはありません。あなたは、アセンブリレベルに到達する、特殊なビット どこかにあることは、オーバーフローがあったと述べたが、C言語では一種のは、まさにそれに対処しない設定されています。 あなたがCで特殊なアセンブリ命令を使用しない限り、実際にそれに対処することはできません のは、XORスワップについて考えてみましょう。 そして、私はWikipediaの記事にもあることを言っているかもしれないと思う - だから、それはまた、モジュラー演算を育てたので、私はモジュラー演算をやって、理論的には、私がいたと思います 1再び15です - 私は0と言ったとき。 だから実際にかもしれない - 1 = 15から0までを行い、正規のプロセッサ上で。 我々は0で終わるので、私達は1を引くので、それだけで周りに1111に戻ってラップします。 B、​​B - - だから、このアルゴリズムは、実際には、A + B、Aに働くかもしれない、それは大丈夫かもしれません。 しかし、それをしないので、それは、それらの特定のもので大丈夫ではないだろういくつかのプロセッサがあります。 XORのスワップは、任意のプロセッサ上で動作します。オーケー。 アイデアは、それはしかし、同じことになっているということです。 ここで、我々は、何らかの形での変数の1への両方の情報を取得するためにXORを使用している その後再び個々の変数の情報を引き出します。 だから誰もがアイデア/答えを持っているのですか? [学生の答えは、不明朗] だから、これは動作するはずであり、また、XORは可換である。 かかわらず、どのような順序でこれら2つの数字は、ここまでにたまたま この結果は同じになるだろう。 だから^ Bはb ^ A。 また、これが書かれたとして見るかもしれません^ = B、B ^ = A、A ^ = bをもう一度。 だから、これは右であり、この作品は、ビットが考える理由を確認する。 小さめの番号を使用して、11001および01100を考えてみましょう。 だから、これは ''ですが、これはbです。 だから^ = bの。 我々は、これらの2つのもののXORに '=を設定することになるだろう。 1 SO ^ 0は1で、1 ^ 1は0で、0 ^ 1は1で、0 ^ 0は0です。1 ^ 0は1です。 だから '、'を10進数を見れば、それがために起こっている - あなたは '、'はるかにオリジナルの 'A'と新しいの間の関係のを参照してくださいするつもりはない しかしビットを見て、 'A'は情報のメッシュのようになりました オリジナルの 'a'とbの両方の元。 我々は、b ^、私たちはオリジナルで終わるだろうことがわかり '。'を取るのであれば 我々が取る場合と、元の '^新しい'、 '私たちは元のbで終わるを参照してください。 (^ b)は^ B =元の '。'だから と(a ^ b)の^ A =オリジナルB。 があります - これは何かのXORそのもので見てのもう一つの方法は、常に0です。 だから、1101 ^ 1101は、すべてのビットが同じであることを行っています。 だから1が0で、もう一方が1であるケースのようにそこに行くことはない。 だから、これは0000です。 これと同じ。 (^ b)のようなものです^ B ^(B ^ b)に示す。 (B ^ b)が0であることを行っている、すべてのビットが0であるので^ 0は '、'であることを行っている。 だから、 'a'はもともと1だった場所になるだろうしている唯一のものは、 - のものを持っていた。 そして、ここで同じアイデアが、私はそれも可換だと確信しています。 うん。私はそれが可換であったその前に言っていた。 ^ '、'、それが連想なので、今では(B ^ A)^ A。 そして、我々が行うことができますB ^(A ^ A)。 それで再び、我々は元のbを得る。 だから 'は現在、一緒に' a 'とbの組み合わせです。 私たちの新しいコンボを使用して 'を'我々は言うB =コンボ '^オリジナルB、我々は元の取得'。 ' そして今、コンボ= '^新しいBは、元あった - またはそれは'またはbだったものになりました。 この場合は、ここに、そのダウンだ。これは、A = B、古いbです。 だから今はすべてが入れ替わっために戻ってきました。 我々は実際にビットを見ている場合、B = A ^ Bは、これらの2のXORしようとしている その答えは、これになるだろう、とされている= A ^ bのこれらの2のXORをとると答えがこれです。 質問はありますか?オーケー。だから、最後のものは幾分よりかなり難しいです。 [学生]私は彼がそれについての質問を持っていると思う。 >>ああ、ごめんね。 [学生]実際には高速は何ですか?このXORを使用している場合は、新しい変数を宣言した場合、またはそれを何ですか? だから、新しい変数を宣言するか、交換するXORを使用して、実際には高速は何ですか? 答えは、十中八九、一時的な変数です。 そして、それは、それがダウンしてコンパイルされた後からである - ので、アセンブリレベルで、 ローカル変数または一時変数やこのようなもののいずれかのようなものはありません。 彼らはただ、希望している - メモリがそこだし、レジスタがあります。 物事が活発に起こっている場所のレジスタがあります。 あなたは、メモリ内の2つのものを追加しないでください、あなたはレジスタ内の2つのものを追加します。 そして、あなたは、それらを追加するには、レジスタにメモリから物事をもたらす してから、メモリにそれらを戻すかもしれませんが、すべてのアクションは、レジスタで行われます。 だから何が起こるか通常、一時的な変数のアプローチを使用しているときです これら2つの数値は、レジスタに既に登録されている。 そして、その時点から、あなたがそれらを交換した後、上に、 それだけで他のレジスタを使用して開始します。 どこでもあなたがBを使用していた、それだけで既に保存されたレジスタに使用します。 ' だから、実際にスワップを行うために何かをする必要はありません。うん? [学生]しかし、それはまた、右の、より多くのメモリを取る? それは、その一時的な変数を格納するために必要がある場合、それはより多くのメモリしかかかりません。 後でどこかで再びその一時変数を使用する場合と同様に、 それから - あるいは、その一時変数に何かを割り当てることができます。 だから時間tempに '、' bのいずれかの時点では、個別の値か何かを持っている それは、メモリ内の異なる位置を持っているつもりだが、それは事実だが、 レジスタのみに存在することになる多くのローカル変数があります。 その場合には、それがメモリに入れたことがない、とするので、メモリを無駄にしていることはありません。 オーケー。最後の質問は、もう少しです。 そこでここでは、このCS50アプライアンスで、辞書がある。 そしてその理由は、ためである[?B66]あなたは書きますスペルチェッカーです ハッシュテーブルや試行またはいくつかのデータ構造を使用しています。 あなたは、スペルチェッカーを書くことになるだろう、とあなたはそれを行うには、この辞書を使用してすることになるだろう。 しかし、この問題のために、私たちはただ一つの単語が辞書にあるかどうかを調べるとしている。 だからではなく、いくつかのデータ構造で全体の辞書を格納 その後、何かのスペルが間違っているかどうかを確認するために、文書全体を見ている 私達はちょうど1ワードを見つけたい。だから我々はちょうど全体の辞書をスキャンすることができます 我々は全体の辞書で単語を見つけることは決してないならば、それはそこにはありませんでした。 我々は全体の辞書をスキャンして、単語を参照しない場合、我々は良いしている、我々はそれを発見した。 それは、我々はCのファイル処理機能を見て開始することをここで言う 私たちは辞書を読んでもらいたいので、 しかし、私は、あなたが考えるべき機能として、ここにヒントを与えるだろう。 私はスペースにそれらを書こうと思います。 だから、主なものあなたは、その後オープン、fは、必然的に、fが閉じている時に見てよいでしょう これは、あなたのプログラムの最後に移動して、Fスキャンのfになります。 また、fは読み込む使うことができますが、あなたはおそらくしたくない そのため、 - あなたはそれを必要とするまで終了しない。 Fスキャンfは辞書をオーバースキャンに使用されようとしているものです。 そしてあなたはあなたの方法を試してみて、擬似コードと同じように、ソリューションをコーディングする必要はありません 溶液にした後、我々はそれを説明します。 私はすでに、これらを与えたので、そして、実際に、あなたは、任意の端末またはアプライアンスのシェルに入る場合 私はだろう - 私は通常 - あなたがまだ見ていない場合は、クラスでやった場合、私は知らないが、 しかし、男なので、manページは、かなり任意の関数を見てのためにかなり便利です。 だから私は、、のように、スキャンfを男fを行うことができます。 これは、現在の関数のスキャンFファミリに関する情報です。 私はまた、オープンな男fを行うことができ、そしてそれは私にその詳細を与えるでしょう。 ですから、あなたが使用しているか、コードを読んでいてどのような機能を知っていれば と "これは何をするのか?"は、いくつかの関数を参照してください、あなたが似ている 男だけでその関数名。 あなたが言っているかもしれない奇妙な例が​​いくつかあります 好きです。その関数名、またはman 3関数名、男性2 しかし、あなたは場合にのみ、男の関数名が初めて動作するように起こらないことを行う必要があります。 [学生]だから私はオープンのmanページを読んでいるが、私はまだそれをして、プログラムを使用する方法について混乱している。 オーケー。 manページの多くは役立たずです。 あなたはすでに彼らが何をすべきか知ってたらもっと便利だ そして、あなただけの引数か何かの順番を覚えておく必要があります。 または彼らはあなたの一般的な概要を与えることができますが、それらのいくつかは非常に圧倒的です。 また、fはfのようなスキャン。それはあなたにこれらの機能のすべての情報を与える と1回線がダウンここで言う、たまたま、 "Fスキャンfは文字列ポイントまたはストリームから読み込みます。" しかしfが開きます。ですから、どのように我々は、fがオープン使うのでしょうか? ファイルを実行する必要があるプログラムのアイデアは、I / Oがあること は、最初に、で物事を行いたいファイルを開く必要があり、必然的に、 そのファイルから物事を読み取ると、それらにものを行う。 Fのオープンは、我々は、ファイルを開くために使用するものです。 我々は取り戻すことは、我々はオープンしたいんどのファイルので、それは私たちに与える - ここでは "/ユーザ/共有/辞書/単語"と述べている。 これは、我々は、開きたいファイルであり、我々はそれを開きたい - 我々は、明示的に、私たちが読む、または我々が書くためにそれを開きたい場合は、それを開くかどうかを指定する必要があります。 そこの組み合わせとかのカップルだが、我々は読書のためにこれを開きたい。 我々は、ファイルから読みたい。 だから、このリターンは何でしょうか?それは、ファイルの星印(*)を返す と私はちょうど、変数fので、*のすべてを紹介します 再び、それはポインタだが、我々はポインタに対処する必要はありません。 あなたは、fは今あなたがファイルを表すために使用しようとしている変数であるfを考えることができます。 ファイルから読みたいのであれば、あなたは、fから読み取る。 あなたがファイルをクローズする場合は、fを閉じます。 だから我々は必然的にファイルを閉じたい、プログラムの終了時に、我々は何をすべきでしょうか? 我々はfを閉じたい。 我々が使用したいとしているようになりました最後のファイル機能は、スキャンF、Fスキャンfです。 そして、どのようなことが行うことは、それが一致するパターンを探しているファイルの上にスキャンしています。 ここのmanページを見てみると、我々はint FスキャンFを参照してください、今の戻り値を無視する。 最初の引数はファイル*ストリームであり、我々が通過するつもりだ最初の引数がfであるので。 我々は、ウェブ上にスキャンしている。 二番目の引数はフォーマット文字列です。 私は今あなたにフォーマット文字列を与える。 私たちは、127S \ nは、不必要だとの多くを言うことが起こると思います。 そのフォーマット文字列が何であるかのアイデアは、あなたがプリントfの反対としてスキャンfの考えることができますです。 だからプリントF、我々はまた、formatパラメータは、このタイプを使用する印刷F、 しかし、プリントfで私たちがやっているが - のは等価を見てみましょう。 だから、fを印刷して、最初の引数がfであることを行っているウェブプリントfは、また、実際にあります。 我々はそれにいくつかの文字列を渡す場合は、fを印刷するとき、我々は、その後、同じように何かを言う "印刷127S \ n"と可能性 それは、この文字列とし、新しい行を印字することになっている。 何が127手段、私はかなり確信しているが、私はそれに自分自身を制限したことがない あなたも、印刷fに'127 'を言う必要はないでしょう しかし、その意味することは最初の127文字を印刷しています。 だから私はケースだとかなり確信している。あなたはそのためにGoogleができます。 しかし、次のいずれかで、私はそれがあることを意味ほとんど肯定的だ。 だから、これは新しい行に続く最初の127文字を印刷しています。 FスキャンF今、代わりの変数を見て、それを印刷し、 それはいくつかの文字列を見て、変数にパターンを保存するために起こっている。 実際には別の例では、スキャンfを使用してみましょう。 それでは、我々はいくつかのint型は、x = 4を持っていたとしましょう そして我々はで構成された文字列を作成したいと思った - 文字列を作成したいと思った それはのようだった、これはずっと後に出てくる、 ちょうど4.jpg私のようなものだもの。 だから、これは、あなたが合計カウンタを持っているでしょうプログラムかもしれない カウンタiを合計し、あなたは画像の束を保存したい。 だから、私はあなたのループのいくつかの繰り返しですi.jpgを、保存したい。 だから我々はそのJPEGのためにこの文字列をどのように作るのですか? あなたは4.JPG印刷したい場合、我々はちょうど、印刷のfは、%d.jpgを言うことができる そしてそれはそのJPEGのために印刷されます。 我々は文字列4.JPGを保存したい場合は、しかし、私たちは、スキャンfを使います。 文字列sのように - 実際に我々はマストアイテム - 文字は、char sでの100を手放す。 だから、僕は、100文字の一部の配列を宣言した そしてそれは我々が必然的にそのJPEGをインチ保存しようとしているものです だから我々は、スキャンfを使用しようと、我々は%d.jpgだと思いますどのようにフォーマット、している 4.JPG印刷するためには、このコマンドの形式は、%d.jpgになるだろう。 フォーマットは%d.jpgですので、私たちが使用して%dを交換したいとxは、 そして今我々はどこかでその文字列を格納する必要があります。 そして、我々はこの文字列を格納しようとしている場所は、配列sにあります。 だから、コード、sのこの行の後に、我々は変数sのf、%sを印刷する場合、 それは4.JPG印字することになっている。 だからFスキャンfが、今では、このファイルに目を通している場合を除き、スキャンfと同じです sに格納するための何のために。 それは最後の引数があると何が起こっているか。 機能スキャンの "スキャンFファミリをしようとしたので、下記の両方のフォーマットに応じてで - 私たちは、保存したいと思うでしょう。 任意の場所をポイントに保存されている場合は戻るかもしれません - " いいえ、私たちは良いかもしれません。私は一瞬考えてみましょう。 だからスキャンfはない - 一体、その処理を実行する関数は何ですか? だからスキャンfは整数を取るとドットJPGをするつもりはありません。 それは[マンブルズ]になるだろう。 文字列のint Cのint型の変数を保存 この変数は何ですか、この関数は何と呼ばれる? はい。 That's - はい。だから私はあなたの前に定義されたものであり、sプリントFだった いる - 私はそれがプリントfのようなはるかに言いました、その理由は、はるかに理にかなっています。 スキャンfはまだのようなプリントfの一種であるが、sプリントfはそれを上にスキャンしようとしている と変数を置き換えると、文字列に格納します。 代わりに、それを印刷するのではなく、文字列に格納します。 だから、完全に無視してください。あなたはまだプリントfのようなような書式指定子と考えることができます。 我々は4.JPG事をしたいならだから今、私たちは、これのxをsのプリントfを行うだろう。 だからスキャンfは何をしている - あなたの質問があることを行っていたでしょうか? [学生]私はちょうどここで我々が​​やろうとしていることに困惑している そのJPEGと。あなたはその1以上の時間を説明できますか? だから、これはあった - それは、fスキャンF今までより少ないreleventです;うまくいけば、それが道のいくつかの種類に戻って結ぶでしょう。 しかし、私が最初に表示するように意図されたことだった - これは、実際には、これらの[に直接関係ある? F5] あなたは、我々は100枚の画像を持っていると言うのprint fを使用してすることになるだろう が、このイメージ1.JPG、2.JPG、3.JPGを読んでもらいたい。 だから、そのためには、あなたが開いているFに必要があり、その後、あなたが開こうとしている文字列を渡す必要があります。 だから我々は1.JPG開きたいだろう。1.JPGである文字列を作成するために、 %の我々がやるのプリントfはd.jpg-我々はint i = 0のためにしませんでした。 私は<40、i + +は。 プリントのf%iのd.jpg sがそう。 したがって、この行の後に、すぐに変数や配列sは1.JPGに起こっている。 または、0.JPG、1.JPG、2.JPG。そして私たちは、順番に、読書のためのそれぞれの画像を開くことができます。 だからのprint fは何をするかです。あなたは、sプリントfは今何をしているかわかりますか? [学生]わかりましたので、それは取っている - それは文字列を作成し、something.jpgし、それを格納します。 はい。これは、作成する - これは単なるスキャンfとプリントfのように、別の形式の文字列で、 場所第二引数に挿入するすべての変数を、sとiに反対したかもしれません。 多分 - 私はケースだ、という意味。しかし、どのような引数の順序は次の通りです。 これは、書式指定文字列にすべての変数を挿入するために起こっている その後私たちのバッファに格納し、我々は文字列を格納している場所バッファは、それがだと呼んでいます。 だから我々は、Sの中で正しくフォーマットされた文字列を格納して、%dが4に置き換えられました。 [学生]は、だから我々はこれをした場合、変数fはちょうど再割り当てすることはするつもりですか? はい。だから我々はこれを行う前に、元のfを閉じる必要があります。 が、 - fここで開くが存在しなかった場合、その後も、、我々は、言う必要があるだろう - うん。しかし、それは百の異なるファイルを開くだろう。 大丈夫 - [学生]しかし、我々は、アクセスしたりすることができないだろう。 オーケー。だからスキャンF、Fスキャンfは、同じアイデアの一種である しかし代わりに、文字列の代わりにそれを格納するのではなく、それはあなたが今以上のようなものだ その文字列に対してマッチングを刺され、パターン上に行くと変数に結果を格納します。 あなたは4.jpg私のような何かを解析するためにスキャンfを使用し、和のint xに整数値4を格納することができます。 それは我々のためにスキャンfを使用することができるものだ。 Fスキャンfは、コマンドラインでそれをやろうとする。 私は実際にこれはCS50ライブラリが何をするかであると確信しています。 だからあなたが言うとき、 "int型を取得、"それは、スキャンF-INGは終わった - スキャンfは、ユーザー入力を取得する方法です。 Fスキャンfは同じことをやろうとしますが、オーバースキャンするファイルを使用しています。 だからここで、我々は、このファイルを走査しています。 我々が一致しようとしているパターンは、127文字の長さで、いくつかの文字列です。 新しい行が続か だから私は、辞書の中から "、sにマッチし、"私たちも、ただ言うことをかなり確信して 我々が持っているために起こる、我々は全く言葉がそれほど長くありません保証されている、 また、Fスキャンfは、私が思うに、新しい行が何でで停止します。 しかし、我々は試合で新しい行が含まれており、よ - [学生]は、我々は新しい行を含んでいなかったなら、それは単語の部分を見つけることができませんでしょうか? それ - 各 - 辞書を見て - だから辞書には、これらは私たちの言葉のすべてです。 一人一人が新しい行に表示されます。 スキャンfはこの言葉をピックアップしようとしている。 我々は新しい行が含まれていない場合、それは次のスキャンfは単に新しい行が読み込まれている可能性があります。 しかし、新たなラインを含むそしてちょうど新しい行を無視します。 我々は常に何があろうと、新しい行まで読み込みをしなくなるので、しかし、我々は、単語の一部を得ることは決してないだろう。 しかし、何cissaような単語 "cissa、"を検索する場合、[学生]。 それはそれを見つけて、それが試合だと言うのだろうか? そこでここでは、 - それは読んでます - これは実際には良い点です。 我々は、現在のを使用することはありませんしている - 我々が探している単語は、最初のコマンドライン引数です。 だから文字列、単語= argvは1。 だから我々が探している文字列は、argvは1である。 私たちは、スキャンfにあるすべての単語を探していません。 我々はスキャンfで何をしていたが、辞書の各単語を取得している その後一度私たちはそれらを比較するstrcmpを使用するつもりだその言葉を持っています。 私達は私達の言葉を比較しようとしていると、私たちはただ読み込む だから必然的に、我々は、スキャンfsの束をやってしまうつもりだ - それはちょうどので、スキャンfが返されていることが起こるまで それは、限り、それは新しい単語にマッチしたように、1を返します。 そして、それはできるだけ早くそれが単語に一致するように失敗したとして、何か他のものを返します。 我々は、変数sに各ワード行ずつ格納し、全体の辞書を読んでいる。 その後、我々は、sで単語を比較し、その比較は== 0の場合、アール strcmpは、一致した場合は0を持って来るために起こる。 それが0だったので、もし、我々は、一致した、fを印刷することができます または単語が辞書にあるか、またはあなたは、fを印刷したいものは何でも。 そして、 - 我々は、fが何度も何度も上に閉じてしたくない。 これは、我々がやりたいことの一種であり、私達はちょうど辞書で単語を探していない。 だから我々は、あなたが前に言ったように、我々は彼らのパターン、cissa探したい場合は、次のことを行うことができます 我々はそのパターンを探したいなら、それは場合に失敗するでしょう それは実際に言葉ではないので、辞書内の単語の一つは、それでそれを持っていることを起こる。 だから、この言葉を一致させるだろうが、言葉のこのサブセットは、単語自体ではありません。 しかし、それは我々がそれを使用している方法ではありません、我々はそれぞれの単語で読んでいる その後、我々はその言葉で持っている単語を比較する。 だから我々は常に完全な単語を比較している。 私は後で確定ソリューションを送ることができます。 これはほぼ正しい答えのようなものですが、私は思う。 [学生のコメント、不明朗] ああ、私は前にそれを取り除くためでしたか? charのは、私たちは127を言ったと思います - 私は最大のが何であるかを忘れている。 我々は、ちょうど128をやる;ので、今sは十分な長さです。 我々は何も印刷する必要はありません。 我々はまた、我々のファイルを閉じる必要はするつもりだし、それは正しい答えであるべきである。 CS50.TV