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