呼び出したコードブロックに値を返さない

情報基礎Ⅱ
(第6回)
月曜4限
担当:北川 晃
例題:4次式の数表
4次式
f  x   1.5 x  0.8 x  6.2 x  0.5 x  2.1
4
3
2
の値を,0から0.2きざみで5.0までのxに対して計算し,
順に書き出すプログラムを作れ.
Dim y As Single
For x As Single = 0.0 To 5.0 Step 0.2
y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _
+ 6.2 * x ^ 2 + 0.5 * x + 2.1
Console.WriteLine("{0,8},{1,16}", x, y)
Next
“x”を書き出すために,
8文字分確保する
例題:4次式の数表(改)
4次式
f  x   1.5 x  0.8 x  6.2 x  0.5 x  2.1
4
について,f
 x
3
2
の値を,0から0.2きざみで5.0までの
xに対して計算し,順に書き出すプログラムを作れ.
xをMath.Sqrt(x)で置き換え
Dim y As Single
For x As Single = 0.0 To 5.0 Step 0.2
y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _
+ 6.2 * x ^ 2 + 0.5 * x + 2.1
Console.WriteLine("{0,8},{1,16}", x, y)
Next
書き換えが煩雑!!関数として定義できないか?
関数の定義の書式
Sub Main()
…
y1 = プロシージャ名(引数リスト)
…
End Sub
仮引数,「値渡し」と
「参照渡し」がある
Function プロシージャ名(引数リスト) [As 戻り値の型]
文ブロック
Return 戻り値 または プロシージャ名 = 戻り値
End Function
プロシージャとは
• ある一連の処理コードに名前をつけて登録した
下請けプログラムを,プロシージャという.
• 従来の言語では,「関数」あるいは
「サブルーチン」と呼ぶ処理に該当する.
• Functionプロシージャが関数にあたり,呼び出した
コードブロックに,必ず一つの値を返す.
• Subプロシージャがサブルーチンにあたり,
呼び出したコードブロックに値を返さない.
• プロシージャ間のデータの引き渡しは,「引数」で行う.
関数の定義の仕方の例(その1)
(主プログラム)
Sub Main()
…
y1=f(x)
…
End Sub
一種の副プログラムであるから,
主プログラムとは別に書く.
組み込み関数のように
呼び出せる
関数を単精度
実数型として宣言
Function f(x)
Dim y As Single
戻り値の型の宣言
y = x ^ 2 + 2 * x
関数の定義
Return y
End Function
主プログラムへ返す値
(副プログラム)
(戻り値)
関数の定義の仕方の例(その2)
Sub Main()
組み込み関数のように
…
呼び出せる
y1=f(x)
…
主プログラムから
End Sub
(主プログラム)
値が渡される
Function f(x)
Dim y As Single
戻り値の型の宣言
If x < 0 Then
y = 0
Else
関数の定義
ステップ
y=1
関数
End If
主プログラムへ返す値
Return y
(戻り値)
End Function (副プログラム)
例題:4次関数の定義
4次式
f  x   1.5 x  0.8 x  6.2 x  0.5 x  2.1
4
について,f
 x
3
2
の値を,0から0.2きざみで5.0までの
xに対して計算し,順に書き出すプログラムを作れ.
考え方:
• 実数xを引数とする実数型の関数
f(x)を定義する.
• xを繰り返し変化させながら,y=f(√x)の値を
順に書き出す.
4次関数の定義:プログラム例
Sub Main()
Dim y As Single
For x As Single = 0.0 To 5.0 Step 0.2
y = f(Math.Sqrt(x))
Console.WriteLine("{0,8},{1,16}", x, y)
Next
End Sub
Function f(x)
Dim y As Single
y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _
+ 6.2 * x ^ 2 + 0.5 * x + 2.1
Return y
End Function
4次関数の定義:出力例
プログラミング演習
• 非負の整数 n に対する階乗 n ! を計算する
関数を定義し,これを用いることで級数

1 1 1 1
   

0! 1! 2!
k 0 k !
1
1

 
 n  1! n!
の値を計算せよ.
考え方:
• 整数nを引数とする実数型の関数
factorial(n)を定義する.
• 与級数は有限の値に収束する.有限項で切っても,
十分よい近似値が得られる.
級数の計算:プログラム例
Sub Main()
Dim sum As Single = 0
有限で切る項を
十分大きく取る
For i As Integer = 0 To 100
sum = sum + 1 / factorial(i)
Next
関数の呼び出し
Console.WriteLine("級数の値は{0}", sum)
End Sub
Function factorial(n) As Single
Dim p As Single = 1
For i As Integer = 1 To n
p = p * i
Next
Return p
関数として返す値
End Function
大きなnに対して
計算できるように,
実数型で定義
級数の計算:出力例
例題:方程式の根
方程式
は,区間[0,2]において
ただ1つ根があることがわかっている.その根を
2分法によって求めるプログラムを作れ.
•2分法
両端と中点の
符号を調べる
方程式の根:考え方
1. 区間
の中点
を計算する.
2. 区間
と
において,
•
ならば解は左の区間
•
ならば解は右の区間
3. 解がある方の区間において新たな中点を計算し,
判定を行う.
となるまで繰り返し,そのときの
4.
解とする.
を
方程式の根:プログラム例(主プログラム)
Dim eps, x1, x2, xm As Single
eps = 10 ^ -6
単精度実数型の
x1 = 0
精度の限界
x2 = 2
端の値を入力
条件が真の間
While x2 - x1 > eps
は繰り返す
xm = (x1 + x2) / 2
中点の計算
If f(x1) * f(xm) > 0 Then
x1 = xm
解が中点の左右
Else
どちらにあるか判定
x2 = xm
端の点を再定義
End If
End While
解の書き出し
Console.WriteLine("解はx={0}", xm)
方程式の根:プログラム例(関数)
Function f(x)
Dim y As Single
y = x ^ 3 - x - 1
Return y
End Function
関数として返す値
方程式の根:出力例
課題:FizzBuzz問題(改)
正の整数を1から順に40まで書き出し,
• 3の倍数と3のつく数字のときは”Fizz”
• 5の倍数のときは”Buzz”
• 両方を満たす場合は”Fizz&Buzz”
と表示するプログラムを作れ.
提出期限:2016年6月13日(月)
適宜コメント行を挿入し,プログラムの説明をすること.
メールにプログラムを電子ファイル(Module1.vb)添付して提出.
プロジェクトのフォルダをzipなどで圧縮して提出してもよい.
FizzBuzz問題(改):出力例