情報実習I (第7回) 木曜4・5限 担当:北川 晃
復習:平方根の計算 a=1, 2, …, 50に対して,その平方根 を求め, 表を出力するプログラムを作れ. : Math.Sqrt(a) 補正値:
平方根の計算:アルゴリズム 整数 について,以下の手順を繰り返す. 初期値として, roota=1を代入する. 補正値 の計算を行う. 整数 について,以下の手順を繰り返す. 初期値として, roota=1を代入する. 補正値 の計算を行う. roota=roota+cにより補正を行う. 補正した値の相対値 を設定した値 と比較して 小さくなるまで補正を繰り返す.
平方根の計算:出力例
これがないと,続くWhile文の評価ができない 平方根の計算:プログラム例 Dim a As Integer, eps As Single = 0.000001 Dim roota, c As Single For a = 1 To 50 roota = 1 c = 1 While Math.Abs(c) / roota > eps c = (a / roota - roota) / 2 roota = roota + c End While Console.WriteLine("√{0}={1}", a, roota) Next 補正量𝑐の初期値: これがないと,続くWhile文の評価ができない While文では最初に条件判定を行う
Do……Loop文の基本的な表式1 前判定ループ Do While 条件式 文ブロック Loop 条件が「真」の間は, ループを繰り返す. 条件が最初から「偽」の場合は, ループを1回も実行しない. Do Until 条件式 文ブロック Loop 条件が「真」になるまで, ループを繰り返す. 条件が最初から「真」の場合は, ループを1回も実行しない.
文ブロックは条件の「真」,「偽」に関わらず,最低一回は実行される. Do……Loop文の基本的な表式2 後判定ループ Do 文ブロック Loop While 条件式 条件が「真」の間は, ループを繰り返す. 文ブロックは条件の「真」,「偽」に関わらず,最低一回は実行される. Do 文ブロック Loop Until 条件式 条件が「真」になるまで, ループを繰り返す.
Do……Loop文を用いた書き換え 前判定ループ 後判定ループ 初期値 一度はループを 必ず通る 一度もループを 通らない場合もある 初期値 roota = 1 c = 1 Do While Math.Abs(c) / roota > eps c = (a / roota - roota) / 2 roota = roota + c Loop roota = 1 Do c = (a / roota - roota) / 2 roota = roota + c Loop While Math.Abs(c) / roota > eps 初期値 一度はループを 必ず通る 一度もループを 通らない場合もある roota = 1 c = 1 Do Until Math.Abs(c) / roota <= eps c = (a / roota - roota) / 2 roota = roota + c Loop roota = 1 Do c = (a / roota - roota) / 2 roota = roota + c Loop Until Math.Abs(c) / roota <= eps 初期値
例題:二乗,三乗,平方根の数表 1~10まで,0.5おきに,その数自身,二乗,三乗, 平方根の数表をラベルに表示するプログラムを作れ. 1~10まで,0.5おきに,その数自身,二乗,三乗, 平方根の数表をラベルに表示するプログラムを作れ. データを書き出す ごとに改行する
システムにより様々なコードが混在しているので注意が必要 改行コード vbCr(キャリッジリターン):行頭復帰 vbLf(ラインフィード):行送り vbCrLf:改行文字 vbTab:タブ文字 縦方向は紙を動かし, 横方向はキャリッジを動かす 改行のための レバー システムにより様々なコードが混在しているので注意が必要
二乗,三乗,平方根の数表:プログラム例 Label1~8,Button1,2の貼り付け 「計算」ボタンを押すと,
二乗,三乗,平方根の数表:プログラム例(つづき) Private Sub Button1_Click(sender As Object, e As EventArgs) … Dim n As Single For n = 1 To 10 Step 0.5 Label1.Text = Label1.Text & Format(n, "##.0") & vbLf Label2.Text = Label2.Text & Format(n ^ 2, "###0.0") & vbLf Label3.Text = Label3.Text & Format(n ^ 3, "####0.0") & vbLf Label4.Text = Label4.Text & Format(Math.Sqrt(n), "#.0000") _ & vbLf Next End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) … End Private Sub Form1_Load(sender As Object, e As EventArgs) … Label1.Text = "" : Label2.Text = "" Label3.Text = "" : Label4.Text = "" プログラム開始した直後の動作
例題:10人の点数の平均点 10人のテストの点数データをキーボードから1つずつ 入力し,その平均点を計算して表示するプログラムを作れ. 10人のテストの点数データをキーボードから1つずつ 入力し,その平均点を計算して表示するプログラムを作れ. 入力のためのフォーム (InputBox関数を使用)
Label1に「ここにデータが表示されます」と入力 10人の点数の平均点:プログラム例 Label1,Textbox1, Button1,2の貼り付け Label1に「ここにデータが表示されます」と入力
10人の点数の平均点:プログラム例(つづき) Private Sub Button1_Click(sender As Object, e As EventArgs) … Dim goukei, n, ten As Integer : Dim heikin As Single goukei = 0 : Label1.Text = "入力データ" & vbLf For n = 1 To 10 ten = InputBox("点数を入力してください", "点数") Label1.Text = Label1.Text & Format(ten, " ##0") goukei = goukei + ten Next n heikin = goukei / 10 TextBox1.Text = Format(heikin, "平均点は###.0点") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) … End
例題:多重ループ 2から20までの数について,1を除くすべての約数を ラベルに表示するプログラムを作れ.
多重ループ:プログラム例 Label1,Button1,2 の貼り付け
多重ループ:プログラム例(つづき) 次のnの評価に移る前に改行コードを入れる Private Sub Button1_Click(sender As Object, e As EventArgs) … Dim n, m As Integer Label1.Text = "" For n = 2 To 20 Label1.Text = Label1.Text & Format(n, "##の約数は:") For m = 2 To n If n Mod m = 0 Then Label1.Text = Label1.Text & Format(m, " ## ") End If Next m Label1.Text = Label1.Text & vbLf Next n End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) … End nをmで割って,余りがゼロなら約数なので書き出す 次のnの評価に移る前に改行コードを入れる
例題:数字列の表示 フォームに0~9のボタンを配置し,これを押した順番に 数字がテキストボックスに表示されるプログラムを作れ. フォームに0~9のボタンを配置し,これを押した順番に 数字がテキストボックスに表示されるプログラムを作れ. ただし,ACキーを押すと,表示が消えるものとする.
数字列の表示:考え方 文字列”s”を用いて数字を表示する. 数字ボタンを押すたびに,新たな文字列が 文字列は,”&”もしくは”+”の演算子で結合できる. “AC”(=All Clear)キーを押した場合,それまで 記憶していた文字列”s”は消去される. “AC”キーを押すと,テキストボックスの表示も消去される.
数字列の表示:プログラム例 Textbox1,Button1~11の貼り付け たとえば”5”のキーを押した場合, それまでの文字列をsとして, s = s & ”5”のように文字列を結合, 新たなsをテキストボックスに書き出す “AC”キーを押すと,s = “”に初期化され, テキストボックスの表示も””に初期化
数字列の表示:プログラム例(つづき) sを共通の変数として宣言 初期値は文字列無し Dim s As String = "" Private Sub Button1_Click(sender As Object, e As EventArgs) … s = s & "1" TextBox1.Text = s End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) … s = s & "2" Private Sub Button3_Click(sender As Object, e As EventArgs) … s = s & "3" … 1のキーが押された場合,sの右側に 文字列”1”を結合し,文字列を表示 2のキーが押された場合,sの右側に 文字列”2”を結合し,文字列を表示 3のキーが押された場合,sの右側に 文字列”3”を結合し,文字列を表示
ACキーが押された場合,sを空に設定し, 数字列の表示:プログラム例(つづき) … Private Sub Button9_Click(sender As Object, e As EventArgs) … s = s & "9" TextBox1.Text = s End Sub Private Sub Button10_Click(sender As Object, e As EventArgs) … s = s & "0" Private Sub Button11_Click(sender As Object, e As EventArgs) … s = "" TextBox1.Text = "" 9のキーが押された場合,sの右側に 文字列”9”を結合し,文字列を表示 0のキーが押された場合,sの右側に 文字列”0”を結合し,文字列を表示 ACキーが押された場合,sを空に設定し, 表示も空にする.
数字列の表示:応用 先の例題のプログラムを応用すれば, 簡単な電卓を作成することもできる. 製品として販売されている電卓を研究し, どのような動作をするか考えてみよう
課題:電卓のフォームアプリ作成 0~9および小数点のキーを備えていること. ACキー(すべてを初期化する)を備えていること. キー入力と連動したディスプレイを一つ以上備えていること. 正の実数の四則演算ができること (答えは負の数になる場合もある). 追加要素の例: 平方根 クリアーキー 正負変換
電卓のフォームアプリ作成:ヒント TextBoxに表示される数字の文字列を 数字のデータに変えたり,また文字列に戻したり. 四則演算をさせるためには,二つの数字を 記憶させなければならない.どのボタンに, どのタイミングで動作させるか. 四則演算のボタンを押したとき,最後にイコール キーを押すまで,どの演算を行うかをどうやって 記憶しておくか ボタンが多くなるので,それぞれの動作の 関連付けを間違えないこと.
データの型の変更 Cint(x): xを整数型へ変換 CStr(x): xを文字列へ変換 CSng(x): xを単精度実数型へ変換 CDbl(x): xを倍精度実数型へ変換 CBool(x): xを論理型へ変換 Val(s): sを適切な数値へ変換
ヒント:足し算機能の実装 足し算キーとイコールキーの動作を次のように設定する. 足し算キー イコールキー それまでに入力されている数の記憶 足し算キー m = Val(TextBox1.Text) op = 1 s = "" 足し算であることの記憶 記憶されている数の消去 イコールキー 二つ目に入力された数の記憶 n = Val(TextBox1.Text) Select Case op Case 1 TextBox1.Text = m + n End Select s = "" 足し算の場合は… 記憶されている数の消去
電卓の自然な動作に向けて1 ディスプレイに「0」が表示されているときに, 0キーを押しても「00」とは表示されない. ヒント:0キーの動作を,ディスプレイの 表示によって場合分けする. (Hint: We divide the action of 0 key Into cases according to string on the display. ) Pushing ‘0’ key Yes No s=‘0’? s=s s=s + ‘0’ Displaying the string ‘s’
電卓の自然な動作に向けて2 ディスプレイ上の数字が小数点を含む場合, 二つ目の小数点を表示しない. 方法1:文字列’s’が’.’を含んでいるかどうかを判定する. 方法2:数字が整数か,小数かを判定する. s1=‘12345’ s2=‘12.345’ Console.WriteLine(s1.IndexOf(“.”)) ’結果は0 Console.WriteLine(s2.IndexOf(“.”)) ’結果は1 文字列の中に’.’が 含まれているかを判定 Fix関数,Int関数 xを整数の範囲で1で割り算 ⇒整数部分だけを取り出せる x-(x\1)=0 or not?