§10 計算(3)1 | プログラミング実習 |
計算(1)、(2)では、計算に使用するデータ入力のため、データの個数だけテキストボックスで入力欄を用意した。しかし、データの個数が10個、20個と増えた場合に対応することができなくなる。
ここでは、複数のデータを1つのテキストボックスに入力して計算するプログラムと文字列を処理するプログラムについて学習する。
@:ラベル 入力欄の説明用 A:テキストボックス データ入力欄等 B:ボタン |
【1】 プログラム作成の準備
操作 1 Windowsアプリケーションを作成するためのプロジェクトを作成する。
プロジェクト名は「実習10計算3」とする。
操作 2 フォーム(Form1)のプロパティを次のように設定する。
Size 360, 300 Text 計算3
操作 3 上の図を参考にして、必要なオブジェクトを配置し、プロパティを設定する。
※ テキストボックスを複数行のデータ入力可能にするには、MultilineプロパティをTrueに設定する。
@ ラベル (Name) → Label1、 Text → 数値データ
(Name) → Label2、 Text → 計算結果A テキストボックス (Name) → Data1、 Text → 0、 Multiline → True、
ScrollBars → Vertical(垂直)
(Name) → Kotae、 Text → 0B ボタン (Name) → KeisanButton、 Text → 計 算
(Name) → EndButton、 Text → 終 了
操作 4 プログラムを保存する。 ( [ファイル(F)] → [すべてを保存(L)] )
操作 5 プログラムを実行する。
数値は入力できるが、どのボタンをクリックしても何も起こらない。
【2】 複数データの処理
データ入力用のテキストボックス(Data1)は、複数行にわたってデータが入力できるように、MultilineプロパティをTrueに設定している。ここで問題になるのが、複数のデータをどのように処理するかである。
例えば、1,2,3,4,5,6,7,8,9,10の10個のデータを処理する場合を考える。
まず、入力の方法であるが、@「1行に1つずつ」、A「1つずつカンマ(,)で区切る」、B「@とAの混在」という方法が考えられる。方法としては3種類であるが、Bの方法で入力できるようにプログラミングすれば、@Aの両方に対応できるので、ここではB「@とAの混在」の入力方法に対応できるようにする。
Bの場合、データの区切りがカンマと改行文字の2種類あるので、どちらか一つにまとめると後の処理が簡単になる。つまり、Bのように入力されたデータを@またはAのように変換する。ここでは、Aのように変換することにする。
操作 6 まず、Bのように入力したデータを表示する。表示用に[計算](KeisanButton)のクリックイベントに対応するメソッドを次のように作成する。
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles KeisanButton.Click
Dim moto As String
moto = Data1.Text
MsgBox(moto)
End Sub
Bのように入力して[合計]ボタンをクリックすると、Bと同じようにメッセージボックスに表示される。
操作 7 次に、Bのように入力したデータをAのように変換する。つまり、改行文字をカンマに変換する。[計算](KeisanButton)のメソッドにプログラム(太字)を追加する。
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles KeisanButton.Click
Dim moto As String, pt As Integer
moto = Data1.Text & "," 'データの最後にカンマを追加
pt = 1 '検索開始位置(1文字目)
Do '永久ループ
pt = InStr(pt, moto, vbCrLf) '改行文字(VbCrLf)を検索
If pt = 0 Then '改行文字なし
Exit Do 'ループを抜ける
End If
moto = Mid(moto, 1, pt - 1) & "," & Mid(moto, pt + 2) '連結
Loop
MsgBox(moto)
End Sub
Bのように入力して、[計算]ボタンをクリックすると、データが1行に並んでメッセージボックスに表示される。最後のデータ(10)の後にはカンマが付けられている。
5の後にカンマが2つある。これは、データ5の後にはカンマがあり、それに続いて改行文字(▽)があるため、カンマが連続することになった。
ここで、使われている命令・関数などについて簡単にまとめておく。
Do 〜 Loop DoとLoopの間を永久に繰り返す。
このループを抜け出すには、Exit DO 命令を使用する。
InStr(検索開始位置, 被検索文字列, 検索文字) Microsoft.VisualBasic.Instr() 被検索文字列 の検索開始位置 から 検索文字 と一致する文字を検索して、そのの位置を返却する。見つからなければ 0 を返却する。
Mid(文字列, 開始位置, 文字数) Microsoft.VisualBasic.Mid() 文字列 の 開始位置 から 文字数 だけの文字列を返却する。
Mid(文字列, 開始位置) Microsoft.VisualBasic.Mid() 文字列 の 開始位置 から末尾までの文字列を返却する。
改行文字の位置を調べて変数ptに記憶させる。改行文字より前半部は「Mid(moto,1,pt-1)」で、改行文字より後半部は「Mid(moto,
pt+2)」で取り出している。ここで、後半部のpt+2としているのは、改行文字(vbCrLf)が半角2文字分であるためである。
前半部と後半部の文字列の間にカンマを入れて連結し、元の変数motoに格納し直す。
次に、変数の値の変化を次に示す。(プログラムの「トレース」という)
ループ
回数moto
1,2,3▽4,5,▽6,7,8▽9▽10,pt
1Mid(moto, 1, pt-1)
↑前半部Mid(moto, pt+2)
↑後半部1 1,2,3▽4,5,▽6,7,8▽9▽10, 6 1,2,3 4,5,▽6,7,8▽9▽10, 2 1,2,3,4,5,▽6,7,8▽9▽10, 11 1,2,3,4,5, 6,7,8▽9▽10, 3 1,2,3,4,5,,6,7,8▽9▽10, 17 1,2,3,4,5,,6,7,8 9▽10, 4 1,2,3,4,5,,6,7,8,9▽10, 19 1,2,3,4,5,,6,7,8,9 10, 5 1,2,3,4,5,,6,7,8,9,10, 0
【特殊な文字】
テキストボックスなどに表示されない(見えない)が、存在する文字がある。スペース文字、改行文字、タブ文字である。見えない文字であるが重要な働きをする。
これらの見えない特殊な文字をプログラムで扱う場合、文字コードで処理をする。
スペース文字→vbSpace(32)、 改行文字→vbCrLf(13)と(10)、 タブ文字→vbTab(9)
改行文字は、復帰文字vbCr(13)とラインフィード文字vbLf(10)の組み合わせである。
操作 8 「4,5,▽」のようにカンマと改行が連続しているデータに対応する。 [計算](KeisanButton)のメソッドを次の下線部のように追加・修正する。
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles KeisanButton.Click
Dim moto As String, pt As Integer
moto = Data1.Text & ","
'データの最後にカンマを追加
pt = 1 '検索開始位置(1文字目)
Do '永久ループ
pt = InStr(pt, moto, vbCrLf)
'改行文字(VbCrLf)を検索
If pt = 0 Then '改行文字なし
Exit Do
'ループを抜ける
End If
If Mid(moto, pt - 1, 1) = "," Then '改行文字の直前がカンマ
moto = Mid(moto, 1, pt - 1) & Mid(moto, pt + 2) '改行文字削除
Else
moto = Mid(moto, 1, pt - 1) & "," & Mid(moto, pt + 2) '連結
End If
Loop
MsgBox(moto)
End Sub
Bのように入力して[計算]ボタンをクリックすると、Aと同じようにメッセージボックスに表示される。
§10 計算(3)1 | Copyright©2008 Hiroshi Masuda |