情報実習I (第6回) 木曜4・5限 担当:北川 晃
例題:不定回数の繰り返し 1日目に1円,2日目に2円,…,n日目にはd=2n-1円の ように,毎日倍額を貯金するとする.ある金額tを読み 時の合計金額がいくらになるか,表示するプログラム を作れ.
不定回数の繰り返し:プログラム例 Label1~3,Textbox1~3, Button1,2の貼り付け
不定回数の繰り返し:プログラム例(つづき) Private Sub Button1_Click(sender As Object, e As EventArgs) … Dim n, d, t, sum As Integer t = Val(TextBox1.Text) n = 0 : d = 1 : sum = 0 While sum < t sum = sum + d d = d * 2 n = n + 1 End While TextBox2.Text = Format(n, "###") TextBox3.Text = Format(sum, "###,###,###") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) … End sumがtを超える まで繰り返す
不定回数の繰り返し:出力例
プログラミング演習 高知大学の各学部を入力し,どこのキャンパスに あるかを表示するプログラムを作れ.
各学部の所在地:プログラム例 Label1~3,TextBox1,2, Button1の貼り付け
各学部の所在地:プログラム例(つづき) 「検索」ボタン Dim faculty As String faculty = TextBox1.Text Select Case faculty Case "人文" TextBox2.Text = "朝倉" Case "教育" Case "理" Case "医" TextBox2.Text = "岡豊" Case "農" TextBox2.Text = "物部" Case Else TextBox2.Text = "(存在しない)" End Select
プログラミング演習 ラジオボタンで高知大学の各学部を選択し, どこのキャンパスにあるかを表示するプログラムを作れ.
Label1~4,TextBox1,2,Button1,2, 学部の場所:プログラム例 Label1~4,TextBox1,2,Button1,2, RadioButton1~5の貼り付け
学部の場所:プログラム例(つづき) 「検索」ボタン If RadioButton1.Checked Then TextBox1.Text = "人文" TextBox2.Text = "朝倉" ElseIf RadioButton2.Checked Then TextBox1.Text = "教育" ElseIf RadioButton3.Checked Then TextBox1.Text = "理" ElseIf RadioButton4.Checked Then TextBox1.Text = "医" TextBox2.Text = "岡豊" ElseIf RadioButton5.Checked Then TextBox1.Text = "農" TextBox2.Text = "物部" End If
学部の場所:プログラム例(つづき) 「クリア」ボタン RadioButton1.Checked = False TextBox1.Text = "" : TextBox2.Text = ""
Streamクラスを用いたファイルの接続 プログラム中における ファイルの名前 … Dim インスタンス名 As New IO.StreamReader( _ “ファイルの絶対パス”, _ System.Text.Encoding.Default) s = インスタンス名. インスタンス名.Close() ReadToEnd:ファイルの内容すべてを取得 ReadLine:ファイルから1行読み込む Read :ファイルから1文字読み込む ファイルを閉じる
外部ファイルからのデータの読み込み:例文 Dim a, b, c As Single Dim ReadText As New IO.StreamReader( _ “D:\read_test\data.txt”, _ System.Text.Encoding.Default) a = ReadText.ReadLine() b = ReadText.ReadLine() c = ReadText.ReadLine() Console.WriteLine(“a={0}”,a) Console.WriteLine(“b={0}”,b) Console.WriteLine(“c={0}”,c) ReadText.Close() 1行ずつ 読み込み ファイル名”data.txt”として “D:\read_test\”に保存 3.141592656 2.718281828 1 ファイル を閉じる
Streamクラスを用いたファイルの接続 外部ファイルにデータを書き込む場合 プログラム中における ファイルの名前 … Dim インスタンス名 As New IO.StreamWriter( _ “ファイルの絶対パス”, _ [True または False], [文字コードの指定]) インスタンス名. インスタンス名.Close() ‘True’のときは追記 WriteLine:ファイルに書き込む(改行) Write :ファイルに書き込む(改行無し) ファイルを閉じる
外部ファイルへのデータの書き出し:例文 Writerとして,ファイル “D:\...\result.txt”を接続 Dim Writer As New IO.StreamWriter( _ "D:\...\result.txt") Dim x As Single = 3, y As Single y = Math.Sqrt(x) Writer.Write(y) Writer.Close() ‘True’と書かれていないので,ファイルは上書きされる ‘y’の値を,Writerとして接続したファイルに書き込む ファイルを閉じる
例題:フィボナッチ数列(改) フィボナッチ数列の最初の40項を求めて外部ファイル ’result.txt’へ出力するプログラムを作れ. …
フィボナッチ数列:アルゴリズム 求めたい項を’n_new’,ひとつ前の項を’n_last’, 二つ前の項を’n_old’とする. 初期値としてn_old=0,n_last=1を代入し, 第一項と第二項をそれぞれ書き出す. 第三項をn_new=n_old+n_lastにより計算し,書き出す. 次の第四項を求めるために, n_old=n_last,n_last=n_newの置き換えを行う. この手順を,第40項が求まるまで繰り返す.
フィボナッチ数列:プログラム例 Writerとして,ファイル “D:\...\result.txt”を接続 項の数 初項 第二項 Dim i, num, n_old, n_last, n_new As Integer Dim Writer As New IO.StreamWriter( _ "D:\...\result.txt") num = 40 n_old = 0 Writer.WriteLine("{0}", n_old) n_last = 1 Writer.WriteLine("{0}", n_last) 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 Writer.Close() Console.WriteLine("ファイル書き込み完了しました.") Writerとして,ファイル “D:\...\result.txt”を接続 項の数 Writerとして 接続した ファイルに 書き込む 初項 第二項 i=1~num(=40)まで繰り返し ファイルを 閉じる 増分”Step 1” は省略 これらの文を 逆にしてはならない 完了を 知らせる出力
例題:関数のグラフの作成 区間 において,正弦関数の グラフを作成せよ. 考え方: x0をキーボードから読み込み,x=x0から0.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 y = Math.Sin(x) Writer.WriteLine(" {0,10}, {1,10}", x, y) Next Writer.Close() Console.WriteLine("ファイル書き込み完了しました.") ファイルがある場合は追記 Writerとして接続した ファイルに書き込む コンマで区切る ファイルを閉じる 完了を知らせる出力
三角関数のグラフ:出力例 追記されている
三角関数のグラフ:出力例(続き) データの列を選択
三角関数のグラフ:出力例(続き)
プログラミング演習 区間 において,正弦関数 およびその導関数,2階導関数のグラフを作成せよ. 考え方: オイラーの差分公式を用いる. 区間 において,正弦関数 およびその導関数,2階導関数のグラフを作成せよ. 考え方: オイラーの差分公式を用いる. x, y, dy, d2yの各値を,CSV形式で 外部ファイルに書き出す. y ⇒ dy ⇒ d2y ⇒
三角関数の導関数:出力例
三角関数の導関数:プログラム例 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() 微小量を定める 導関数の計算 コンマで区切る 完了を知らせる出力 ファイルを閉じる
プログラミング演習 区間 において,矩形波を 出力するプログラムを作れ. 考え方: 矩形波 を Functionプロシージャとして作成する. 区間 において,矩形波を 出力するプログラムを作れ. 考え方: 矩形波 を 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") 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 Writerとして接続した ファイルに書き込む コンマで区切る ファイルを閉じる 完了を知らせる出力
矩形波のグラフ:プログラム例(続き) Function rect(x) Dim y As Single If x - Fix(x / 2) * 2 < 1 Then y = 0 Else y = 1 End If Return y End Function x=0.5のとき, 0.5-Fix(0.25)*2=0.5<1 x=1.5のとき, 1.5-Fix(0.75)*2=1.5>1 x=2.5のとき, 2.5-Fix(1.25)*2=0.5<1 … yの値を返す
プログラミング演習 次の微分方程式の初期値問題をオイラー法により数値的に解け. 考え方: オイラーの差分公式を利用する. について,繰り返し計算を行う. x=0のとき, =y0=2として, =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 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() 刻み幅,初期値の設定 Writerとして接続した ファイルに書き込む コンマで区切る 次の計算のための置き直し ファイルを閉じる 完了を知らせる出力
微分方程式(オイラー法):プログラム例(続き) Function f(x, y0) Dim y As Single y = -x / y0 Return y End Function 関数プロシージャ部分