roots - みる会図書館


検索対象: C++基礎講座
12件見つかりました。

1. C++基礎講座

115 14 15 第 6 章関数 return 1 ; 関数 roots は、 2 次方程式の最初の係数が 0 であるために、あるいは複素数 の根を持っために、根を求めることができなかった場合に 0 を戻します ( 10 行目 ) 。そして、関数 roots が根を求めることに成功すると、 1 を戻します ( 14 行目 ) 。根が完全に求められるかどうかを決定するのは、関数 roots の呼び元 の責任です。関数の戻り値が、その関数の実行が失敗か成功かを示すために使 われる場合、それをステータス値 (statusvalue) と呼びます。 入力を読み込み、エラーメッセージを出力し、そして根を出力する処理は、 関数 roots を呼び出す関数 main で行われる処理です ( ファイル mroots. cpp) 。 1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 #include く iostream . h> #include "froots . h" int main() f 1 oat a , b , c , r 1 , て 2 ; while (cin > > a > > b > > c) { if(roots(a, b, c, rl, (2)) { cerr くく " 工ラー ! 最初の係数が 0 か " cerr くく " 方程式は複素数の根を持つ ! " ・ continue ; cerr くく endl ; cout C Ot1t くく " 係数は = くく C ; くく " ; 根は = くく a くく くく b くく " くく r2 くく endl; くくて 1 くく " 次の関数呼び出し ( 7 行目 ) について考えてみます。 roots(), b, c, rl, て 2 ) これは if 文の条件部です。値によって渡される実引数 a と b と c の値は、 関数 roots の仮引数 A と B と C にコピーされます。仮引数 RI と R2 は、そ

2. C++基礎講座

116 第 6 章関数 れに対応する実引数 rl と r2 が参照によって渡されるので、実引数と同音衄に なります。この rl と RI 、 r2 と R2 の間の関係は、関数 roots の終了まで継続 します。なお、仮引数と実引数の名前は、異なっていなくてもかまわないこと に注意しておいてください。 この 2 次方程式の根を求めるプログラムは、 mroots. cpp と froots. cpp の 2 つのファイルから構成されます。このプログラムは、 BorlandC 十十の場合、 次のようにしてコンパイルします。 C>bcc mroots froots そして、次のように入力して実行します。 C>mroot s 参照による引数渡しの利点 参照による引数渡しは、次の 2 つの重要な理由で使われます。 1. 実引数の更新 参照によって渡された引数の値は、関数の本体で、対応する仮引数の更新に よって変えることができます。 2. 能率 参照によって実引数を渡す場合には、実引数を仮引数にコピーする必要があ りません。構造体やクラスオプジェクトの場合のように、実引数のサイズが 大きい場合、コピーの負荷は大きいものになります。なお、構造体やクラス オプジェクトについては、詳細を後で解説します。引数が参照によって渡さ れる場合には、そのメモリ中の位置 ( アドレス ) しかコピーする必要があり ません。メモリアドレスのコピーの負荷は、普通 4 バイト程度のサイズのオ プジェクトのコピーと同等か、またはそれよりも少ないものとなります。 6.5 局所変数と大域変数 局所変数とは、 1 つのプロック内 ( 関数など ) でだけ参照できる変数です。 また大域変数とは、通常多くの関数から共有される変数です。局所変数と大域 変数は、それぞれローカル変数とグローパル変数とも呼ばれます。

3. C++基礎講座

