world」を画面に表示することを学びました。helloでコンパイルし、ソースコードをマシンコードに変換してから、./helloでコンパイルしたプログラムを実行しました。実際のところ、オプション付きでコンパイラであるclangを呼び出すプログラムにすぎません。hello.cコマンドを実行します。何も起きていないようですが。これはエラーがなかったということです。lsを実行すると、a.outファイルがディレクトリに表示されます。hello.cを実行できます。別のコマンドライン引数、またはコマンドライン上のプログラムへの入力を、プログラム名の後に追加しました。clangはプログラムの名前で、-o,、hello、およびhello.cは追加の引数です。使用し、ソースコードとしてhello.cを使用するように指示しています。これで、出力としてhelloが作成されたことがわかります。-lcs50も追加する必要があります。get_stringのマシンコードを含みます。IDEではすでにこれらの引数が生成されるようmakeが設定されています。ソースコードのマシンコードへのコンパイルは、実際にはより小さなステップから構成されています。始まる行が含まれます。そのヘッダファイルを探すように指示します。プログラムに含めたい内容が含まれているからです。これらのヘッダファイルの内容をプログラムに置き換えます。以下のようなものです。name);}これは前処理で以下のようになります。name);}これには、インクルードしたライブラリのすべての関数のプロトタイプが含まれているため、コードで使用できます。コンパイルでは、ソースコードであるC言語を取得し、アセンブリコードと呼ばれる別のタイプのソースコードに変換します。...これらの命令は下位レベルであり、コンピュータのプロセッサが直接理解できるバイナリ命令に近いものです。バイナリ命令は、変数名のような抽象化ではなく、通常はバイト自体を操作します。次のステップは、アセンブリコードを取り出し、それをアセンブルしてバイナリの命令に変換することです。バイナリ形式の命令はマシンコードと呼ばれ、コンピュータのCPUが直接実行できます。最後のステップは、cs50.cのように、以前にインクルードしたライブラリをコンパイルしたものを、実際にプログラムのバイナリと結合するリンクです。これらの4つのステップはmakeによって抽象化または単純化されているため、実装する必要があるのはプログラムのコードだけです。デバッグバグとは、意図した動作とは異なる動作を引き起こすプログラム内の誤りまたは問題です。デバッグとは、これらのバグを見つけて修正するプロセスです。前回、私たちはコンパイルをしたのと同時に、良いスタイルを持ち、正しいコードを書くのに役立ついくつかのツールについて学びました。あるprintf関数を使用して、デバッグに役立つメッセージと変数を出力できます。buggy0.cを見てみましょう。(プログラムはエラーなしでコンパイルされているので、ロジックにエラーが発生しています)。}}これで、iが0から開始して10まで続いていることがわかります。IDEには、プログラムのデバッグに役立つ別のツールdebug50があります。これはスタッフが作成したツールで、gdbと呼ばれる標準ツール上に構築されています。これらのデバッガはどちらも、プログラムをステップバイステップで実行し、プログラムの実行中に変数やその他の情報を確認できるプログラムです。./buggy0を実行すると、プログラムを変更したので再コンパイルするように指示されます。次に、デバッガがプログラムを一時停止するコードの行にブレークポイントまたはインジケータを追加するように指示します。ターミナルで上下キーを使うことで、過去のコマンドを再入力せずに利用できます。コードの6行目の左側をクリックすると、赤い円が表示されます。./buggy0をもう一度実行すると、右側にデバッガ・パネルが開きます。セクションの下にあり、値が0であることがわかります。ブレークポイントは6行目でプログラムを一時停止し、その行を黄色で強調表示しています。続行するには、デバッガパネルにいくつかのコントロールがありますが、青い三角形は、別のブレークポイントまたはプログラムの最後に到達するまでプログラムを続行します。行を実行し、直後にプログラムを再び一時停止します。そこで、カーブした矢印を使用して次の行を実行し、その後の変化を確認します。printfの行に戻り、カーブした矢印をもう一度押すと、ターミナルウィンドウに#が1つ表示されます。矢印をもう一度クリックすると、iの値が1に変わります。矢印をクリックし続けると、プログラムが1行ずつ実行されます。Cを押して実行中のプログラムを停止します。別の例としてbuggy1.cを見てみましょう。n;}別の関数get_negative_intを実装し、ユーザから負の整数を取得しました。main関数の前にプロトタイプを記述する必要があり、そうすればコードがコンパイルされます。プログラムを実行すると、負の整数を指定した後も負の整数を指定するように要求され続けます。get_negative_int();にブレークポイントを設定します。これが最初の興味深いコード行だからです。その時点でプログラム内で呼び出され、まだから返されていないすべての関数を指します。これまでは、main関数のみが呼び出されていました)。コールスタックが関数の名前で更新され、変数nが値0で更新されています。Over」をもう一度クリックすると、nが-1に更新されています。これは実際に入力した値です。クリックすると、プログラムがループ内に戻っているのがわかります。whileループはまだ実行中であるため、whileループがチェックする条件はtrueである必要があります。0に変更してバグを修正する必要があります。debug50の使い方を学ぶために少しの時間を投資することで、将来多くの時間を節約することができます。使用することもできます。これは、ラバーダックに何をしようとしているのかを説明するための実際のテクニックであり、多くの場合、ロジックや実装の誤りを理解しながら説明することができます。メモリCでは、データを格納するために使用できる変数のタイプが異なり、それぞれが一定量のスペースを占有します。IDEで使用される容量を使用します。bytes...コンピュータの内部にはRAM(ランダム・アクセス・メモリ)と呼ばれるチップがあります。RAMは、プログラムが実行されている間のコードや、プログラムが開いている間のファイルなど、短期間使用するためのデータを格納します。保存して長期保存することもありますが、RAMの方がはるかに高速なので使用します。RAMは揮発性であるため、データを保存するために電力が必要です。RAMに格納されたバイトは、グリッドにあるかのように考えることができます。実際には、チップあたり数百万または数十億バイトです。Cでは、char型の変数を作成すると、その変数は1バイトのサイズになり、RAM上のこれらのボックスの1つに物理的に格納されます。4バイトの整数は、これらのボックスの4つを占有します。配列3つの数の平均を取りたいとします。3.0);}3ではなく3.0で除算するので、結果もfloatになります。プログラムをコンパイルして実行すると、平均値が表示されます。プログラムの実行中、3つのint変数がメモリに格納されます。各intは4バイトを表す4つのボックスを持ち、各バイトは8ビットの0、1で構成され、電気部品によって格納されます。メモリ内では、変数を次々に連続して格納し、ループを使用してより簡単にアクセスできることがわかります。Cでは、連続して格納された値のリストを配列と呼びます。scores[3];によって3つの整数の配列を宣言できます。72として配列内の変数を割り当てて使用することもできます。位置にインデックスを付けて、その位置に移動します。配列のインデックスは0から始まります。最初の値のインデックスは0、2番目の値のインデックスは1というようになります。配列を使用するようにプログラムを更新します。3.0);}ここで、ユーザに3つの値を要求し、前と同じように平均を出力しようと思いますが、配列に格納された値を使用します。配列内の項目は、その位置に基づいて設定およびアクセスすることができ、その位置は変数の値にもまたなるため、ループを使用できます。3.0);}ハードコーディング、つまり各要素を3回手動で指定する代わりに、forループとiを配列内の各要素のインデックスとして使用します。配列の長さを表す値3を2つの異なる場所で繰り返しました。TOTAL);}constキーワードを使用して、TOTALの値がプログラムによって変更されてはならないことをコンパイラに伝えることができます。慣例により、変数の宣言をmain関数の外に置き、その名前を大文字にします。これはコンパイラには必要ありませんが、私たちには、この変数が定数であり、最初から見やすいようにします。正確に3つの値がなければ、現在の平均は間違っている数値です。平均を計算する関数を追加します。渡し、ヘルパー関数内で別のループを使用して値を合計して変数sumにします。使用してlengthをfloatにキャストするので、この2つを分割した結果もfloatになります。scores);を使用して新しいaverage関数を呼び出すことができます。main内の変数の名前は、値のみが渡されるため、averageが呼び出すものと一致させる必要はありません。配列の長さをaverage関数に渡しているため、average関数はいくつ値があるか知ることができます。簡単なプログラムで1文字を印刷できます。c);}このプログラムを実行すると、ターミナルに#と表示されます。プログラムを変更してcを整数として出力するとどうなるかを見てみましょう。は#記号のASCIIコードであることがわかります。実際には、cを明示的にintにキャストする必要はありません。この場合、コンパイラーはそれを行うことができます。charは1バイトなので、上のメモリグリッドの1つのボックスに格納されていると考えることができます。文字列やテキストを出力するには、文字ごとに変数を作成して出力します。いう文字列が表示されます。次に、各文字の整数値を出力します。出力され、これらの文字が次のようにメモリに格納されていることがわかります。文字列は実際には単なる文字の配列であり、CではなくCS50ライブラリで定義されています。s[1]などでアクセスできます。文字列は特殊文字「\0」、またはすべてのビットが0に設定されたバイトで終わることがわかります。この文字はNULL文字またはNULと呼ばれます。したがって、実際には、3文字の文字列を格納するために4バイトが必要です。このプログラムでは、文字列を配列として使用し、文字列の各文字のASCIIコードまたは整数値を出力できます。0が印刷されています。s[4]にアクセスしようとすると、予期しないシンボルが出力されます。Cを使うと、私たちのコードは本来アクセスすべきでないメモリにアクセスしたり変更したりすることができ、これは強力ですが危険です。ループを使用して、文字列内のすべての文字を出力できます。'\0'、つまりsの現在位置にある文字がnull文字でない場合以外という条件だけでなく、iが何であるかにとらわれずループを継続することができます。ライブラリstrlenに付属する関数を使用して、ループの文字列の長さを取得できます。printf("\n");}プログラムの設計を改善する機会です。この条件では、各文字が出力された後に文字列の長さをチェックするため、ループは少し非効率的です。文字列の長さは変更されないため、文字列の長さを1回チェックすれば大丈夫です。}}ループの開始時に、変数iと変数nの両方を初期化し、nで文字列の長さを記憶します。これにより、strlenを呼び出して文字列の長さを毎回計算することなく、値を確認できます。nを格納するためにもう少しメモリを使う必要がありましたが、これにより、毎回文字列の長さをチェックする必要がなくなり、時間を節約できます。次の2つの文字列の配列を宣言します。"BYE!";メモリ内では、文字列の配列は次のように格納され、アクセスされます。words[0]は、文字列であるwords配列の最初の要素または値を参照するため、words[0][0]は、文字であるその文字列の最初の要素を参照します。文字列の配列は単なる文字の配列です。これまで見てきたものを組み合わせて、文字を大文字にするプログラムを書くことができます。printf("\n");}まず、ユーザから文字列sを取得します。それ以外の場合は、そのまま表示するだけです。(小文字は大文字よりも高いASCII値を持ち、同じ文字間の違いは同じ値であることがわかっているので、小文字から大文字を引くことができます)別のライブラリctype.hを使用することもできます。printf("\n");}他の人がこの関数を書いてテストしてくれたので、コードは読みやすくなり、正確になりそうです。単純化して、各文字をtoupperに渡すだけで、小文字以外の文字は変更されません。printf("\n");}CS50のマニュアルページを使用して、一般的なライブラリ関数を検索し、学ぶことができます。ctypeと呼ばれるライブラリーから使用できる関数です。独自のプログラムは、コマンドライン引数、つまりプログラム名の後に追加された単語をコマンド自体に取り込むこともできます。argv.cでは、main関数の外観を次のように変更します。}}argcとargvは2つの変数で、プログラムをコマンドラインから実行したときにmain関数が自動的に取得するようになりました。argcは引数の数です。(例えば./helloなどの最初にタイプされた単語)。この例では、引数が2つあるかどうかをチェックし、2番目の引数がある場合は出力します。Davidと表示されます。コマンドの2番目の単語としてDavidと入力したためです。各文字を個別に印刷することもできます。}}argv[1][i]を使用して、プログラムの最初の引数の各文字にアクセスします。main関数も整数値を返すことがわかりました。デフォルトでは、main関数は何も問題がないことを示す0を返しますが、別の値を返すプログラムを作成することもできます。0を記述しますが、本来は必要ありません)。複雑なプログラムを作成する場合、このようなエラーコードは、ユーザーには表示されていない場合や意味がない場合でも、問題の原因を特定するのに役立ちます。アプリケーションプログラムの中で文字列を扱う方法や、ライブラリの中で他の人によって書かれたコードを扱う方法がわかった今、単語や文の長さや複雑さなどの要因に基づいて、テキストの段落を読みやすさのレベルで分析することができます。暗号技術は、情報をスクランブルしたり、隠したりする技術です。誰かにメッセージを送信したい場合は、暗号化するか、何らかの方法でメッセージをスクランブルして、他の人が読みにくいようにします。このアルゴリズムに入力される元のメッセージは平文と呼ばれ、暗号化されたメッセージは暗号文と呼ばれます。スクランブルを行うアルゴリズムは暗号と呼ばれます。暗号は一般に平文に加えて別の入力を必要とします。キーは、数字のように、秘密にされている他の入力です。86とキーを足します。これを復号化するには、キーが1であることを知っていて、各文字からそれを減算する必要があります。これらの概念は、後段のレッスンと問題セットで説明します。languages.。