情報基礎実習I第六回目

情報基礎実習I
(第6回)
木曜4・5限
担当:北川 晃
Streamクラスを用いたファイルの接続
外部ファイルから変数’s’にデータを読み込む場合
プログラム中における
ファイルの名前
…
Dim インスタンス名 As New IO.StreamReader( _
“ファイルの絶対パス”, _
System.Text.Encoding.Default)
…
ReadToEnd:ファイルの内容すべてを取得
s = インスタンス名. ReadLine:ファイルから1行読み込む
Read :ファイルから1文字読み込む
…
インスタンス名.Close()
ファイルを閉じる
外部ファイルからのデータの読み込み:例文
Dim a, b, c As Single
Dim ReadText As New IO.StreamReader( _
“D:\read_test\data.txt”, _
1行ずつ
System.Text.Encoding.Default)
読み込み
ファイル名”data.txt”として
a = ReadText.ReadLine
“D:\read_test\”に保存
b = ReadText.ReadLine
c = ReadText.ReadLine
3.141592656
Console.WriteLine(“a={0}”,a) 2.718281828
Console.WriteLine(“b={0}”,b) 1
Console.WriteLine(“c={0}”,c)
ReadText.Close()
ファイル
を閉じる
Streamクラスを用いたファイルの接続
外部ファイルにデータを書き込む場合
プログラム中における
ファイルの名前
…
Dim インスタンス名 As New IO.StreamWriter( _
“ファイルの絶対パス”, _
[True または False], [文字コードの指定])
…
インスタンス名.
‘True’のときは追記
WriteLine:ファイルに書き込む(改行)
Write :ファイルに書き込む(改行無し)
…
インスタンス名.Close()
ファイルを閉じる
外部ファイルへのデータの書き出し:例文
Writerとして,ファイル
“D:\...\result.txt”を接続
Dim Writer As New IO.StreamWriter( _
"D:\...\result.txt")
Dim x As Single = 3, y As Single
‘True’と書かれていないので,
y = Math.Sqrt(x)
ファイルは上書きされる
Writer.Write(y)
‘y’の値を,Writerとして
接続したファイルに書き込む
Writer.Close()
ファイルを閉じる
例題:フィボナッチ数列(改)
フィボナッチ数列の最初の40項を求めて外部ファイル
’result.txt’へ出力するプログラムを作れ.
…
フィボナッチ数列:アルゴリズム
1. 求めたい項を’n_new’,ひとつ前の項を’n_last’,
二つ前の項を’n_old’とする.
2. 初期値としてn_old=0,n_last=1を代入し,
第一項と第二項をそれぞれ書き出す.
3. 第三項をn_new=n_old+n_lastにより計算し,書き出す.
4. 次の第四項を求めるために,
n_old=n_last,n_last=n_newの置き換えを行う.
5. この手順を,第40項が求まるまで繰り返す.
フィボナッチ数列:プログラム例
Dim i, num, n_old, n_last, n_new As Integer
Dim Writer As New IO.StreamWriter( _
"D:\...\result.txt")
Writerとして,ファイル
num = 40
Writerとして
接続した
ファイルに
書き込む
ファイルを
閉じる
完了を
知らせる
出力
項の数
n_old = 0
Writer.WriteLine("{0}", n_old)
n_last = 1
Writer.WriteLine("{0}", n_last)
“D:\...\result.txt”を接続
初項
第二項
For i = 3 To num
n_new = n_last + n_old
Writer.WriteLine("{0}", n_new)
n_old = n_last : n_last = n_new
Next
i=1~num(=40)
まで繰り返し
増分”Step 1”
は省略
これらの文を
逆にしてはならない
Writer.Close()
Console.WriteLine("ファイル書き込み完了しました.")
例題:関数のグラフの作成
区間 x0  x  x0  1 において,正弦関数の
グラフを作成せよ.
考え方:
• x0をキーボードから読み込み,x=x0から0.1刻みで
x=x0+1まで変化させる.
• それぞれのxについて,y=Math.Sin(x)を計算する.
• x,yの組をCSV (Comma Separated Value) 形式で
ファイルに書き出す⇒Excelで読み込み
CSV形式のファイル
• テキストエディタで開くと…
• Excelで開くと…
三角関数のグラフ:プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Dim x0, x, y As Single
Dim Writer As New IO.StreamWriter( _
"D:\...\result.csv",True)
ファイルがある場合は追記
Console.Write("初期値x0を入力してください:x0=")
x0 = Console.ReadLine()
For x = x0 To x0 + 1.0 Step 0.1 Writerとして接続した
ファイルに書き込む
y = Math.Sin(x)
Writer.WriteLine(" {0,10}, {1,10}", x, y)
Next
コンマで区切る
ファイルを閉じる
完了を知らせる出力
Writer.Close()
Console.WriteLine("ファイル書き込み完了しました.")
三角関数のグラフ:出力例
追記されている
三角関数のグラフ:出力例(続き)
データの列を選択
三角関数のグラフ:出力例(続き)
プログラミング演習
区間 0  x  10 において,正弦関数 y  sin x
およびその導関数,2階導関数のグラフを作成せよ.
考え方:
• オイラーの差分公式を用いる. y ⇒ f  x   sin x
df  x  f  x  h   f  x 

