86- 7 C& C + + ス円 関数 get-float の中の return 文は , ちょっと複雑な形をしているように見え ます . しかしこれは , まず文字列変数 s を atof で float 型に変換し , その値を return 文で戻しているだけです . このように 演習問題 return atOf (s) : return f; f = atof ( s ) : この結果か戻り値となる と 2 行で書くところを , 1 行にまとめて書くこともできます . 数もあります . この場合は , 関数の型を void にします . 1. 9. 2 節の関数定義 戻り値の型を関数の型として関数を定義しますが , 中には戻り値のない関 ・戻り値の void について 整数を入力する get_int という関数を作成しなさい がこの形式になっているので , 確認してください . Ovoid 型関数で使う return 文 戻り値のない関数 ( void 型関数 ) でも return 文を使うことができます . の場合は , return 文の後ろに戻り値を記述しません . そ if (x return : ・・ x か 4 に等しけれは関数を終了し , 呼ひ出した側に戻る 0 関数の型を省略すると ? void 型ではなく , int 型とみなされます . 次節で説明します . * 関数の戻り値や引数に文字列を使用する場合は , ポインタの知識が必要になるので , 節て説明します 1 . 12. 6
3 " サウンド & グラフィックス " とディスクス出力 次のプログラムは , 画面をクリアし , 何かキー入力があると終了します . 戻るようになっています . 画面やカーソル位置を保存しているので , プログラム終了時には元の状態に サンプレプログラム 69 #include く土 0 . h> main ( ) char buffer[80 * 25 * 4 信 struct text info t ー gettextinfo ( & し房 gettext(), 1 ′ 80 ′し . screenheight, getch ( 房 printf い Press any key clrscr ( puttext ( 1 ′ 80 ′し . screenheight ′ buffer) : buffer) : go し 0 み ( し curx , し . cury); / * カーソル位置が変るのを防ぐ * / return 0 ー 実行例 Pre s s any key ・・画面かクリアされ , これが表示される 何かキーを押すと元の状態に戻る * 本節に出てきた関数 clrscr, gettext, puttext, gotoxy は , ヘッタファイル conio. h が必要てす 3 ユ 9 アプリケーションのための用関数 たいていのアプリケーションは , 起動時に画面モードを設定したり , 画面 をクリアしたり , ファンクションキーの表示を消したり , といった初期化が必 の 2 つの関数にまとめてみることにします . どのアプリケーションにも必要になる初期化と後処理を , 次 存し , 終了時に戻すことも必要です . また , これまで説明してきたように , これらの初期状態を保 こういった 要になります .
た 9 関数 ・戻り値の受け取り方 たとえば , 次のように代入式の右辺に関数呼び出しを置きます . x = func ( ) : この場合 , まず関数 func の本体が実行されます . 次に , 関数 func の戻り 値が変数 x に代入されるというわけです . 次のサンプルプログラムでは , これまで何回も出てきた数の入力を関数化 しています . float 型についての例を示していますが , int 型の入力も同様に関 85 数化できます . サンプルプログラム 41 #include く s し d 土 0 . h> #include く s し dl 土 b . h > / * 浮動小数点数入力 * / floa し get—float (void) char s [ 8 0 gets(s); return atof (s) ー main() floa し hight ー p て土 n し f ( " 身長 ( c Ⅲ ) ? " hight = get—float ( ) : pr 土 n に f ( " あなたの標準体重 = % . If / * 身長 * / (kg)Yn" (hight return 0; 実行例 身長 ( c Ⅲ ) ? 149 あなたの標準体重 = 10 0 . 0 ) * . 9 房 44 . 1 ( kg )
8 イ ア C8 C + + ス門 ・引数の void について 引数を持たない関数を定義する場合は , 引数の並びの代りに ( ) の中に void と書きます . ただし , c ではこの void を省略することもできますが , 省 略すると引数のチェックが行われません . 安全性を高めるためにも明示的に void を指定した方がよいでしよう . 1.9.2 節のサンプルプログラム 39 の関数定義がこの形式になっています . 1.9.4 関数の戻リ値 関数が受け取る引数とは逆に , 関数が呼び出し側に値を返すことができま す . これを関数の戻り値といいます . 引数は複数個定義できますが , 関数の戻り値は関数 1 個につき 1 つだけしか 定義できません . ・戻り値のある関数の定義 実は , 関数を定義する場合には , 型を指定しなければなりません . 数の型に , 戻り値の型を指定します . こに戻り値の型を指定する 関数の戻り値は , 関数定義の中で return 文を使って戻します . ・戻り値の戻し方 文 関数の型関数名 ( 引数の並び ) この関 return 戻り値 : これで , 呼び出された関数の実行が終了すると , 戻り値を持って呼び出し た側に戻ります .
70 / main() 土 n し n1 2 0 0 : 10 0 ′ n2 printf("nl, n2 の最初の値 change ( &nl ′ &n2 ) : printf ( " change 実行後の値 宅 d ′ %dYn" %dYn" nl ′ nl ′ れプ 2 ポインタ n2 房 n2 ) : return 0 ー 実行例 nl ′ n2 の最初の値 change 実行後の値 10 0 ′ 2 0 0 ′ 2 0 0 10 0 今度はうまく入れ代わりました . か , もう一度確認してみましよう . ではなぜ , ポインタを使うとうまくいくの 1. 12. 3 節でも説明したように , ポインタに * を付けるとアドレスを代入し た変数の値を示します . つまり , 仮引数 x , y に * を付けて値を変化させると , 実引数 nl, n2 の値そのものを変化させることになります . ここで , * を付け ないで x , y を変化させると , nl , n2 のアドレスを変化させることになってしま います . このように , 関数の引数に実引数のアドレスを渡すことを引数の参照渡し といいます . 引数の参照渡しでは , 関数の中で実引数の値を変更することが れ 126 文字列引数と文字列の戻リ値 できます . ですから , 前節までをしつかりと頭に入れてから次を読んでください . 文字列とポインタとは関係なさそうに思えますが , おおいに関係があります . の引数や戻り値に文字列を使う方法について説明します . ポインタの基本的な使い方がわかったところで , おあずけになっていた関数
3 " サウンド & グラフィックス " とディスクス出力 O_wscroIl —wscroll は , Turbo C + + 特有の外部変数で , く conio. h> の中で定義されて います . これを 0 にすると , cprintf や putch で画面に文字などを出力したと きに , 画面右下端からはみ出してもスクロールしなくなります . アニメーショ ンでは , ポールが画面の右下端にきたとき , スクロールしては困るからです . を設定します . 次に示す記号定数を引数として指定します . —setcursortype は , く conio. h> で定義されている関数で , カーソルの形など setcursortype また , ー wscro Ⅱを 1 にすると , スクロールを開始します . 記号定数 NOCURSOR SOLIDCURSOR LINECURSOR NORMALCURSO 意味 カーソルを表示しない プロックカーソルを表示する ラインカーソルを表示する カーソルを表示する ここでは , ボールが移動するときにカーソルが表示されているとチカチカし て見にくいので , カーソルを表示しないように設定します . Okbhit kbhit は , <conio. h> の中で定義されている関数で , どうかをチェックし , 次の値を返します . キーポードが押されたか キーポード 押された 押されていない 戻り値 0 以外 0 また kbhit は , 何らかのキーが人力されたかどうかをチェックするだけで , 入力された文字は取り込みません . そのため , MS - DOS に戻ったときにその キーが有効になってしまいますので , getch() を使って人力されたキーを捨て ます . こでは , kbhit を使って , キーポードから入力があるまでポールを表示さ せています .
れ 9 数 87 7.9.5 いくつかの補足 関数について , いくつか補足があります . ・関数の型の省略 関数の型は次のいずれかでした . void func( 引数並び ) ・・戻り値を持たない関数の場合 型 func( 引数並び) ・・・戻り値を持つ関数の場合 関数の型は指定しなければならないと説明しましたが , 関数の型を省略す ることもできます . 型を省略すると , その関数は int 型としてコンパイラに認 哉されます . そのため void も他の型も省略すると , int を返す関数とみなされ るので , 型を省略する場合は , 必ず int を返します . func( 引数並び ) 二一一口 ・・・型を省略 ・・ int を返す return 1024 ・ main も関数 main の形を見ると , main も関数であることが分かります . main( ) 文 main が関数であるのだから , もちろん関数の型を指定しなければなりませ ん . しかし , 今までのサンプルプログラムを見てもわかるように main の型は 指定していません . 型を省略しているので , main の型は int 型ということに なります . したがって main は , int を返さなければなりません . main で int を戻さないと警告工ラーになるのは , このためです . ( 1. 1. 1 節 ) ちなみに , main の戻り値は , OS (MS-DOS) で利用できます .
22 File Edit Search Run CompiIe 9 Project Options ぐ料正 2. C Ⅲゆ を反転させリタ を反転させ , Quit FI F2 Save F3 Grph—F9 Compile F9 Make F19 海 0 終了 TC を終了させるにはを 10 キーを入力します . するとカーソルが画面上部の メニュー部分に移動するので , 矢印キーでメニューの ーンキーを入力します . さらにメニューが表示されるので , リターンキーを入力します . これで TC が終了し , MS - DOS に戻ります . 0 メニュー選択の約束事 File/Quit の後に書かれているメニューを選択するという操作を行ってください . かれているメニュ ーを選択 , さらに表示されたメニューの中から , スラッシュ 力し , カーソルを画面上部のメニューに移動させてから , スラッシュの前に書 ですから , この先このような記述が出てきた場合は , ます , を 10 キーを入 のように記述します . File/Quit 上記の TC を終了させるための操作は メニューを選択する操作を簡略記号を使って説明します . す . そこで本書では , この画面上部のメニューを選択し , さらに表示された とんどですが , その説明をそのたびに書いていては大変な量になってしまいま TC では , このメニューを選択し , TC の機能を実行させるという操作がほ
22 4 ・データベース 1 2 3 4 これらの関数は , io. c の中で定義されています . ただし , main から直接呼 _save を呼ひ出してテータをセープ _undelete を呼び出してテータを復活 _browse を呼び出してテータを表示 —input を呼ひ出してテータを入力 → data → data → data → data に戻ります . なお , 0 ( 終了 ) が選択された場合だけ無限ループを抜け , return で main び出されることはないので , io. h に関数プロトタイプは入れていません .
7.9 関数 neko ( ) : 定義した関数を使う場合は , その関数名の後に ( ) とセミコロンを付けます . 9.2 関数呼ひ出し プログラムは次の順序で実行されます . neko ( 房 が終ると , 関数呼び出しの次の文に戻ります . たとえば次のような場合 , 呼び出された関数の定義までジャンプし , 関数が実行されます . 関数の実行 これを関数呼び出しといいます . プログラムが関数呼び出しを実行すると , 87 → neko で定義した文 文 1 文 2 この流れを次のサンプルプログラムで確認してください . サンプルプログラム 39 #include く s し d 土 0 . h> void neko (void) pr 土 n む f ( " 我が輩は猫である¥ n " 房 pr 土 n し f ( " 名前はまだない¥ n " ) : ・関数定義 main() neko ( ) : return 0; 実行例 我が輩は猫である 名前はまだない ・・関数呼ひ出し