[Powered by Google Translate] [チュートリアル - 問題セット2] [Zamylaチャン - ハーバード大学] [これはCS50です。 CS50.TV] かしこまりました。みなさん、こんにちは、そしてチュートリアル2へようこそ。 まず、私は、pset 1の仕上げにあなたを祝福したい。 私は、それがあなた方のうちの何人かのために少しタフだったかもしれないことを知っている あなたが書いた最初のコンピュータプログラムだったかもしれない、 しかし、ちょうどあなたが学期の終わりに振り返ると、これの終わりにそれを覚えている あなたは、pset 1を見てみましょう、あなたは "その5分ぐらいのところにあります。ねえ、私がやったかもしれない"、と言うでしょう だから、これの終わりに、あなたは間違いなくpsetの1は非常に単純で見つけることを知っていると信頼しています。 しかし今のところ、それは大偉業だし、成し遂げるおめでとうございます。 さて、また簡単なメモ私たちは、チュートリアルの肉に入る前に。 私はちょうど私が時々十分な時間を持っていないことに簡単なメモを作りたい ウォークスルー中に問題セットを行うための一つ一つの道を通過する可能性があります というだけで、多分実装の1または2種類に焦点を当てる あなたがこれを行うことができる方法。 しかし、それはあなたがそれを別の方法をやってから禁止されていると言っているわけではない。 物事の多くの方法は、コンピュータ科学と同じように、多くの場合があります ので間違いなく私が提示しているかもしれないよりソリューションのさまざまなタイプを使用して自由に感じる。 [PSET 2:暗号 - Zamylaチャン - zamyla@cs50.net] [pset2 - 0。質問のセクション - 1。シーザー - 2。 Vigenere] かしこまりました。だから問題は、セット2:暗号は楽しいものです。 繰り返しになりますが、すべてのpsetでは、質問のセクションから始めましょう それは自分に割り当てられたティーチング·フェローであなたのセクションで行われるだろう。 我々は、チュートリアルを介して、これらを通過するつもりはありません しかし、彼らは間違いなくあなたがpsetを完了するのに役立ちます。 だから問題セットの最初の部分はシーザーです。 それでカエサルの誰かが、あなたに整数を使用してキーを渡します そしてあなたは、彼らはあなたを提供するテキストの文字列を暗号化します および暗号化されたものを、それらを返す。 誰もがクリスマスの物語を見た場合、そこの例があります。 次に、問題セットの2番目の部分は、Vigenereです これは、より高度な暗号化技術である。 それで我々は、テキストの一部を暗号化しようとしている だけではなく、単一の整数を除いて、我々は実際にそれをエンコードしようとしている ユーザーが当社に提供することをキーワードと。 さて、今日はツールボックス内の最初のツールは、実際にアプライアンスをアップデートしようとしている。 ディスカッションボード上で我々は、のようなものを見るでしょう "なぜこの仕事をしないのですか?" "なぜ、50の仕事を提出しないのですか?" 多くの場合、解決策は、単にあなたのアプライアンスを更新するために実際にある。 そしてあなたはちょうどあなたのアプライアンスは、sudoのyum-yの端末ウィンドウで実行する場合 - 、アップデート - それはそうです、すべてを更新することを示すフラグです ことが必要な場合は、あなたのアプライアンスは更新されます。 あなたは既にアプライアンスの最新バージョンである場合、それは悪くはない。 それだけではありません新しいアップデートが利用可能と言うだろうし、一緒に作業を続けることができます。 しかし、これも、あなたは、アプライアンスを起動するたびに実行しているのは良いことだ 我々はまだまだだから - アプライアンスでそれを修正する - 時には我々はバグが入ってくる場合。 ですから、アプライアンスの最新バージョンを持っていることを確認してください そしてそこにアップデートすることを実行します。 かしこまりました。だから我々は文字を扱うと変え、物事を暗号化しているので、 我々は本当に私たちのASCIIチャートで最高の友達になるつもりだ。 あなたが見つけた場合は、多数のものが、来店中です。多分自分で作る。 基本的に、すべての文字、すべての数字、すべての文字で それらに関連付けられている番号は、そこにある ので、それは実際の手紙と一緒に、それらのASCII値を表示するには良いことだ。 それは間違いなく問題セットのお手伝いを致します。 本当にこの問題セットで助けてくれたことの一つは、実際にそれをプリントアウトすることだった と私は通過していたとして、私は実際にそれを引く、 "それから、これはそこに行かなければならないなら..."を書く の種類は、その上に描画し、それをマークアップし、あなたのASCIIテーブルで最高の友達になる。 その後、我々は我々の処理では、他のいくつかのツールを持っている。 この時間の代わりに、実際に自分のすべての入力をユーザーに要求 我々は、組み合わせをやろうとしている。 我々は、いくつかの入力のためにそれらを要求するつもりだ しかし、我々はまた、単にコマンドライン引数を使用するつもりです。 だから、彼らはプログラムを実行すると、通常、あなたが言う。/こんにちは、例えば、 あなたのプログラムはhello.cであった場合。 しかし、この時だけではなく、それを言って、彼らはその後の言葉は、引数を置くことができます。 彼らは同様に彼らの入力として私たちに渡すものは何でもそして私たちは、使用するつもりです これだけの整数を求めるプロンプトを越えて移動するだけでなく、コマンドライン引数を使用しています。 そして、我々は、我々は同様に多くのことを使用することがあります、配列や文字列、に行くつもりです。 ここ1ミニASCIIチャートのちょうど例です。 私が言ったように、すべての文字は、番号に対応します となるように慣れる。それは便利になるだろう。 と後に我々は数値を扱ういくつかのASCIIMathをやって起動したときに - 次にこのグラフを参照するように確かに良い - それらを引き算して、追加します。 あなたが演じてきたかもしれない何か - だからここには、シーザー暗号の例です。 それはちょうどホイールです。本質的には、外側のアルファベットがあり、その後内側のアルファベットがあります。 だからここには、シーザー暗号のが、0のキーを持つ例です。 本質的に、ZにA、BがBに揃えて配置され、すべての方法と整列される しかし、その後、我々は、例えば、3のキーを望んでいたと言う。 その後、我々は今、Dなどと揃うように、内側のホイールを回転するであろう それで、これは我々がやろうとしているものなのです。 我々は、ホイールを持っていないが、私たちがやろうとしていることは私たちのプログラムを作っている 数字に一定量の私達と一緒にアルファベットをずらすの一種。 私が前に言ったように、我々は、コマンドライン引数を扱うことになるだろう 同様に整数を得る。 したがって、ユーザーがあなたのシーザー·プログラムを実行することの方法は言っています。/シーザー し、その後の番号を入力する。 その数は、キー、シフトを表し 何回あなたのシーザー暗号の内側のホイールを回転することになるだろう。 そしてあなたはここでの例を参照してください。 我々は、シーザー暗号でのLから文字を入力した場合は、 それは、Oを介して入力Dを3回にわたってシフトすべての文字だからだろう ちょうど私がお見せしたことを輪の例のように。 それでは、あなたが入力した場合、例えば、これはCS50です! それはまた、すべての文字を移動します。 そして、それはカエサルとVigenereの両方で重要なことだ 我々は、任意の非文字をスキップするつもりだということです。 だから、スペース、文字など、数字、我々は彼らと同じ維持するつもりだ。 我々は、この場合のみ文字をシフトしようとしている。 あなたは車輪で見るように、我々は唯一の私達に利用できる文字を持っている、 ので、我々は唯一の文字をシフトして、文字を暗号化したい。 最初に行うべきことは、だから、あなたは問題でシーザーのために使用量が2に設定することを見 あなたは、端末でそれを実行したときにシーザーを実行し、数値を入力することです。 だから我々は何をする必要があるか何とかその鍵を取得し、それをアクセスすることです。 そして私たちは何とかそれは2つ目のコマンドライン引数になるだろうと見てみたい。 最初のものは、。/シーザーになるだろうし、次のいずれかのキー番号になるだろう。 だから前に、我々は、Cプログラムを開始するにはint型のmain(void)を持っていた。 我々は戻って皮層を少しするつもりだ そして実際に見て、その代わりに私たちの主な機能へのvoidを渡すの 私たちは実際に2つのパラメータを扱っている。 我々はargcというintを持っているし、文字列の配列は、argvと呼ばれる。 だからargcは、整数です そしてそれはあなたのプログラムに渡される引数の数を表します。 そして、argvは、実際に渡された引数のリストです。 すべての引数は文字列であり、そうargvは文字列の配列、リストを表します。 配列について少し話してみましょう。 アレイは、本質的に新しいデータ構造です。 我々は、我々は倍増している、int型を持っている我々は、文字列を持って、今私たちは、配列を持っています。 配列は、同じ型の複数の値を保持できるデータ構造です ので、本質的に、あなたが好きなタイプのリスト。 本質的に、あなたはすべて1変数に整数のリストを検索したい場合、 次にあなたはint型の配列であった新しい変数を作成することになります。 だから、配列は、配列の最初の要素はインデックス0にあることを意味し、0から始まるインデックスです。 配列は、この例のように、長さ4のものである場合、あなたの最後の要素は、インデックス3にあるであろう 1から4までは、です。 だから、配列を作成するには、このような何かを行うだろう。 あなたは二重配列が欲しかったと言う。 ただし、これはデータ型の任意のタイプのために行く。 ですから、二重配列が欲しいと言う。もしメールボックス呼び出したいと言う。 あなたは他のダブルを初期化と同じように、 、ダブル、名前を言うだろうが、今回は角括弧を置く我々 その後数は、配列の長さがあるでしょう。 配列に私たちが今までの長さを変更できないことに注意して、 したがって、いつでも、どのように多くのボックスを定義して選択する必要があります どのように多くの値は、アレイは保持しようとしている。 だからあなたの配列内の異なる値を設定するには、この次の構文を使用するつもりだ あなたは、スライドで見たような。 あなたが持っているメールボックスのインデックス0は、1.2に設定されます 2.4〜メールボックスのインデックス1セット、等 だから今我々は、配列のビットを確認しましたので、次にargcとargvに戻りましょう。 我々は、argvが今や文字列の配列であることを知っている。 だからユーザが通過したときに - 彼らはプログラムを実行していると言う - 彼らが言うには、。/こんにちはデビッド·マラン あなたは既に実際にargcとargvは何か思い付くさのためのプログラムは何をするでしょう。 だから、そのことについて心配する必要はありません。 それは空白で区切られた3つの異なる単語を認識するので、この場合はargcは3になります。 それで、このインスタンスの配列は、最初のインデックスは次のようになります。/こんにちは、 次の1デビッド、次の1マラン。 誰もが、argvの間に何の関係がすぐに見ない  配列、およびargcは何ですか? うん。我々はargs.c.の例では、その中に買ってあげる 我々は2との関係を活用できる​​かどうか見てみましょう。 ここでは、アプライアンスでそれを見つけるかもしれないデフォルトのアプリケーション cファイルを開くためには時々emacsです。 しかし、我々はあなたが正しい、あなたのCファイルをクリックすることができているあなたは何ができるように、geditのに対処したい で開き、[プロパティ]に移動して、[既定に設定geditを、選択 そして今、あなたのプログラムは、Emacsの代わりにgeditで開く必要があります。 パーフェクト。 だからここに私は、各コマンドライン引数を出力するプログラムを持っています。 どんなユーザ入力だから、私は、本質的に新しいラインでそれらに戻ってそれを返すようにしたい。 だから我々は何かを反復処理するために使用できる構造は何ですか - おそらくあなたのpset 1で使用したもの? あなたは物事のセット数を通過したいですか?場合Forループ>> [生徒]。 forループ。その通りです。だから、forループを始めましょう。 我々は、int i = 0のために持っている。ただ標準の初期化変数でみましょう。 私はセットの状態のままにして、次にi + +が、そこの事をやろうと言うつもりです。 かしこまりました。 だから、argvがプログラムに渡された引数のリストである場合、argvに戻って考える とargcは、プログラム内で引数の数です 次に右、argcは本質的にargvの長さであることを意味し、 argcの値と同じ数の引数があるように起こっているためです。 だから我々は、argvの各要素を反復処理したい場合は、 我々は与えられたインデックスのargvの変数にアクセスするたびにするつもりだ。 それは右、これを使用して表すことができますか? ここでは、この変数は、このインスタンス内の特定の文字列を表します それは、文字列の配列だから - その指定されたインデックスにある特定の文字列。 我々が何をしたいのか、この場合、我々はそれをプリントアウトしたいので、printfの言うてみましょう。 そして今、argvは文字列なので、私たちはそこにそのプレースホルダを載せていきたいと思います。 我々は、ちょうどそれが良い見えるように新しい行をしたい。 そこでここでは、forループを持っています。我々はまだ条件を持っていない。 ので、私はそれが与えられた文字列を印字することになっているたびに、次に0から始まり、 配列内の特定のインデックス位置にある。 だから我々は、配列の要素をプリントアウトするのをいつ止めるかをしたいですか? 我々が終わったら、右か?我々は、配列の最後に到達したとき。 だから我々は、配列の長さを超えて超えてしたくない そして我々はすでに我々が実際に積極的にargvの長さがどうなっているかを知る必要はありません知っている ので、それは私たちに与えられた、それは何だ? ARGC。その通りです。 だから我々は時代のこのプロセスのargc数をやってみたい。 私は、正しいディレクトリにないんだけど。 かしこまりました。 今度は、argsを作ってみましょう。素晴らしいですがエラーなし。 だから、argsを実行してみましょう。 これは私たちに戻ります何が起こっている?それはちょうどそれを裏印字することになっている。 "あなたがプログラムに引数を入力し、私はあなたにそれをお返しするつもりです。" それでは、我々は、args次にfooバーを言いたいとしましょう​​。 だから、それは私達にそれをプリントアウトします。大丈夫か? ですから、argcとargvを使用する方法の例がある argcがargvの長さを表していることを知っている。 あなたは配列は配列の長さを超えていずれかにアクセスして今までにないことを確認してください Cは間違いなくあなた怒鳴るますので。 あなたは、セグメンテーションフォールトと呼ばれるものを買ってあげる これは、基本的にあなたが何かをアクセスしようとしていると言って、楽しいことはありません 存在しない、あなたには属していません。 だから、特にゼロインデックスを持つことを確認し、我々はしたくない - 私たちは、長さ4の配列を持っている場合、インスタンスの場合と同様に、 我々はゼロインデックスで、0から始まるため、その配列のインデックス4は存在しません。 我々は0から開始したとき、それだけでforループのように第二の天性になるでしょう。 これだけあるということを忘れないでください。 あなたは今まで手の届かないところの配列のインデックスにアクセスする必要はありません。 どのように我々は、アクセスの種類ができるように、我々は今見ることができる 渡されるコマンドライン引数 あなたは文字列を見たけど、argvは、実際には文字列の配列です。 だから、まだ実際には整数ではありませんが、シーザーに我々は整数に対処したい。 幸いなことに、実際に文字列を整数に変換することができます私たちのために作成された関数があります。 我々は彼らを促しているところも、ここで我々は、ユーザの入力を扱っていない キーの入力のためにここに、私たちは、実際に求めるプロンプトと言うことはできません "それが有効ではない場合ああ、、と言う、私に別の整数を与える。" しかし、我々はまだ正しい使用方法を確認する必要がない。 シーザーでは、それらは1つだけ番号を渡すために許可され、 そして、彼らは。/シーザーを実行する必要があり、その後、彼らはあなたの番号を与える必要があります。 だから、argcは一定数にする必要があります。 彼らはあなたに。/シーザーし、キーを渡す必要がある場合にどのような数字は、そのことでしょうか? argcは何ですか? >> [生徒] 2。 >> 2。その通りです。 だから、argcが2であることを確かめたいと思う。 そうでなければ、基本的にプログラムを実行することを拒否する。 メインでは、int型のmain関数だと言う、 それでは、私たちは常に良い習慣リターン0で成功したプログラムの終了時。 と言う、もしそうなら、彼らはあなたに3コマンドライン引数の代わりに2を与える またはあなたが何をしようとしていた後、例えば、あなたに1を与えると、あなたはそれをチェックしたいと思うです その後、いや、言って1を返し、私はこのプログラムを続行できません。 [学生]あなたのテキストにスペースがあってはいけません。 >>は、なんですって? [学生]は、暗号化しようとしているテキスト内のスペースがあってはいけません。 ああ! 我々は暗号化しようとしているテキストの面では、それは実際に後で来る 我々は、そのテキストを与えるとき。 だから今我々は、ちょうど実際の数は、コマンド引数として受け入れておる シーザーの暗号化のための実際のシフト。 [学生]わずか1 argcは対照的に、なぜあなたは2が必要なのでしょうか? 1番号は、間違いなくあります。 右。 1の代わりに我々はargcは、2を必要とする理由 あなたがプログラムを実行すると言うときがあるためです。/シーザーまたは。/こんにちは、 それは、実際にコマンドライン引数としてカウントされます。 それでは、それはすでに1を占めているので、次に我々は余分な1を入力している。 だから、実際にコマンドライン引数の文字列を入力している。 あなたが何をしたいのか、シーザーために我々は、整数を扱いたいと考えて ので、このatoi関数を使用することができます。 そして、基本的には、文字列にそれを渡し、その後、それは整数をあなたに戻ります それは整数にその文字列を作ることが可能ましょう。 我々はそのようなprintf関数またはGetString、物事を扱っているときに、今、覚えている 我々は我々に固有のライブラリが含まれています。 だから初めに、我々はハッシュタグの標準I / O、H、そのような何かから始まります。 まあ、atoiは、これらのライブラリの1内ではありません 私たちは何をすべきか、私たちはそのために正しいライブラリをインクルードする必要があります。 だから私は、マニュアル機能を議論チュートリアル1に戻って思い出してください。 ご使用の端末で男を入力し、[関数名が続く。 ですから、その使い方のリスト全体が表示されますその が、同様に、それはそれが属しているライブラリが表示されます。 だから私は、atoi関数とマニュアル機能を使用するには、あなたにそれを残しておきます そしてあなたはatoi関数を使用できるようにインクルードする必要があるライブラリを見つけ出す。 ので、我々は鍵を持っていると今では、プレーンテキストを得ることになる ので、それは実際にあなたがプロンプトユーザー入力になるだろう。 私たちは、同じ調子でそうgetIntおよびgetFloatは対処し、 我々は、GetStringメソッドを扱うことになるだろう。 whileまたはループがチェックしながらしかし、今回のケースで我々は、いずれかの操作を行う必要はありません。 GetStringメソッドは間違いなく、私たちに文字列を与える そして我々は、ユーザが与えてくれるものは何でも暗号化するつもりだ。 ですから、これらのユーザーが入力する文字列のすべてが正しいと仮定することができます。 グレート。 、それでは、一度キーを持っていると一度は、テキストを持っている 今残っているものは、平文を暗号化する必要がある。 ちょうど素早く専門用語の上にカバーするために、プレーンテキストは、ユーザーがあなたを与えるものである と暗号文は、あなたがそれらに戻すものです。 だから文字列は、文字で実際に手紙を通過できるようにするには 我々はすべての文字をシフトしなければならないので、 裏皮我々は一種の層をした場合、我々は、その文字列を理解する 我々は、彼らが本当に文字のリストだということを参照してください。 一つは、他の後に来る。 彼らは文字の配列であるため、そして私たちは配列​​として文字列を扱うことができます。 ですから、テキストという文字列を、持っていると言う その変数テキスト内これはCS50で格納されます。 その後、インデックス0のテキストが資本のTだろう、インデックス1は、H、等であろう そして、配列を持つ、args.cでARGC例では、 我々は配列を反復しなければならなかったことを見た それで我々は、私は長さよりも小さくなるまでiから= 0を反復しなければならなかった。 だから我々は文字列の長さとは何かを考え出すのいくつかの方法が必要 我々はそれを反復するつもりなら。 幸いにも再び、関数はCS50ではあるが、後に、私たちのためにそこにある あなたは間違いなく、独自の関数を実装して作ることができるだろう その文字列の長さを計算することができます。 しかし、今のところ我々はそうstrlenは、文字列の長さを使用するつもりです。 あなたは、文字列を渡すと、それは、あなたの文字列の長さを表すintを返します。 我々は、文字列内の各文字を反復することができるかもしれない方法の例を見てみましょう そしてそれで何かをする。 私たちがやりたいことは、文字列の各文字を反復している そして、私たちがやりたいことは、我々は1ずつ文字1をバックプリントです 我々はそれの隣に何かを追加する場合は除きます。 だから、forループを始めましょう。 int型私= 0。 我々は条件のためのスペースを残してするつもりです。 我々は、文字列の末尾に到達するまで、反復したいですよね? それでは、どのような機能は私たちに、文字列の長さを与えますか? [聞き取れない生徒の応答] これはコマンドライン引数の長さです。 しかし、文字列のために、私たちは私たちに、文字列の長さを与える関数を使用したい。 だからそれは文字列の長さです。 それで、あなたはそれに文字列を渡す必要があります。 それはの長さを計算する必要があるか文字列かを知る必要があります。 それでは、この場合、我々は、文字列sを扱っている。 グレート。 それでは、私たちが何をしたいのかは、printfしてみましょう。 今、私たちは文字を扱いたい。私たちは、それぞれの個々の文字をプリントアウトしたい。 あなたはそれがフロートをプリントアウトしたい場合は、%fのようなプレースホルダを使用することになります。 int型を使用すると、%dを使用します。 それで同様に、文字であなたは、私が文字を印刷するつもりだと言うこと%cを使う 変数内に保存されている。 だから我々はこれを持っており、それまでの期間とスペースを追加してみましょう。 我々は、どの文字を使用していますか? 我々は、我々が文字列の時のどのような文字を使用してすることになるだろう。 それでは、我々は、文字列を使って何かを使用してすることになるだろう しかし、我々はそこに特定の文字にアクセスすることにしたい。 文字列は配列であればそうだとすれば、どのように我々は、配列の要素にアクセスするのですか? 我々は、これらの角括弧を持っているし、我々はそこにインデックスを入れた。 だから我々は、角括弧を持っています。この場合、我々は、ちょうど私が私たちのインデックスを使用することができます。その通りです。 そこでここでは、我々はドットと続く空白文字を印刷することになるだろうと言っている その文字は私たちの文字列sのi番目の文字であることを行っている。 私はちょうどそれを保存するつもりです。オーケー。 今私は、文字列の長さを実行するつもりです。 だから我々は、OMGと呼ばれる文字列があったが、今ではそれがさらに強調されている。 同様に、聞かせは、私たちが実際にユーザから文字列を取得したいと言う。 どのように我々はこれを行うのでしょうか? 前に、どのように我々はintを取得するのですか? 我々は右、getIntを言ったの?しかし、これはint型ではないので、GetStringをしてみましょう。 文字列の長さを作ってみましょう。ここでは、特定のプロンプトを入力しませんでした。 だから私は知りません。 私はここに私の名前を入れてするつもりですので、私はそれらのもののいずれかを実行できます。 ここで私は、そのようなすべての文字か何かのための単語を割り当てます。クール。 だからそれは文字列の長さです。 だから我々はカエサルに戻っています。 私たちは、文字列を反復するかについて、いくつかのツールを持っている 我々は個々の要素にアクセスする方法。 だから今我々はプログラムに戻ることができます。 私はASCIIテーブルで、前にも述べたように、あなたの親友、 あなたはすべての文字に関連付けられている数値を参照するつもりです。 だからここに私たちの平文が、私はめまいだと言う! 次に、これらの各文字は、数字とそれに関連付けられたASCII値を持っているとしている でも、アポストロフィー、スペースさえも、感嘆符、 ので、このことを念頭に置いておきたいでしょう。 だからそれらのコマンドライン引数に含まれているユーザが6であるという我々の鍵を言う。 73で表されている私の最初の文字、、、そのための手段 あなたは73 +6のASCII値で表されているものは何でもそれらの手紙に戻りたい。 このケースではそれが79になります。 今、私たちは、次の文字に行きたい。 だから平文のインデックス1の次は、アポストロフィであろう。 しかし、我々は文字だけを暗号化したいことを忘れないでください。 だから我々は、アポストロフィが実際には同じままであることを確認したい 我々は39から45に何でも変更しないこととなります。 我々は、アポストロフィとしてそれを維持したい。 だから我々は文字だけを暗号化するために覚えておきたい 我々は他のシンボルのすべてが我々のプログラムで変更しないままにしたいので。 私たちが望むこともう一つは、大文字と小文字を保持することです。 ですから、大文字を持っているとき、それは大文字として滞在する必要があります。 英小文字は小文字として滞在する必要があります。 そこで、いくつかの便利な機能にのみ暗号文字に対処できるようにするには 物事の総額を維持し続ける isalphaは、isupperは、islowerは関数です。 ので、これらを使用すると、ブール値を返す関数です。 基本的には、trueまたはfalse。これは大文字ですか?この英数字のですか? これは本質的に、手紙です。 だからここでは、その関数を使用する方法の3つの例である。 基本的には、その関数によってあなたに返された値がtrueであるかfalseであるかどうかをテストすることができます その入力に基づいて。 どちらか、またはそれを暗号または、それはそれの大文字を確認してください、などを暗号化しない [学生]あなたはもう少しだけ、どのようにあなたがそれらを使用するものを説明できますか? >>うん、確かに。 我々は振り返るのであれば、ここでは右、私は資本を持っている? だから我々は、私は+6 Oであるので、私はOになることを知っている しかし、我々はそのOはOの資本であることを行っていることを確認したい だから、基本的に、それは私たちの入力を変更するつもりのようなものです。 だからそれが大文字かどうかにかかわらず一種のは、我々はそれに対処する方法を変更します。 それでは、我々は、その特定のインデックスにisupperは関数を使用する場合、 本当の私たちのために返すようisupperが( "I")、ので、我々はそれが上限だと知っている。 それでは、それに基づいて、後に我々は式に行くよ あなたはカエサルで物事をシフトするために使用されるだろうと、 それでは、基本的に、それは大文字の場合、若干異なる式が行われる予定です として小文字に反対した。理にかなって? うん。心配ありません。 私はかなりの意味をなさない文字に6を加えることについて少し話を 私達は種類のこれらの文字があることを理解する場合を除き、 整数と互換性の一種である。 我々がやっていることは、我々は使用暗黙的キャストの一種である。 我々は、あなたが値を取る場所にちょっと遅れキャスティングに行くよ、あなたは別のタイプに変えて それはもともとあったより。 しかし、このPSETで、我々は同じ意味で使用する文字の種類にできるようになります とそれに対応する整数値。 だから、あなたは、単にちょうど単一引用符で文字包む場合、 その後、整数として扱う、整数でそれを使って作業することができるでしょう。 だから大文字のCは67にも関する。小文字のfは102にも関する。 これらの値を知りたい場合は、もう一度、あなたのASCIIコード表を見てみましょう。 それでは、あなたは引いて追加することができるかもしれない方法の例をいくつかに行こう どのように実際には本当に交互に使用することは、これらの文字を扱うことができます。 私はそのASCIIMath整数に文字を付加を計算するために起こっていると言う その後、得られた文字だけでなく、結果のASCII値を表示します。 ので、ここで私が言っている - この部分にwe'll取引後 - しかし、基本的に、私は、ユーザーがキーと一緒に実行ASCIIMathを言うべきだと言っている と私は、そのキーが数字であることを行っていることを言っている いると我々は、この文字を追加しようとしている。 だからここに気付くことが私はキーを要求しているから、 私は彼らが私に1つのことを与えていることを要求しているから、 私は。/ asciimathとキーを受け入れたい。 だから私は、argcは2に等しいことを要求するつもりです。 それがないなら、私は1を返すつもりだとプログラムは終了します。 だから私は、キーが最初のコマンドライン引数であることを行っていないと言っている それは2番目の1になるだろう、とあなたはここで見られるように、 私はその整数に変身するつもりです。 それから私は、rにする文字を設定するつもりです。 変数CHRの型が実際に整数であることに注意してください。 私は整数としてrを使用することができるよという方法は、これらの単一引用符でそれを包むことである。 だから戻って我々のprintf文に我々は文字のプレースホルダを持つ場所 し、整数のプレースホルダ、 文字はCHRで表され、整数がキーになります。 それで、我々は結果で一緒に2を追加するつもりです。 だから我々はrを追加するつもりだ+キーが何であれ、 その後、我々はその結果を印刷しようとしている。 それではasciimathを作ってみましょう。それが最新なので、ちょうどasciimathを実行してみましょう。 我々は実際には鍵をくれなかったので、ああ、しかし見、それは何もしません。 だから、それだけで、私たちの主な機能は1が返されたときに、それはちょうど私達に戻る。 だからその後の鍵に渡すことができます。誰かが私に番号を与える。 >> [生徒] 4。 4。オーケー。 だから、rは、私たちに118のASCII値に相当するvを与えるために起こっている4増加した。 だから、それは一種のは、という意味になります - 実際に、私はあなたを求めることができますあなたは、r + 4 118である場合は、rのASCII値が何であるかと思いますか? その後、ええ、rは114である。 あなたは、ASCIIコード表で見ればそう、確かに、あなたはrが114で表されていることがわかります。 だから今、私たちは文字の整数を追加することができます知っている、これは非常にシンプルに見えます。 私達はちょうど私達が前の例で見たような文字列を反復するつもりだ。 それが手紙の場合我々は確認してみます。 それがあるなら、私たちはキーが何であれでそれをシフトします。 あなたがこれを好きになる場合を除いて、かなりシンプルな、 あなたは、zは、122で表され、その後に別の文字を与えるだろうことがわかります。 私たちは、実際、私たちのアルファベットの中に滞在したいですよね? だから我々は、ラップアラウンドの種類のいくつかの方法を把握する必要があります。 あなたはZED到達し、あなたが特定の数だけ増やしたい場合、 あなたは、ASCIIアルファベットセクション越えに行きたくない; あなたはAにすべての道を戻ってラップしたい しかし、あなたはまだケースを維持している心に留めておいてください。 だから文字が記号になることができないことを知っている ただの記号のようにも変更するつもりはありません。 あなたは間違いなくする必要はありませんでした最後のpset内、 しかしオプションはモジュラス関数を使用してあなたの貪欲psetを実装することでした。 しかし、今、私たちは実際に、係数を使用する必要があるとしている そうちょうどこの少し上に行くしてみましょう。 本質的に、あなたがあなたにxをyで割った余りはxをyで割った剰余を持っている場合。 ここではここでいくつかの例があります。我々は27%15を持っています。 基本的には、負の取得せずに、可能な限り多くの27から15を引くとき その後、残された12を得る。 だから、それは数学の文脈のように親切なのですが、どのように我々は実際にこれを使用することができますか? それは私達のラップオーバーするのに便利になるだろう。 このためには、ちょうど私が3つのグループに分割するためにあなたのすべてを尋ねましょう。 ときには、グループとそのような何かでこれを行う。 "さて、私は3に分けることができるようにすべてを望んでいる"、私は言ったと言う どのようにすればいいでしょう? [聞き取れない生徒の応答]ええ、その通りです。オフ数える。オーケー。 実際にそれを実行してみましょう。あなたが開始しますか? 1、2、3、4 [学生がオフカウント]にします。 しかし、覚えて... >> [生徒]ああ、ごめんね。 それは本当に良い点だ。 あなたは4点を述べたが、我々は唯一の3つのグループにしたいので、我々は実際にあなたが1を言いたい。 それでは、どのように - そしてどのようにあなたが1を言うかもしれないので、いや、それは本当に良い例ですか? 4と1の間の関係は何ですか? さて、4 MOD 3は1です。 あなたが続けば、それで、あなたは2になります。 だから我々は、1、2、3、1、2を持っています。 繰り返しになりますが、実際に第五人だ。どのようにあなたは2点の代わりに5を言うことを知っていますか? あなたは5 MOD 3が2であると言います。 私に残されたどのように多くの3つのグループを見たい場合、どのような順序は、I.午前 それで、我々は、部屋全体に沿って継続した場合 次に我々は、我々は常に、実際に自分自身にMOD関数を適用していることを見るでしょう カウントオフの種類に。 それはあなたがモジュロを使用する方法の具体例のようなものだより 私は確信しているので、私たちのほとんどは、おそらくそのプロセスを経てい 私たちはうまくやってカウントする場所を持っていた。 モジュロ上で何か質問はありますか? それは、この概念を理解することが非常に重要になるだろう ので、私はあなたたちが理解していることを確認したい。 [学生]は残りが存在しない場合、それはあなたの実際の数を与えるのですか? それらの最初の3つはそれを行っていた場合、それは、彼らが実際に何であったか、それらを与えているだろう または、それが彼らに与えているだろう[聞こえない] >>それは良い質問ですね。 モジュロのための残りの部分が存在しない場合 - あなたは6 modの3を持ってそう言う - それは実際には0を戻り与える。 私たちは、少し後でそのことについて話します。 そうそう、例えば、3人目 - 3モッズ3は、実際には0であるが、彼女は3を語った。 だから、例えば、内側のキャッチのような種類のものだ modが0であれば大丈夫のように、その後、私は3人目になるつもりです。 しかし、我々は、我々は0が後で何かに対処することも方法の一種に入るでしょう。 だから今我々は何とか右の文字にZEDをマッピングする方法を持っている。 だから今我々は、これらの例を経てきました 私達は種類のシーザーがうまくいくかもしれない方法を参照してください。 あなたは2アルファベットを見て、あなたは彼らがシフトしてください。 それでは試してみて、式の面であることを表現しましょう​​。 この式は、実際には、仕様であなたのために与えられた しかし、各変数が何を意味するかを通して見てみましょうの一種。 私たちの最終的な結果は、暗号文になるだろう。 だから、これによると、暗号文のi番目の文字 平文のi番目の文字に対応する予定です。 我々は常にこれらの事を並べるようにしたいので、それは理にかなっています。 だから、私たちの鍵である暗号文を加えたkのi番目の文字になるだろう - それは理にかなっている - そして、我々はこのmod 26を持っています。 我々はZEDを持っていたとき戻って覚えている 私たちは、文字に入るためにしたくなかったので、我々はそれをmodにしたかった アルファベットラップアラウンドの、やさしい。 後はあなたが正しい数値になったまではA、B、C、Dに行くだろうzedの。 だから我々は知っているZED、ZEDは、A、B、C、D、E、Fの後に来るので+ 6、私達にfを与えるだろう。 だから我々はZED + 6くれfを与えるために起こっていることを確かに知って覚えておきましょう。 ASCII値では、zは122であり、fは102である。 だから我々はシーザー式は私たちに102を与えることのいくつかの方法を見つけなければならない 122で取った後。 私達はちょうどこの式は、実際にあなたに24を与える( 'Z' + 6)%26を適用するのであれば 122 + 6 128ですので、128%26はあなたに24余りを返します。 しかし、それは実際にfを意味するものではありません。それは間違いなく102ではありません。 それはまた、アルファベットで第六文字ではありません。 だから明らかに、我々は、この少し微調整する何らかの方法を持っている必要があります。 通常のアルファベットの面では、我々は、zは26文字であり、fは6であることを知っている。 しかし、我々はコンピュータサイエンスにしているので、我々は0からインデックスに行くんだ。 代わりに、zは26番であることのそれだから、我々はそれが数25だと言うつもりだ 0であるため。 だから今のこの式を適用することができます。 私たちは、zはあなたに31を与える、25 + 6で表されています。 と31モッズ26は、剰余としてあなたに5を与える。 我々は、fはアルファベットで5番目の文字であることを知っているので、それは最高だ。 しかし、それはまだ右、fはないですか?それはまだ102ではありません。 それではこのpsetに対する、挑戦は関係を見つけるしようとする これらのASCII値とアルファベット順のインデックスとの間の変換の間。 本質的に、あなたが何をしたいだろう何、あなたは、ASCII値でスタートしたい しかし、その後は何とかそのアルファベット順の索引に変換したい それがどうあるべきか手紙計算 - 基本的に、そのアルファベット順のインデックスとは何か 暗号文字の - その背中ASCII値に変換します。 あなたはASCIIテーブルをサッと取り出し、もしそうなら、次に試してみて、102および図5を参照すると、言う間の関係を見つける または122と25。 私たちは、平文を得て、コマンドライン引数から我々の鍵を手に入れた 我々はそれを暗号化されてきました。 今、私たちがしなければ残っているのは、それを印刷しています。 我々は、このそれぞれに異なるいくつかの方法を行うことができます。 我々に沿って行くと私たちは何ができると、実際に印刷されています。 私たちは、文字列内の文字を繰り返すため、 我々はそれを計算するときに我々は、単にちょうどそれから印刷することができます。 別の方法としては、配列に格納し、文字の配列を作ることができます そして最後にその配列全体を反復処理し、それをプリントアウトする。 だから、そのためのオプションがいくつかあります。 と%cは文字を印刷するためのプレースホルダーであることを行っていることを覚えておいてください。 だから私たちはシーザーを持って、そして、今、私たちは、Vigenereに移る これはカエサルに非常に似ていますが、少しだけ複雑です。 だから、本質的にVigenereとは、キーワードを渡すことになるだろうされています。 数字の代わりだから、あなたは、文字列を持っているつもりです ので、それはあなたのキーワードとして機能するようになるだろう。 その後、いつものように、ユーザーからの文字列の入力を求めるプロンプトを取得するつもりだ し、それを暗号化してから、それらを暗号文のバックを与える。 私が言ったように、それは、代わりに特定の数でシフトを除いて、シーザーと非常によく似ています 数は、実際には文字から文字へたびに変更する予定です。 シフトすることが実際の数を表すために、それはキーボードの文字で表さだ。 あなたが例えばのシフトに入るようなら、それは0のシフトに対応しているでしょう。 だから、アルファベット順の索引に戻って、再びです。 あなたは私たちが実際にASCII値を扱っていることを見ている場合に便利かもしれないもの 同様に、文字だけでなく、アルファベット順のインデックスとして、 多分、0〜25のアルファベット順のインデックスを示し、独自のASCIIテーブルを見つけるか、または作る ように、どのような種類の関係をaからzまで、およびASCIIの値を見ることができます とスケッチし、いくつかのパターンを試してみて、見つける。 同様に、fで特定のインスタンスでシフトされた場合 - これは、小文字も大文字fである - そしてそれは5に対応しているでしょう。 我々は、これまでのところ良いですか? Vigenereための式は少し異なっています。 基本的に、あなたは、それだけでシーザーのようなものだがわかり 除くだけではなく、我々はKインデックスjを持っているK。 我々は、本質的にあるため、キーワードの長さiを使用していないことに注意してください 私たちの暗号文の長さとは必ずしも一致しません。 我々は、私は少し後に持っている例を見たときこれは、ビット鮮明になります。 基本的に、あなたがOHAIのキーワードを使用してプログラムを実行する場合、 そのたびに、OHAIがあなたのシフトであることを行っていることを意味します。 ですから、あなたのキーワードにあるかの位置に応じて、 あなたはその分だけあなたの特定の暗号文の文字をシフトしようとしている。 繰り返しになりますが、ちょうどカエサルのように、我々は、我々は物事の資本を維持することを確認したい そして我々だけ暗号化する文字ではなく、文字やスペース。 だから、あなたが使用しているかもしれない機能にカエサルを振り返る あなたが物事をシフトし、ここであなたのプログラムにそれを適用する方法を決定した方法。 それでは、これをマッピングすることができます。 我々は、我々がGetStringメソッドからユーザーから得ていることを平文を持っている これを言って... CS50です! その後、我々はOHAIのキーワードがあります。 最初の4文字は非常にシンプルです。 我々は、TはOだけシフトされようとしていることを知っている hはhによってシフトされようとしているそして、私はシフトすることになるだろう。 ここでは0を表していることがわかり、 それでは、終了値は、実際には前と全く同じ文字です。 するとSは、iによってシフトされます。 しかし、あなたはここで、これらの期間を持っています。 私たちは、それでは我々は何によってそれを変更しないことを暗号化する必要はありません とちょうど変わらない期間をプリントアウト。 [学生]私はあなたがこれをシフトさせていることを知ってどのように理解していない - あなたはどこをやった - >>ああ、ごめんね。 ここで上部には、ここではそのコマンドライン引数のOHAI、以下を参照してください それがキーワードになるだろう。 それで基本的には、キーワードの文字の上にサイクリングしている。 [学生]だからoが同じシフトをされようとしている - だからOはアルファベットの特定の番号に対応しています。 [学生]右。しかし、あなたはCS50の部分をどこから得たのですか? ああ。それはあなたが、似ているところGetStringメソッドでの "私にエンコードする文字列を与えます。" [学生]彼らはあなたに、シフトさせる、その引数を与えるつもりだ その後、あなたの最初の文字列をおうかがいします。 >>うん。 そこで、彼らはプログラムを実行するとき、彼らはキーワードを含めるつもりです それらのコマンドライン引数で、彼らはそれを実行したとき。 次に、あなたは、彼らが実際より少なく、より多くのではないあなたに1を与えられていませんでしたことを確認したら 次に、文字列の入力を要求するつもりだ、と言う、 "私に文字列を与えます。" だから、このケースでは、彼らはあなたにこれを与えてくれた場所だ... CS50です! だから、それを使うとOHAIを使用して繰り返し処理するつもりです。 ここではピリオドを暗号飛ばしていることに注意してください、 しかしOHAI、次のいずれかの我々の立場という点で我々はoを使用していました。 このケースでは、4の処理になるため、表示するには少し難しいです それでは、少し続けていきましょう。ちょうどここに私と一緒に固執する。 その後、我々はその後、それぞれOとHによって翻訳されるiとsを持っています。 その後、我々はスペースを持っており、それでは我々はスペースを暗号化するつもりはないことを知っている。 しかし、代わりに、右ここにこの場所でに行くことに気付く 我々は、することにより暗号化している - 右ここに - あなたはそれを見ることができるかどうかは分からない。 だから、それはあなたが実際に所定のようではない、と言う、oはここに行く、hは、ここに行く 私は、I、O、H、O、H、Iはここに行き、ここに行く。あなたはそれをしない。 あなただけのキーワードで自分の位置をシフト あなたが実際に実際の文字を暗号化することになるだろうことを知っているとき。 そういうのは理にかなっていますか? オーケー。 だから、いくつかのリマインダ。 あなたが唯一のあなたのキーワードの次の文字に進むことを確認したい あなたの平文での文字は英字である場合。 だから我々はoにしていると言う。 我々は、次の文字、平文のiインデックスは、例えば、数値であることに気づく。 我々は、別の文字が表示されるまで、その後、我々は、jは、私たちのキーワードのインデックスを進めません。 繰り返しになりますが、あなたはまた、キーワードの先頭にラップアラウンドことを確認したい あなたはそれの終わりにいるとき。 あなたは私たちが私にいるここに表示された場合は、次のものは、oである必要があります。 つまり、あなたのキーワードの先頭にラップアラウンドすることができるといういくつかの方法を見つけたいと思って あなたが最後に到達するたびに。 それで再び、演算の種類は、折り返しのためにそのような場合に役立ちましたか? 例えばオフカウントに好きです。 [学生]パーセント記号。 >>うん、モジュロであるパー​​セント記号、。 だからモジュロは、あなたOHAIでインデックスをオーバーラップしたい場合は、ここに便利になるだろう。 そして、ちょうどクイックヒント:ビットカウントオフのようなキーワードの中でラッピングを考えてみてください、 3グループ、第四人は、どこがあるかどう 彼らが言ったことを、その数は1であった4モッズ3、だった。 だから、そのようにしようと考えることもできます。 あなたが次にKJをciとその後パイを持っていますが、どこでも、式で見たように、 あなたがそれらを追跡することを確認したい。 あなたはそれを私を呼び出す必要はありません、あなたはそれjは呼び出す必要はありません しかし、あなたはあなたがあなたの平文時だという位置を追跡することを確認したい 同様にあなたがキーワードであるという立場にいるとして それらは必ずしも同じであることを行っていないためです。 キーワードだけでなく - それはあなたの平文より完全に異なる長さである可能性があります。 また、お使いの平文、数字や文字があります、 ので、それは完全に一緒にマッチアップするつもりはない。はい。 [学生]は大文字と小文字を変更する機能はありますか? あなたは、資本に変更することはできますか? >>うん、間違いない。 あなたがチェックアウトすることができます - 私はそれがtoupperが、すべて1つの単語だと思います。 しかし、あなたが物事を暗号化して、テキストを保存しようとしているとき、 それは別の例を持っている基本的にはベストです。 それは大文字の場合は、これによってシフトさせたい 式の中で、あなたが振り返ったときに私達は行くの種類があるので、どのように 同じ意味で数字を表すのASCII方法との間の と実際のアルファベット順の索引、我々は確認したい あなたが使用しようとしているパターンのいくつかの種類があるように起こっている。 パターン上の別のノートでは、実際に。 あなたは間違いなく、数値を扱うことになるだろう。 スタイルの一例である、マジックナンバーを使用しないようにしてください。 あなたが好きで毎回シフトに何かしたいそう言う - あなたが何かをシフトしようとしているときにわかりましたので、ヒント、別のスポイラーです 一定量のことで、実際の数でそれを表現しないようにしよう むしろ試してみて、あなたは一種の方が理にかなっているでしょうASCII値を使用することができます参照してください。 別のノート:私達は式を扱っているので、 あなたのTFは種類のあなたが使用している可能性が何パターン知っているにもかかわらず、 あなたのコメントの種類の中でのベストは、ロジック、などを説明 "私はこのパターンを使用していますので..."そして種類のあなたのコメントに簡潔にパターンを説明する。 [これはチュートリアル2であった]他の質問がない場合は、私はほんの少しのためにここにいるよ。 クリプトと来てくれてありがとう:あなたのpset 2で頑張って。 [学生]ありがとうございます。 >>ありがとうございます。 [メディアオフラインイントロ]