ざざ虫ロゴ


ひまわり入門

日本語プログラミング言語

ひまわり


▲ひまわり目次へ戻る



 関数の定義と呼び出し方(C言語の復習)

○ 関数のプロトタイプ宣言と関数の書式

関数のデータ型 関数名( 引数のデータ型の並び );
戻り値のデータ型 関数名( 引数のデータ宣言の並び )
{
    関数内で使う変数の宣言;
        ・
        ・
        文;
        ・
        ・
    return ( 戻り値 );
}
表 関数のパターン
引数のデータ型 戻り値のデータ型 関数
int int int f( int )
intfloat float f( int )
引数なし int int f( void )
int 戻り値なし void f( int )
引数なし 戻り値なし void f( void )


表 関数の作り方の例
main( ) 関数のみ

#include <stdio.h> main() { float teihen, takasa, menseki; printf("底辺, 高さ:"); scanf("%f %f", &teihen,&takasa); menseki = teihen * takasa / 2; printf("面積=%f\n), menseki ); }
引数、戻り値のない関数

#include <stdio.h> void sankakukei_menseki( void ); main() { sankakukei_menseki (); } void sankakukei_menseki( void ) { float teihen, takasa, menseki; printf("底辺, 高さ:"); scanf("%f %f", &teihen,&takasa); menseki = teihen * takasa / 2; printf("面積=%f\n), menseki ); }
引数、戻り値のある関数

#include <stdio.h> float sankakukei_menseki( float, float ); main() { float teihen, takasa, menseki; printf("底辺, 高さ:"); scanf("%f %f", &teihen,&takasa); menseki = sankakukei_menseki(teihen, takasa); printf("面積=%f\n), menseki ); } float sankakukei_menseki( teihen, takasa ) { float menseki; menseki = teihen * takasa / 2; return (menseki ); }
外部変数を使った関数

#include <stdio.h> void sankakukei_menseki( void ); float teihen, takasa, menseki; main() { printf("底辺, 高さ:"); scanf("%f %f", &teihen,&takasa); sankakukei_menseki (); printf("面積=%f\n), menseki ); } void sankakukei_menseki( void ) { menseki = teihen * takasa / 2; }


 引数と戻り値のある関数

○ 引数と戻り値のある関数

例 関数で円の面積を計算する
「半径を入力してください:」と表示し、入力された半径から円の面積を関数にて計算し、 「面積=‥」と表示する。なお、πは3.14159、出力書式は小数点6桁、関数の引数は1つ で半径、戻り値は面積とする。
ひまわり
'関数で円の面積を計算する パイ=3.14159 『円の面積の計算』を『?の』で、関数定義。 書式は、「%.6f」 「半径を入力してください:」と、尋ねる。 半径は、それ。 半径の、円の面積の計算をする。 面積は、それ。 面積を、書式の、指定形式に変換。 「円の面積={それ}」と、表示。 待機。 *円の面積の計算(?の) 引数取得。 答えを、ローカル変数。 答え=それ#0*それ#0*パイ それ=答え 戻る。
C言語
'関数で円の面積を計算する #include <stdio.h> #define PAI 3.14159 float en_no_menseki(float r); main() { float hankei, menseki; printf("半径を入力してください:"); scanf("%f", hankei); menseki=en_no_menseki(hankei); printf("面積=%.6f\n", menseki); } float en_no_menseki(float r) { float ans; ans = r*r*3.14159; return ans; }
ひまわり関連
関数定義:ラベル?を,引数リスト?で,関数として以下のように定義する
『ラベル名』を、『?と,?を(引数リスト)』で、関数定義。
なお、メインプログラムの最後に「待機。」を付けて、イベントの実行を待つ。
引数取得:引数リストの順に それ#0、それ#1、‥に、引数が取得される。
:関数の中だけ有効なローカル変数として定義できる。→ ○○を、ローカル変数。
戻る:関数(サブルーチン)からの復帰、変数「それ」に値を代入すると、それが戻り値となる。
*ラベル名:ひまわりの関数は、引数を渡して飛び、戻り値をもって戻ることのできるラベル
単に「飛ぶ」という命令で実行制御を移すことも可能。
ひまわりでは関数への参照渡しできない。そのため、配列名を引数として扱うことできず、ポインタという概念はない。


例 '関数でべき計算をする
2^3の、べき計算を関数により計算し、結果を表示する。関数の引数は2つ戻り値はべき計算結果。
ひまわり
'関数でべき計算をする 『べき計算』を『?の、?乗』で、関数定義。 2の、3乗、べき計算して、表示。 待機。 *べき計算(?の、?乗) 引数取得。 答えを、ローカル変数。 答え=1 それ#1回(     答え=答え*それ#0 )。 それ=答え 戻る。
C言語
'関数でべき計算をする #include <stdio.h> int beki(int a, int b); main() { int n; n=beki(2, 3); printf("%d\n", n); printf("%d\n", beki(3, 4); } int beki(int a, int b) { int i, ans; ans = 1; for (i=1; i<=b; i++) { ans = ans * a; } return ans; }


 関数を再帰呼び出しする

○ 関数の再帰呼び出し

