ざざ虫ロゴ


なでしこ入門

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

なでしこ



 関数の定義と呼び出し方(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; }


 引数と戻り値のある関数

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

例4-1 関数で円の面積を計算する
「半径を入力してください:」と表示し、入力された半径から円の面積を関数にて計算し、 「面積=‥」と表示する。なお、πは3.14159、出力書式は小数点6桁、関数の引数は1つ で半径、戻り値は面積とする。
なでしこ
# 関数で円の面積を計算する パイ=3.14159 書式は「%.6f」 「半径を入力してください:」と尋ねる。 半径はそれ。 半径の円の面積計算する。 面積はそれ。 面積を書式で形式指定。 「円の面積={それ}」と表示。 # 関数の定義 ●円の面積計算(半径の)   答え=半径*半径*パイ   それ=答え
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; }
なでしこ関連
関数定義
●関数の名前(引数の定義)
  関数の内容
関数の内容はインデントして記述する
関数の最後で、変数『それ』に値を代入すると戻り値となる


例4-2 関数でべき計算をする
2^3の、べき計算を関数により計算し、結果を表示する。関数の引数は2つ戻り値はべき計算結果。
なでしこ
# 関数でべき計算をする 2を3乗する。 それを表示。 ●乗(xをn)   答=1   カウンターで1からnまで繰り返す     答=答*x   答で戻る。
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; }
なでしこ関連
関数の名前に注意、動詞的な名称を付ける。
「〜を○○する」、「〜と〜を○○する」など(○○が関数名、〜を、〜と〜を、が変数定義。


 関数を再帰呼び出しする

○ 関数の再帰呼び出し

例4-3 整数の階乗計算
整数を入力して、その階乗を求める。
なでしこ
# 整数の階乗を求める # なでしこは再帰呼び出しができない 「整数を入力してください。整数=」と尋ねる。 それを階乗計算して表示。 ●階乗計算(答えを)   もし、答え==0ならば     1を戻す。   違えば     もし、答え==1ならば       答えを戻す。     違えば       n=答え-1       カウンターで1からnまで繰り返す         答え=答え*n         nから1を引いてnに代入する。       答えを戻す。
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 ) ); } }
なでしこ関連
なでしこは、再帰呼び出しができない。


 ポインタ(参照渡し)を使った関数


表 値渡し関数と参照渡し関数の例
値渡しの関数

#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; }


○ 参照渡しの関数

例4-4 参照渡しの関数
整数を2つ入力して、その大小関係を比較する。
なでしこ
# 整数の大小を比較する 「1つ目の整数を入力してください。 整数A=」と尋ねる。 値Aは、それ。 「2つ目の整数を入力してください。 整数B=」と尋ねる。 値Bは、それ。 値Aと値Bを大小比較する。 「{値A}>{値B}」と表示。 ●大小比較({参照渡し}Aと{参照渡し}Bを)   もしA<Bならば     値はA     AはB     Bは値
C言語
'整数の大小を比較する #include <stdio.h> void exchange(int*, int*); main() { int x, y; printf("Please input data: A= "); scanf("%d", &a); printf("Please input data: B= "); scanf("%d", &b); exchange( *a, *b ); printf(" %d > %d\n", a, b); } void exchange( *x, *y) { int z; if ( x < y ) { z = x; x = y; y = z; } return;
なでしこ関連
参照渡しする場合、変数の前に{参照渡し}を付ける


 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 ); }
なでしこ関連
プログラム起動時のコマンドライン引数を配列形式で得ることができる。
Vnako.exe ○○.nako (引数1) (引数2)…の様にオプションとして与えることができる。
なお、引数は変数「コマンドライン」に格納される。

ただし、コマンドプロンプトからコマンド入力する必要がある。


 練習問題 4
台形の面積を計算する、ただし関数(引数として底辺、上辺、高さ、面積、戻り値として面積)をつかう
台形の底辺、上辺、高さをcmで入力して、その面積を計算するプログラムを作成する。
計算式は (底辺+上辺)×高さ×1/2
回答1
# 上辺、底辺、高さから台形の面積を計算する 書式は「%.6f」 「台形の上辺を入力して:」と尋ねる。 上辺はそれ。 「台形の底辺を入力して:」と尋ねる。 底辺はそれ。 「台形の高さを入力して:」と尋ねる。 高さはそれ。 上辺と底辺と高さで台形の面積計算する。 面積はそれ。 面積を書式で形式指定。 「台形の面積は{それ}です。」と表示。 ●台形の面積計算(TとBとHで)   答え=(T+B)*H÷2   それは答え。 回答2
# 上辺、底辺、高さから台形の面積を計算する(参照渡し) 書式は「%.6f」 「台形の上辺を入力して:」と尋ねる。 上辺はそれ。 「台形の底辺を入力して:」と尋ねる。 底辺はそれ。 「台形の高さを入力して:」と尋ねる。 高さはそれ。 上辺と底辺と高さで台形の面積計算する。 台形を書式で形式指定。 「台形の面積は{それ}です。」と表示。 ●面積計算({参照渡し}Tと{参照渡し}Bと{参照渡し}Hで{参照渡し}Mの)   M=(T+B)*H÷2


 まとめのプログラム