dy ⇒
dx
h
d 2 f  x f  x  h  2 f  x  f  x  h

d2y ⇒
2
dx
h2
• x, y, dy, d2yの各値を,CSV形式で
外部ファイルに書き出す.
三角関数の導関数:出力例
三角関数の導関数:プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Dim x, y, dy, d2y, h As Single
Dim Writer As New IO.StreamWriter("D:\...\result.csv")
h = 0.01
微小量を定める
For x = 0 To 10 Step 0.1
導関数の計算
y = Math.Sin(x)
dy = (Math.Sin(x + h) - Math.Sin(x)) / h
d2y = (Math.Sin(x + h) - 2 * Math.Sin(x) _
+ Math.Sin(x - h)) / h ^ 2
Writer.WriteLine("{0,10},{1,10},{2,10},{3,10}", _
x, y, dy, d2y)
コンマで区切る
Next
Console.WriteLine("ファイルの書き込み終了しました.")
Writer.Close()
ファイルを閉じる
完了を知らせる出力
プログラミング演習
区間 0  x  10 において,矩形波を
出力するプログラムを作れ.
考え方:
0
• 矩形波 f  x   
1
 2m  x  2m  1
 2m  1  x  2  m  1 
を
Functionプロシージャとして作成する.
• x,yの組をCSV (Comma Separated Value) 形式で
ファイルに書き出す⇒Excelで読み込み
矩形波のグラフ:出力例
矩形波のグラフ:プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Sub Main()
Dim x, y As Single
Dim Writer As New IO.StreamWriter( _
"D:\...\result.csv")
Writerとして接続した
For x = 0 To 10 Step 0.01
ファイルに書き込む
y = rect(x)
Writer.WriteLine(" {0,10}, {1,10}", x, y)
Next
コンマで区切る
ファイルを閉じる
Writer.Close()
Console.WriteLine("ファイル書き込み完了しました.")
End Sub
完了を知らせる出力
矩形波のグラフ:プログラム例(続き)
Function rect(x)
Dim y As Single
If x - Fix(x / 2) * 2 < 1 Then
y = 0
• x=0.5のとき,
Else
0.5-Fix(0.25)*2=0.5<1
y = 1
• x=1.5のとき,
End If
1.5-Fix(0.75)*2=1.5>1
Return y
• x=2.5のとき,
End Function
2.5-Fix(1.25)*2=0.5<1
…
yの値を返す
プログラミング演習
次の微分方程式の初期値問題をオイラー法により数値的に解け.
dy
y  x  0, y  0   2
dx
 0  x  2
考え方:
• オイラーの差分公式を利用する.
dy
 f  x, y 
dx
⇒
yi  yi 1  hf  x, yi 1 
• 0  x  2 について,繰り返し計算を行う.
• x=0のとき, yi 1=y0=2として, yi =yを計算する.
• xとyを書き出し,y0=yと置き直して
次のxについて計算を続ける.
微分方程式(オイラー法):出力例
微分方程式(オイラー法):プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Dim x, y, y0, h As Single
Dim Writer As New IO.StreamWriter("D:\...\result.csv")
h = 0.01 : y0 = 2
刻み幅,初期値の設定
Writerとして接続した
For x = 0 To 2 Step h
ファイルに書き込む
y = y0 + h * f(x, y0)
Writer.WriteLine("{0,10}, {1,10}", x, y)
y0 = y
コンマで区切る
Next
次の計算のための置き直し
Console.WriteLine("ファイルの書き込み終了しました.")
Writer.Close()
ファイルを閉じる
完了を知らせる出力
微分方程式(オイラー法):プログラム例(続き)
Function f(x, y0)
Dim y As Single
y = -x / y0
Return y
End Function
関数プロシージャ部分