例関数の再帰呼び出し
整数を入力して、その階乗を求める。
ひまわり
'整数の階乗を求める 'ひまわりは再帰呼び出しができない 『階乗計算』を『?の』で、関数定義。 「整数を入力してください。整数=」と、尋ねる。 それの、階乗計算して、表示。 待機。 *階乗計算(?の) 引数取得。 答えを、ローカル変数。 答えは、それ#0。 もし、(答え==0)ならば(   それは、1   戻る。 )違えば(   n=答え-1   n回(     答え=答え*n     nから、1を、引く。   )   それは、答え   戻る。 )
C言語
'整数の階乗を求める #include <stdio.h> int kaijo(int); main() { int x, ret; printf("Please input data: x= "); scanf("%d", &x); ret = kaijo(x); printf("kaijo = %d\n", ret); } int kaijo(int n) { if ( n == 0 ) { return( 1 ); } else { return( n * kaijo( n - 1 ) ); } }
ひまわり関連
ひまわりは、再帰呼び出しができない。


 ポインタを使った関数(C言語の復習)

○ ポインタを使った関数(C言語)

値渡しの関数

#include <stdio.h> float sankakukei_menseki ( float, float ); main() { float teihen, takasa, menseki; printf("底辺, 高さ:"); scanf("%f %f", &teihen, &takasa ); menseki = sankakukei_menseki( teihen, takasa ); printf("面積=%f\n), menseki ); } float sankakukei_menseki( teihen, takasa ) { float menseki; menseki = teihen * takasa / 2; return (menseki ); }
参照渡しの関数

#include <stdio.h> void sankakukei_menseki ( float *, float *, float * ); main() { float teihen, takasa, menseki; printf("底辺, 高さ:"); scanf("%f %f", &teihen, &takasa ); sankakukei_menseki ( &teihen, &takasa, &menseki ); printf("面積=%f\n), menseki ); } void sankakukei_menseki( *t, *h, *s ) { *s = *t * *s / 2; }
ひまわり関連
ひまわりには、ポインタという概念はなく、関数の参照渡しはできない。


 main()関数とコマンドライン引数(C言語の復習)

○ main( ) 関数とコマンドライン引数(C言語)

main( ) 関数

#include <stdio.h> main() { float teihen, takasa, menseki; printf("底辺, 高さ:"); scanf("%f %f", &teihen,&takasa); menseki = teihen * takasa / 2; printf("面積=%f\n), menseki ); }
コマンドライン引数のあるmain( ) 関数

#include <stdio.h> #include <stdlib.h> main( int argc, char *argv[ ] ) { float teihen, takasa, menseki; teihen = atof( argv[1] ); takasa = atof( argv[2] ); menseki = teihen * takasa / 2; printf("面積=%f\n", menseki ); }
ひまわり関連
ひまわりには、コマンドライン引数という概念はない。


 練習問題 4
台形の面積を計算する、ただし関数(引数として底辺、上辺、高さ、面積、戻り値として面積)をつかう
台形の底辺、上辺、高さをcmで入力して、その面積を計算するプログラムを作成する。
計算式は (底辺+上辺)×高さ×1/2
回答
'上辺、底辺、高さから台形の面積を計算する 『台形の面積の計算』を『?と、?と、?で』で、関数定義。 書式は、「%.6f」 「台形の上辺を入力して:」と、尋ねる。 上辺は、それ。 「台形の底辺を入力して:」と、尋ねる。 底辺は、それ。 「台形の高さを入力して:」と、尋ねる。 高さは、それ。 上辺と、底辺と、高さで、台形の面積を計算する。 面積は、それ。 面積を、書式の、指定形式に変換。 「台形の面積は{それ}です。」と、表示。 待機。 *台形の面積の計算(?と、?と、?で) 引数取得。 答えを、ローカル変数。 答え=(それ#0+それ#1)×それ#2/2 それ=答え 戻る。


 課題 4
πを計算する
πを、円に内接する多角形と、外接する多角形により近似的に計算するプログラムを考えなさい。
多角形の角数入力では、角数は3よりも大きく、角数の入力が無い時終了するものとします。 また、πの計算部分を関数にしてください。
なお、πは半径1の円に内接する多角形の周囲/2よりも大きく、外接する多角形の周囲/2よりも小さいです。
回答
'多角形によるパイの計算 『パイの計算』を、『?と、?で』で、関数定義。 「多角形によるパイの計算」と、表示。 「多角形の角数を入力し、パイを計算する。」と、表示。 円の半径は、1。 *多角形角数入力 「終了する場合は、キャンセルを押す。\n多角形の角数は(3以上)」と、尋ねる。 もし、それが、「」ならば(   おわる。 ) もし、(それ<3)ならば(   多角形角数入力へ、飛ぶ。 ) 多角形角数は、それ。 円の半径と、多角形角数で、パイの計算。 「{多角形角数}角形によるパイは {内接パイ}<パイ<{外接パイ}」と、表示。 多角形角数入力へ、飛ぶ。 待機。 *パイの計算(?と、?で) 引数取得。 半径は、それ#0。 角数は、それ#1。 角度は、360/(角数×2) 角度は、度からラジアン(角度)。 '内接多角形 内接底辺は、2×半径×SIN(角度) 内接円周は、角数×内接底辺 内接パイは、内接円周/2 '外接多角形 外接底辺は、2×半径×TAN(角度) 外接円周は、角数×外接底辺 外接パイは、外接円周/2 戻る。


▲ひまわり目次へ戻る


このホームページはLightiningHTMLで作成しました。


Copyrights(c) 2000 ザザ虫. All rights reserved.