114 第 6 章関数 swap(), y); x と y の値は、それぞれ仮引数 a と b にコピーされます。そして a と b が 変換されますが、 a と b は、 x 、 y と同意語ではないので、 x と y には何の影響 も及ばしません。そのため、 swap の実行終了の後でも、 x と y は関数 swap の呼び出しの前と同じ値のままです。 参照による引数渡しをさらに詳細に示すために、 2 次方程式の根を求める 関数を書いてみます。 2 次方程式の根を求めるプログラムについては、第 1 章 「 C 十十の概要」ですでに示しました ーでは、その根を求めるプログラム の一部を使って、 roots という名前の関数を作り出します。次に示すのが、そ の関数 roots のプロトタイプです ( ファイル roots. h)o int roots(float a, float b, float c, float& rl, float& て 2 ) ; 関数 roots の最初の 3 つの実引数は値によって渡され、後の 2 つは参照に よって渡されます…後の 2 つが参照によって渡されるということが重要です。 関数 roots によって求められる根は、これらの実引数に対応する仮引数に保持 されます。参照によって渡される実引数に対応する仮引数は実引数の同意語な ので、根が実引数に保持されることになります。 関数 roots を、次のように定義します ( ファイル froots. cpp)o 1 2 3 4 5 6 8 9 10 11 12 13 / / 2 次方程式の実数の根を求める / / 複素数の根は演算しない #include く math . h> #include "froots . hl' int roots(float A, float B, float C, float& RI, float& R2) float tmp = B*B ー 4*A*C; if (A = = 0 Ⅱ tmp くの return 0 ; tmp RI R2 sqrt (tmp) ;

4. C++基礎講座

