§10 計算(3)1 プログラミング実習
 back next 

 計算(1)、(2)では、計算に使用するデータ入力のため、データの個数だけテキストボックスで入力欄を用意した。しかし、データの個数が10個、20個と増えた場合に対応することができなくなる。
 ここでは、複数のデータを1つのテキストボックスに入力して計算するプログラムと文字列を処理するプログラムについて学習する。

実習10計算3のデザイン  @:ラベル
   入力欄の説明用
 A:テキストボックス
   データ入力欄等
 B:ボタン

 

【1】 プログラム作成の準備

操作 1 Windowsアプリケーションを作成するためのプロジェクトを作成する。
 プロジェクト名は「実習10計算3」とする。

操作 2 フォーム(Form1)のプロパティを次のように設定する。

Size 360, 300 Text 計算3

操作 3 上の図を参考にして、必要なオブジェクトを配置し、プロパティを設定する。

@ ラベル (Name) → Label1、 Text → 数値データ
(Name) → Label2、 Text → 計算結果
A テキストボックス (Name) → Data1、 Text → 0、 Multiline → True、 
   ScrollBars → Vertical(垂直)
(Name) → Kotae、 Text → 0
B ボタン (Name) → KeisanButton、 Text → 計 算
(Name) → EndButton、 Text → 終 了
※ テキストボックスを複数行のデータ入力可能にするには、MultilineプロパティをTrueに設定する。

操作 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
1
Mid(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と同じようにメッセージボックスに表示される。


 back next 
 §10 計算(3)1 Copyright©2008 Hiroshi Masuda 

 

 

inserted by FC2 system