[Powered by Google Translate] [第2週、続く] [デビッド·J·マラン、ハーバード大学] [これはCS50です。 - CS50.TV] かしこまりました。これはCS50であり、これは2週目の終わりです。 あなたは明日、この頃空腹であることが予想される場合は、 私たちは小さなグループ明日、木曜日、午後1時15分のように招集するつもりだと知っている。 あなたはRSVPしたい場合は、このURLはここにあります。 スペースが限られているので、フォームはあなたがこれを埋める時間でいっぱいになった場合はご容赦下さい。 興味があるかもしれない別のURL、しかしは、これです。 ちょうど月の時間について、このコースは利用できるようにしようとしている すべてのより広くEDXを経由して、それを介してインターネット上の人々が、一緒に従うことができるようになります 実際には、かなり積極的にコースに従事。 彼らは議論CS50 ApplianceおよびCS50を使用することがあります そして、我々はすでに、この学期を使用してきた様々なソフトウェア·ツールのほとんど。 そして、我々は今年の実験としてで取りたいと思い取り組みの一つ 我々が翻訳することができますどれだけのコンテンツを確認することです 他の話し言葉と書き言葉の言語へ。 このプロジェクトに参加することに関心を持っているかもしれないので、もし それによって我々はコースの講義のための英語成績証明書や字幕を提供します そしてパンツとセミナーやセクションなど、 あなたは流暢に話したり流暢にいくつかの他の言語を記述する場合、 あなたがビデオの1つ以上に取ることによって、我々は、このプロジェクトであなたを従事するのが大好きだ あなたは非常によく知っている言語に翻訳する。 あなたのインターフェイスの感覚を与えるために、このWebベースのユーザー·インターフェースはあり 我々は、本質的にこ​​のようなUIを作成することを使用することがありますことを。 これは、いくつかのハロウィーンの前に私を教えていた、 そしてこれらのタイムスタンプの隣にある黒いであり右側に、 あなたは、あの日、私の口から出てきた様々なものが表示されます その下位には、いくつかの他の言語に翻訳することができるでしょう マッピングは、この場合には、間にあるかを正確に、英語とは、スペイン語を言う。 だから、実際には非常にユーザーフレンドリーなツールです。 キーボードショートカットで非常に容易に巻き戻しと早送りができます。 あなたがこの実験に参加し、持っていると思いますので、もしあなたの言葉がわかると読み そこに人々の潜在的に数千人が参加すること自由に感じれば。 月曜日から子猫について一言。 我々は過度に怖いメッセージを送信したといけないので、営業時間が示唆するように、あることを実現するか セクションが示唆するように、そしてもちろんデザインは非常によく似ている 学生が協力して、問題のセットを介して動作するように話を持っている と一緒に問題があり、実際にラインがちょうど、に尽きる 再び、あなたは最終的に提出する仕事が自分であるべきである。 そしてそうはっきり言って、営業時間にそれは完全に正常で、 それは完全にあなたの隣にいくつかの友人とチャットすることも、予想されるためだ。 彼または彼女はいくつかのトピックに苦労している、あなたが同じなら、 "ああ、まあ、私はあなたに私が書いたコードのいくつかの行のを垣間見ることができるように、"それは、いいのよ それが起こると、その学習の過程で、私が思うに、非常に多くの助けとなるのです。 ヘッドはソートのあまりに多く秒間こっち傾いているときに、その行は交差されるところ 本当にちょうどあなたの友人のためのブロックを解除する機会があったために、そのためには分 そして確かに物事は電子メールやDropbox等を介して交換されるとき、 すぎる行があります。 だから、すべての手段で快適に感じる、お友達とのおしゃべりを促したい とpsetとよりちょうど約同級生はあなたが最終的に何を提出することを認識 本当にあなたの創造ではなく、他の誰かの製品でなければなりません。 pset2ためのドメイン固有の問題となる1、 これは、暗号技術の世界に飛び込むことで、明日の夜遅く出てくるだろう これは、情報を暗号化またはスクランブルする技術である これは究極的にはセキュリティの世界にも関する。 さて、私達のほとんどのためのセキュリティは、かなりありふれたメカニズムの形式で提供されます。 私たちのすべては、ユーザー名とパスワードを持っている と私たちのすべては、最も可能性の高い、非常に悪いユーザー名とパスワードを持っています。 あなたのパスワードは複数のウェブサイト上で同じである場合、それは、おそらく最高のアイデアではありません 私たちは、学期の終わりに向かって説明しますように。 冗談 - - モニター上で、パスワードが付箋紙に書かれている場合 それはあまりにも必ずしも最良のデザインが、かなり一般的な現象ではない。 そして、あなたがあなたのパスワードを暗号化する暗号化方式を使用していないのであれば、 彼らは特に脆弱です。 あなたは隠されたWord文書を持っていることによって巧妙なスーパーであるしていると思うので、もし どこかにあなたのパスワードのすべてを持って、ハードドライブ上の それはあまりにも非常にセキュアなメカニズムではないつまり、誰に見に行くんだというフォルダにあります。 それで何pset2がご紹介しますと、暗号化のこの芸術です パスワードのようなものはすべて、より安全になるように、情報をスクランブル。 ここでコンテキストがその安全でないデータを持つ それを暗号化する機会が来て、それをスクランブルする。 それでこれは、例えば、暗号化されたメッセージの例です。 これは、実際に英語で何かを言うが、それははっきりと完全に明確ではありません。 そして、我々はここに、この秘密のメッセージとは何かを離れていじめるために今日完全な円を来ます。 彼らは英語のフレーズかもしれないようですが、コンピュータの現実の世界では、物事はさえ見ていません。 例えば、これは、標準のLinuxやMacやUNIXコンピュータ上で見つけるかもしれないものである パスワード·ファイルと呼ばれる昔々あったファイルに記録します。 今日では、他の場所に移動した。 あなたは、システム上の適切な場所で見てみると、あなただけではなく、あなたのユーザー名が表示されます またはシステム上の他の人のものですが、あなたはそれらのパスワードの暗号化バージョンが表示されます。 確かに、そこにワードcryptは、以下のものが暗号化されていることを示唆している そしてこの一見ランダムな文字と文字と数字のシリーズなど 一般的にはいくつかの秘密を知ることによってのみ復号することができます - シークレットワード、暗証番号 - ので確かに、暗号化の技術は、最終的に帰着するいくつかの並べ替えの信頼に そして、他の誰かがいない何かを知っている。 だから我々は今日、もう少し詳細にこれを見ていきますとPSETに来て。 そして今、合格/不合格の単語。 あなた方のうちの何人かはPSET1、家庭用品、飛び込んだき、特にとして あなた自身のための、非常に新しい世界、そのフラストレーションと混乱を実現 とだけ技術的な問題は非常に予想される、 特にちょうどそんなに新しいあり第一PSETと、 ちょうどlsとcdに慣れ親しむことと、これらのすべての難解なコマンド 新しい環境、そしてその実際の素材とは別に、自身のプログラミングです。 だから支持構造として存在し、オフィスの営業時間は、確かに存在することにも気付く。 のセクションでは、今度の日曜日から始まります。 しかし、最も重要なのは、これがあなたのための世界ではないというだけのこと感じている場合、 それは本当にちょうど時間がかかりますことを実現します。 そしてそれは、クラスパスを取って/失敗の私にとっては数年前にこの機会を与えなかった 正直なところ、私も教室に足を踏み入れてもみなかった。 そして、あなたは、もちろん第五月曜日、言うまで、このアップを変更することができます あなたが今エッジにしているそうだとすれば、完全に実現することはなく、頭いくつかの他の海域​​に、 確かにちょうど合格/失敗し変更することを検討してください。 繰り返しになりますが、物事を取ることをハーバード大学でここは本当にこの国の文化なさそうだ合格/不合格 誰もが本当に実現するか、〜以上の成績を収める読んでもらいたいので、 しかし率直に言って、これは何かを試すの素晴らしい方法です 、、非常に細かいことはあなたに慣れていない場合があります、あなたは、ほとんどの場合、やって終わるだろう 多分ずっとあなたの驚きに。 そして、より具体的に、私はありません一般的に合格/不合格かと思う あなたはPSET0で経験したかもしれない、特にとして、 あなたには、いくつかのpsetに10時間、15時間、25時間以内に置けば とするだけで壁に頭を強打していて、それが夜遅くなってきたスーパー しかし、あなたは道のpset 90%を撮影したとするだけで、一つのことを把握することはできません 合格/不合格本当に、このようなクラスの端を脱ぐ あなたは喜んで、さて、私はそれは完璧ではないと知っている "と言うのを並べ替えることができますどこに しかし、私はこの上に私のお尻をオフに働いて、私は "それは終わった場所にはかなり満足している それは合格/不合格の期待に応えていきます。 だから、このことを念頭に置いておくん。かしこまりました。 ハーバード大学のWi-Fiを使用するには苦労しているあなたの人々ですから、 周りに浮かんで、CS50のSSID、Wi-Fi接続があることを知っている あなたのためのより良い運を持っているかもしれない。 それは少し皮肉だあなたはこれに接続して試してみたい場合には、このためのパスワード、 そしてそれは良いのない場合はお知らせ - - より良い速度のために、最大8つのすべての方法12345 8は5よりも安全であるためです。 だから、Wi-Fiパスワード、ワイヤレスでここCS50に接続する場合は、12345678を、必要がある場合 そして、あなたはまだ断続的な接続性の問題がある場合、議論CS50に投稿 そして、私たちはこの空間のために知っていることの力をもらおう。かしこまりました。 特に、すべての物事のアップルのファンの男の子または女の子であるあなたの人々のために非常に速く、無理難題。 私は数年前から掘って、、ここにiUnlock.cこのファイルでした だけの種類のより具体的な、より複雑なことに 私たちが書いてきた、より基本的なC言語のプログラムの一部。 だから私はiUnlock.c、このファイルを開いた。それは今日の講義のページで利用可能なのです。 左側には、機能の長いリストを参照してください。 だから、これを書いた奴はメインよりも多くの機能を、書いています。 彼はここにライブラリの全体の束を使用しており、我々はスクロールを開始した場合、 何これは実際にあると、元のiPhoneのための非常に最初、私は信じて、亀裂があります。 あなたは、AT&Tから〜のいましめを解くことを意味し、オリジナルのiPhoneを脱獄したいとき そして実際に、その上に特別なソフトウェアをインストールし、Appleは人々が何を望んでいないということを行う 誰かは、彼らがソフトウェアの欠陥を悪用する可能性があります正確にどのように把握するために時間がかかった したがって、アップルソフトウェアのミス、バグ、およびが生まれたiUnlock.c- - そのあなたのコンピュータ上でそれをコンパイルし、iPhoneにそれをインストールした場合 それは、USBケーブル、言う、を介してコンピュータに接続されていた これはあなたのiPhone上で管理者権限またはroot権限を与えるだろう とあなたはかなりあなたがやりたいことができます。 それで、この魅力的な猫とネズミのゲームがありまして アップル、多くの企業のように、彼らのような特定の世界の他の部分との間に、 あなただけの彼らが意図したものそれを行うことができるように自分の作品をロックダウンしてみてください。 しかし、このような人々と低レベルの詳細の理解のおかげで - この場合のCプログラミング - とおなじみのコンストラクトの多く 私達は一緒に遊んで始めたことを、あなたは本当にハードウェアを活用することができます の方法では、フィット感と、いくつかの企業体である必要はありませんを参照してください。 だから例えば、私は、このすべてが何をしているのか見当がつかない しかしバージョンの取得は、かなり簡単なように見えます そして、それは次のようになり、この人が書いた関数である。 これは、引数として整数のいくつかの種類を取り、何も返しません 条件ブレークしかし、もし、ここでループやif条件のためにループに表示されます 我々は下にスクロールしている場合や何らかの形で、バージョン番号に関し、 これらのキーワードの多くは、新しいことを行っているにもかかわらず。 そして、我々は見たことがないし、これまで表示されないことがあり、ここでの関数の全体の多くはあり 学期の経過。 一日の終わりに、それは我々がこれまで一緒に遊んできたのと同じルールとロジックに従っています。 だから、これは、あなたのiPhone 3sまたは4sのか、まもなく5Sこれらの日をクラックするにはあまりにも古いです しかし、それはすべての非常に我々が飛び込んだきたこの世界から派生していることを知っています。 のは、もう少し簡単な例を見てみましょう: この1は、単にいくつかの構文を使用して暖め始めるために、また、いくつかの他のデータ型 私たちは話をしましたが、実際にC言語で見たことがない これはpositive1.cと呼ばれるファイルであり、先頭のコメントにつき、 これは単に、ユーザーが正の数を提供することが求​​められています。 そのため、ユーザ対話型プログラムのための素晴らしいです、do-whil​​eループの例です あなたが何かをするようにユーザに指示する必要がどこに、 そして、彼らはあなたがそれらで叫ぶまたはそれらの入力を拒否する協力しない場合。 ポイントのケース:私は24行目まで19をするつもりです 限り、ユーザーは私に正の数を与えていない。 18行目でここにこの詳細は、なぜ私はこの全体のループ構造の上にnを宣言した としては、私が実際にnを取得する気に22行の横にある右に反対?うん。 [学生]スコープ。 >>うん、スコープのようにこの問題を解決しました。 と普通の言葉に、範囲はに何を指しているのでしょう? うん。 >> [聞こえない学生の応答] >>あなたは大声で少し話すことはできますか? あなたは、その変数にアクセスすることができます[学生]。 >>パーフェクト。 どこで特定の変数にアクセスすることができます。 そして一般的には、親指のルールは、これまでされていることをいくつかの変数のスコープ あなたが見てきた最新の中括弧で定義されています。 私は22行目のnを宣言のミスを犯した場合、したがって、この場合には、そのラインが働くだろう。 、私はint型になるだろう、と私は、22行目でその変数nに入れたい しかし、コードのどの行には、今私が何について話しているか見当がつかないでしょうか? >> [学生] 25。 [マラン] 25、この場合、それは中括弧の外側にあるので、それは同様に24が判明した。 迷惑のだから少しだけが、非常に簡単に、単純に変数を宣言することで解決 関数自体の外。 我々は、あなたが一歩先を行くことができます今日は後ほど説明します あなたも少し怠け癖がつく可能性があります。 そして、これは一般には推奨されるべきではないですが、あなたも、怠け癖がつく可能性があり そして、ループの内側に、関数の内部ではなく、話すことではない、グローバル変数を置き 私は15行目でここに行ったようですが、ファイル自体に、すべての関数の外には、書いてきた。 これは、一般に、ひんしゅくを買うが、これは時々他の問題への解決策であると認識されている として我々は最終的に表示されます。 だから今のところ、我々はこのようにそれを残しておきますが、私たちはこれを書き換えることができるかどうかを確認してみましょう ほんの少し違った自分を表現し始めます。 このプログラムは、単に明確にするために、positive1です。 私はここで先に行くと、私の端末ウィンドウで入力し、positive1を作ってみましょう。 大丈夫コンパイルされます。私は、Enterを押して、positive1を実行するつもりです。 私はあなたが私達に正の整数を与えることを求めています。私は-1と言うでしょう。それは動作しませんでした。 0、99。それが動作するように思われる。 多分ない最も厳格なテストが、少なくともそれは素敵なサニティチェックだ 我々は正しい軌道に乗っていることを確認します。 だから今、私が先に行くと、これのバージョン2を開いてみましょう そして既に何が違うのですか? それは同じことを実装していますが、何が明らかに異なる今回のように外に飛び出すのか? 緑の中で、このブール値。それは緑、データ型であるブール値、として知られているこのキーワードで強調表示されます。 これは、Cのすべてのバージョンに組み込まれて来ていない あなたは、特定のライブラリをインクルードする必要があります。 我々のケースでは、私たちはboolへのアクセスを持っているので、CS50ライブラリが含まれていた。 しかし、18行目では、我々はここに感謝と呼ばれるブール値を持っているように思われる。 私はこの何かを求めているかもしれませんが、私はそれは感謝と呼ばれる ちょうどいくつかの意味を伝えるの種類に。 だから最初は18行目で、私は明らかに感謝してないんだけど 感謝してブール値は18行目でfalseに初期化されているので。 そしてそれは私が23を介して、ライン21にここで何をやったかと思われる 私はちょうど一種の私のロジックを書き換えてきたさ。 ない機能的に異なるので、int型は、ユーザーが提供した場合ですが、22行目で、今私はチェック 0より大きい場合は、私は単純にtrueに感謝の値を変更します。 そして、私がなぜそれを行うのですか? 25行目にあるので、明らかに私は条件をチェックするつもりです。 感謝がfalseのときにこのループを行う。 だから私は、バージョン1の代替としてこれを提案した それはおそらく、少なくとももう少し直感的なので、それはもう少し英語で接地だ。 感謝がfalseのときに感謝じゃないか、そうしながら次の手順を実行します。 そして、この時間はあまりにも私は明らかに、ユーザーが入力した内容を覚えて気にしない 予告ので、そこには変数nので、実際には、小さな白い嘘はありません。 我々はそれの一番下にした途端に、機能的には、プログラムが少し異なっています 私はnが何であるか覚えてないんだから。 しかし、私たちはgetIntを見てきたにもかかわらず、あまりにもここにいることを証明したかった との右辺で使用されてGetStringメソッドは、これまでのところ、等号 私たちは価値を覚えていること、技術的に、それは厳密には必要ではありません。 もしあなただけの値を保存する気にしない理由のいかんにかかわらず、 あなただけの、我々は単にこのような場合、getIntを書くことができていることがわかり、値を確認したい 開いた括弧、括弧近い。 その関数は、我々が言ってきたように、値を返すことになるだろう。 それはintををお返しになるだろう。 そしてあなたは精神的に、このような出来事を思えば 私は99で入力したときに、getIntは、番号99を返します 私のコードは、実際にこのあたかもので、概念的には、それは。 99が0より大きければ確かにそうだとすれば、感謝がtrueになり、 次に25行目では、私は今、感謝していますので、我々がやっている、オーッを実現 そして26行目では、我々は単に、 "正の整数をありがとう!"と言う それがために起こったものは何でも。 今すぐいわば、ここで若干の糖衣構文を実行してみましょう。 我々はpositive3でこの目と最後のバリアントで、このライン25をクリーンアップすることができるかどうかを確認してみましょう。 唯一の違いに気付くには、コードのどの行ですか? >> [学生] 25。 >> [マラン]うん、25。 そして、我々は本当にただまだこのトリックを見ていないが、我々は、月曜日に感嘆符を見た これは何を意味する? >> [学生]はありません。 >>いないか、または否定。 だからブール値を取得し、その値を反転させます。 真が偽になる場合は、falseがtrueになります。 だから、これは、私が提案したい、でも、コードを書くのはもう少し直感的な方法です 私はまだfalseに感謝して初期化するので、私はまだ、次の操作を行います。 時が来れば、私は、trueに設定され感謝 しかし今は本当にただ、口頭で左から右にこのコードを変換することができます ながら(感謝!)ビッグバンまたは感嘆符ではなく、の概念を表すので とても感謝していないが だから、もう一度、我々はそれ自体任意の新しい概念を導入していない。 我々がスクラッチで演奏するとき、我々は、バックブールの話 しかし、我々は単に多くの異なる方法で私たちのコードを書き始めることができますすぐに理解しています。 だから特にPSET1であなたには、いくつかのプログラムを書くための方法を考え出すのに苦労して一​​種のなら、 ソリューションの数に制限はありませんので、オッズは、あなたは運がいいアール あなたは時に起こることができます。 例えば、これは、ちょうど3つのプログラムの最も単純なためです。かしこまりました。 そして今、我々は月曜日に戻り値をこのノートに残って思い出す。 だから、非常に初めて、我々はちょうどメイン持たないプログラムを書いた。 それはまた、私がここで書いた独自のカスタム機能を持っています。 だから、31行目で34を介して、私はキューブの機能を実装しました。 それは、複雑ではありません。それはちょうどA *この場合は*です。 しかし、何それについて重要なのは、私がの形式で入力を取っているということです と私は、* A * Aの形式で出力を返すよ。 だから今、私は能力を持って、ずっと私はprinf単独で使われていたような、 キューブ関数を呼び出して、この関数を呼び出すことができます。 とキューブ関数は、いくつかの入力を受け取り、キューブ関数は、いくつかの出力を返します。 これとは対照的に、printfのちょうど何かをした。 余談として、それが値を返さない場合でも、それは、我々が気にかけていることは何も返されませんでした; あなただけの、一般的にそれを無視する。 printfはちょうど何かをした。これは、画面に印刷の副作用を持っていた。 ここではそれとは対照的に、我々は実際に何かを返しキューブ関数を持っています。 だから、これに精通しているために、それはかなり簡単なアイデアだ。 しかし、入力を渡し、出力を取り戻すのこの考えにあまり精通している人のために、 ちょうど何か超簡単に試してみましょう。 快適で誰もが簡単にステージに上がって来ている? あなたは同様にあなたのカメラに慣れている必要があります。うん?オーケー。 あなたの名前は? >> [生徒]ケン。 >>ケン。かしこまりました。ケンは、アップ時に来る。 ケンはここにある種の関数であることを行っている。 先に進み、これをやってみましょう。少し空想を取得してみましょう。 よろしくね。センターステージへようこそ。かしこまりました。 のがここでこのボタンを押してみましょう。かしこまりました。 だからここでは、現代の黒板を持っている と私は私は、例えば、main関数である と私は私の手にiPadを持っていない。 まあ、私はそれを言うことはできません - 私は本当にする方法を覚えていない。 私は本当に良い筆跡を持っていない、 ので、したがって、私はあなたが私のために、画面上に何かを印刷したい。 私は、メインプログラムである、と私はあなたがこれを言う必要がありますするつもり 私の鶏の傷でそれを書いて、次にあなたに入力を渡すことによって。 この演習では、関数と呼び出し元の関数の概念ですが、だから愚かな 及びこれに機能本当に沸騰ダウン返す。 私がメイン、私はちょうど、画面にprintfの、俗に言う、何かを書かれている 私は、このプログラムを実行していて、できるだけのprintf呼び出さ それは1つの引数を引用符または二重引用符の間に時々つのパラメータを取ります。 ここではその引数です。私はケンにそれを渡している。 彼は何年か前に書かれた数字ブラックボックスである ことは明らかだけ画面上のものを印刷する方法を知っています。 だから実行してください。 それは悪くはない。非常に良い。 だから今のケンは、実行中に行われます。彼は私に何かを手の甲する必要がありますか? はなく、私たちがこれまで見てきた。 繰り返しになりますが、printfは実際には数値を返しませんが、我々は今のところそれを無視しようとしている 我々はそれを使ったことがないので。だからケンのためにそれだ。 それで今、主は再びプログラムの制御を引き継ぐ そのコード行ので、printfは、実行が終了しています。 そして、我々は他の行が含まれているものは何でも実行して、私たちのやり方について行く。 だから今度は若干異なる例を試してみましょう。 ここで今回は、最初の画面をクリアしてみましょう、と我々はキュービング機能をするつもりだ、この時間 しかし、今回は、私は出力値を期待しています。 それでは、先に行くとこれを行うことができます。 今私は、xはxの立方体を取得言うコードの行を持っている。 コー​​ドの行、リコールは、次のようになります。x =キューブ(X); だから、これはどのように動作するように起こっている?先に進み、再びあなたに白い画面を挙げてみましょう。 私は今、xの値を書き留めてするつもりです、 時間のこの瞬間にどれがあることを起こる、のはそれをシンプルに保つために2、としましょう​​。 私は紙の上に私のxの値が2の値を、書き留めてある。 私はケンにそれを手渡す。 >>そして私はちょうど答えを書くのか? >>うん、ちょうど答えを書いてみましょう。 オーケー。そして今、彼は私に何かを返す必要があります。パーフェクト。セグエニース。 だから今、彼は、このケースでは8の値を教えて手の甲、そして私はそれで何をしますか? 実は - この権利を取得、見てみましょう。私はそれをどうするつもりですか? 今私はこの値を取得し、実際にメモリ内の同じビットに格納するつもりです。 しかし、私はここで苦労のようなものだ気付く。 ここで私は実際に、xの値を書けばいいので、私は少し混乱している 私は何をやったかを物理的にケンに値2を持っていた一枚の紙を渡しているので、 どのXだったし、実際、それは何が起こったかを正確です。 だから、あなたが関数を呼び出すとするときに引数を渡すことが判明 こんにちは同じように、世界のあなたは2点のような引数を渡すと、 一般的には、その引数のコピーを渡しています。 そして私は、ここに数字の2を書いたとケンに渡したのと同じよう それは私がまだどこかに値2のコピーを持っていることを意味する必要があります 確かに、今私は、値8を戻してもらいましたので、私はRAMに戻ってする必要があるため、 そして実際に私が一度数字の2を持っていた8を書き留めます。 だから視覚的に、文字通りでは、値のコピーを渡すのこの概念を覚えています。 ケンは彼のことをやって、何か私を手の甲 - この場合は8のような価値 - そして私は私がそれを周りに残しておきたい場合、その値を使って何かをしなければならない。 だから、これのすべてはずっと前にあまりにも精通して戻ってくるだろう。 ケン、ここでこのデモのために本当にありがとうございました。 [拍手] 非常によくやった。 最終的に我々がここで行ってきたことを呼び出し元の関数の一部に関し、その方法を見てみましょう。 私が先に行くと、ここでキュービング例に私たちを連れ戻すましょう。 我々は実際にはさらにこれを服用開始したい場合ことに注意してください、 我々はここで渡されている数xという事実に留意する必要があるとしている 実際に関数に渡されているものとは異なっている。 だからもう一度、コピーすることによって、このパスは一瞬で非常に密接な関係になろうとしています。 のは非常に適切ではまだ動作しません何かを見てみましょう。 私は、先に行くと、自然に欠陥がある第三バギー例を開くつもりです そしてそれはbuggy3と呼ばれ、それがスワップ機能を実装している。 ここでは、xとyは任意にそれぞれ1と2に初期化された主な機能を持っています。 我々は、getIntを使用することもできますが、我々は単純な運動が必要 ので、1と2のように、ハードコードされたのです。 ライン21と22では、我々は明らかに、xとyの行ごとに1を出力します。 次に23行目で、私は、ドット、ドット、ドットはこれらの値を交換していますと主張している。 私は明らかに2つの引数をスワップと呼ばれる24行目の関数を呼び出す。 関数は2つの引数を取るために、それは完全に合法です。我々は、printf既にそれを行う見てきました。 だから、スワップは明らかにxとyを受け取り、その名前が示唆するように 私はそれがこれらの2つの値を交換するために起こっていることを望んでいるでしょう。 それでは、私は25行目で主張する "スワップ!"と私は、xとyを転載 彼らが実際に交換されてきたという仮定の下で。 しかし、私は実際にこのプログラムを実行する場合 - 私はターミナルウィンドウを開いてみましょう、 私はbuggy3を作ってみましょう - 名前が示すように、これはよく終わろうとしていません 私は、入力xが1であることに気づくを打ったとき、yが2であるため、 しかも、プログラムの終了時に、彼らは、実際には、まだ同じです。 だから、実際に何が起こっているのケンとはちょうど今実証に基づいて? このスワップ機能に飛び込みましょう。それは超短いです。それだけで数行のコード長いです。 でも、ケンと一緒にここまで言われ、単純な物語に基づいて基本的な問題は何ですか? なぜスワップが壊れている? [学生]あなたは、コピーではなく、変数に格納している。 その通りです。我々は、コピーではなく、変数自体に保存している。 言い換えれば、スワップは明らかに2つの引数は、intをとり、 そしてそれは、任意に、aとbと呼ばれています とここまで私がそれぞれ1と2のx、y、、で合格しました 私は文字通り、xに渡していないんだけど、私は文字通り、yに渡していないよ 私はxとyのコピーのコピーを渡している。 それはあなたがスワップにコピーして貼り付けたかのようにほとんどの あなたはそれが実際に操作したい値。 その場合は、私はプログラムの開始が行を実行35、36、だそうだとすれば 私は37行目に到達したとき、物語の中で、この時点での値は何ですか? 物語のこの時点では、37行目は、この時点での値は何ですか? >> [生徒] 1。 [マラン] xは最初の引数として渡されたため、それはちょうど、右、1でなければなりません、 そして、この関数は単に恣意その最初の引数を呼びかけている。 同様に、第2引数はyで、それだけで勝手に第二引数bを呼び出すことと言えます。 この二分法は、実際にはかなり簡単に説明されています。それについて考えてみよう。 我々の誰も、printfを書いた人に会ったた そう確かに、彼または彼女は私たちの変数は30年後に呼ばれることになりましたか見当を持っていません。 ですから、あなたが書いている関数内の変数と呼んでいるものとの間の区別が存在しなければならない そして、あなたが呼び出しまたは使用している関数内の変数と呼んでいるもの。 だから、他の言葉で、私は、xとyのようにmy変数を書かれている しかし、他の誰かがスワップ機能を書いていた場合、彼または彼女は確かに知っているだろう 何私の変数が呼ばれることになり、 ので、この名前の二重性を持っている理由、これがあると認識しています。 技術的には、私は、偶然にこれを行うことができます しかし、彼らはまだコピーとして渡されるであろう。 それはちょうど偶然だろう審美場合に、スワップを書いたあの人 同じ名前を使用していた。 だから物語の中で、この時点で、37行目は、1であり、bは2であり、そして今、私はそれらを交換するに進みます。 まず第一に、私は実際にははるかに簡単にこれを行うことができます。 私は、これらのコードの3行は何をしていたかわからない。 私はちょうどこれをやってみましょう:B = A;はa = b;行われます。 なぜこれが、論理的に壊れたのですか? それは右、直感的なものの一種ですか? だから、BとBになるになる しかし、問題は37行が実行されるとすぐに、aとbの値はどうだということですか? あなたが泥酔してたので1、同じことは、いわば、あなたは等しくなるようにbを変更しました。 だから一度37行が実行された、それは素晴らしいことだ、あなたが今1番の2つのコピーを持っている この関数の内部では、38行目で言うので、その後ときA = B、 あなたはただ1から1を代入しているので、ねじ込ん一種のだ。 に、どのような種類のあなたが気にかけて価値を失ってしまった。 だから、これの元のバージョンでは、私がやったことに気づく。 私の代わりにこのように見えたコードの3行目を持っていた。 私は一時的な変数を宣言します。 tmpは一時的な変数のための非常に一般的な名前であり、それはintだ それは私がのコピーを作りたいものと一致する必要があるため。 私は、37行目が実行されたので、一旦、tmpの内部のコピーを保管 の値は - 迅速な健全性チェック - 1、bの値は2であり、 とtmpの値も1になります。 だから今は、38行目を実行します。 38行目が実行されると、bの値をとります。 aとbが2であったので、今は2である。 だから物語の中で、この時点で、2であり、a、bは2であり、tmpは1です だから今論理的に、我々はbにちょうどウンチのtmpの値ができると我々は完了です。 だから我々はその問題を解決しました。 残念ながら、私はこの形でこのプログラムを実行するとき、それは実際には任意の値をスワップしません。 しかし、明確にすることが、なぜですか? 私は、さっきから論理的な問題を修正しました 私はこのプログラムを実行する場合、再び、、xとyは変わらない プログラムの実行の終わりまで。 [聞こえない学生のコメント] >>我々は何も返されていないが、本当だそう。 なぜなら、これまでの問題のビットがここにあるのOUTしかし、それは、ターン 我々は戻ることができてきた唯一のものは、一つのことであり、これはCの制限です あなたは私がここで立ち往生のようなものだその場合、実際に1つの値を返すことができます 私は、xの新しい値を返すことができますか私は、Yの新しい値を返す可能性があるため、 しかし、私は両方のバックが欲しい。 だから戻って、ここで単純な解決策ではありません。 しかし、問題は根本的になぜですか?我々は実際には何を交換している? [学生] aとb。 >> aとb。 しかし、AとBは、我々はちょうどこの作品のすべてをやったことを意味し、xとyのコピーです 我々だけで、スワップ機能と、これらの変数のすべての3つの話を3分を費やし そしてそれは、単独で完全に正しい、素晴らしいことだ しかし、AとBのスコープはここでしかこれらの行にあります。 だから、あなたがのためにループ内の整数iを宣言した場合、forループのように、 同様に、あなたが書いた関数のaとbの内側を宣言している場合、 彼らはすぐにスワップの実行が終了するような手段は、その関数の内部でのみ有効な、ね そして我々は24行目から25行目は、xとyに行くまったく変わっていない。 あなただけの変数のコピーを交換する時間の全体の多くを無駄にした。 だから、これを解決する方法は、実際に非自明であることが判明した。 我々は1つだけ値を返すことができるので、それは、値を返すようにするため、非常に十分ではありません と私は本当に、同時にxとyの両方を交換したい ので、我々はこれに戻ってくる必要があるとしている。 しかし、今のところ、問題は根本的にaとbがコピーであることに由来していることを実現 そして彼らは自分のスコープ内にあります。 何らかの方法でこれを解決しようとしてみましょう。 これの第4の変形、buggy4と呼びましょう、実際にここに戻ってスクロールして開くさせて頂いております。 これについてはどうですか? これは、我々はそれを解決するで刺しを取る前に見て似ていますが、単純な問題である。 このプログラムは、インクリメントと呼ばれ、それは明らかに18行目で1にxの整数を初期化しています。 私はその後、xが1であると主張し、私はその後、 "インクリメント..."主張 私はその後の増分を呼び出すのではなく、その後の行22と23で、私はそれがインクリメントされての請求、 2、おそらく - - 私はxが何であれ今であると主張するが、このプログラムはバグが多いです。 何が問題なの? うん。 >> [聞こえない学生の応答] >>その通りです。 だから、xは18行目には、明らかに、宣言されています。 それがメインの中括弧の中にある。 だからここに簡単な答えは、xがここに存在している間ということです それは32行目に存在しないので、このプログラムは、実際には、コンパイル時にエラーとなります。 私はこのコードをコンパイルしてみてくださいコンパイラは私に向かって怒鳴り起こっている いくつかの未宣言の識別子またはその旨を何かについて。実際、やってみよう。 これはbuggy4を作ることです。そこにそれがある。 32行目で宣言されていない識別子は 'x'の使用。 そして、実際に、これが有用であることそれでは、今日ここより明確になるであろう 営業時間や家庭で。 それが書かれた暗号のような少しだということに注意してください。 しかし、Clangのは持っているという事実はbuggy4.c言って、私達に怒鳴ら:32:5、実際に有用である。 これは、エラーが文字位置5の32行目にあることを意味します。 だから、1、2、3、4、5。どこに問題があることは、実際には、です。 また、あまりにも、営業時間や家庭で心に留めて、私はここでラッキーだ。 私は一つのミスがあります。それは修正することは比較的容易になるだろう。 しかし、あなたは圧倒的なエラーメッセージの完全な画面全体を取得する場合、 再び最下位の1がちょうど一番上の1の症状かもしれないことを認識しています。 だから、常にトップダウンからバグを追いかける ただデイジーチェーンの効果があるかもしれないので、 それはあなたが実際に行うよりもずっと問題を抱えている示唆している。 私の目標は、xをインクリメントする場合ので、どのように我々はこの問題を解決するだろうか? >> [生徒]×グローバルを作成します。 わかりましたので、我々は、xがグローバルにすることができます。 、Let 'sは、私は約以前警告したショートカットを取るが、一体、私達はちょうど簡単な修正を必要とする だからここまでのint xを言ってみましょう。これは、xがグローバルになります。 だから今、メイン、それへのアクセス権を持ち、増分はそれへのアクセス権を持っている ので私が先に行くと、すぐにこれをコンパイルしましょう​​。 buggy4を行い、入力します。今コンパイルしているようだ。 buggy4を実行してみましょう。そしてそれは実際に動作しているようです。 これは、私はしないように、私が言うようにやるのは、これらのものの一つである 私はちょうどので、一般的に、ここで行ったように、 私たちのプログラムは、これよりもはるかに興味深いとはるかに長く得ようとしている、 そして人生の問題に対するソリューションは、ちょうどあなたのファイルの先頭にすべての変数を入れている場合、 非常に迅速にプログラムは管理が恐ろしく難しいのですか。 それは、新しい変数名を考えるのが難しくなる それは、変数が何をやっていることを理解することが困難になる ので、一般的に、これは良い解決策ではありません。 それでは、良いこれを行うことができます。 私たちはここで、グローバル変数を使用する必要はありません。 私はxをインクリメントしたいので、私は明らかでした - 我々だけでこれを行うために、一日の終わりには、これは愚かな物語のようなものです - しかし、私はその演算子については知りませんでしたか、私はそれ自体メインでそれを変更することが許可されなかった場合、 他にどのように私はこの時間ではなくキューブにこっちケンを実装することができますが、インクリメントする? どのように私はここにこの事を変更するのですか?うん。 [学生] xの渡し、その後、戻り[聞こえない] >>さて、良い。 では、なぜ私は、xに渡し、その後ではなく、それを返さない なぜ私はちょうどx + 1を返すことはしない。 カップルより多くの事はここで変更する必要があります。私は正しい軌道に乗ってよ。 私は微調整するために他に何が必要なのですか?他の誰か。うん。 [聞き取れない生徒の応答] それがvoidではないので、私はインクリメントの戻り値の型を変更する必要があります。 、ボイドは何も返されませんされていることを意味しますが、明らかに今はある に変更するには、このニーズはそう - >> [生徒] intです。 私は実際に戻ってる何と矛盾しないようにint型。 今すぐ何か他のものはまだここにバギーです。うん。 [聞き取れない生徒の応答] >> [マラン]私はxをインクリメントする必要がありますね? [聞き取れない生徒の応答] >> [マラン]ああ、そう、私はxを渡す必要があります。 だから私はここにこれを行う必要があります。 >> [聞こえない学生のコメント] [マラン]だからプロトタイプは、私がここでこれを設定変更する必要があります。 これはint型になることがありますので、これはなっている - うーん、私は実際にここにバグを持っています。のは、最初にこの1を修正しましょう​​。 これは実際には何をすべきか?それはint何かがあるはずだ。 あなたが変数xのすべての呼び出しを開始した場合、それは、率直にXであるが、可能性 それはどれがどれだかもうあまり明確な得るために起こっている。 だから勝手に、私のヘルパー関数に異なる命名規則を選択してみましょう 私が書いている機能。我々はそれと呼ぶことにしますか、我々はそれを呼び出すことができます - それは数さらに明示的にするために呼び出してみましょう。 それでは私は数がプラス1で、何でも返す必要が そして今、私はこことここでもうひとつ、最大1他の事を変更する必要があります。 私は、最初の21行目に変更するには何がありますか? >> [聞こえない学生の応答] [マラン]私はそれをxに代入する必要があります。私はちょうどインクリメント(x)を呼び出すことはできません。 私は左側にxの値を変更することで答えを覚えておく必要があります。 とxが左と右に今あるにもかかわらず、それは全く大丈夫です 右側が最初に実行されるので、左側のものにそのまま流しこむれる - この場合のx。 そして、最後に、これは今では簡単な修正です。 これは単に、以下のものをダウンのINT番号と一致する必要があります。 だから本当に愚かな関数の変化の全体の束 しかし、我々はますますやりたいだろうというものの代表。 だからbuggy4を作る。私はどこかでしくじった。 ああ、私の神。 6行のプログラムの5つの間違い。 だから18行、文字5日に何が悪いの? だから私はこの、int型を宣言する必要があります。 見てみましょう。その他のエラーの全体の束があります。 ああ、私の神 - 19、18、21 - しかし、再び、ここだけの画面は、コントロールLをクリアしてみましょう、 とClangのを再実行してください。 だから5の問題は実際にはその1です。 だから今のEnter、buggy4を実行してみましょう。やれやれ、xが正しくインクリメントされている。 かしこまりました。数字をインクリメントする方法について何か質問はありますか?うん。 [聞こえない学生の質問】>>良い質問です。 それは私はただの数字にxを変更することができますし、プログラムがすぐに知ることがどうですか? 繰り返しになりますが、この抽象化と考えることもできます。 私がメインですし、ケンはインクリメントされていたら、率直に言って、私はケンが自分のiPadを呼んでいる気にしない。 私は彼がこの機能の彼の実装と関係している何と呼んでいるものを気にしない。 これは、私は、メイン、気にする必要がないことを、実装の詳細です。 それで、単に関数の内部一貫してそれを変更する - 数はこことここ数 - それは私が再コンパイルする限り、かかる時間です。 あなたは私たちの約多くを考えるなら、それは運転免許証を持つあなたのもの、好きなものだ 、誰が運転したか、あなたも車の中で運転した場合 私たちのほとんどは、車がボンネットの下にどのように動作するか見当がつかない。 あなたがフード、私たちのほとんどを開く場合、文字通り、 - 私自身を含めて - 本当に我々が探しているものを知っているつもりではないが、 あなたが今、このようなものと感じるかもしれないような一種の。 しかし、我々は本当に、車がどのように動作するかを気にする必要はありません 私たちは何車内ロッドとピストンとすべてのケーブル気にする必要はありません 実際にやっている。 ですから、ピストンと呼んでいるもののようなものは、このケースではここでは関係ありません。同じ考え。 うん。 >> [聞こえない学生の質問] 前に変数XAモーメントのより用途がある場合は、 あなたは、プログラマが、どこでもそれらを変更する必要があります。 それとも、文字通りファイル、メニューの操作を行い、[置換、見つけることができる - のようなものを - しかし、あなたはそれらの変更を自分で作る必要があるとしている。 あなたは一貫している必要があります。 >> [生徒]複数の変数がある場合は[聞こえない] ここのように特定の順序、これがあった場合は、別の番号をint? >> [学生]が正しい。 [マラン]うん。関数を呼び出しているときに順序が問題になります。 だから私は、何かコンマ何かでここに増分を呼び出していた場合、 ダイレクトマッピングがあります。 最初の変数は、それが呼ばれるものは何でも、こっちの最初の引数のコピーが作られています。 申し訳ありません。これは、括弧であってはならない。 二番目と二番目の引数ラインアップ。オーダーだから、そう、事項。かしこまりました。 申し訳ありません。私はそこに着くために長い道のりを取った。その他の質問は?かしこまりました。 だから我々は実際にここで何が起こっているかの絵を描くことができないかどうかを確認してみましょう フードの下に、いわば。 これは、コンピュータのメモリを表すかもしれません四角形です。 あなたはメモリがどのように動作するかのアイデアや方法RAMが動作していない場合でも、 少なくともあなたは、これらの日それの束を持っていることを前提としています。 あなたがそれのメガバイトを持っている、あなたはそれのギガバイトを持っている そして我々はバイトだけで何であることを0週目から知っていますか? >> [生徒] 8ビット。 8ビット、右か?だから8のゼロと1。 お使いのコンピュータは、RAMのギグ、RAMの2ギグ、これらの日を持っていますので、もし あなたは、メモリの億または20億バイト、または約8億160億ビットを持ってい お使いのコンピュータの内部。 少しふんわりウィリーの例とは違って、それは一般的にはもう磁性粒子ではありません。 ますます - 少なくともノートPCで - それは、ソリッドステートドライブ、SSD、だ ただ可動部分を持たないこと。それは、すべての電子です。これは、すべての電気ベースだ。 だから、あなたが持っているメモリの1または2ギガバイトを表すものとして、この長方形を考える。 だから、メモリの塊だ。 コンピュータサイエンスの世界では、ソートで仕切られている さまざまなことを行うためのメモリの塊。 例えば、そこに矩形で示唆したように、これは、コンピュータのRAMである場合、 それは、慣例により、あなたのRAMの最上部にある、いわばことが判明 テキストセグメントと呼ばれるものが一般的である。 それらはあなたがコンパイルした0と1です。 だから我々が何であるかはa.outでフードの下に見てきたときに、 あなたがプログラムを実行するすべてのこれらの0と1、 それらの0と1は、RAMと呼ばれるものには、ハードドライブからロードされます RAMに彼らは先頭に配置している。 一方、あなたは他のものを持っている:データの初期化を解除し、データを初期化します。 メモリのそれらの2帯状の領域を使用すると、頻繁に使用していないグローバル変数を参照してください もしそうなら、時には、彼らは同様にそこまで終わる。 環境変数は、私たちが多くの時間を費やすことはしませんが、:そしていくつかの他のものはあり 学期を通して戻ってくるだろうが、その後、2つの重要な事柄、 スタックとヒープ。 プログラムを実行するときに、コンピュータのメモリのほとんどが予約されています 何かのために、スタックとヒープと呼ばれるものと呼ばれる。 今日はヒープについて話をするつもりはないが、我々はスタックについてお話します。 スタックは、マザーハウスにダイニングホールミールトレイのビジュアルを想起させることを意図している またはどこでもあなたは、ダイニングホールスタッフが毎日それらをきれいにどこのことが起こる 彼らは上の階からそれらを積み重ね、 と同様に、メモリでは、スタック上に何かを入れてのこのアイデアは、そこにある スタック上に何かを入れて、スタック上に何かを置く。 そして、我々はこれで何を意味するのですか? この写真のちょうど下半分には、コンピュータのRAM上でズームしてみましょう 次のことを提案する。 それはあなたがa.outまたはhelloのようなプログラムを実行するとことが判明 - - プログラムは、あなたが書いたことは何でも 再び、これらの0と1は、長期保管であるハードドライブからロードされます。 あなたがRAMにロードされたプラグを引っ張るときでさえそこにとどまります。 RAMはハードドライブよりも高速である - それはハードドライブに比べて小さいです - あなたがそれらを実行している間にプログラムがどこに住んでますが、それは。 ですから、二重のMacまたはPC上のプログラムをクリックして、それがRAMにハードドライブから読み込まれている。 それは、RAM、ウェイ上部に0と1を外出先にロードだとすぐに いわゆるテキストセグメントが、その後できるだけ早くあなたのプログラムが実際に実行して起動すると、 main関数が呼び出され、主、我々が見てきたように、多くの場合、ローカル変数を持っています そして、それは整数や文字列と文字などがあります。 だからあなたのあなたが書いたことをプログラムしたり、ダブルクリックしたプログラムなら いくつかの変数がメインの内側に使用され、 彼らは、いわば記憶のあなたのスタックの一番下になってしまう。 具体的には、これは実際に何を意味するのか? これはちょうど、我々は、コンピュータで数値にRAMのバイトに行く必要がある場合や、 これはバイト数が0の場合があり、これはバイト番号1、2、3、4、5、6、かもしれないことに気づく 最大2億〜すべての道は、そこまで最上部にあるすべての方法だろう。 だから、他の言葉で、私たちは、バイト単位でRAMまたはメモリについて話すとき、 それだけで、誰かが何番目のメモリ、これらのチャンクのそれぞれに決めたことを意味します。 ですから、intの32ビットを必要とするか、またはあなたは、charは8ビットを必要とするとき、 彼らは、メモリ内にどこに終わるのですか? 概念的には、彼らは単にスタックと呼ば​​れるこの事の一番下になってしまう。 メインは、関数を呼び出したときにしかし、何今面白いのはある - fooという関数を、単に任意の名前を付けるとします - このメモリのスタックの底に何が起こる主である; fooは今やメモリにメインの上に置かれます。 fooは概念的にメインのもの上記のようなものを結局した任意のローカル変数は、そう。 fooはbarと呼ばれる別の関数を呼び出す場合、これらの変数はここにたどり着く。 バーでは、こことここに何か他のものを、ここで、呼び出した場合。 だから、プログラムの実行について興味深い何が関数を呼び出すようにすることです それらの関数は、関数を呼び出すように、それらの関数は、関数を呼び出すと、 あなたは、メモリ内の関数のこのスタックを構築します。 そして唯一の関数の復帰後は、そのメモリを取り戻す始めるのですか。 だから、コンピュータ·プログラムでメモリー不足にする最も簡単な方法の一つ 決して戻らない関数を記述することです。 だから例えば、意図的にバグのあるプログラムと同じくらい示しましょう​​。 私が先に行くと#を含めるやってみましょう、 int型のmain(void)を、 そして、私は(2> 1)しながらやろうとしてんだけど、それはおそらくこれまで、我々に変更されることはありません と私は今、先に行くとprintfやらせる。 実際のところ、それは少なく視覚的に面白いことになるだろう。これを実行してみましょう。 ためます。int i = 0; i>の0 - のは、このミスをしてみましょう - i + +は。 そしてここでのprintfないようにしましょう​​。私が説教されたことを実践してみましょう。 レッツは、ここにメソッドは、voidコーラスを持って、私たちは、int iを言うよ そして私は、printf言うつもりだ - いや、してみましょう、これはもっと面白くなる。 実際にはまったく何も印刷されませましょう。コー​​ラスは、(i):ただこれを行うてみましょう。 かしこまりました。なぜので、だから、これはバグですか? プログラムが実際に興味のある何もしていませんので、私が行くように私はこれを作っています。 しかし、それはゴールではありません。 目標は、明らかに、その主な機能は何を行うプログラムを書くことですか? 自分自身を呼び出す。そして、実際に、我々はループを必要としません。 でも、これはただのように本当に根本的なバグを見失わないように簡略化してみましょう。 メインの呼び出しは、いくつかの合唱コーラスを歌う、 その後、私は愚かなことをしたと私は、コーラス·コールコーラスを持っていた 私は他の誰かが多分それを実装しようとしていたと仮定しているため、 そして今、これはまだコンパイルするつもりはない。私は何をする必要がありますか? 私はプロトタイプを必要とする、覚えています。 だから私は(int i)指定ここボイドコーラスを持っている必要があります; 私はここに行けばだから今 - 実際には、大きな窓を使用してみましょう。 先に進み、合唱を作ってみましょう。 先に進み、合唱を作ってみましょう。 iが宣言されていない識別子の使用。 ああ、それは愚かだった。我々は、引数を必要としません。ただ、これをやってみましょう。 私たちはこのように始まっていたと思います。それが書きやすくプログラムされていると思います。 そこ。それでは、私の端末ウィンドウの所へ行くClangのを再実行し、ここで我々は行くことができます。 それは本当に速かった。 実際に何がちょうどしかし、起こったのか? 我々が見ることができるので、さて、今私は、印刷行を追加します。 私は( "私はここにいるよ")printfは言わせない - 変数もありません。我々はそのようにそれを残しておきます。 私はmakeを再実行してみましょう。私はコーラスを再度実行してみましょう。 そして...に来る。続ける。 余談ですが、なぜそれがまだクラッシュしていない? セグメンテーションフォールトは前に超高速で起こった。 [聞き取れない生徒の応答] >>その通りです。だからそれは、右の印刷に時間がかかる? それはちょうど、コンピュータの一部に多くの作業を要する。 そして、それはそこにある:セグメンテーションフォールト。 だから、プログラムを実行にどれだけ早く気づく。 あなたは何も、超高速の印刷をしていない場合。 しかし、我々はまだ何が起こっていたので、このセグメンテーションフォールトを得たか。 あなたは、コンピュータのメモリがどのようにレイアウトされるかを考えてみれば、 これがメインであることを起こるが、ここのはちょうどこのコーラスを呼ぶことにしましょう​​、そしてこのコーラスを呼び出してみましょう。 私は右の私の美学を行う場合、現在は、これは単なるコーラス、コーラス、コーラスを、言おうとしている コー​​ラス、合唱、コーラス、コーラス、広告nauseum、最終的には、起ころうとしているのでしょうか? 文字通り大局場合は、これは単に概念的に何が起こるか、ですか? スタックオーバーランヒープ。 または、悪いことに、あなただけの、テキストセグメントを含むすべてを、オーバーラン これは、あなたのプログラムを表す0と1です。 要するに、これは単にスーパー、超悪いです。 あなたのプログラムが暴走螺旋た。 あなたが意図したより方法より多くのメモリを使用している なぜならこの場合は愚かな過ちのすべて、 このケースでは非常に意図的に行わ関数は自分自身を呼び出す。 さて、これはすべての不良ではありません。 あなたが正しくそれを使用するときに自分自身を呼び出している関数は、実際には偉大な力を持っています。 私はここでそれを正しく使用していない。 だから、これはすべての悪いことではありませんが、私は実際に自分自身を呼び出して停止することはありませんという事実 このプログラムのここに根本的な弱点です。 だから我々はこのすべてにどこへ行くのか?本当に何が起こっているの? 我々はこれらの例でやっていたように私はインクリメント関数を呼び出すと、 私が渡した1インチのような値を持っている 私は番号1のコピーを渡しますので、次のことが起こります。 インクリメントの例に入りましょう、右こっちにこの男。 ここでは、実際に何が起こっているかだ。 私はインクリメントを呼び出して、私はここで何が起こっているのか、絵を用いて、xに渡すときです。 私はここに1の値を格納していたと私は実際にインクリメントを呼び出す場合は、 これは、今ではコーラスと呼ばれて - iPadはここに私をオフに投げている。 この増分を呼び出してみましょう、私たちは、この関数は次のことを行っているのか分からない。 だから、実際に何が起こっているのは、私はメモリの塊を持っているメインのどこかにここにある それは数字の1を格納しています。 私はインクリメントを呼び出すときに、私は、メモリの別のチャンクを使用しています 今私は1のコピーを持っている。 私は、その値をインクリメントするとき、これは、2となる が、その後できるだけ早くインクリメント戻ると何が起こるか? このメモリは、単に、オペレーティングシステムに戻される これはあなたがやったすべては役にも立たないことを意味します。 もともとは主に含まれていた1が実際にまだそこにある。 だから我々はこれでどこへ行くのか? これは、メモリ内にあなたがこのバイトのバックツーバックのシーケンスを持っていることが判明 あなたにものを置くことができ、それは、我々はすでに何度か見かけたことが判明していること バックアップするためにバックアップするバックアップすることを背面入れ関与していること。 第1週となりました2週に基づいて、文字列とは何ですか? それはただの文字のコレクションです。 だから、あなたがメモリ内に数字を置くことができるのと同様に判明 同様にして、メモリ内の文字を入れることができます。 そして、かつて私たちは、背中合わせにし、背中合わせにメモリ内に文字を入れて起動する それは、ループまたはwhileループのようなものの最も単純なを使用していることが判明 我々は、文字列内の文字の上に左から右に繰り返すことができます とまったく異なる文字にそれらをマッサージ開始 - Bになる可能性があり、BがCになるかもしれない - 最終的に、我々は実際に理にかなっている英語の文章を取ることができるように と一度にそれらの手紙1のそれぞれを変換 私たちのコンピュータのメモリを介して歩くことによって、実際に暗号化するために左から右へ。 それでは、ここで我々の5分間の休憩を取りましょう そして我々が戻ってくるとき、私たちは情報にスクランブルをかけるのは、このプロセスを開始します。 かしこまりました。 、我々はいくつかの暗号に飛び込むと、これらのものは、アレイと呼ぶ前に 私は本当に一種の混乱したように私は感じるので、私に何か質問のために一時停止させ これらのトピックのいくつか。だから我々は、可能であれば今度は、修正しましょう​​。 我々は、ちょうど戻り値の話、我々は、引数の話 そして我々は、来て、我々は数週間内に戻ってくる、この概念、について話しました のいわば、これらの積み重ねられたトレーの全体の束のようにメモリを表示して、 このような最高の底からそのスタックに置かれる各トレイ 現在呼び出されている関数を表す。 何か質問? 私はここに質問をさせてください。 私はそれが我々の以前のQ&Aの一部の前にあったものにこのバックを簡素化しましょう 増分は開き括弧、int型の数値を持っているという事実は、括弧を閉じて - int型の数字は何を表すのでしょうか? [学生]引数。 >>引数。オーケー。しかし、引数は何ですか? [聞き取れない生徒の応答] >>これは何ですか?あなたはインチ渡すこと>> [生徒]サムシング さて、あなたが興味を通過して、より一般的には、それだけで入力だと何か。 あなたは生活の中で関数とその関数の目的を書いていた場合 、少し何か違う、あなたがそれを使用するたびに行うことです その後、実際に起こるための唯一の方法は、入力とそれを提供することであるように思えるでしょう その入力とするたびに異なる何かを行うことができますように。 ですから、関数が入力を取るときに2つの項目を指定する必要があります。 あなたは、その入力につけたい名前を指定する必要が 純粋に自分の都合のために、あなたはそれを参照できるように 私は32行目でここに行ったように、あなた自身が、書いていると機能が変更されます。 しかし、あなたはまた、Cはプログラミング言語であるため、そのタイプを指定する必要が それはただ、あなたが変数として使用したいなら、あなたはそれが何であるかのデータ型をコンピュータに指示されている必要があります 大部分はその変数に割り当てる何ビットを知っているように、 それが6である可能性があるため - 申し訳ありません、それは6ではありません。 それが16になることができ、それが8することができます、それは、あっても32個、64個できます が、コンピュータが認識する必要があります。 さて、左側にintは対照的に、何を表す? [聞き取れない生徒の応答] >>これは何ですか? >> [生徒]関数のタイプ。 関数のタイプと、より具体的には、その出力のタイプを指定します。右。 だから括弧内のものに対し、その入力があれば、表し 左側にあるものは、その出力を表します。 この場合、増分は明らかに、intを返します ので、int型では、この関数の戻り値の型です。 それは何を返すためにどういう意味ですか? 文字通りには、キーワードreturnを使用してから、あなたが戻ってきたらどう キーワードの右側に、整数である その後、それは我々が約束したことと実際に一致している。 それは、文字列であるため、 - こんにちは、世界 - あなたはこのような何かをすることができませんでした。 明らかに、それは整数ではありません。 だから要するに、負担が特異的であるように、私たちに本当にプログラマです 我々は戻っているし、実際にそれを返すことについては移動するものとして。 ここでコンテキストは、コンピュータのメモリがギガバイト、2ギガバイトであるということです - 何でも - それがさらに多分、多分それは少ないですが、 しかし、コンピュータは、さまざまなセクションを持っているとして、それを見ている。 何かがダウンした場合、何か他のものは、そこに上がる 、別のものは真ん中に行き、今日は我々だけで話をし始める しかし、我々はこれ以上の時間に戻ってくる。 今のところ、我々は本当に気にメモリの唯一の作品は、テキストセグメントである ただ、0と1をそのClangのを表すために出力した。 だからあなたがa.outのようなキーボードでコマンドを実行するとき または、ダブル、Mac OSやWindows上のアイコンをクリック あなたのプログラムは、あなたのハードドライブからRAMにロードされ それはいわば、コンピュータのRAMの最上部にそのまま流している。 一方、あなたのプログラムが起動すると実行され、mainが呼び出される あなたが書いたプログラムまたはプログラムで、MicrosoftやAppleが書いた そのローカル変数のいずれかは、コンピュータのメモリの最下部にそこに終わる。 メイン自体は変数や引数を持っていることを別の関数を呼び出す場合、しかし、彼らはそれの上に終わる。 その関数が何かを呼び出した場合と、彼らはそれの上に、その上に、それより上になってしまう。 と一度だけ関数の実行が終了するトレーのスタックは、いわばんが、 どんどん低く取得を開始する。 そして、これはキューブを呼び出すときに、一言で言えば、理由を説明するものである あなたはインクリメントを呼び出したり、値のコピーを渡しています。 や絵を用いて何を意味するかすれば、文字通りナンバー1を書いているということです メモリの別の部分で、その増分変更の場合には1から2 離れて、そのメモリを投げたり、キューブの場合は8とその後 とすぐにインクリメントまたはキューブ関数を返している。質問。 [学生]グローバル変数が保存されますか? グローバル変数は、現在初期化されたデータまたは未初期化データと呼ばれるものに格納されています グローバル変数を使用していて、すぐに値を割り当てることがあれば違いがある 等号と、それは、そこに上部に終わる あなただけのint型のxを言う場合と、値なしで、RAM内にわずかに低く終わる 単に慣例により。 その他の質問は?かしこまりました。 我々はより強力になるように、この絵は戻ってくるだろう 我々はコンピュータを使って何ができるかと、 しかし今のところ、のは暗号化を簡単にイントロを持ってみましょう 世界のすべての問題を解決するわけではありません暗号の特定のタイプ が、それらのいくつかを解決しますか。 ここでは、このケースでは、我々は、秘密鍵暗号と呼ばれるものを持っています。 秘密鍵暗号では、名前が示すように、秘密からその安全性を導き出します。 あなたは小学校に戻っていたとした場合例えば、あなたはちょっとした秘密の愛の手紙を渡していた あなたが聴衆を介して、そのノートを渡したい場合は、上の破砕された男の子か女の子に、 あなたはおそらく、英語で、ノートを書いたり、何でもあなたの母国語ではないだろう。 むしろ、あなたはそれを暗号化したり、あなただけのこれらの日彼らにテキストメッセージを送信することがあります。 しかし、あなたが実際に教室の中にそれらにメモを渡すことがあります。 お友達や先生にそのような方法で確実にこれを実行するには あなたが書いているかわからない、あなたは、かなり単純なアルゴリズムを思いつくかもしれません あなたは若いかもしれないけど、言葉だけをスクランブルする。 だから代わりに書き込むのは、bを書くかもしれない 代わりにCを書くことがあるbの、 Cの代わりには、等dを書き、可能性があります。 それとも、より洗練された翻訳を考え出すこと 異なる文字への手紙。 しかし、漁獲量はこのノートを送っている人に男の子か女の子です 明らかに、何か何かを、知っている必要があります? >> [生徒]あなたは何を送っている。 あなたの秘密はさんとBさんとCさんとDさんの間に、そのマッピングが何であるかのように、何ですか。 それだけでAからB、BからCへ行くの各文字に1を加算していますか? それはそれよりもっと複雑なのですか? だから、あなたとあなたのときめきは、この秘密情報を持っている必要があります しかしここでキャッチ22の種類があります。 これは非常に初めての場合は、クラスを使用してこの愛の手紙を送っている どのようにその男の子か女の子は秘密でも何であるか知っているのだろうか? だから、秘密鍵暗号では、世界のすべての問題を解決するわけではありません との関係は、私たちが学期の終わりの方に戻ってくることをここに実際にあるのです。 同様に私たちのほとんどは、Amazon.comで、例えば、働く人を知らない そしてまだ私たちの多くは、おそらく、Amazon.comでものを買った そして我々は、これらの電子商取引のトランザクションが安全であることを仮定して教えられてきた。 URLは、愚かな小さな南京錠のアイコンがどこかに多分あり、httpsを多分言う あなたのクレジットカード情報を保護する暗号技術のいくつかの種類があり あなたとAmazon.comの間。 暗号が含まれる場合は、まだいくつかの秘密を知っている そしてまだ私はアマゾンで誰も知らないと私は確かに秘密の任意の種類を配置していないた Amazonで誰かと、どのように私のコンピュータまたは私のブラウザがこれをやっている? 暗号化の他のタイプは、その問題を解決することを完全にあり、それはアウトになります。 しかし、今日のために、我々は単純なものに焦点を当てていきます あなたには、いくつかの秘密を知っているため、事前に手配することができますどこに のような1またはのaとbの間の一部のマッピング。 と暗号化のプロセスは、一般的にこれを伴います。 あなたは左でここに示されているいくつかのプレーンテキストを、持っている あなたはそれを暗号化するためのアルゴリズムや手順のいくつかの種類を使用してそれを実行 - 多分それだけのBになり、BはCになります - そして、あなたは暗号文で終わる。 一方、一度あなたのときめきは、この秘密のノートを受け取る 彼または彼女は、一般的にそのアルゴリズムを逆にすることによって、それを復号化しています プレーンテキストを取り戻すように。 この物理的な化身があります。 例えば、これは、ちょっとした秘密のデコーダリングです これは2つのダイアルがここにありという意味で、リングです。 この事の外周囲には、AからZまでの文字、そこ 彼らはランダムな順番にしているものの、 そして内側には、いくつかの数字は、実際にはありませ このリングを使えば、外を回すの一種ではなく、内側にすることができるよう 文字と数字を並べるするために。 クリスマス·ストーリーという映画から、その少しRalphieが表示されます リトル孤児アニーの秘密のメッセージが彼に何であったかを把握するために熱望していた そのシリアルの箱に数字メッセージの形で、私が思うに、伝達されていた そしてあなたは、シリアルの箱に来たすべての小さなカードを蓄積しなければならなかった あなたがそれらをで郵送しなければならなかった、あなたは秘密のデコーダリングを取り戻す必要があった あなたは最終的にマッピングは文字と数字の間にあるかを把握できるように または文字と文字。 我々はこのようなものを実装したり、表現をどのようにコンピュータで行くことができますか? 我々はもう少し柔軟に自分自身を表現する方法が必要 our変数はこれまで許されているよりも。 我々は、我々が文字を持っていたが、int型を持っていた、我々は、floatとdoubleといくつか他の人を見てきた しかし、それらは本当に私たちが物事を表現することを許していないメモリの個々の部分である 言葉や文章やフレーズのような。 実際、我々はそのようなものの文字列を呼び出しましたが、 しかし、我々はこれが本当にCS50ライブラリ内だけ簡略化したものであることを約束 我々は戻っピールしようとしていること。 ので、ここでそれを行うには始めましょう。 私が先に行くと、ファイルを開いてみよう - これらのすべてのファイルが利用可能ですが、いつものように、オンライン - いわゆるarray.c 文字列とは無関係の問題を解決するが、それはここで絵を描くために 我々は配列と呼ばれるものを使用する方法の。 配列はデータタイプです。 それはそれの内側に小さな複数のデータ型を持っている一種の変数の型だ 背中合わせに背中合わせにします。 だから例えば、我々はあなたにあなたのクイズの平均を与える小さなプログラムを書きたい場合 2クイズを持っている50のようなコースのため、 あなたは非常に簡単であっても、先週の材料の一部に基づいて、このプログラムを書くことができます getIntおよびいくつかの変数を使用して:int型quiz1、int型quiz2。 そしてそれはかなり簡単です。 これは、プログラムを実装するために多分10、コードmaxの20行だ 2クイズのスコアをユーザーに要求し、それらの平均値を計算し、その 、それらを加算し2で割って、その結果を印刷します。 我々は、おそらく分をいくつか実行したあとでかなり容易になりましたことを行うことができます。 しかし、問題は50が3クイズや4を持っていたと仮定するということです。 あなたはクイズを毎週持っていたクラスに同じプログラムを使用していたと仮定します。 クイズを毎週持つクラスを考える。 学期中に16人ほど週があれば、今あなたが16の変数を持っている: int型quiz1、int型quiz2、int型quiz3、int型quiz4。 この冗長性を見始めるとすぐに、これは、コピーしてコードの貼り付け それはあなたがより良い方法があったならばなあ作るために開始する必要があります。 そしてありがたいことに、なぜなら配列の存在です。だから、これを実行してみましょう。 まず、私たちがこれまで使用されていませんでしたことを非常に単純なものを紹介しましょう​​、 しかし、あなたは、コード内で時折それを見ることができます。 これは一般的に定数と呼ばれるものです。 だから、この値が変わることはないという意味では一定です。 定数を作成する人間の慣習 ちょうどので、それが本当にあなたのコードの中で際立っていることを、すべて大文字を使用することです そしてあなたがC言語で使用する特殊なキーワードは、#defineされている。 だから我々は#次に、その後、あなたは一定の名前に使いたい単語をスペースを定義すると言う その後一定の値。 これは、変数に何かを割り当てるとは異なることに注意してください。 等号全くありません、セミコロンはありません。 これは、一般的にはプリプロセッサディレクティブとして知られているものである その別の時間で、より多くの。 今のところ、これはクイズと呼ばれる不変の価値を創造する その実際の数値は2です。 だから、どこでも、このファイル全体クイズ、クイズ、クイズを参照してください それはただのナンバー2だ。 私は今、主を見てみると、これがどのように機能するかを見てみましょう。 最初に、それは少し不可解に見えますが、それは第1週からのすべてのものです。 グレードのユーザーに依頼します。どのように我々はこれを行うのですか? 22行目では - これは本当にジューシーな一部である - 私はfloatを宣言する それだけではない一つの浮動小数点。私は、むしろ、浮動小数点値の配列を宣言しています。 その変数は、ここで暗示として、グレードと呼ばれようとしている しかし、新しい構文の唯一の作品は、これらの角括弧です。 私はその後、フロートグレードしてから、開き括弧と番号を言ってきたという事実 - これは、これはちょうど私達がこれをしたようなものである定数であると気付いて - これは、 "ねえ、コンピュータ、私に2山車を与え、それらを総称グレードと呼びましょう"という意味です。 これは、このような多くの退屈なプロセスと対照的になっています。floatグレード1; grade2フロート(以下同様)。 だから、配列は、私たちはこのアイデアを実装することができますが、あまりだらしなく、 我々は、と言うのではなく、16週間の学期のための16のコードの1行を書き込むことができるような方法で。 あなたが論理的に今、このことを考えるとので、私はハードコード2にしたくなかった、 3〜CS50変更が代わりにクイズ来年仮定 と私はここで数字の2を持っていた、私は、ここに数字の2を持っていた 私はここ2、ここに数値を数字の2を持っていた。 それは非常に面倒で、台無しにするのは非常に簡単になります と誤って3から1の値を変更し、2のいくつかの他の値を欠場する。 だから私は、この離れて代わりに抽象的に行くと、この定数を使用していること その名前が示唆するように、決して変化しません。 そして今、我々は別の持っているかどうかに関係なく、今年または次のクイズません 私はちょうど一番上にここに一つの場所でそれを変更する必要があります。 だからそれはすべての定数があるのです。 一方、新しい概念の特徴は、配列のことです。 だから、角括弧は私にこの多くの山車を与えると私は総称して、ここでそれらのグレード呼び出すことができます。 だから今私は何をするつもりか見てみましょう。 ここでは24行目のforループの始まりです。 これは本当に何も空想です。それだけでハードコードされた番号の代わりにクイズを使っている。 しかし、先週からそこに知的に異なるものは何もありません。 これは( "%dの%dをクイズ"など)ので、printf関数、printfのです 私はちょうど私が2の番号1をクイズしてから2の2与えるプリントアウトしたいので。 だから、これは純粋に美的なものです。 しかし、興味深い部分は、今や27行になっています。 浮動小数点値を持つ2つのプレースホルダのいずれかを記入するためには、 あなたは再び角括弧を使用します。 このforループは明らかに、私がどのような値に等しいを始めているので、この場合、私は私を使用しています? [学生] 0。 >> [マラン] 0。 だから、このループの最初の反復で、それは私がこれをコードで書いたかのようですが、 私は私のコードでこれを書いたかのように、このループの2回目の繰り返しでは、それはある。 名前が示すように、ので、しかし、私は変数を使用しているという事実は、完璧です それは、繰り返しごとにその値を変化させている ので、私はこの配列を一度に1つのスポットを充填しています。 この配列はどのように見えますか? 私はここで、画面上の超単純な四角形を描いた理由は前にこのような理由のためだった。 配列はメモリの別のチャンクが続くメモリの塊です メモリの別のチャンクが続くなど。 私の配列はここで、この場合は大きさが2であるのであれば、すべて私がやっているであろう 私のクイズの得点を入力してここ好き - 私はこの1つに100を得た後、私はこの1つに99を持って - 私はコンピュータのみを尋ねてきたので、このメモリがあっても使用できない場合があります サイズ2の配列のため。 これらの四角は右、ま​​だそこにいる? あなたはまだ、わずか2山車を求めている場合でも、2 GBのRAMを持っています。 だから配列の背後にある考え方は、コンピュータは単なるメモリの塊がかかるということです その後背中合わせにし、背中合わせに小さなピースをapportions。 そしてそうそれはすべての配列であるのです。 それはあなたが物事を置くことができるそのうちのメモリ内部の連続するチャンクです。 そして、これはほんの一部の退屈な算術演算を行うことを起こる。 私はここで下にスクロールすると、これは私がその配列を反復処理する場所です。 私は、配列内のすべての値の合計を思い付く そして私は実際にクイズで割った値の合計を行うにはここをラウンド関数を使用します。 しかし、私は今のところ十分な算術の一種としてその時点で私の手を振ってみましょう。 しかし、私のためにやっていることすべてが、最終的に平均を計算している。 だから、最初のクイズプラス第二クイズは2で割った後、int型としてそれをプリントアウトする。 しかし、今ではstring1と呼ばれる別の例に遷移してみましょう これは、似たような絵が、使用して文字列を描画します。 私が先に行くと、ちょっとこれを簡素化することができます。 今のインデントをお許しください。 この例の19行目に注目してください、私はユーザから文字列を取得します。 しかし、私は次の行に22以降をやっていることに気づく。 私は実際にiから最大反復している - これは新しいトリックです - strlenは、文字列の長さ。 これはつまり、あなたが文字列を渡す場合、Cが付属機能である それは、その文字列内にあるどのように多くの文字がわかります。それがすべてです。 そして、それは代わりに文字列の長さのstrlenのだという事実は、それがより簡潔だという理由だけです。 30年前、人々は、簡潔に、できるだけのことを書くのが好きだった ので、ここではその規則を守ってきた。 iは+ +だけで、各反復でiをインクリメントを意味します。 そして今、本当に興味深いです、これに気づく。 24行目では、私が言うには、 "コンピュータは、私に8ビット文字を与えると、それをCと呼ぶ。" しかし、これは言って右側には何ですか? 英語では、それが何を表すのでしょうか? [学生]配列内の最初の文字。 その通りです。私の配列の最初の文字を与える。 または、より一般的には、私に、配列内のi番目の文字を与える。 そして今、それが重要だという認識のコンピュータ科学者として、 私たちは実際に0からカウントしている。 あなたはこれをやって起動するようになりました裁量権を持っていない。 ここでは、コンピュータの期待に従って動作し、0からカウントする必要があります [0]があるため、文字列の最初の文字であることを行っている [1]第二になるだろう、[2]など第三になるだろう、とされています。 したがって、このプログラムは、私はそれをコンパイルした場合、これが再びstring1があるので、string1が作る、 そして今、私は私の端末ウィンドウでstring1が実行しようとしました。 、これは、入力を待っているので、私は入力して、ダビデに入力するつもりです 私がやっていることに気づくので、今では別の行にすべてのデイビッドを出力します。 私は、一度に1つの文字を印刷しています。 我々は、この上に今日の詳細には触れませんが、私はここに、このチェック前の瞬間を削除しました。 それは、ユーザーが敵対、ふらちな、あるいは単に混乱していることが判明した場合 あなたが実際にいくつかの長さの文字列を与えることに失敗することがあります。 あなたには、キーボード上で誤ったキーを叩いてしまった場合は、まったく文字列を与えないかもしれませんが、 あなたが悪意なら、または、あなたはエッセイのギガバイトの価値に貼り付けしようとするかもしれない コンピュータのメモリが不足した場合、この文字列を入力し、ためには、 それは我々がNULLと呼ばれるこの特別な値を取り戻すために行っていることが判明した。 だから今のところ、単にNULLと呼ばれるこの特別な値があることを知っている それは、私たちが他のものの間で、メモリが不足しているときにチェックすることができます。 しかし、私は今、string2を開く場合は、ここに違いに気付く。 string2でここに一つの違いに注目してください。 string2で、このforループは少し異なっています。 我々はそれらの別の時間の話ができるように私はNULLを削除しましょう​​。 今回は、forループについてなにが違う? 私は、前の例に戻ることができます。 バージョン2のように、これはバージョン1です。 1、2。 1、2。 strlenの呼び出しはどこにあるのでしょうか? これは、forループの最初の部分にあります。 私はこれをやっている理由として、任意の考え?うん。 [学生]だからあなたは、関数毎回呼び出すことはありません。 [マラン]我々は、関数ごとに1つの時間を呼び出すことはありませんので。その通りです。 彼らは超簡単だというforループを思い出してください 一度この種の初期化、条件、および更新であることを理解しています。 問題は、条件がループの繰り返しごとに起こることです。 ので、ここでは、この例では、これが私の条件であるという事実について悪い何ですか? [学生]あなたはstrlenを呼び出しています。 [マラン]あなたは何度も何度も何度もstrlenを呼び出しています。 しかし、かつて私は、ダビデに入力した、その文字列の長さが5で、 そしてそれは、ループの繰り返しごとに変更するつもりはない 文字列は、まだD-V-I-dであるからである。 だから、これはますます重要な考え方になるために何が起こっているのかでヒントです ちょうどコンピュータが不要な仕事を作らない設計上の決定として知られている。 同様に標準版でpset2、pset2のスニークプレビュー 実際に暗号の一部数を実装するためにあなたに挑戦しようとしている、 あなたは両方の暗号化ができるように、暗号化アルゴリズムのいくつかの数、 ずっとそこにデコード1 Ralphie様および復号化は秘密のメッセージ。 pset2のハッカー版では、さらに少し行くつもり。 我々は、実際のコンピュータシステムからあなたにファイルを渡すつもりだ それは、ユーザー名と実際の暗号化されたパスワードの全体の束が含まれています やハッカーの版のための課題は、これらのパスワードをクラックすることになるだろう そして実際にそれらのパスワードを生成するために使用された暗号化、またはどの秘密を見つけ出す。 そして、我々はここでCの新しい機能を使用することによって、これをやろうとしている 私はあなたのコマンドライン引数として知られているだけのデモをやること。 あなた方のうちの何人かは、セクションまたは教科書で見たことがあることがあるため、判明 主は必ずカッコ内の空隙である必要はありません。 それは、主はまた、2つの引数を使用して、このように書くことができることが判明 argcはワード数でargcとargv、 あなたのコマンドラインでプログラム名の後に入力することを とargvは、実際の言葉です。 そこに角括弧が示唆するようにと、argvは明らかに配列です。 これは、メモリ内の文字列の後の文字列の後の文字列になるだろう。 それでは、我々はPSET 2で始まるを行うことができるとしているのは、このようなものです。 私たちは月曜日にに戻ってきて、それを実行することになるでしょう例ですargv1を行った場合に それはまだ何もしていないようにも注意してください。 それはちょうど自分自身の名前を出力します。 しかし、私はこのプログラムは明らかに反復しているさようならクラス、通知を言うなら プロンプトで入力された単語のそれぞれの上。 そして、我々は、ユーザーがプロンプトで入力した単語へのアクセスを獲得するための手段 メインintにint型のmain(void)をこの週末から始まる主な変更することです(argc、argv)の したがって、コマンドライン引数を生まれてくるだろう。 そして、一度これで本当に洗練され得る、あなたは本当に頭がクラクラするようなプログラムを書くことができるでしょう などの枠を越えて、更に上に行くここでは、この1、 我々はこれまでが、すべての非常に強力やった機能の一部。 だから我々は、画面上にこれとこれを残しておきます、そして我々は月曜日にお会いしましょう​​。 [CS50.TV]