第 6 章関数 Exercises 127 1. 平方根を演算するプログラムの例では、倍精度の値の絶対値を求める ために、数学ライプラリ関数 fabs を使いました。 fabs と同し機能を 持った関数 myabs を書きなさい。 2. 階乗を求める関数 fact を負の値の引数で呼び出した場合、何が起こ るでしようか ? そのような間題には、どうやって対処しますか ? 関数 fact の再帰的な定義と非再帰的な定義の両方を考慮して解答し なさい。 3.1 から 8 までの数の階乗を出力するプログラムを書きなさい。演算を 行うために、本章で書いた階乗を求める関数の 1 つを使いなさい。 4. 関数 roots ( ファイル froots. h と froots. cpp に含まれている ) は、前 に述べたとおり、根を計算できた場合には 1 を戻し、根が計算できな かった場合には 0 を戻します。成功の場合には 0 を戻し、最初の近似 値が 0 である場合には 1 を戻し、根が複素数である場合には 2 を戻す ように関数 roots を書き換えなさい。 なお、関数 roots は、次のように呼び出されなけれは。なりません。 default : break ; case 2 : break; case 1 : break; case 0 : switch (roots (a,

5. C++基礎講座

30 第 1 章 C 十十の概要 C>roots く roots . in 係数 = 1 , 4 , 4 ; 根 = ー 2 , 係数 = 1 , ー 4 , 4 ; 根 = 2 , 2 MS-DOS や UNIX のコマンドラインで、 '<" を使って、入力データを読み 込むファイルを指定することを、入力リダイレクション (input redirection) と呼び考す。この場合、、 '<" を入力リダイレクション記号と呼びます。入力と 同様に、 MS-DOS や UNIX の出力リダイレクション記号 " > " を使って、前 己のプログラムの出力をファイルに保存することもできます。例えば出力ファ イルを roots. out とすると、次のようになります。 C>roots く roots . in >roots . out 一三ロ 1.2 プログラムの終了 C 十十のプログラムは、関数 main の実行完了 ( main の本体を示す右波括 弧、、 } " にたどり着くこと ) 、関数 exit の呼び出し、または関数 main の中で の return 文の実行によって、終了します。もし、 MS-DOS や UNIX などの OS の環境に値を戻す必要があれば、関数 exit を明示的に呼び出さなければ なりません。 OS に戻される整数値は、次のように、関数 exit の引数として指定します。 exit(0) ; 環境に戻される値は、プログラムの実行が正常に完了したかどうかを示すた めに使われます * 5 。慣例として、正常終了を示す場合には、関数 exit が引数 0 で呼び出されます * 6 。非 0 の引数は、エラーを示す場合に使われます。 * 5 ( 訳注 ) 環境に戻される値は、 OS の環境変数に代入されます。例えば UNIX の場合 には、環境変数 status が、プログラムやコマンドの実行状態の値を保持します。 * 6 ( 訳注 ) 関数 exit や return 文を呼び出さすにプログラムが正常終了した場合、 UNIX では環境変数 status の値が 1 になります。しかし、 UNIX のコマンドなどが正常に終了 した場合は環境変数 status の値は 0 になるので、プログラムを正常に終了させる場合は、 "exit(0)" とするのが慣例なのです。

6. C++基礎講座

28 第 1 章 C 十十の概要 が複素数の根を持っことを意味します。式の中の括弧は、その式の要素が評価 されるべき順序を示すために使われています。もしその条件式の値が真であれ ば、「式が真のときの選択肢」に示した文が実行されます。 cerr くく " 工ラー ! イ系攵 cerr くく a くく " " くく b くく " は複素数の根 " くく endl ; cerr くく " continue ; 2 番目の出力文は、変数 a と b と c の値をモニターに書き込みます。 次の 5 つの文からなる while ループ本体の残りが、 2 つの if 文の後に続き くく c ; ます。 tmp = sqrt (tmp) ; x 1 x2 cout くく " イ系委攵 cout くく " ・ " くく a くく " くく b くく " くく c ; ”くく xl くく " " くく x2 くく end1; このうち、最初の 3 つは代入文で、 4 番目と 5 番目はすでにいくつか見てき た出力文です。最初の代入文では、 C 十 + の関数によって変数 tmp の値の平 方根を求め、その値を tmp の新しい値とします。それに続く 2 つの代入文で は、 2 次方程式の根を求め、この値を xl と x2 に代入します。最後の 2 つの 文は、モニターに説明と係数を表示します。 プログラムのコンバイルと実行 BorlandC 十十では、前記のプログラムを、次のようにコンノ、イルとリンク をして、実行可能なプログラムの形にできます。 保存します。 Borland C 十十は、 C>bcc て oots プログラムと結合して、そのコンパイル結果の機械語をファイル roots. exe に このプログラムを機械語に変換し、適切なライプラリを このプログラムは、次のように入力して実行できます。

7. C++基礎講座

第 1 章 C 十十の概要 29 C>roots すると、プログラムは入力待ちの状態になります。この対話モード (interac tive mode) では、ユーサーがキーポードで適当な値を打って入力します。 "AZ" ( コントロール Z ) と改行を入力して、入力操作の終わ MS-DOS では、 りを示します。 UNIX では、入力の終わりは "AD" ( コントロール D) によっ て示します。 次に、 MS-DOS の場合の対話入力の例を示します。 C>roots 1 4 4 係数 = 1 , 4 , 4 ; 根 = 係数 = 1 , ー 4 , 4 ; 根 = 2 , 2 4 ューザーが各係数を入力した後、プログラムはその結果を出力します。 一般にプログラムに対する入力は、 MS-DOS や UNIX などの OS によっ て、行単位で行われます。キーポードから入力される文字単位では行われない のが普通です。言い換えれは、入力は、ユーサーがエンター (enter) キーを 入力した後にだけ、プログラムに伝えられます。このエンターキーの入力に よって、カーソルはモニタースクリーン上の次の行に移動します。行単位の入 力では、バックスペースなどによる入力の訂正を、その入力がプログラムに伝 わる前に、ユーサーが行えます。例えは前述の対話操作では、入力は最初の係 数の入力後、または 2 番目や 3 番目の入力後に、 MS ー DOS によって伝えられ るのではありません。ューザーが 3 つの係数を入力した後に、エンターキーを 入力して、初めてプログラムに伝えられるのです。 毎回対話的にデータ入力を行わすに、スクリーンエデイタやワープロなどを 使って係数をテキストファイルに保存し ( データはテキスト形式でなければな りません ) 、そのファイルからデータを取り込んでプログラムに伝えることも できます。プログラム roots では、次のようにしてデータをそのファイルから 読み込み、実行結果をモニタースクリーンに表示できます。

8. C++基礎講座

第 12 章大規模なプログラムの例 309 冖 / - 8 0) 0 1 一つっ 4- LO ( 0 「 / 8 0) -1 亠イ亠 1 1 1 亠 1 一イ上 -1 char wrd [MAX] ; int 1ine ; tree *root = NULL ; while (word(cin, wrd, MAX, line) ! = EOF) { if (root = NULL) root = new tree(wrd, line) ; else root—>find—or—add(wrd, line) ; root—>print() ; delete root ; 関数 ma ⅲは、関数 word を呼び出し、単語とそれらを含んだ行番号を得 ます。そして関数ⅱ nd ー or ー add を呼び出して、リストと順序付けされた木に これらの単語と行番号を付加します。そして、入力ファイルが終了した後、 進木にある単語を出力します。

9. C++基礎講座

第 2 章基本的な事項について " 1993 " "Enter Data Va1ues : " He110 Wor1d'I 4. 文字列定数は、ダブルクオートで囲まれた文字列です。 2.4 コメント "Were you bo てⅡ before 1980 ? " 39 コメント (comment) は、 C 十十コンパイラではなく、人間が読むために プログラム中に書かれる文章です。プログラムでコメントを使うと、そのプロ グラムが理解しやすくなります。 C 十十には、 2 種類のコメントがあります。 1. 文字の組 " / * " がコメントの開始を示し、、。 * / " が終了を示す。 2. 文字の組ン / ' ' も、コメントの開始を示す。このコメントは、行の最後で自 動的に終了する。 第 1 章「 C 十十の概要」で示した 2 次方程式の根を求めるプログラムに、コ メントで注釈を付けたものを、次に示します ( ファイル roots. cpp)o 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include く iostream. 五 > #include く math . 五 > y = a*X*X 十 b*X 十 C プログラム 根を求める 2 次方程式の int main ( ) float a, b, c, tmp ; xl , x2 , if (a ile (cin > > a / / 係数 / / 根 / / 一時変数 b > > c) { / / 入力があれば読み込む

10. C++基礎講座

22 第 1 章 C 十十の概要 うに書けます。 ⅶ ile ( 次の入力があれは読む ) { if ( 根が複素数 ) 工ラーメッセージを表示し、次のループを繰り返す ; 根を計算して表示する ; 根を求めるプログラムの C 十十版を次に示します ( ファイル roots. cpp ) 。 劣るため、そのままではプログラムにはなりません。 こうした疑似コード表記は、 C 十十よりも正確さに よりも正確です。しかし、 プログラミング言語を使った記述よりも理解しやすく、さらに通常の自然言語 (pseudo code) と呼ばれます。疑似コードで書かれたものは、 C 十十や他の ドと自然言語を組み合わせて制御の流れを示すような表記法は、疑似コード の自然言語とは異なった形で書いたものです。このように、プログラムコー 合わせ、異なった処理項目では行を変え、さらにインデントを使って、普通 ここで述べたプログラムは、自然言語と C 十十の命令 (while と (f) を組み ついては、第 5 章「文」で解説します。 返す」という、条件式の本体を実行します。なお、この文の持つ意味の詳細に 複素数」 ( つまり真 ) である限り、「エラーメッセージを表示し、ループを繰り 弧の内部 ) を実行するループ ( 10 叩 ) です。この条件式は、条件として「根が この while 文は、条件「次の入力がある」が真である限り、その本体 ( 波括 1 2 3 5 6 7 8 9 10 11 12 13 #include く iostream . h> #include く math . h> int main ( ) float a, b, c, xl, x2, tmp; while (cin > > a > > b > > c) { if (a cerr くく”工ラ cerr くく endl ; C ont i nue ; if ( (tmp = b*b cerr くく " 工ラ ー ! 最初の係数は 0 ! " ・ 4*a*c) くの { ー ! 係数