[Powered by Google Translate] [第3週] [デビッド·J·マラン - ハーバード大学] [これはCS50です。 - CS50.TV] 私は我々が前回中断したところの方向で私たちを操縦しましょう​​、 構文についてのよりも少し考え始めた と特徴点のすべてについて、少し少ないと思いますしようとしている セミコロンの面でこれまでに順応するには少し時間がかかり、その と括弧と中括弧、 上位概念レベルに物事を少し取って開始する そう、我々は今、次の数週間に渡って解く問題開始 より高いレベルの概念的な問題に多くを巻き込むつもりです あなたの足が濡れるような構文で、ビット未満 構文のいくつかのこれらの過去数週間からで汚れ、あなたの手。 だから先週我々は配列の概念を導入していることを思い出してください。 と英語で配列がどのように記述することができますか? >> [聞こえない学生の応答] 申し訳ありませんが? のコレクションですか? >> [聞こえない学生の応答] >>さて、良い。 アイテムのコレクション。だから我々はスクラッチで配列を見た。 あなたは物事をドラッグすることができたスクラッチのリストの0 1 psetに対する使っていた場合 、一種の目録、オレンジやバナナのように ことは、配列が何であるかのような種類のものだ。 そして、より多くの技術的には、実際のコンピュータの文脈では、 アレイは、単にメモリの連続するチャンクです。 言い換えれば、あなたは、その後、別のバイトして、その後、別のバイト、別のバイトを、バイトを持っている そして、写真でそれらのバイトを描くした場合、 彼らは、背中合わせにし、背中合わせになる。それは我々が連続して何を意味するかだ。 だから、その後、バイト数が1、2、3です。 それはここまで、ここまで、ここまで、ここまでというわけではありません。 配列は0バイト以上の連続した​​塊です。 それでは、彼らはのために有用である? 我々はプログラムの中で、人々のクイズの成績を格納する不自然な例のこの種を持っていたリコール いくつかのコースのためにあなたのクイズの平均を計算し、 そして我々は変数quiz1を宣言することによって、そのプログラムを書き始めることができることを思い出してください。 その後、我々はquiz2と呼ばれる別の変数を持つことができます。 しかし、その後、このクラスでクイズquiz4 3があった場合。 または毎週のクイズがあった場合、それは、quiz7 quiz6 quiz5だろう。 だから、メインの中で宣言これらの変数のすべてを持っているでしょう またはどこか他のプログラムの中で、 そのアプローチの問題は、それは、単にコピーして貼り付けるのは簡単ですが、 それだけで非常に迅速に手に負えなくなります。 禁じる神は実際には30または50クイズクイズを持っています。 それは高校の毎日のスタイルのポップクイズのようなものだ場合は、 あなただけの、宣言された変数の途方もなく長いリストを持っている これはちょうど非常に迅速に制御不能になる。 それは醜いですが、それを維持するのは難しい、それはタイプミスをするので、はるかに簡単だ あなたが得る場合、1番号は、プログラムのどこかで入力ミス。 だから我々は、代わりに配列の概念を導入しました。 そして、我々はこのように少し何かをすることで、このプログラムを実施していることを思い出してください。 私は、今日のソース3月曜日ディレクトリに行ってみよう 我々は最後の時間を見て配列を開く。 と新しいCのトリックのカップルがここにあったにもかかわらず、 それらの間の一定の概念、 この構文を使用して、我々は本質的に、複数の浮動小数点数を宣言したことを思い出してください。 float型は、変数の名前が、次に私たちが初めて本当に角括弧を使用し、 我々はそれらの角括弧の中に何をしたかを効果的に番号を入れた。 しかし、代わりに番号を入れて、私はクイズ、この大文字の単語を入れた。 とクイズのように大文字で始まる単語を置くための動機は何だった その後、実際にその数を与えるためにここに17行目のトリックを使用していますか? そこに動機は何でしたか?うん。 [聞き取れない生徒の応答] >>その通りです。 我々は値2を変更したい場合、我々は1つだけの場所でそれを変更する必要が 考慮するために - 私もこのプログラムが正確に何をしたか覚えていない、 しかし、あなたはそれをすくい取る場合は、クイズ、クイズを参照してください。 あなたがダウンしてここにもっとクイズ、クイズを参照してください。 我々は、これは一定持っていなかったのであれば、シャープのこの使用が定義する、 我々は、罰金である、次に2の場合、2の場合、2、2を入力したと思います。それはちょうどとして正しいだろう。 しかし、我々はCS50で3クイズを持って、来年と仮定します。 私は、コードを移動して、更新する必要があるので、私はそれを再コンパイルする必要があり、 私は愚かな何かをする場合、私は2の1の言及を見落とすようですが、問題があり、 と3プラグインに忘れ、全体のプログラムは非常によく壊れる可能性があります。 だから我々はちょうどトラブルを求めている。 だから、一定の概念は、データの一部のうちファクタリングがすべてです それは、文字列またはcharやfloatや何なのか あなたがより容易に将来的にそれを変更できるようにし、それを1ヶ所を宣言。 そしてそれは、あなたがちょうど今これを考えるなぜならもし読んで、率直に言って、また少し簡単だ それはクイズですか、私たちもそれをNUMBER_OF_QUIZZESのようなものの名前を変更することができる より明示的に、または何か。 コー​​ドだけで、それが何をするとしてもう少し明らかになる と、番号2が意味するように何が起こるか少し疑問に思う。 アレイと根本的には何の関係もありませんでした定数がそう。 配列は、これらの角括弧の方法が紹介されました。 だから、23行目では、我々はユーザーに尋ねることがわかり、 "クイズの得点は何でしたか?" その後、我々はちょうど明らかに彼らのグレードのユーザーに尋ね、このループを持っています。どうやって? これは、0〜2の繰り返し処理を行います。すべて大文字でクイズが現在2であるので、私は2を言う。 ので、最大0〜2の繰り返し処理を実行して、それは#何かの何かをクイズプリントアウト そして、次に、それはユーザから値を取得するgetFloatはを使用しています。 だから、これは先週の水曜日から、構文の唯一の他の新しい作品であることに気づく。 あなたは、その配列内の特定の場所で何かを保存したい場合は、 あなたは再び角括弧を使用します。 だから二分法のビットがここにあります。 あなたは、角括弧を初めて使用するとき あなたは配列になりたいどれくらいの大き指定するためにそれを使用します。 しかし、ここではこの次のコンテキスト私たちは再びこれらの角括弧を採用場所 その配列には、いくつかの値を入れたいですかどこ意味ですか? そしてここでの区別は文脈から推測することができます。 我々は、データ型を持ってここで注目し、我々は、変数の名前を持っている 次に我々は、セミコロン、内部番号との角括弧を持っています。それはそれだ。 だから宣言だ。 フロートgrade2、それは我々がフロートグレード1のような何かをやったかのようにです; しかし、再び、これは非常に迅速に、あまりにも多くのコピー、ペーストに委譲 ので、代わりに私達はちょうどそういうものとしてそれを簡略化し、 これは、今後我々は、ブラケット0で保存することができるグレードを持っていることを意味 我々は、ブラケット1で保存することができる別のグレードを持っている しかし、私がへまいただくと、例えば、私のループはこれまで行く - 例えば、私は、これより小さいか等しいこと そのリコールは、以前のバグの原因だった - を効果的にこのループのいくつかのサード偶発的反復であることを意味 私はブラケット2を使用します。効果的に、ここで何が起こるのでしょうか?申し訳ありませんが? [学生]それを交換する必要が起こっている。 >>それは交換するつもりですか? 何を交換するか? これは文字通りgetFloatはの戻り値を持つ位置2にあるものを置き換えると言っています。 しかし、問題は、物語の中で、この時点で配列がどのくらいですか? [聞き取れない生徒の応答] >>配列のサイズが2の唯一残っている 我々はそれを使用する前に、アレイは、任意の変数と同様に、最初に宣言されたため、 そして我々は、私が入れてするつもりだ2グレードを持っているので、この定数のここで指定された。 しかし、覚えて、コンピュータ科学者は0からカウントを開始します。 だから、その配列内の最初の位置はブラケット0です。 次の位置は1です。このことは、側に上すぎて、ほんの少しです。 だから、他の言葉で、私は実際にこの配列を持っている場合 - そして私は、この私たちのためにここに協力する方法も見てみましょう - 私は、単に次のように描かれてきた配列を持っている場合 と私は2つの要素のためのスペースを割り当てられましたが、私はメモリではこのように、これを描くかもしれません どこでこの大きな白いキャンバスです。 それはちょうど私が私のコンピュータを持っているのRAM、RAMのギグ、RAMの2ギグ、何でも、 しかし、これら2つのボックスは、今個別にフロート、32ビットを表します。 私は1.0のようにここに1番号を入れてもしそうなら、私は3.2のようにここに別の番号を入れて しかしその後、私はここで何かを置くようなものだブラケット2を、行う。 絵が示唆するようにと、何もそこにはありません。 私は、オペレーティング·システムを求めていないので、それは人の土地のようにソートの一つだ 私は、この第三クイズを得た。 私は第三のクイズをしたいやった場合、私は深慮があったはず 宣言することによって、それのためのオペレーティング·システムに依頼することはしない2となるようにクイズ その代わりに3と等しくなる。 だから、他の言葉で、我々は効果的に手に持っている絵は、ここでこのように見えます。 これは再びノーマンズランドです。私たちはより良い値をここに書いてみません。 しかし、再び、コンピュータ科学者は、0からカウントするので、 我々は配列にこの場所について話すとき、それは、0の位置することになっている この場所は1であることになっているが、これはあっても存在しません ので、我々は2つ​​しかそのような場所のためにオペレーティング·システムを尋ねた。 他の言語のプログラミング経験を持つあなたのそれらだから これは常にベクトルと呼ばれる配列や物事の場合ではないことを知っているかもしれません。 むしろ、あなたはただ、配列に物事を追加し、追加し、追加し続けることができ れ、率直に言って、我々は、スクラッチでその能力を持っていたし、まだ我々はここでそれをあきらめているように見える Cであるため、はるかに明示的にプログラミングされています。 それは今あなたとコンピュータだけだし、コンピュータだけやろうとしている あなたは何をすればいいか指示してくれる。 ですから、ここでしかライン22を介してあなたに2山車を与えるためにそれを指示した場合、 それはあなたがオペレーティングシステムから戻って得ようとしているすべてのです:2のためのスペース。 だからますますあなたのプログラムは時々、配列に関してバギーになるだろうしている。 私たちのすべてが誤りを犯しがちなアールそれによってこれは、ただ獣の性質のようなものです といくつかの点であなたの配列の境界を越えて非常に高いインデックスます。 そして、それはちょうどあなたが何かのブラケットに入ったしゃれた言い方だ と何かが数あまりにも大きかった。あなたの配列の範囲を超えました。 しかし、逆さまには今これです。 このプログラムの残りの部分は本当に配列とは根本的に何もしています。 それはちょうど、コンピューティング平均のためのいくつかの単純な算術演算が全てだ。 だから我々は我々が0に初期化した変数と呼ばれる和最初にここにこのforループでここに持っている。 その後、我々は再び0から2まで反復し、我々はその総和変数に追加 i番目のグレードなので、ブラケット0次にブラケット1。 そしてあなたは、平均を計算するために小学校で行われるように 我々は、単に、その総和を取るクイズの総数で割っ その後ついでに我々はラウンドと呼ばれるここで関数を呼び出します。 さて、余談ですが、34行目では、この括弧内のint型との契約は何ですか? それはセクションで既に出ているかもしれませんが、本当に、正式にここでそれについて話をしていない しかし、括弧内のこのintはおそらく何をやっている? >> [聞こえない学生の応答] ええ、これは、鋳造や型キャストを指し これは、1つのデータ型を取り、別のに変換することを意味します。 時にはそれは少し奇妙になるので、あなたは、すべてのデータ型を使用してこれを行うことはできません。 しかし、この場合には、ラウンドの場合、戻り値は浮動小数点数です なぜなら、2のように、すべての後、私はfloatを取っていると数で除算し 私はfloatを取り戻すつもりです。 しかし、小学校の人々は彼らの平均は93.4であったことを知って本当に好きではない 彼らはこれまでの95丸めポイントにとても近かったので、気づくでしょう。 だから我々は、代わりに最も近いintに皆を丸めるためにintを使用したい このケースではそれはそれの後にノーポイントで94になるだろう。 だからほんの少し数学的なトリックです。 それが意味を持つことになるため、我々は、鋳造のこの概念に戻ってくる あなたは既に発見されていない場合、問題は2を設定します。 配列その後だから、あなたが考えることができます - それは私が一日中笑顔にすることになるだろう。 あなたはそれの絵を描く場合は、次のようになります。 しかしキーはサイズがまたあなたによって選択されていることである あなたは、オペレーティングシステムからそれを要求したとき。 アレイ上次に何か質問はありますか?うん。 [聞こえない学生の質問] ああ、良い質問。 質問は、配列内のNULLを0に何が起こるか?それは、このコンテキストに存在しません。 それが唯一の私たちが一瞬でに来て約ている文字列のコンテキスト内に存在します。 しかし、配列のため、この場合のように、あなたが得るすべてはあなたができるようにオペレーティング·システムを求めるものである。 そして余談ですが、これがはっきりしないことがないように、など 私はあなたのオペレーティングシステムを尋ねると、オペレーティングシステムに頼む言い続ける。 オペレーティングシステムは、あなたはおそらく知っているように、Mac OSは、Windows、Linuxです。 あなたはgetFloatはのような関数を呼び出しているとき またはあなたは、グレードのような変数を宣言している 一日の終わりには、効果的に他の誰かがあなたにそのメモリを与えるように求めている 意欲的なプログラマーとしてなぜなら我々 実際にメモリへの物理的なアクセスを取得する方法はわかりません。 しかし、誰かのことを行います。オペレーティングシステム。 だからほかにかなりのアイコンとメニューやフォルダなどを私たちに提示 あなたは、MacまたはPCかどうかを、あなたのデスクトップ上に表示される オペレーティングシステムも、低レベルの平凡なものを行う ギガバイトの管理の高度に技術的なもの またはあなたが持っているメモリの2ギガバイト、あなたが持っているCPUを管理する、など。 ですから、コードを書いているときに、 あなたは本当にその意味では、ご使用のオペレーティング·システムにフッキングしている。 私はそれを最小限にするために持っているつもりです。かしこまりました。 アレイに関するその他の質問は? いいえ?オーケー。 だから当然、配列からの移行は少し馴染みのトピックに実際にある。 そして、我々はあまりにも、この最後の時点でそう簡単に今までに見た。 これは、水曜日からの文字列の例であった。 この文字列の例では、非常に単純なプログラムだった と私は実際に今日の目的のために、数行でそれを簡略化しました。 それは19行で行うすべては、ユーザから文字列を取得することですsという変数に格納します。 次に22行目以降では明らかに行につき、その文字列1文字を印刷している。 しかし、それはどのようにこれをやっている? 我々は0と等しい値に設定することは、変数iを宣言している、 これは現在、古い習慣になってきています。 我々は水曜日までこれを見ていなかったが、あなたは、その名前から推測する一種の缶 strlenは、単にsを与えられたときに何を返す?文字列の長さ。 だから私はそれを文字列、俗に言うデイヴィッドに渡した場合、 それがうまくいけば、私には理由ダビデの5番を返すために起こっている。 だから、生活の中でのその目的は、ハードコーディングされているかどうかをあなたによって、文字列を取ることであることを このケースでは、引数として、変数としてプラグイン そしてそれはその文字列の長さが何であるかを割り出し。 だからここに、今、私たちは以前のクイズの例からいくつかの表記を借りています。 これは、浮動小数点数とは何の関係もないクイズとは何の関係もない、 それは小さな白い嘘我々は第1週以来、あなたに言ってきたことが判明 C言語で文字列が実際には存在しないということです 一日の終わりに文字列が実際には単なる配列です。 これは、リコールはわずか8ビットですバイトの配列なので、バイト、バイト、バイト、バイト、、だ ので、メモリの塊、メモリの塊、メモリの塊、メモリの塊。 と文字列が実装される手段 、ここで最初の文字を入れることである 次にここ、ここ、ここ、バック、コンピュータのメモリにバックアップするバックアップします。 あなたはハローのような単語を綴るたいならだから、あなたは1文字Hをかけることになり、 その後、E、次にLをL、その後O - 合計で5文字 - どこかにコンピュータのRAMインチ しかし、ここで重要なディテールは、彼らが背中合わせにし、背中合わせになってしまうだろうということです 互いのすぐ隣。 私が言うときs [i]は、英語で何をすること、これが私に与えますか? S [i]は、このケースでは何を表しているのでしょうか?うん。 [学生]文字列中のi番目の文字。まさに>>。文字列中のi番目の文字。 今、私は、ここでループのために私の当たりとして、0から開始する予定です すべてが0から​​カウントを開始しますので、それは良いことだ。 ので、s [0]は、helloのような単語に文字Hを表すために起こっている、 S [1]などのHELLOのような単語でEのような文字を表現しよう、とされています。 と私たちはこのループの繰り返しごとにやっているように見える 一時的にだけchar型である、cという変数にi番目の文字を格納している、 その後、我々は、cをプリントアウトしている ように、このプログラムが何をするのか、一日の終わりに、次のとおりです。 私は、ソースディレクトリに移動し、私は、string1を作り、私が先に行くと、string1が実行している場合は、 その後、私はハローのような単語を入力し、入力し、それはないすべては、一度にこの1文字を印刷しています。 そこでここでは改良のための機会はある。 私はそれが必要以上に、このように多分より明確には言っても、それ以上の仕事をしているのようなものだ。 コー​​ドのどの行については、ここでは私はおそらく完全に捨てることができますか?うん。 24行目。 24行目では、私は変数cを宣言しています。 私はそれにsのi番目の文字を格納しているんだけど、その後、私はここでcを使用しています。 だから私は、cを使用していますので、私はわずか24行目を投げることができないような気がします。 [聞こえない学生のコメント】>>その通りです。 だから、プログラムの設計の話になると、 同じように読みやすいコードのこのわずかな簡素化を、、気づく しかし、sがただの変数であり、そのデータ型が配列であることを実感 のように[i]がちょうど瞬時に、その文字列のi番目の文字に戻すために起こっている。 あなたがそれを印刷する場合と、それは大丈夫です。 あなたはただ、あなたは文字列を出力していないため、%cを使用する必要が あなたは、文字列内の文字を印刷しているが、これはあまりにもi番目の文字を印字するという効果があります。 とprintfを使用して、先週から本当に唯一の違いを思い出す 週間のに対し、我々は超簡単な何かを、過去のことである %sのプレースホルダーのようにし、ここに文字列の名前、 今、私たちはフードの下に少し深くにダイビングしていると、言って 文字列を出力しません。そこに単一の文字を印刷してください。 バグではない - 他の1があるので、だから我々はここでは少し違う何かを行うことができます このプログラムは右ですが、私は愚かな何かをやっているので、 私は水曜日に簡単に述べている。 しかし、戻って考え、どのようにこのプログラムのデザインはさらに改善されるだろうか?うん。 [聞き取れない生徒の応答] >>ああ、いい。 だから我々はと呼ばれる第二変数n最後の時間を導入したことを思い出し、 前記第2の前に私の目標ので、自分自身を否定しているように見える 、不要として変数を捨てることだけだった しかし、水曜日に私たちが実際にこれをしなかったことを思い出してください。 私は、その後、n = strlenは、実際にここにカンマを持っているために、forループに変更 その後こっち私は私が> [聞こえない学生の応答] >>その通りです。 どのようにループ作品の思い出すので、私は何度も何度もstrlenをリコールしていない。 彼らは、より複雑な見栄えの取得を開始した場合でも、 最初のセミコロンの前に事が一度起こる初期化、であることを思い出してください。 条件は、しかし、真ん中にある、 これは、ループを通過するたびに確認されます。 だから、愚かなの一種で、何度も何度もコンピュータにも同じ質問をされるべきだ - HELLOの長さは何ですか? HELLOの長さは何ですか? HELLOの長さは何でしょうか - 今日我々が見て、水曜日に説明するように、これは間違いなく時間がかかるために起こっているので、 文字列の長さを把握するために、それは時間の非常に良い使用ではありません 実際努力には多少時間がかかります。 それはいくつかの言語であるとして、それは、瞬間的ではありません。 だから、nにこれを変更することによって、私が払っている価格はいくらですか? 我々は、ここでのトレードオフを見ている。 私は、何度も何度も同じ質問をする気はないことで時間を節約できます それは私に何かを、コストになるだろう? [学生]あなたは、一定量のメモリを失う。まさに>>。それは私にいくつかのメモリをコストになるだろう。 したがって、この場合、それは私に何の費用? 別の32ビットここに単語をintで含意として、nが、ちょうどint型であるためです。 しかし、それは大丈夫ですか? あなたが考えてみれば率直に言って、それがあるため、おそらく大丈夫だ、 長い文字列は、私は無駄にするつもりだ、より多くの時間です strlenは、何度も何度も呼び出されるために行っているので ループの反復ごとに。 そして、これらの日、私のMacには、RAMの2ギグ、このごろたまにRAMの4ギグを持っています。 私は実際に物事をスピードアップするためにそれらのバイトの4を買う余裕ができると思います。 しかし、これはトレードオフとプログラミングとコンピューターサイエンスの本当にテーマになるだろう 本当に無料で何かを得ることはありませんの。 あなたはここで何かを改善したい場合は、何らかの形で他の手でそれを支払う必要があります。 この場合の空間と時間の関係。 だから、これはすべて、このような不可解な何かに向かってリードしていた トしますが、おそらく今で考え出したように、実際に言った? [聞き取れない生徒の応答] >>うん、そうこれは、あなたのオヴァルを飲むようにしてください 実際にROT13と呼ばれるアルゴリズム、ROTは1から3を使用して、 ただの文字の全13箇所を、回転を意味する それは取るし、それに13を追加し、ドット、ドット、ドットに行く意味 離れて13日の手紙にすべての方法は、A、BおよびCの等Dのと同じことを行う。 そうだとすれば、我々は実際に、13箇所のシフトを使用して、ここでこれを変換 我々は少しRalphieがあった、なかったものに戻りましょう、あなたのオヴァルを飲むようにしてください。 しかし、今の問題のために、少なくとも、標準版には、2を設定する あなたは、これは自分自身を暗号化するかの種類に持っている そして我々は何らかの形でこのような入力に取ると、それか、それを復号化を暗号化する必要があります。 それでは、これらのファンダメンタルズのソートのどれがその機会に私たちを導く? のがここでこの第3の例を見てみましょう。 まず第一に、それは、ASCIIと呼ばれています。 ASCIIに戻って何を指しているのでしょう? 情報交換用米国標準コード、 これは何を言ってのは本当に長い道のりですか? ASCII文字とは何ですか? [聞き取れない生徒の応答] >>これは何ですか? >> [生徒]キャラクターマップ。 >>キャラクターマップ。 世界は標準化されているので、それはただの文字に数字をマッピング 私たちのすべてがコンピュータを使用できるように、どのような文字は何の数字を表します と私たちのプログラムはすべて、画面上のものをプリントアウトしに来るときだけ互換性があります。 だから65が表すように起こることを思い出して、97は小文字表現するために起こります。 ので、ここでは、この単純なプログラムは、ASCII、その事実を利用している - 世界は資本が65であることを知っている - そしてそれは単にマッピングの印刷だ。 我々は、このコードに飛び込む前に、私が代わりにターミナルウィンドウを開いてみましょう。 私が先に行くとASCII作成し、そのちょうど出力を台無しにするために、この事を実行してみましょうましょう。 そして、それはまさにこのことを行います私だけに様々なコードのすべてを伝えます本当に大きなチャート 様々な文字のすべてのため。 超簡単なプログラムでは、だから、私はハードコードへの出力のものと52のラインを持っていなかった: 26個の大文字、小文字の26。 代わりに、私はループのカップルを使用してプログラムでこれをしなかった。 私がここで何をしたかに注目してください。 私は、26文字をプリントアウトしたいと思ったので、私は最大65 + 26日に65歳であるから繰り返さ 英語のアルファベット、i + +は、各繰り返しで、今では再びこれを注意してください。 それは私たちの友人に型キャストの再発だ それによってあなたが別のものに1つのデータ型を変換する 私は、この特定のプログラムではどのように過ごしたいですか理由? など、65 66、67、 - 私はそれは私が数えて育った方法なので、数値的にカウントしたい - しかし、私は数字だけを印刷したくない。 私は数字が続く文字列を印刷したい。 数、B:私が印刷したい番号を、私はまったく同じ変数でこれを行うことができます。 だから私は、文字のプレースホルダとして%cをプリントアウト 数字または数字のプレースホルダとしては%d。 それから私は、それらの2つのプレースホルダのために何を差し込むのですか? 私はiの文字と等価の最初のプラグ、そして、私はi自身プリントアウト。 だから、これはあまりにもただ働きに気づく。 私はintにfloatからキャストすることができるのと同様に 、実数から整数に行くために ここで私はintから少し変だchar型、に行くことができます - 非常に現実の世界にマップされていません - しかし、コンピュータで charは、ボンネットの下にただの数字です ので、我々は、コンピュータにここに今までので、明示的であると言っている、 printfは、iが65としてではなくプリントアウトし、それに相当する数値として、それをプリントアウトする。 私は技術的にも、これを必要としない、それがアウトになります。 私は少し前にやっていたことは、明示的にキャストされている 私から行くとしたいデータの種類を指定することによって。 しかし、私はすでにこのプレースホルダ%cを持っていることに気付く ここでは、この他の%cのプレースホルダです。 これはint型でなくても、コンピュータは、そのcharを実現 それはちょうどフードの下にint型です。 だから私は実際にこれを再コンパイルおよびASCIIプログラムを再実行した場合、 コンピュータはこの対応関係があることに気づくので、それはまだただ働きに気づく。 さて、それはintにfloat型の世界では明示的なキャストを行うことの方が重要です そこにあるため、実際には計算された意思決定をしている: 小数点以下のすべてを捨てる。 ここでは文字はただの数字なので、捨てるのには本当に何もありません と文字列は文字の配列だけです。 だから、いくつかの暗号化または復号化を実装するための時間が来るとき、 それは我々が実際に、このナンセンスのような何かを簡単に翻訳できることをどのように あなたのオヴァルを飲むようにしてください? 我々は今何を知っていれば - 、そのキーを - のは前提として任せる 我々は、することによって、これらのすべての文字を回転させていた番号は13番ですか? だから我々は、文字Bから文の先頭にOにすべての方法を行った 私はBを行う場合があるので、iPodオヴァルを飲むようにしてください そして私は、C、D、E、F、G、H、I、J、K、L、M、N、Oを行く 文字Bの暗号化は、Oになる理由だ ので、私はちょうどそれに13を追加しました。 私はこの解読したいのであれば、私は基本的にOを取ると、そこから13を減算する必要があります。 アルファベットで26文字があるため、または、率直に言って、これは、素晴らしく対称である 我々はまた、ちょうど13を追加することができ、我々は手紙Bに戻りましょう しかし、あなたはカイザルに、このようなものを実装する方法を教えてください。 または本当に一般的に文字列を操作する? 文字Bは何番ですか? Bの文字は何ですか?だからそれは右、66ですか? もしそうなら手紙は65であり、Bという文字は66であり、 66だから、私がしなければならないすべてはそれに13を追加しており、これは私に79を与える。 そして、我々は少しチートシート、Oの上に79確かにマップに行けば しかし、コーナーケースのビットがここにあります。 文字Z、と言う、何ですか? 我々はアルファベットの最後にすべての方法を得るために66 + 25をすれば、我々は91にいる。 91 + 13は私に104を与えて、どうなったと思う? 104は、大文字と等しくありません。 のは、ここで少しチートシートに戻りましょう。 私はアプライアンス、予告でこのプログラムを再実行した場合、その104、私は端末ウィンドウに戻ってしまったら、 104は明らかに小文字のhです。 だから我々は、我々はZで起動したときにことを確認するために、ここでいくつかの重要なトリックが必要 そして我々は我々だけでどんどん大きく数字に前進し続けたくないそれに13を追加します。 私たちは本当に何をしたいのですか? あなたの周りをラップしたい。 だから、あなたが今、セクションまたは問題セットのスペック自体は、おそらく見てきたように、結局 また、パーセント記号はCで、この他の演算子があることに気づき、 しかし、我々はプレースホルダを指定するここで%を使用していたのに対し、 特に問題セット2に、このようなものもあり、ことを知っている: int型のX = Y%Z。 私はちょうどこの非常に一般的な形として、これを提示しましょう​​。 パーセントは、プログラミング言語で何を意味する? >> [生徒]モジュロ。 残りをしゃれた言い方ですモデューロ、。 そこの定義と若干の違いがありだとしても、 この手段は、zをy​​に分割するが、その除算の結果を返すことはありません。 代わりに、残りの部分を返す。 yは実際には3であり、zは、2で割った実際には2、3であるのであれば、1の残りの部分との1である だから何このシナリオでは、xが実際に等しいのですか? 1。 これは、このような単純な低レベルのアイデアです。 それはあなたの心がそれを包ん得るために少し時間がかかり あなたも、余り気にしなければならなかったので、それはおそらく、しばらくしているので、 そして実際に、意図的な何かのためにそれらを使用する しかし、この場合には、3のように大きい数から行くことができるという単純な事実 その後2など比較的少数に効果的に包み込む 1のような小さい値に、残りを使って、非常に貴重なトリ​​ックであることを行っている 私たちはカエサルのような何か、この他の事Vigenereの両方を使用することができます 問題に2を設定しますが、これは学期を通して繰り返しトリックであることを行っている。 ちょうど一般の剰余を取るのはこの単純な、シンプルなアイデア 私達が一周できるようにするつもりです。 そして、我々はメモリ自体でより多くの再生を開始するように我々は、配列でもっと遊んで開始すると、 これは強力なトリックのより多くなろうとしています。 ASCIIまたは配列として文字列の表現上の、任意の質問がそう? そして、我々は更に1ノッチそれを取るよ。うん。 [聞こえない学生の質問】>>良い質問です。 変数はそれの前にアスタリスクがある場合、それはどういう意味ですか? 、私は詳細に答えることを延期しましょう それはポインタとして知られているトピックを参照します。 ポインタはメモリに関係しており、我々は実際には今日だ その議論に向かって第一歩を踏み出し、 しかし今のところ、私はスターが存在しないことを考えてみましょう そして我々は、char *を使用するのではなく、文字列の文字列を呼び出し続けます そのあなたがおそらく今まで見てきたと私はティーザーとして一瞬で画面上に置くことにしましょう​​。 だから我々は、おそらく好きになるでしょうあなた方の多くよりもずっと詳細にそれに戻ってくる。 結局、今日は説明しません。うん。 [聞こえない学生の質問] どのようなコンテキストでは、文字の符号を提供する必要がありますか? >> [生徒]うん。 だからデフォルトでは、+を入れていないときに、ちょうど正の数値が想定されます。 単に数字の1を書くのであれば、それは正の1だ。 あなたが実際に値の否定を指定したい場合は、 あなたは文字通り、キーボードの-1をしなければならない。 しかし、これはおそらく、あなたの質問ではありません。 >> [聞こえない学生の応答] 良い質問です。オーケー。 だから、これはあなたがぶつかったバグのいくつかの種類で、私が収集し、関係している あなたは、整数を文字に変換されたため 何とかネガティビティは、関与した などの文字がちょうど何とかmunged出てきた。 だから今のところ、我々はこの種の話題に戻って来るまで、私は少し単純化し過ぎることができます。 これは単純化しすぎであると - 今のところは、この事物の方法だと思う。 しかし、整数の世界では、あなたの処分でどのように多くのビットを持っている? あなたは32ビットを持っています。 そしてこれまで、我々はあなたが故に表現できる整数の総数について説明しました あなたは32ビットを持っているので、約40億合計であり、 そう、それは約40億だので、32から2です。 しかし、我々はあなたが本当に数字の範囲を持っていないことを一週間か前に見た2 アップ時に0〜4億円となりました。 範囲ではなく、ポジティブにほぼ負の2億人から20億人になる。 しかし、これはその後、負の2億ドルの概念をどのように表現するか、質問しておきたい 1負おろか? 今のところ、我々は単純化し過ぎると、ちょうど我々が左端のビットを使用するつもりだと言うことができます それは1の場合、これらの32ビットの、そして、それは、負の数だ もし0を指定した場合、それは正の数です。 負の数の表現を簡略化し、その問題 あなたが意図的に巧妙であると文字から数値に変換しようとしていた場合ということです (またはその逆)は、負の文字のようなものはありません。 8ビットのみを使用するASCII、これらのビットの主題のすべての8の世界では そして左端のビットは陰性とは何の関係もありません。 そして、ちょうど、私は一番左のビットを言うときに、明確にすること 我々は最初の週に私たちのビット関連の例をしたときにことを思い出してください 我々はこのような何か、1001101のようなものを描いていることを思い出してください。 私は左端のビットを言うとき、私は文字通りあなたが左に上のすべての方法を記述した1を意味します。 だから、文字の世界では否定的な概念はありません、 ので、左端のビットは実際にはASCII、陰性とは何の関係とは何かを持っている。 だから、のように聞こえる - と突拍子もそれが正確に答えるのは難しい - どういうわけか、あなたのコードは、負の値を表すものとして、その左端のビットを混乱させた それは本当に問題になっている文字の一部だった。 コンピュータが実際には少し手の込んだ何かをするために、もう一度、私が過ぎたりしています ちょうど0対負の符号のために1にその左端のビットを変更するよりも。 あなたがGoogleに興味があれば、彼らは代わりに、典型的には2の補数と呼ばれるものを使用、 アプローチのもう少し洗練されている しかし、アイデアは、最終的には同じです。 だから簡単に言えば、それはあなたが数値を文字にマッサージしていたという事実に関係していた (またはその逆)が、あなたのコードは、事実を認識しませんでした これらのビットの1は数字の世界で重要性を持っていたこと。 それは文字の世界ではそうではありません。 あなたが今、議論の余地があるその場合には、固定されたようですが、それが聞こえる。その他の質問。 オーケー。 だからこれまで、私たちが書いてきたすべてのプログラムは、ユーザーから多分入力をとっている 場合、getInt、GetStringメソッドのような関数の形で またはあなたが様々な書籍やオンラインの参考文献に先読みしてきた場合、 あなたがたは、率直に言って、我々はCS50ライブラリで使用、scanfのような関数を使用していたかもしれません。 しかし、週または2に、我々は実際にCS50ライブラリが実装されている方法を紹介します 我々は完全にそれらの補助輪を外すことができるように。 ユーザーからの入力を取得する別の方法があるが、それはアウトになります。 実際には、我々自身は、コマンドライン引数を使用してきました 今では数週間のために。 我々はClangのを実行しているか、我々は、makeを実行しているたびに、 私達はちょうど打ち鳴らすを入力していませんが、入力して、我々は、入力、確認入力していない。 我々は、通常、私たちのターミナルウィンドウプロンプトでワードカーンという音の後に何を書かれている? [学生]ファイル名。 >>ファイル名、右か? hello.cのか、または何mario.c該当するファイル名です。 その意味で、あなたが本当に何をやったかはClangのの行動に影響を与えてきている 確かにClangのを書いた人々はその少し古い見当を持っていなかったため mario.c年後と呼ばれるプログラムを書こうとしていた。 だから、何とかして、そのプログラムの動作に影響を与える必要があった そのプログラムのClangのは、それはあなたからの入力を受け入れることができるような方法で書かれなければなりませんでした ユーザーのヒットの前にプロンプ​​ト上の単語を添加することによって入力します。 だから、しばらくの間、我々は、ほとんどすべての我々のプログラムのを宣言されていることが判明 このように起動します - int型のmain(void)を - そして、我々は先に行ってきた と私たちのコードを書き始めた。 そして、我々は、ファイルの先頭に含まれていますいくつかのシャープを持っているかもしれません しかし、ほとんどすべての我々のプログラムのは、これまでこれを始めている あなたの本に、セクションで見た場合でも、オンラインリファレンス これは、実際には無効である必要はないこと。 これを有効にするため、他の正規の形式はint argcと次に文字列のargv []である。 だから今、これが暗示されているでしょうか? それは人間の慣習ですargcは、ことが判明した - あなたはこのfooを呼び出すことができ、 それだけで読者にはるかに少ない明らかになる - argcはちょうど何を表すメインと呼ばれる関数への引数のですか? argcは精通している人は何の略ですか? [聞き取れない生徒の応答] >>うん、引数または引数のカウント数。 それはそれと同じくらい簡単です。 このプログラムにどのように多くの引数が渡されたのですか? どういう意味ですか? コマンドライン上で私はこのような何かを実行している場合 - 打ち鳴らすmario.c- - 私はEnterキーを打つargcは2、やや紛らわしいが、の値をとるとしている。 だからそれは、argcは引数の数であることが判明 しかし、歴史的な理由により、プログラム自体の名前は、その数に含まれます。 私はmario.c打ち鳴らすを書いたときにそうargcは2です。 argvは何が含まれているのですか? まず、argvは文字列のように見えなく、かなり なぜなら前水曜日のように、すべてのより多くの今日、 これらの角括弧は何を意味する?これは配列です。 そこに指定された配列に番号がありません、それは直感的に意味を持ちます Clangの数年前に書いた人は、確かにわからなかったので、 私たちのようにどのように多くの単語の人はEnterキーを押す前に、プロンプトに入力します。 そこでここでは、このケースでは、それらは、引数の配列を取るようにmain関数を宣言しています 0個以上の引数。 彼らは、いくつあるのか事前にわかっていない ので、これらの角括弧の内部には、数は意図的にありません。 しかし、角括弧があるという事実は、コンピュータを言っている 配列を期待しています。 argvは引数ベクトルのためだけの簡単な表記法です。 ベクターは、配列をしゃれた言い方です 配列はリストまたはコレクションをしゃれた言い方です。 だから、これはちょうどあなたがこのようなメイン書けばことを意味します 代わりに我々は過去数週間のためにそれを行ってきた方法のように、 あなたのプログラムは、コマンドライン引数を受け入れる力を持っている もはやあなたは、Enterを押すのマリオを記述する必要はないとないように、 その後、あなたはピラミッドになりたい、何ブロック高のために番号を入力 再度Enterを押してください。 私たちも、そのことについてはもう、または場合、getIntまたはgetFloatはGetStringを使用する必要はありません。 我々だけで、ユーザーがプロンプトに自分自身をそれらの単語を入力することを期待することができます Clangのの作者は、それが本当に迷惑なプログラムになることを決めたのと同じよう あなたが最初に入力打ち鳴らすコードをコンパイルする場合は、Enterキーを打つ それから私達はユーザーによると、は、コンパイルするファイルの名前を入力してください それから私達はmario.cで入力してEnterを押してください。 しかし、それは我々のユーザーに数週間をやってきましたがまさにそれだ。 我々は、GetStringを使用して、プログラムの入力のためにそれらを求めるように実行されるまで、我々は待つ。 ケースのように必要としなくなったこと。 そこでここでは、この例では、我々は今、文字列argvを持っている これは、あまりにも単純化しすぎである 補助輪は非常にすぐに外れます。 これは、メインのこの代替宣言を作成するための、より適切な方法です。 それは私たちが列を呼び出しておくと、実際には、星を持っていることが判明したので、 その実際の定義でアスタリスクが、これは単に複雑に見えますが、 それは、最初は混乱しますので、我々だけである種のシノニムを作成することにより、簡素化 これよりユーザフレンドリーな単語列へのマップはchar *そのCS50ライブラリインチ それでは、実際にはこの後、試してみましょう。私が先に行くと、ここでgeditを開いてみましょう。 私が先に行くと1のargvを開いてみましょう。 このプログラムは明らかに引数を出力するだけでなく、英語の用語で、 このコードを見て、これは、より具体的に何をするのでしょうか? 私は黒と白のウィンドウに出力される内容をコマンドのa.out fooバーに入力した場合は? a.outのfooバー、入力します。 どうぞ召しあがれ。うん。 >> [聞こえない学生の応答] グッド。だからa.outの場合、新しい行は、foo、新しいライン、バー、新しい行。 これはなぜですか?我々は確かに一瞬で確認することができます。 これはコードのふわふわラインの一種である。  それはただ単に画面上で物事をよりきれいにするために、新しい行を出力します。 これは、argcは最大で0から繰り返し処理のループです これは繰り返しのたびにインクリメントされている+ +。 だから、これは今ではこの%sが示すように、文字列を印刷すると言っている。 ARGV [i]は、かなり前の例と同じ考えです。 我々は、変数sを呼び出すために使用されるが、今それは、argv、任意に、呼ばれています。 これは、コマンドラインで入力されたi番目の引数をプリント意味 この全体のことが行われた後、その後、ちょうど良い測定のために別の新しい行を印刷します。 だから、これを見てみましょう。私は、ターミナルウィンドウを開いてみましょう。 私は1のargvをコンパイルしてみましょう、そして今私は1のargvを実行させて入力してください。うーん。オーケー。 fooのバーを実行してみましょう。興味深い。バズ。 私はこれを入力すると、なぜあなたが今まで疑問に思ったことがあれば、 これはまた、単に愚かなコンピュータサイエンスの規則です。 世界は、多くの場合、言葉のためのちょうど口頭プレースホルダを必要とします。 だから、あなたには、いくつかの一般的な文字列について話をしたい場合は、 コンピュータ科学者はただ、彼らはランダムな単語を必要なときにfooを言う傾向がある 彼らは第二ランダムな単語が必要な場合、彼らは、バーを言う その後、彼らは、彼らは3番目のワードを必要としたら、彼らは4番目のワードを必要とする場合、それらはかんぬん言ううんぬん言う その後かんぬんの後に来るものなどのオンライン巨大な宗教的な議論は、そこ ので、他の任意の単語がどうあるべきかを把握することをGoogleができます。 しかし、これらは、全く意味を持たない しかしfooバーは、Googleが、それが意味を持っていませんが、その場合 それはここに語源の一部です。 だから、すべてこれは、行ごとに、これらの文字列の1を印刷してやっている。 私は代わりに、しかし、少し手の込んだしたかったのであれば、 私はラインごとに各文字列を印刷したくなかったと仮定してください。 私は、1行ごとに各文字列から各文字を印刷したい。 私の代わりに、どのようにそれを行うだろうか? 私ではない、各単語を印刷したい場合、私はこのプログラムについて変更するには何が必要ですか しかし、私は、文字ずつで各単語の文字を印刷したい 手紙で手紙でその後次の単語の手紙? どのように我々はこれまで、これらのアイデアを組み合わせるのですか?うん。 [学生]%C。 >>すべての権利。だから私たちはどこかに%cを必要とする。 良い、私は全体の文字列を出力したくないので、私は、文字を印刷したい。他に何が? [聞き取れない生徒の応答] >>面白い。 だから我々は今ここに2番目の次元の並べ替えが必要 なぜなら配列としてargvのと思うが、それは文字列の配列です。 しかし、の、のように、15分前に、文字列は何ですか?それは文字の配列です。 だから本当に、argvは、文字の配列の配列です。 文字の配列の配列。 だから、我々はちょうどより多くの角括弧表記を使用できることが判明した。だから、これを実行してみましょう。 19行目では、このループの先頭では、私はiからのargcに反復するつもりですが、 しかし、私はこれを行うにするつもりです: ために - 私は今、私を使用することはできません。 私は言葉を反復したいので、私は、別の変数を必要とする しかしその後も単語の文字の上 ので、私は一種の縦軸と横軸、概念的の並べ替えを持っている。 だからint型jは0を取得し、私は​​jは未満である限り、jをやってみたい - と私はビットでこれを片づけます。 どのように私は、文字列内の文字を反復するのですか?我々は少し前これをしなかった。 argvのstrlenの[i]とする。グッド。 そして再び、私は、nまたは何を、作成しないことで、ここで少し非効率性を作ってるんだ しかし、我々はそれに戻ってくる。 だから今はJ + +。今、私はここではこれ以上インデントしなければなりません。 私は今、各反復に印刷するには何をしたいですか? [聞き取れない生徒の応答] >>だから[i]が私に言葉を与えるだろう。 [i] [j]は、マトリックスのような一種の。 数学 - yの背景を持つあなたのそれらの、 我々は、さらに深くこの行列や配列のこの配列へのインデックス付けの一種だ この2次元構造。 だから今ここで何が起こるか見てみましょう。私は私の大きなターミナルウィンドウを開いてみましょう。 私は1のargvのmakeを再実行してみましょう。 そして私は私があまりにもこれを行うのを忘れたので、良い教訓である、ここでめちゃくちゃになってきました。 暗黙的に型 'の符号なしでCライブラリ関数' strlenは 'を宣言 - 、私もその手段の残り何かわからないが、私は前にこれを見てきました 暗黙的に宣言する。 我々は、このエラーが表示されるたびに、これは通常、何を意味するのでしょうか? [聞き取れない生徒の応答] >>私はトップアップライブラリを忘れてしまった。しかし、少しお待ちください。 私はCS50ライブラリを忘れてしまったので、通常、私はめちゃくちゃになってきたが、それはそこだ。 私は標準のI / Oを忘れてしまったので、通常私がしくじった 率直に言って、私もこれを必要としません。今日はGetStringメソッドを使用していない。 だから私は、何が足りないのですか? 今、私たちは時折呼ばstring.hを使用する必要がある別のライブラリーには、あります そしてこれはまだ標準I / Oに含まれていない多くの機能を持つ別のライブラリです それでは、私の大きなターミナルウィンドウに戻りましょう。 オーケー。さて、畜生、私は私が間違っていたと思います。私はCS50ライブラリを使用していました。 だから我々は2つ​​の方法のいずれかでこれを修正することができます。 我々は、現在補助輪を外して、ただこれを行うことができます またはしてみましょう一種のは、この後ろに貼り付けるだけで、今のところその簡素化を保つ その問題を解決するため、現在はターミナルウィンドウに戻ります。 だからCS50ライブラリで、明確にするだけの機能ではありませんが、 それはまた、そのエラーが起こったの理由であるキーワード文字列、です。 だからここに私達は行く。私は、ライブラリの問題の両方を修正しました。入力します。グッド。 1のargv、fooバー、入力します。優れています。 だから今我々は、1行に1を印刷し、各単語の各文字を持っている 、非常に興味深いプログラムのために作るしない しかし、今我々は言葉だけをイテレートしない能力を持って気付く もやけに聞き覚えの言葉で、個々の文字、上 このような文字列のスクランブル文字のようなアプリケーションの最も単純にさえ。 先に進み、ここで我々の5分間の休憩を取りましょう。 そして、我々が戻ってくるとき、私たちは効率の話から始めましょう いると私たちはより良いこれらのことを行うことができます。 かしこまりました。我々は戻ってきた。 bananagramsの多くを担っている私たちのTFの1のおかげで、 私たちは実際に今日ここに私達と文字の全体の束を持っている 物理的に、これらの小さなプラスチック片と転生 そしてこの空白のスレートはここに私のコンピュータのRAMを表していることを私は提案させて - ラップトップ、デスクトップ、何でも - そこはそれの多くのように見える なぜなら、私たちは小さなバイトサイズの断片にこのRAMをチョッピング起動した場合、 任意のサイズとそのぼやけが表している何かを言ってみましょう - そこに私達はここに移動して、少し外に出すのズーム - サイズは1バイトを表している何かを言うてみましょう。 だから我々は確かに、このメモリの内部バイトまたは文字の全体の束を収めることができます としてここに相対的なサイズによって示唆された。 だから目標は文字列用のメモリを確保していることを今仮定します。 これはどのように実際に動作しますか? 私たちが書いてきたプログラムでは、我々は通常、GetStringメソッドを使用してきた しかし、今、明らかに、我々はargvのユーザー入力を取得することができ、それを介して、この他のチャンネルあり コマンドライン引数を経由して。 しかし、本当にフードの下に起こっているのでしょうか? 我々が呼ぶなら、それは判明 - GetStringメソッドに戻ってスクロールしてみましょう - 関数GetStringを CS50ライブラリで、ユーザは、文字列の入力を求められます いくつかの単語でユーザータイプ - のがHELLOそれを呼び出すことができます。 そして、我々は過去数週間のために言ってきたことがGetStringメソッドの戻り値 ハロー単語のように、実際には文字列です。 しかし、実際に何をしてgetStringで? 入力し、ハロー内のユーザー·タイプとしては、GetStringは、考え出すされている 大丈夫、これは何文字ですか?これは、H-E-L-L-Oです。 だから、割り当てる必要がある、それは、オペレーティングシステムに依頼する必要があります - この場合はLinuxを - 少なくとも5バイトのhello格納する。 それは、オペレーティングシステムから戻ってそれらの5バイトを取得したら、それは次に何をすべきかを進める バックアップするためにバックアップするバックアップするハローバックレイアウトすることです。 それで本当にGetStringメソッドから返されると、次のようなデータの塊です。 それは簡単ではないことが判明したので、しかし、これは少し不正確である ただ、コンピュータのメモリに格納するなどのHELLO なぜなら、私はC言語で書いているというのが私のプログラムは、再度GetStringメソッドを呼び出しているとし そして、ユーザーがタイプで次の単語は、BYE、BYEです。 まあ、私はメモリのどこかに、その単語のBYEを適合する必要があります。 私はHELLO上書きすることはできません。 例えば、私はちょうどこのような上書きを開始するには、コンピュータをしたくない 私はまだ変数にhelloという単語を使用しているかもしれないので、元の単語 どこか私のプログラムインチ だから、B-Y-Eはメモリのどこかで終わる必要があります。 しかし、大会は通常、次の文字列を使用すると、割り当てられていることである おそらく、常にではないが、次の使用可能なメモリ位置になってしまうために起こっている。 そして、私は任意のメモリにオペレーティング·システムを求めていない場合 私がGetStringメソッドと呼ばれる最後の時から、オッズは、ワードBYEアール ハローメモリ内のワードの後に​​右に終わろうとしている。 潜在的な問題が発生した場所が、この時点であなたはおそらく見ることができます。 - メモリの次のチャンクだけ自由だったので、次のバイト 白い石板をきれいに - コンピュータのメモリに、ハローのすぐ隣にあった それは私が今突然変更される可能性がありますを求めた最初の文字列のように感じている 私は基本的に変更したので、それはHELLOBYEする 代わりに何とかBYEとHELLOの終わりの始まりをdemarcingの。 だから、何が本当にフードの下で起こっていることが判明 あなたは、オンラインで参照またはセクションや書籍でちらっと見たかもしれない かどうかはまだ全く意図的デマが実際に存在することである コンピュータのメモリ内の単語間。 そして、実際には、ここで、この場合に、だけではなく、すぐ隣のHELLOにBYEを置く 代わりに、コンピュータは特殊文字、特殊ヌル文字を、いわば置き そのバックスラッシュ0のマーカーで表されます。 だから長い話を短く、文字はASCIIで表現されていることを思い出してください。 ASCIIは、ただ数字と文字の間のマッピングです そしてそれらの手紙のほとんどは、資本、Aのために約65を起動する あなたは確かに整数として、またはバイナリの番号0を表すことができますアウトそれは、ターン それはずっと前に、長いことを決めた世界が判明、 "あなたは何を知っている?" キーボード上の任意の文字を表していないとして "レッツ·リザーブ番号0 - "は、文字、数字なし、句読点。0は特別ではありません。" "それは特別なnull文字になるだろう、と我々は\ 0としてそれを記述するつもりです。" 我々だけで0,0を書いた場合、違いは文字です。 1、2、3のために、0のASCIIコードがあることを思い出してください 文字0は数字の0とは異なるため。 そして、あなたは、あなたが週1から振り返って、我々は最初のASCII話をするときことがわかります 最大9から0と1と2と3のすべての方法は、独自のASCIIコードを持っていた。 彼らは、偶然にも、0から9までではありません。彼らは非常に異なっている。 だから、0は単に "私は特別な思い"を意味し、\ 0は、文字通り、 "私は0文字ではありませんよ。" "私はこの特別な値、ヌル文字です。" 私は二度同じ過ちを犯すことができないので、それで、私は実際にこれらの別のものを必要としています。 だからワードBYE後に我々はまた、これらのヌル文字の別のものが必要になるだろう。 私はここに私のペンをつかむと、私はすぐに別の\ 0を描きましょう ので、私は2つの文字列については、オペレーティングシステムを依頼した後に GetStringメソッドへの別のコールに続いてGetStringを経由して、 これは、メモリ内に実際にあるものです。 だから私は戻って文字列を取得するとき、私は本当にそれが戻ってきている、 と私は次の文字列を取得するとき、私は本当にそれが戻ってきたよ。 だから、これは、まず第一に、strlenは、質問しておきたい、それは何を返すべきでしょうか? 私は、文字列sとsにstrlenを呼び出したときに、ユーザーが入力した言葉だったのHELLO 我々は明らかにハローの長さは数分前にあったものを言いましたか? それは右、5でしたか? H-E-L-L-O。そして、それは確かにどのようにstrlenの作品だ。 それは普通の人間であるために、文字列の長さを期待するものを返します。 しかし、現実には、hello保管の文字の配列の大きさは? これは、実際には6だ。 strlenのようにあなたにその事実を言及していない。 しかし、フードの下にコンピュータが実際には、5文字の単語を格納するために6バイトを使用しています これは言葉がどんなに長くても真実ではありません。 常に文字列の末尾に特別なNULL終端文字があるように起こっている その長さの合計を分界する。 それでは、あなたが今、30年前にはstrlen 20を実装する人、ある場合には、 あなたはstrlen自体を実装する方法を教えてください。 当たり前のprintf関数が存在することを当然のことと私たちが取るのと同様、我々は、それが存在することを取る、 しかし、HELLO、問題の単語である場合 と私は記憶しているのは、このようなものである あなたはあなたがするように求めていたので、strlen関数を再実装する必要があった場合 またはので、率直に言って、あなたは存在してstrlenを知りませんでした - あなた自身でこの1を転がしていた - どのようにあなたはstrlenを実装することができます このようなものが与えられたとき? 今、私たちは、文字列が配列であることがわかっている、我々は、個々の文字のそれぞれを反復することができます のようなものを使用すると、 - その場でこれを実行してみましょう。 私はアプライアンスに行こう。私は、新しいファイル、strlen.cを作成してみましょう。 私は今、先に行くと我々は、printfへのアクセス権を持つようにstdio.hをインクルードやってみましょう。 私はint型のmain(void)をやってみましょう。ああ。私はちょうどその時、今の自分でこれをやる。 [笑い]を ありがとう。 これは私がやっていることです。かしこまりました。 私は、画面をオンにする前に、だから、私はそれのすべてを入力しました。 そして今、私がやろうとしているものは次のとおりです。 ( "私に文字列を教えてください:")のprintf それはちょうどフワフワの命令だ。 今私は、文字列s = GetStringをやらせる。 私はすでに今変更を加える必要があります。 私は突然CS50ライブラリを使用していますので、私が先に行くとcs50.h.を入力せ そして今、これを実行してみましょう:のprintf( "長さは次のとおりです。%dは、strlenは[S] - と私はまだいないよ。他に何私はこのプログラムに追加する必要がありますか? [学生] string.hで。 >> string.hで。 だから今のところ、我々はstrlenを使っているので、のはそれがどこにあるか、コンパイラが知っていることを確認しましょう ので、少し正気をチェック。 私は、8行目で文字列を取得していて、9行目で、私は%dで、その長さをプリントアウトしています。 それでは、先に行くとこの上を開いてみましょう。 我々は、strlenを作成してもらって - 大丈夫コンパイル - strlenは - 私は、ズームインできます - 入力は、H-E-L-L-O、入力します。長さは5です。 わかりましたので、strlenは、動作しているようですが、世界は知っていた。 それでは、今、自分自身を次のようにstrlenを実装してみましょう。 私は離れて、このライブラリを見てみましょう。 我々はもはや、私もそれは存在を知らなかったのでstring.hでために必要なアクセス権がありません。 私はstrlenを自分で実装することができるので、しかし、それは大丈夫だ そして、それは入力と呼ばれる文字列を取ることがある そして今、私はこの文字列の長さを把握する必要があります。 だからどうすればこれを行うことができます? 私がしなければ何をする - あなたは何をしたい - さんがこれを行う方法を見てみましょう? [聞き取れない生徒の応答] >>オーケー。 だから我々は方法の束でこれを行うことができます。私は、このアプローチを取ることにしてみましょう。 私は自分自身にint型の変数iを挙げてみましょう、そう私は0から始まります。 そして私はこれを言わせて:入力中に[i]が何に等しくないですか? \ 0。 だからそれは、プログラムの中で文字通りに書き込むすべての文字を含んでいる場合と同様に、判明 あなたは、単一引用符ではなく二重引用符を使用する必要があります。 私は手紙を書いていたので、もし私が文字b、以下のことを行うだろう、私はそれを行うだろう。 これは、対照的に、ではなく、個々の文字列になります。 だから私は、文字通り\ 0としたい。私はこのループ内で何をするかをしたいですか? 実は、私は別の変数が必要なので、intの長さが0を取得します。 あなたは、私たちがやった方法を始めた理由を確認されていない場合でも、 今、私たちはこの道を行っている、私は、9行目で何をするかをしたいということ? 長さ+ +とダウンしてここに10行目、戻りの長さ。 だからstrlenをどのように実装されている? それは実際にこのように、おそらく実装されています。 多分ループに対して使用者は、多分Do Whileループ - 誰が知っている? 私たちは本当に、実際のソースコードでフードの下を見なければならないだろう いくつかのファイルはおそらくstring.cと呼ばれる。 しかし、ここでは私がやっていることについて考えてみましょう。 私は0と等しい値に設定することは、iという変数を宣言しています。 私はその後、0と等しい値に設定する、という別の変数の長さを宣言しています。 それから私は、入力中のi番目の文字が特殊文字で、ヌル文字\ 0に等しくないときに言っている 長さを増加させます。 しかし、すぐにi番目の文字は特殊文字であるため、何がループになりますか? それは短絡。それは、我々はその後、瞬時に長さを返すことを意味し、停止します。 私が台無しにしなかった場合それでは、先に行くと、私の端末ウィンドウに戻りましょう。 私は再コンパイルしてみましょう。そして、私は台無しでした。 ライブラリ関数strlenの互換性のない再宣言。 だから私はここに私自身のためにあまりにも巧妙取得しようとしていた。 コンパイラは、実際にはstrlenという関数があることを知っている 我々は、ライブラリが含まれていないにもかかわらず。それで結構です。ものは何でも。 我々は、ちょうどその後に協力するつもりです。この長さの名前を変更してみましょう。 私はここに長さにそれの使用を変更しましょう​​、これはClangのが幸せでしょう。 余談ですが、これらの機能のいくつかは、一般的なので、くそあるので - strlenは、prinf - 彼らは実際に特別なステータスのようなものを持っている。 そしてそうClangのはちょうどそれらについて特別な少し何かを知っています。 常に最新の機能を持つ場合ではないですね、私たちは怒鳴らてしまった理由だそう。 私はもう一度試してみましょう。ありがたいことに、それはその時間を働いた。 だから今、私は私自身のstrlenのプログラムを実行してみましょう。 私に文字列を与える:H-E-L-L-O、入力します。そして、私はしくじった。 なぜですか? >> [聞こえない学生の応答] >>その通りです。 だから私は、私自身はここで非常に見栄えの良い無限ループを持っている 私は、各繰り返しで長さをインクリメントしているにもかかわらずあるので、 私ははっきりと何をやっていないのですか?私は、iをインクリメントしていない。オーケー。簡単な修正。はい? オーケー。私はブラケットを必要な場所号今、私たちはいくつかの他の一般的な間違いに抵触だろう。 率直に言って、このコードは、不細工に見えるし始めている ので、私たちは一瞬にして、これをクリーンアップで刺しを取るよ。 しかし、今私は長さとiの両方をインクリメントしています。 率直に言って、私はすでにここに改善の機会を参照してください、しかし、我々はそれに戻ってくる。 だから今、私たちは少なくとも進歩していることを確認してみましょう。 これはあなたのいくつかに起こっている、と私は事前にこれを言及することを怠っ。 あなたがこのようなシナリオの不幸を持っているときは、これをどのように修正すればよい アプライアンスまたはコンピュータを再起動したり、ウィンドウを閉じたときの短い? これは、実際には簡単です。 コントロールCは、この小さなニンジン記号Cを送るでしょう、そして、それはちょうどほとんどのプログラムを終了します。 あなたは無限に何回もものを印刷している本当に悪い無限ループを持っている場合は、 時にはあなたは、それが実際にそれを聞くことには、Ctrl + C千回をヒットする必要があります。 私はかなり簡単だったものを、印刷していないためこのようにしていますちょうど今実現しています。 そして技術的には、一度で十分ですが、私はイライラしてくると私は通常何回もあること、それをヒット。 strlenのようにします。私に文字列を与える:こんにちは。それはこの時間を仕事に行くのですか? オーケー。別のよくある間違い。再コンパイルする必要があります。 つまり、その1意図的であった。かしこまりました。 strlenのように、H-E-L-L-O、入力します。優れています。 だから我々は現在、5にstrlenを持っています。 だから我々は文字通り、その車輪を再実装しました。 これは私が感銘を受けたものではないので、だから今はこの上をきれいにしてみましょう 私のコードの設計と。 我々は明らかにこれをクリーンアップするために、このプログラムで何を排除することができますか? [聞き取れない生徒の応答] >>うん。文字通り、我々は同じように私と長さを扱っている。 では、なぜ我々だけでスマート取得し、長さながら、言うことはありません? むしろ、それだけの長さを0に初期化し、初めに、呼び出してみましょう 我々はそれが何であるかを把握するまで、デフォルトでは文字列は長さを有していないため。 今、私たちはこれを行うには、今ではこれはかなり洗練されたプログラムです。 一つの変数。私は、それをクリーンアップし、それを強化した。 だから今の私の端末ウィンドウに戻りましょう。先に進み、これを実行してみましょう。 strlenを作る。よさそうだ。入力し、再びstrlenを実行します。 私に文字列を与える:こんにちは、入力します。そしてそれは5として動作しているようだ。 今、私は書かれていなかった場合、例えば、明確にするために、ハロー1の文字列で その後別のBYEは、我々は確かに複数の単語を持つことができます。 私は実際に入力したいと思った表現はHELLOはありませんでしたが、例えば、場合 世界、私たちが持っていないでしょうがここでこのような状況であることに注意して、右もしもし? それはそれは2つの文字列のことを示唆している。 あなたは確かに私たちが実際に長いフレーズで入力しそうだとすれば、スペースバーの文字を持つことができます Hello Worldのように、我々は実際にはメモリに何を持っているでしょう そこにそのような少し何かを探します。 かしこまりました。次に文字列のここに表現についてのご質問? いいえ?かしこまりました。 だから私は、そのように意図的に何度も何度もstrlenを呼び出していること以前言った あなたが仕事の全体の多くを行うことになるだろうので、おそらく最高のアイデアではありません 何度も何度も。 実際には、作業の種類は明らかに、文字列の長さを把握するために必要ですか? あなたが初めに開始し、その後見て、見て、見て、見て、見なければならない あなたが最終的にその特殊文字が表示されるまで、その時点で、ああ、今私は長さを知っている。 だから、以前の我々はstrlenが何度も何度も呼び出されていたとき、 再び、その文字列は以下のようになりますので、愚かのようなものだった、私が提案した理由があります。 それはあなたには、いくつかのループを反復するたびに変更するつもりはないが、 そのため、不必要な仕事をしている。 あなたが知っておくべき同時に、余談ですが、Clangのようなコンパイラは、これらの日は、その 長年にわたって開発されてきた、 とコンパイラライター、プログラマーは、かなりスマートです。 そしてそれは、Clangのと他のコンパイラでは、実際にそれを見つけ出すことができることが判明 大丈夫、はい、あなたは、あなたの状態にstrlenを書いた これは、技術的に我々は何度も何度もそれを呼ぶであろうことを意味する。 しかし、スマートコンパイラは実際に貧しいユーザの意思決定のこれらの種類を最適化することができます 物事を是正するため、コードの外に。 だから時には、コンパイラには我々よりも賢いであることを認識しない そして一種の私達の自身の過ちを隠すことができます。 しかし、確かにそれは問題セットなどになると、 それらの根本的に間違った設計上の意思決定について考えることがない 我々は方法より多くの仕事をしているはずだという単純な理由のための潜在的に よりも私たちが実際に行う必要があります。しかし、どのように多くの作業? HELLO WORLDの場合には、この問題の大きさを一般化することから始めましょう。 問題の長さや問題の大きさは何ですか 時ワードで入力したユーザーはHELLOですか? それは多分、明らかに6 5です。プラスまたはマイナス1。ものは何でも。 それは、我々はちょうどそれ5と呼ぶことにしますので、近いです。 HELLOの長さを把握しようとしたときに、問題の大きさはここで何ですか? それは、最後の文字を多分1、2、3、4、5、6ですが、一般化してみましょうnとその。 ので、n、単に変数nは、コンピュータ科学者は、一般的に使用されるものである 当面の問題の大きさ、問題を説明すると、helloとどのくらいですか? strlenは、どのくらいの時間がかかりますか? それは、各ステップは文字を見て意味し、nステップの順序を取る 文字を見て、文字を見てみましょう。 そして、我々は、しばらく前に何かがかかる操作の数を、この議論を交わしました。 私たちは誰もがぎこちなく立ち上がっていたクラスの非常に最初の日、 その後、誰もがお互いにオフペアリング開始 実際に部屋にあった理想的にどのように多くの人がカウントするため。 そして、我々はまた別のことをしたことにより、私は代わりに古い学校の道行った場合 ちょうど1、2、3、4、5、6、などを、出発の それも、その問題の大きさは、サイズnのだった。部屋のn人の人がいた。 しかし、私は右、それをスピードアップできますか?小学校のスタイルは、私が2秒でカウントを開始することができます。 2、4、6、8、10、12。そして、それはそんなに速く、確かにそれは感じている。 もう400人はこの部屋に足を踏み入れたなら、それは、再び文字通り2倍高速だが、 すべてを一度に、これらのアルゴリズムは、他の400または200多分手順を取るだろう。 私たちは本当にスマート取得し、私たちの代わりに持っている場合でも、これとは対照的に、あなたのすべてが、自分自身を数える そのアルゴリズムが働いたかを思い出してください。 あなたはすべて立ち上がった。これに早送りさせて頂いております。 あなたはすべて、あなたの半分は座った後、あなたがオフにペアになって、立ち上がった あなたの半分は、あなたの半分は座って、腰を下ろした そして0週からこのループの繰り返しごとに、我々は手で問題を半減 そしてその後、n / 8には、n / 4、N / 2に行ってきました。 との意味は、つまり別の400人は、部屋、大したことない、中に入る場合 それは、私たちにはない400以上のラウンドではなく、200以上のラウンドを、他に1ラウンドがかかります。 それで、私たちはしばらく前に言った話はこれで少し何かをしなければならなかった。 この赤い線がここに線形であるが、それはまっすぐだし、それをnとしてラベル付け 問題のサイズが大きくなるにつれてので、 あなたのアルゴリズムやプログラムがこれであなたが解決しようとしている場合、それは、n個のステップを実行します 我々はそれが問題の大きいサイズより時間がかかり直線としてそれをプロットすることができます。 と2をカウントtwosiesアプローチは、4、6、8、まだ直線が、ほんの少し良い。 それは黄色のラインがポイントの下に赤い線がポイントですので、少し時間がかかります。 しかし、より良い我々は対数時間と呼んだこの聖杯だった さえあれば再びここで我々は、部屋にいる人々の数を倍増 私たちは、授業の初日からその電話帳のサイズを倍にする 大したことは、それが1以上のページ·涙をとり、座って1以上をとりません 倍の大きさの問題を解決するためである。 そして、我々が今持って開始することを得るの会話がある どのように我々は、実際には効率的に問題を解決するのですか 我々はこのような問題の最も簡単な場合を考えてみ? 我々はいくつかの数字は8扉その後ろに持っていると仮定し、 そして、これらの数字の各々は、どのような方法でソートされていません 彼らは、これらのドアの後ろにちょうどランダムな整数だ 知っている - 私たちはどのように番号を見つけに行くのですか質問をする - これらのドアの後ろに7? もし、人間が、私に7番を見つけるために何をするでしょう 再び場合は、これらの各々は、ドアであり、あなたが扉を開かなければならない値を参照してください? あなたのアルゴリズムは、おそらく何でしょうか? [聞き取れない生徒の応答] >>だから左から開始して、ドアを開け、ドアを開け、ドアを開ける。 最悪の場合、どのくらいの時間が7番を見つけるために私たちを取るつもりですか? そして再び、彼らがソートされていないしているので、同じように簡単ではありません、まあ、私は第七の扉を開くつもりです。 それは、最大限に、8つのステップ私たちを取ることができます。 最悪のケースでは、図7に示すように、ドアのラインの一番最後にランダムである ので、我々はすべてのnドアを試す必要があるかもしれません。 だからここでも、我々は、線形アルゴリズムを持っているように思われる。 実際には、我々は数年だけのカップル前にこれをしなかった。 あなたの前任者の1つはこの正確でチャレンジしました 私たちがデジタル版を持っていなかった場合、我々はその代わりに黒板を持っていた その上に紙のいくつかの作品である。 と私は私は何だろうと思ったことは、これはどうだったのバックざっと目を通してくださいです ステージ上で最高の、そしておそらく最も厄介な機会の一つ サンダースの上で右ここにデモを持っている。 私たちは、数字の2行を持っていた。 私たちは、これらの行の一番上のためショーンと一緒にここに何が起こるかを見ていくつもりです。 しない限り、二度と誰もCS50のボランティア、 私たちは、カメラの前でこれを維持するためにショーンの祝福を持っていた ので、彼は何百人もの人々が何年も今これを見ていることを知っています。 しかし、ショーンは素晴らしい仕事をしてくれた - あるいは彼をした - ?実際に私達に特定の番号を見つけるに。 だから我々はずっと前にこの会話を再開しますように、彼は、このアルゴリズムをどう解決してみましょう 我々は効率的に物事を見つける方法の。 [ビデオオンマラン]私は、これらのドアの後ろに数字の7を非表示にしている しかし、他の非負の数であるだけでなく、これらのドアの一部にひっそりと あなたの目標は、単に配列としてこの数値の一番上の行に考えることです またはそれらの後ろの数字を書いた紙の部分のちょうどシーケンス、 あなたの目標は、ここでしかトップアレイを使用して、私に7番を見つけることです。 そして、我々は、あなたはそれをやって行く方法批判しようとしている。 >>すべての権利。 [マラン]ください、私たちの7番を検索します。 [笑い] [マラン]いいえ[笑い] 5、19、13、[笑い]。それはトリックの質問ではありません。 1。 [笑い] この時点で、あなたのスコアは非常に良いではありませんので、あなたにも続けるかもしれません。 [笑い] 3。 進んでください。率直に言って、私は助けることは、あなたも考えているのだろうことはできません。 [笑い] 最上行のみなので、あなたは3点の左を持っている。だから私は7を見つける。 [学生がさらさら] [マラン] 17。 [学生がさらさら] [マラン] 7! [拍手] だから、水曜日に私たちは、物事を見つけるために、この、より洗練されたアルゴリズムに飛び込みましょう。 今のところ我々はショーンであなたを残しておきますと、水曜日にお会いしましょう​​。 [CS50.TV]