関数における変数の扱いについて
関数において、引数有り、引数なしでの関数における変数の扱い
○引数で渡された変数は、独立変数
○引数で渡されていない変数は、外部変数
例示プログラム
#円周と面積求める関数における変数の扱い 半径=1 半径から円周面積計算する。 「半径{半径}のとき、円周{円周}、面積{面積}です。」と表示。 半径から円周と面積を参照計算する。 「半径{半径}のとき、円周{円周}、面積{面積}です。」と表示。 半径=1 円周=0 面積=0 円周面積計算外部変数する。 「半径{半径}のとき、円周{円周}、面積{面積}です。」と表示。 ●円周面積計算(半径から)   円周=2*PI*半径   面積=PI*半径*半径   半径=0 //引数として宣言された変数の「半径」は独立変数 ●参照計算({参照渡し}変数rから{参照渡し}変数lと{参照渡し}変数sを)   変数l=2*PI*変数r   変数s=PI*変数r*変数r   変数r=0 //参照渡しなので「変数r」を0にすると、「半径」は0になる ●円周面積計算外部変数   円周=2*PI*半径   面積=PI*半径*半径   半径=0//引数として宣言されていない変数の「半径」は外部変数であり、0になる。
なでしこ関連
引数のある関数定義の秘訣
1.変数を関数に関連づける場合、格助詞(が・の・を・に・へ・と・より・から・で・や)を付ける。
2.関数名は <「名詞する> と記述できるもの
3.関数の実行は、「変数・格助詞…(繰り返し)…・関数名・する。」と記述する。
4.関数は、「●関数名変数・格助詞…(繰り返し)…)」と記述する。
  なお、引数定義における変数名は関数独自の変数名として定義する方がわかりやすい。

例:
変数tと変数bと変数hで面積計算する。
        :
●面積計算(上辺と底辺と高さで)
        :


 課題 4
πを求めるプログラムを考えなさい。
パイを、円に内接する多角形と、外接する多角形により近似的に計算するプログラムを考えなさい。
多角形の角数入力では、角数は3よりも大きく、角数の入力が無い時終了するものとします。
また、パイの計算部分を関数にしてください。
なお、パイは半径1の円に内接する多角形の周囲/2よりも大きく、外接する多角形の周囲/2よりも小さいです。
また、なでしこにはTAN()はないので、以下の公式を使ってください。
tanθ = sinθ / cosθ
また、角度をラジアンに変更する関数がなでしこにあります。DEG2RAD(角度) を使用してください。

ヒント:プログラムの組み立て方、関数の作り方の例
1 角度入力して、外接・内接多角形の外周求める関数により、パイを計算
2 角度入力して、外接多角形外周、内接多角形外周、二等辺三角形底辺求める3つの関数により、パイを計算する

回答
# 多角形によるパイの計算 「多角形によるパイの計算」と表示。 「多角形の角数(整数)を入力し、パイを計算する。」と表示。 円半径は1。 # 多角形角数入力 必要の間   「終了する場合は、取消を押す。{改行}多角形の角数は(3以上)」と尋ねる。     もし、それが「」ならば       抜ける。     角数はそれの整数部分。     もし角数<3ならば       続ける。     違えば       多角形角数はそれ。       円半径と多角形角数でパイ計算する。       「{多角形角数}角形によるパイは {内接パイ}<パイ<{外接パイ}」と表示。 ●パイ計算(半径と角数で)   角度は360/(角数*2)。   # 内接多角形   内接底辺は2*半径*SIN(DEG2RAD(角度))   内接円周は角数*内接底辺   内接パイは内接円周/2   # 外接多角形   外接底辺は2*半径*TAN(DEG2RAD(角度))   外接円周は角数*外接底辺   外接パイは外接円周/2


 課題 4 おまけ
Y=aX2+bX+c を積分するプログラムを考えなさい。
a、b、cと積分範囲を入力し、範囲内をn等分して、台形積分公式により数値積分する。
nを繰り返し入力して積分を繰り返し、0入力で終了しなさい。

ヒント:台形積分とは、たとえば、範囲x1〜x2の面積を、そのときのy1、y2もとめ、台形x1,x2,y2,y1として面積求め これを積分範囲について合計して求める。

回答
#Y=aX2+bX+cをxx1〜xx2の間でn等分して積分する #台形積分公式による数値積分に該当する。 「Y=aX2+bX+cをxx1〜xx2の間でn等分して求めます。 各項のa、b、c、範囲のxx1、xx2を入力し、複数回分割数nを入力します。 積分を終了する場合はn=0を入力して下さい。」と表示。 「a=」と尋ねる。 aはそれ。 「b=」と尋ねる。 bはそれ。 「c=」と尋ねる。 cはそれ。 「xx1=」と尋ねる。 xx1はそれ。 「xx2=」と尋ねる。 xx2はそれ。 必要の間   「終了する場合は0を入力{改行}?等分」と尋ねる。   もしそれが0ならば抜ける。   nはそれ。   「Y={a}X2+{b}X+{c}を{xx1}〜{xx2}の間で   {n}等分して積分します。」と表示。   aとbとcをxx1からxx2までnの等分で積分する。   積分値はそれ   「積分結果は{積分値}です。」と表示 ●等分で積分(a項とb項とc項をxx1からxx2までn分割の)   カウンタ=0   間隔=(xx2-xx1)/n分割   面積=0   (n分割)回     x1=xx1+間隔*カウンタ     y1=a項*x1*x1+b項*x1+c項     カウンタ=カウンタ+1     x2=xx1+間隔*カウンタ     y2=a項*x2*x2+b項*x2+c項     面積=面積+間隔*(y1+y2)/2      それは面積



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


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