DOUG LLOYD：すべての権利。
だから今のタックルましょう 本当に大きな話題、機能しています。
これまでのコースで、すべての 私たちが書いてきたプログラム
メインの内側に書かれています。
彼らは、非常に単純なプログラムです。
あなたは、これらすべてを持っている必要はありません 枝や物事が起こっています。
私達はちょうどそれをすべて収めることができます メインの内側とそれ
ひどく圧倒的得ることはありません。
しかし、コースが進むにつれてと あなたがプログラムを開発するために始めると
独立して、彼らはおそらくつもりです 10よりも多くを得るために開始します
または15行。
あなたは数百または数千を得る可能性があります または十何千行ものコードの。
そして、それは本当にありません クレイジー考えています。
このように、それはおそらく良い考えではありません メインの内部のすべてを維持します。
それは見つけることが少し難しい得ることができます あなたはそれを行う場合は探しているもの。
>> 幸いなことに、Cけれども、とかなり 他のすべてのプログラミング言語こと
うまくいくかもしれない、ことができます 私たちは、関数を記述します。
そして、私はちょうどに行きますよ さておき、ここで迅速に取ります
関数があることを言及します コンピュータサイエンスの一つの領域。
そして、あなたは、それらの多くより多くが表示されます コー​​スを通してさまざまなポイント
あなたは上で続けば。
どこに多くのがあります 同じ単語の同義語。
だから我々は関数を呼び出します。
しかし、あなたはまた、それらを聞くことがあります 手順と呼ばれます、
または方法、特に、あなたがしている場合は、これまで 任意のオブジェクト指向プログラミングを行います
before--と心配しないでください あなたがいない場合ではなく、
大きなdeal--しかし中 監査指向言語
頻繁に呼び出されるメソッドです。
時には彼らは、サブルーチンと呼ばれています。
しかし、彼らは本当にすべて参照してください。 同じ基本的な考え方に。
>> それでは、その考えが何であるかを見てみましょう。
機能とは何ですか？
まあ機能が実際にあります ブラックボックス以外の何物でもありません。
ゼロのセットを持ってブラックボックス 以上の入力と単一の出力。
これは、例えば、そのように 機能かもしれません。
これは、FUNCと呼ばれる関数です。
そしてこれは3つの入力A、B、およびCを取ります。
そして、そのブラックボックスの内部には、我々 それがない正確に何を知りません、
それは入力を処理 何らかの方法で、次に
この場合、単一の出力を提供し、Z。
今では少し作るために 抽象度の低い、我々
我々は多分それを言うことができます 呼ばれる機能を持っています
それは三つの入力、Bを取り追加し、 Cとは、何らかの方法で出力を処理
ブラックボックスの内部 単一の出力を生成します。
この場合、もしそうであれば 追加は、3を取り6、および7。
どこかの内部 我々は、機能を追加することになります
それらを一緒に追加されることを期待します 出力を生成するために、これ
3プラス6 + 7または16です。
>> 同様に、あなたは呼び出された関数を持っています 2つの入力A、Bを取りMULT、
そのようないくつかの方法でそれらを処理します その関数の出力
2つの入力の製品です。
2つの入力が掛け合わさ。
図4及び図5は、MULTに渡されます 何かが、私たちが期待する出力を発生します
20です。
なぜ我々はブラックボックスと呼んでいますか？
さて、私たちが書いていない場合 これは、自分自身を機能
我々は、CS50、これまでかなりやりました。
我々は、例えば、プリントFを見てきました 私たちが書いていない機能があります
自分自身が、我々はすべての時間を使用するのです。
我々は書いていない場合 機能自分自身、
私たちは本当にそれはだか知っている必要はありません 実際にボンネットの下に実装されています。
>> 私はブラックボックス例えばそう ただ、乗算のためにあなたを示しました
MULT、Bは次のようになり defined--これはちょうどです
いくつかのpseudocode--が考えられ 回のB出力として定義されています。
それは、右の意味をなします。
私たちは、呼び出された関数を使用している場合 2つの入力を取りMULT。
我々は、出力があろうと期待されます 2つの入力は、乗算しました
回B。
しかし、MULTも可能性があり このように実装、
私たちは、カウンタ変数にを持っています 0にMULTの内部にセットされます。
そして、我々は、このプロセスを繰り返します B回はカウンタに追加します。
例えば、我々はによって3Aを掛けた場合 図5b、我々はカウンターを0に設定すると言うことができます、
5回繰り返して、カウンタに3を追加します。
だから我々は、0から開始し、我々がやります この5回の3、6、9、12、15。
これは、同じ結果です。我々 まだわずか3回5を取得
実装が異なっています。
>> それは我々が何を意味するかです 私たちは、ブラックボックスを言うとき。
それはちょうど私たちは本当に気にしないことを意味します どのようにそれはボンネットの下に実装されています
限り、出力は、我々が期待するものであるとして。
実際には、それが契約の一部です 特に、機能を使用して
他の人が書き込み機能。
動作が常に起こっています 予測できない、典型的であるために
関数の名前に基づいて。
そして、それはそれは本当にだ理由です 重要なあなたは、関数を記述するとき
場合や、他の人が書きます あなたが使用する可能性がある機能、
これらの機能は持っていること 明確な、比較的明白な名前、
よく文書化されています。
どちら確かにケースです 印刷Fのような機能のために。
>> では、なぜ私たちは関数を使用するのですか？
さて、私たちが書く場合は、先に言ったように 我々のコードのすべての主要なものの内部
本当に面倒な取得することができます 本当に複雑。
機能は、私たちにできることを許可します 物事を整理し、破壊します
非常に複雑な問題に 多くのより管理サブパーツ。
関数も、私たちができるようにします 符号化処理を簡素化します。
これは、10をデバッグするためにはるかに簡単です 100ライン対ライン機能
関数または千ライン機能。
我々は、デバッグする必要がある場合 当時の小片、
あるいは、当時の小片を書きます そのプログラミングの経験を作ります
多くの良いです。
その1の私を信頼します。
>> 最後に、関数を書く場合には、我々 これらのさまざまな部分を再利用することができます。
機能は再利用することができます。
これらは、で使用することができ 一つのプログラムまたは別の。
あなたは既に書きました 機能、すべてのあなた
そのプログラムを教えている実行する必要があります どこでその機能を見つけることができます。
私たちは、リサイクルおよび使用してきました 40年以上にわたり、fを出力します。
しかし、それは一度だけ書かれていました。
右、かなり便利。
大丈夫。
だから、機能は素晴らしいです。
我々はそれを知っています。
今度はそれらを書いてみましょう。
のが得てから始めましょう 私たちのプログラムにそれら。
これを行うためには、最初の 私たちがやることは、関数の宣言です。
あなたは関数を宣言する場合 あなたは基本的に何をやっています
コンパイラを語って、 ちょっと、ちょうどあなたが知っているので、
私は書くことにするつもりです 後で機能
ここでそれが見えるように何が起こっているのです。
その理由は コンパイラは可能性があるため
いくつかの奇妙なことを行う場合 彼らはシンボルのセットを参照してください
彼らはに慣れていないこと。
だから我々は単にコンパイラaを与えます ヘッドアップ、私は関数を作成しています
それがこれを行うために起こっています。
一般的に関数の宣言の場合 あなたは方法であなたのコードを整理しています
他の人のことができるようになること 理解とを利用します、
あなたは、一般的にすべてを入れたいです あなたの関数宣言の
あなたのコードの最上部に、右 あなたも、主要な書き込みを開始する前に。
そして便利に、あります 非常に標準的なフォーム
すべての関数の宣言は、次のこと。
彼らはすべてのほとんどは、このようにします。
関数の3つの部分があります。 宣言、戻り値の型、名前、
そして、引数リスト。
>> 今戻り値の型はどのような種類のあります 変数関数が出力されます。
したがって、たとえば、場合には、我々は戻って考えます 乗算〜2分前
数値関数、我々は、以下の場合に何を期待しています 我々は、整数、整数を乗算
出力は次のようになります おそらく整数、右。
掛け二つの整数 一緒に、あなたは、整数を取得します。
その戻り値の型だから この関数はint型になります。
名前は何をしたいです あなたの関数を呼び出します。
これはおそらく最も重要です 関数宣言の一部、
機能性の点から好ましいです。
しかし、実際には、おそらく1です 最も重要な部分の
点では関数宣言の 実際にどのような機能を知ります
い。
あなたは、関数fまたはgに名前を付ける場合、または 時間や謎またはそのような何か、
あなたはおそらく取得するつもりです 少しはしようとしてアップトリップ
これらの関数は何をすべきかを覚えています。
だから、あなたを与えることが重要です 関数の意味のある名前。
>> 最後に、引数リストされています カンマ区切りのリスト
あなたの関数へのすべての入力の、 その各々は、タイプと名前があります。
だから、しなければならないのではないだけ 変数の型を指定します
関数が出力されます、 あなたも指定したいです
どのようなタイプと変数の型 関数は、入力として受け入れます。
それでは、ここでの例を実行してみましょう。
ちょうど見てみましょう より具体的な1時。
そこでここでは関数の例を示します。 その関数の宣言
一緒に2つの整数を追加します。
二つの整数の和をしようとしています ちょうど私達のように、同様に整数であります
議論しました。
だから戻り値の型、 ここで緑で、int型になります。
それはちょうど2つのintを追加することを教えてくれる 一日の終わりに起こっています、
出力、または戻ってそれを吐きます 私たちに出て、整数。
この関数は、我々が何をするかを考えます それに意味のある名前を付けたいです。
2つのintと思われる追加 考慮して、適切な
我々は、入力として2つの整数を取っています うまくいけば、それらを一緒に加えます。
これは面倒なビットであるかもしれません 名前と率直に言って、この機能
おそらく必要はありません 我々は追加を持っているので、
あなたが私たちから思い出した場合、オペレータ、 オペレーターの議論、以前に。
しかし、ちょうどのために言わせて この機能が有用であることを引数
ので、我々はそれが2つのintを追加呼ぶことにします。
最後に、この関数は2つの入力を取ります。
それらの各々は整数です。
だから我々はこのカンマを持っています 入力のリストを分離しました。
今、私たちは一般的にしたいです それらのそれぞれに名前を付けます
それらを使用することができるように 関数内。
名前はそれほど重要ではありません。
>> ここでは、必ずしもありません それらに接続されているすべての意味を持ちます。
だから我々はちょうどそれらとBを呼び出すことができます。
それは完全に罰金です。
しかし、もし、あなたが見つけます 状況で自分自身
ここで変数の名前 実際に重要であるかもしれません、
あなたはそれらを呼び出すことをお勧めします aとb以外のもの
彼らにもっと何かを与えるために 象徴的意味を持ちます。
しかしこの場合、私たちは本当にありません 関数について何かを知っています。
私達はちょうど2つの整数を追加したいです。
だから我々はちょうど呼ぶことにします これらの整数A及びB。
これは一例です。
>> あなたは、第二を取ることはありませんなぜ これを考えるために、
どのように機能を記述します その関数の宣言
2つの浮動小数点数を乗算？
あなたは何を覚えていますかA 浮動小数点数はありますか？
何この関数は希望 宣言のように見えますか？
私は実際にあなたがビデオを一時停止をお勧めします ここで、あなたが必要とするどのくらいの時間かかります。
何これについて考えます 関数の宣言は次のようになりますか？
戻り値の型は何でしょうか？
意味のある名前は何でしょうか？
入力は何でしょうか？
なぜ、あなたはここにビデオを一時停止しないでください 書き込みアップ関数宣言を
掛けるだろう機能のために 2つの浮動小数点数。
うまくいけば、ビデオを一時停止しました。
>> それでは、例を見てみましょう 一つの可能​​な宣言の。
MULT 2実数フロートX、Yフロートフロート。
2の製品 浮動小数点数、
私たちはどのようにするリコールされています 実数を表します
またはcの小数点以下の値を持つ数、 浮動小数点数になるだろう。
あなたが掛けたとき 進することにより進、
あなたはおそらく、小数点を取得するつもりです。
あなたはそれに関連した名前を与えたいと思います。
2実数を掛け罰金です。
しかし、あなたは実際にそれを呼び出すことができます MULT 2つのfloat、またはMULT山車。
これほど長い間そのようなもの、 いくつかの実際の意味を与えたもの
このブラックボックスは何をするつもりでした。
そして再び、この場合には、我々はありません 何の意味が添付されているように見えます
の名前に 我々は渡している変数、
私たちは、単にxとyにそれらを呼び出します。
今、あなたは何か、それらを呼び出す場合 他に、それは完全に罰金です。
実際には、あなたがした場合 代わりに、この宣言
代わりにダブルスを使用して あなたが思い出した場合の、浮きます
ダブルスは異なっていること 方法により正確に
実数を指定しますか、 浮動小数点変数。
それはあまりにもまったく問題ありません。
どちらかそれらの一つは大丈夫だと思います。
実際には、いくつかあります 異なる組み合わせ
この関数を宣言するための方法。
しかし、これらは、二つのかなり良いものです。
我々は、それは素晴らしいことだ、関数を宣言しました。
私たちはどのようなことをコンパイラに指示しました 私たちがやっているとしているもの、です。
それでは、実際にその機能を書いてみましょう。
のはそれを定義してみましょう、 その結果、ブラックボックスの内部
予測可能な動作が起きています。
実際には、我々は二つの実を乗算しています 一緒番号、または追加の番号
一緒に、またはそれが何であれやっ 私たちが行うために私達の機能を尋ねたもの。
>> だから実際には、のがしようとすると定義してみましょう ちょうど私達2実数を掛けます
秒前について話しました。
今の始まり 関数定義
ほとんど同じに見えます 関数の宣言として。
私はここでそれらの両方を持っています。
上部には関数宣言であり、 タイプ、名前、カンマで区切られた引数
リスト、セミコロン。
セミコロンがあることを示し それは、関数の宣言です。
関数の先頭 定義は、ほぼ正確に見えます
同じタイプ、名前、コンマ区切り 引数リスト、無セミコロン、
中括弧を開きます。
同じように、オープン中括弧、 私たちは、主に行ってきました
私たちが今していることを意味し 定義し始めて
何がブラックボックスの内部で起こること 我々はMULT 2実数を呼び出すことにしました。
ここで、それを実現する1つの方法です。
我々は新しいを宣言することができ、言うことができます 製品と呼ばれるfloat型の変数
その変数を割り当てます 値x倍yに。
そして、製品を返します。
リターンはここで何を意味します。
まあ復帰方法です 我々は、それがどのような指示します
我々は戻って出力を渡しています。
だから、何かを返す、と同じであり、 これは、ブラックボックスの出力です。
だから、それはあなたがそれを行う方法です。
ここではそれを実装する別の方法です。
私達はちょうどY x回を返すことができます。
xはフロートです。
yは浮動小数点数です。
回のxだからyはまた、フロートです。
私たちもする必要はありません 別の変数を作成します。
だから、異なる方法です まったく同じブラックボックスを実装します。
>> 今の瞬間を取ります、 もう一度ビデオを一時停止、
そして、2つのintを追加しようとすると定義 これは、他の関数である我々
少し前の話を。
ここで再び、私は、関数を入れています 宣言などセミコロン、
オープン中括弧 そして、閉じカーリー
我々は記入する場所を示すためにブレース 内容に、2つのintを追加
私たちは、特定の定義ように、 ブラックボックスの内部動作。
だから、ビデオを一時停止。
そして、できるだけ多くの時間がかかります あなたは試してみて、定義する必要があります
実装は2つのintを追加し、そのような その関数が値を出力すると、
それは実際には、ありません、リターン 2つの入力の合計。
だから、前の例のように、 いくつかの異なる方法があります
あなたは、2つのintを追加実装することができること。
ここに1つです。
ここにオレンジ色で、私はしました ただ、いくつかのcomments--を持っていました
私はいくつかを追加しました 示すためのコメント
何がコードの各行に起こっています。
だから私は、変数を宣言 int型の合計と呼ばれます。
私は、合計がプラスBに等しいと言います。
私たちが実際にやっているところです 仕事が追加と一緒にBは
そして、私は合計を返します。
ので、それは理にかなっています 合計は、int型の変数です。
そして、データ型は、このことを何 関数は出力に起こっている私に指示？
Int。
だから私は、合計を返すよこれ 整数型の変数です。
そして、それは私たちがしてきたこと与えられた意味をなします 宣言され、私たちの関数を定義しました
することができません。
>> 今、あなたはまた、定義することができます 機能このようにして、
int型の合計がプラスに等しいb--ことをスキップ step--最初にして、合計を返します。
今、あなたはまた、可能性があり それは、この方法で実装しました
これは私は非常にお勧めしません。
これは、1つの悪いスタイルです 事と本当に悪いデザイン、
それは、実際には、動作しません。
あなたはintで、このコードを、取る場合 悪い加算ドットcを追加し、それを使用しています。
これは、実際に追加しません 2つの整数。
それは非常に貧弱な実装です この特定の行動の。
しかし、それは動作しません。
それは説明するためにここだけです 私たちは本当にない点
内側に何が起こるか気に 限りブラックボックス、
それは我々が期待する出力を有しているからです。
これは、設計が不十分ブラックボックスです。
しかし、最後の日に、それはありません まだ出力プラスbの合計。
大丈夫。
だから我々は、機能を宣言しました。
そして、我々は機能を定義しました。
だから、本当に良いです。
今度は、関数を使用することから始めましょう 私たちは宣言したと我々は定義されてきたこと。
それが実際ですfunction--を呼び出すには あなたがする必要があるすべてはかなりeasy--
適切な引数を渡しています、 データ型の引数
それは期待していること、および その後、リターンを割り当てます
その関数の値 そして、this--言い訳me--
その関数の戻り値を代入 正しいタイプのものに。
>> それでは、見てみましょう 実際には、このファイル内の
加算器1ドットCと呼ばれ、これは 私はCS50のIDEを持っています。
そこでここでは、加算器1点cです。
初めに、あなたは私が持っている参照してください。 私は、ポンドが含まれ、含まれ、
標準入出力、およびCS50ドット時間。
そして私は私の関数宣言を持っています。
私はここにあります 私は、コンパイラに伝えます
書くことになるだろう 呼び出された関数は、2つのintを追加します。
これは、出力ANに起こっています 整数型の変数。
つまり、この部分はここでです。
そして、私はそれに2つの入力を持っています aとb、それらの各々は整数です。
メインの内部では、私はをユーザーに尋ねます 私に整数を与える、と言って入力。
そして、彼らは忘れてするように求められます その関数でint型、
CS50ライブラリに含まれています。
そして、それはに格納されます X、整数変数。
>> その後、我々は他の整数のためにそれらを促します。
私たちは別の整数を取得します yのそれを格納します。
そして、ここではライン28上の、あります ここで、我々は、関数呼び出しを行います。
我々は、int型zの等号を言っています 2 int型のxコンマYを追加します。
これは理にかなっているなぜあなたは思いますか？
xは整数型変数で、 yは、整数型の変数です。
だから、それは良いことです。
それがどのような私達の機能と意味をなします ライン17上の宣言は次のようになります。
カンマ区切りの入力リスト 2つの整数aとbのを期待しています。
その場合は、呼び出すことができます それら何でも私たちが望みます。
それはちょうど2つの整数を期待しています。
xは整数であり、yは整数です。
それが動作します。
>> そして、我々はその関数が起こっている知っています 出力の整数としても。
そして、私たちは保存されています 関数の出力、
整数型では、2つのintを追加 変数、我々は、zを呼んでいます。
そして、我々は、の合計を言うことができます ％がiとパーセント私は％です。
X、YおよびZはそれぞれ これらのパーセント私の年代に埋めます。
の定義は何ですか 2つのintは次のように追加しますか？
それは非常に簡単です。
それは私たちのものの一つです ただ、前に見た第二
int型の合計はプラスBリターン合計に等しいです。
この仕事をしていますか？
ファイルを保存してみましょう。
そして、ダウンここに私の端末上 私は、加算器1を作るつもりです
私は私の画面をクリアします。
私が知っているので、ズームインするつもりです それは見て少し難しいです。
>> だから我々は、加算器1と、このプログラムをコンパイルします。
だから我々は、ドットスラッシュ加算器1を行うことができます。
私は整数、10を与えます。
私は別の整数、20を与えます。
10と20の和は30です。
だから我々は成功した関数呼び出しを行いました。
あなたは、負の関数を再度実行することができます 図10は、負の10と17の合計17 7です。
この機能は動作します。
それは行動を持っています 我々はそれをするために期待しています。
そして、私たちは成功を作りました 関数、定義、宣言、
成功した関数呼び出し。
カップルその他 関数についてのポイント
我々はこのセクションを終える前に。
私たちからのリコール データ型の議論
以前に、その機能 時には何も入力を取ることはできません。
その場合は、我々 関数を宣言する
ボイド引数リストを持つように。
あなたは何を思い出してください 最も一般的な機能
我々はかかるという、これまで見てきました ボイド引数リストはありますか？
これは、主です。
時にはその機能を思い出してください 実際に出力を持っていません。
その場合は、関数を宣言 ボイド戻り値の型を持つように。
それでは、によって、このセクションを締結してみましょう 練習問題に取り組みます。
>> だからここにレイアウトされた問題です。
私は、関数を書きたいです 有効な三角形と呼ばれます。
この関数は何をすべき 3つの実数値を取ることです
それは3の長さを表します そのパラメータとして三角形の辺、
またはその引数、またはその 同義語の別のセットをinputs--
あなたが遭遇するかもしれません。
この関数はすべき 出力は、真または偽
これらの3つの長さかどうかに応じて、 三角形を作ることが可能です。
あなたはそのデータ型を覚えていますか 私たちは、trueまたはfalseを示すために使用しますか？
今、あなたはこれをどのように実装するのですか？
まあカップルがいることを知っています 三角形に関するルール
それは実際に知っておくと便利です。
三角形だけ持つことができます 正の長さの側面。
それは理にかなっています。
あなたは、おそらく当たり前、と言っています。
注意すべき他の事 しかし、その和であります
任意の長さの 三角形の二辺
より大きくなければなりません 第3辺の長さ。
それは実際に本当です。
あなたは、辺1の三角形を持つことができません 図2及び図4に示すように、例えば、1ため+2
4以下です。
だから、それらは、その規則です 決定する3つのかどうか
入力が考えられる三角形を形成することができます。
だから、数分かかります そして、宣言して、定義
この機能は有効と呼ばれます 三角形、そのような実際にその
ここで指定した動作をします。
>> それは、これらの3つの側面であれば、真の出力は以下となります 、三角形を含むことが可能です
そうでない場合はfalse あなたがやった方法を確認する準備はできましたか？
ここに1つの実装です 有効な三角形の。
それだけではないのです。
ユアーズは多少異なる場合があります。
しかし、このものは、実際には、持っています 私たちが期待する行動。
当社は、当社の関数を宣言 一番上に、ブール値有効な三角形
フロートのxフロートYフロートZ。
だからもう一度、この機能 3つの実数値をとります
その引数として、浮い ポイント値変数
真または偽を出力 ブール値、リコール。
戻り値の型はブールであるだから、なぜです。
その後、我々は関数を定義します。
まず最初にすることは確認してくださいです 側面の全てが正であること。
Xが以下である場合 0に、またはyが0に等しい場合、
またはzは、0以下である場合 それはおそらく、三角形にすることはできません。
彼らは正の側面を持っていません。
そして、私たちは返すことができます そのような状況ではfalse。
次に、我々は確認してください その入力のすべてのペア
第1より大きい。
>> このため、xプラスyが小さい場合、 よりまたはzに等しく、
またはXプラスzが小さい場合 よりyと同じか、
またはyプラスzの場合は、以下であり、 X、それはまた、有効な三角形にすることはできません。
だから我々は再びfalseを返します。
我々はチェックの両方に合格したと仮定すると、 しかし、我々はtrueを返すことができます。
これらの3つの側面ため、 returning--することができ、
有効な三角形を作成します。
そして、それはそれです。
これで、宣言と定義しました。
そして、あなたは今すぐにできる可能性があります 使用して、この関数を呼び出します。
素晴らしい仕事。
私はダグロイドです。
これはCS50です。