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

【3】 データの取り出し手順

 変換されたデータは、変数motoに次のように1つの文字列データとして記憶されている。

"1,2,3,4,5,6,7,8,9,10,"

 このデータを1つ1つのデータに分ける必要がある。その処理手順を次に示す。

  1. カンマの位置(先頭から何文字目)を調べて、変数ptに格納する。
     pt = InStr(moto, ",")
  2. カンマの直前までの文字を取り出して数値に変換して、変数dに格納する。
     d = Val(Mid(moto, 1, pt - 1))
  3. カンマまでの文字を元のデータから削除する。
     moto = Mid(moto, pt + 1)
以上、データがなくなるまで繰り返す。

 トレース(moto=1,2,3,4,5,6,7,8,9,10," の場合)

回数 pt=InStr(moto,",") d=Val(Mid(moto,1,pt-1)) moto=Mid(moto,pt + 1)
1 2 1 "2,3,4,5,6,7,8,9,10,"
2 2 2 "3,4,5,6,7,8,9,10,"
3 2 3 "4,5,6,7,8,9,10,"
 …
8 2 8 "9,10,"
9 2 9 "10,"
10 2 10 ""


操作 9 カンマで区切られたテータを1つずつ分ける。[計算](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, d 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
        Do Until Len(moto) = 0
            pt = InStr(moto, ",")        'カンマを検索
            d = Val(Mid(moto, 1, pt - 1))    '先頭からカンマ直前まで
            MsgBox(d)    '確認用
            moto = Mid(moto, pt + 1)    'カンマ直後をmotoに
            MsgBox(moto)    '確認用
        Loop
    End Sub

結果 Bのように入力して[計算]ボタンをクリックすると、メッセージボックスに取り出したデータ、残りのデータの順に繰り返し表示される。
 「1」→「2,3,4,5,6,7,8,9,10,」→「2」→「3,4,5,6,7,8,9,10,」→「3」→「4,5,6,7,8,9,10,」→「4」→「5,6,7,8,9,10,」→「5」→「6,7,8,9,10,」→「6」→「7,8,9,10,」→「7」→「8,9,10,」→「8」→「9,10,」→「9」→「10,」→「10」→「なし」

 以上で@、A、Bのどのような入力方法にも対応できるようになった。

 ここで、使われている命令・関数などについて簡単にまとめておく。

Len(文字列 ) Microsoft.VisualBasic.Len()
 文字列 の長さ(文字数)を返却する。
Do Until 条件式  〜 Loop
Do 〜 Loop Until 条件式
 条件式 が真になるまで繰り返す。条件式 が真になったらループを終える。
(参考)
Do While 条件式  〜 Loop
Do 〜 Loop While 条件式
 条件式 が真の間、繰り返す。条件式 が偽になったらループを終える。

 

【4】 合計計算

 カンマで区切られたデータは、変数dに取り出されていく。このデータを加算(累算)していき、合計を計算させる。

操作 10 合計計算をする。[計算](KeisanButton)のメソッドを次の下線部のように追加・修正する。2カ所の確認用の命令は削除する。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KeisanButton.Click
        Dim moto As String, pt As Integer, d As Integer
        Dim goukei As Integer
        moto = Data1.Text & ","        'データの最後にカンマを追加
        pt = 1        '検索開始位置(1文字目)
        goukei = 0    '合計用
        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
        Do Until Len(moto) = 0
            pt = InStr(moto, ",")        'カンマを検索
            d = Val(Mid(moto, 1, pt - 1))    '先頭からカンマ直前まで
            MsgBox(d)    '確認用
            moto = Mid(moto, pt + 1)    'カンマ直後をmotoに
            MsgBox(moto)    '確認用
            goukei = goukei + d    '合計計算
        Loop
        Kotae.Text = goukei    '合計表示
    End Sub

結果 1〜10のデータを@、A、Bいずれかの方法で入力して、[計算]ボタンをクリックすると計算結果の欄に"55"と表示される。

操作 11 [終了](EndButton)のクリックイベントに対応するメソッドを作成する。

 

【カンマ区切りのデータ形式】
 データをカンマ(,)で区切ったデータ形式は、「CSV(Comma Separated Values)」形式と呼ばれる。表計算などの保存形式としても使われている。実態はテキストデータであるのでほかのアプリケーションとのデータ交換などにも使われる。
 VBには、区切られたデータを取り出すのに、split関数がある。
    Dim a(3) As String
    a = Split("1,2,3,4", ",")
 実行結果は、a(0)="1",a(1)="2",a(2)="3",a(3)="4"となる。詳しくは、ヘルプ参照のこと。

 

【5】 平均計算

 平均は、合計をデータの個数でわり算したものである。すでに合計は計算できているので、あとはデータの個数がわかればよい。
 個数をカウントする変数cntを用意して、データを取り出すごとに1ずつ加算していけばデータの個数を調べることができる。

操作 12 平均の計算結果を表示する欄を図のように追加する。合計のラベルのメッセージも変更しているので修正する。

@ ラベル (Name) → Label3、 Text → 平均=
A テキストボックス (Name) → Kotae2、 Text → 0

操作 13 平均計算をする。[計算](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, d As Integer
        Dim goukei As Integer, cnt As Integer
        moto = Data1.Text & ","        'データの最後にカンマを追加
        pt = 1        '検索開始位置(1文字目)
        goukei = 0    '合計用
        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
        cnt = 0    'データ個数用
        Do Until Len(moto) = 0
            pt = InStr(moto, ",")        'カンマを検索
            d = Val(Mid(moto, 1, pt - 1))    '先頭からカンマ直前まで
            moto = Mid(moto, pt + 1)    'カンマ直後をmotoに
            goukei = goukei + d    '合計計算
            cnt = cnt + 1    'データ個数カウント
        Loop
        Kotae.Text = goukei    '合計表示
        Kotae2.Text = goukei / cnt    '平均表示
    End Sub

結果 1〜10のデータを@、A、Bいずれかの方法で入力して、[計算]ボタンをクリックすると合計の欄に"55"、平均の欄に"5.5"と表示される。


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

 

 

inserted by FC2 system