プログラミングⅠ講義ノート2参照(PDF形式)

2.変数と入出力
2.1 変数と表示
変数:データを保持しておく記号(例:x, y, x1, st, st1, data, city1, …)
日本語も可能だができるだけアルファベットで始まる英数字を用いる。
変数の型:整数型,長整数型,実数型,倍精度実数型,文字列型,バリアント型等
以後は、すべての型として利用できるバリアント型を用いる。
変数の型宣言:これからこの変数を使うという宣言 Dim x [as Variant]
バリアント型の場合、しなくてもよい。
以下の図のようなサンプルプログラムを作る。
1)1つのラベル、4つのコマンドボタン、1つのテキストボックスを以下の図のよ
うに貼り付け、コマンドボタンのオブジェクト名を rei1, rei2, rei3, rei4、テキスト
ボックスのオブジェクト名を ans にする。
2)テキストボックス ans の MultiLine プロパティを True にしておく。
3)プログラムを記述する。
4)プログラムは vb11.frm と vb11.vbp に保存する。
Private Sub rei1_Click()
x = 19
ans.Text = "私は" & x & "才です。"
End Sub
Private Sub rei2_Click()
s = "福井正康"
ans.Text = "私は" & s & "です。"
End Sub
1
Private Sub rei3_Click()
ans.Text = "私の名前" & Chr(13) & Chr(10) & "福井正康"
End Sub
Private Sub rei4_Click()
x = 2: y = 3
p = x + y: q = x - y
r = x * y: s = x / y
t = x ^ y
st = "x=" & x & Chr(13) & Chr(10)
st = st & "y=" & y & Chr(13) & Chr(10)
st = st & "x+y=" & p & Chr(13) & Chr(10)
st = st & "x-y=" & q & Chr(13) & Chr(10)
st = st & "x*y=" & r & Chr(13) & Chr(10)
st = st & "x/y=" & s & Chr(13) & Chr(10)
st = st & "x^y=" & t & Chr(13) & Chr(10)
ans.Text = st
End Sub
問題
例題のようなフォームで以下の問題に解答するプログラムを作れ。プログラムは
vbex11.frm と vbex11.vbp に保存せよ。
1)自分の氏名と年齢を変数 x と y に代入し、
「××××は××才です。
」と表示する。
2)変数 x に 2、y に 3 を代入し、数字を使わず x と y だけを用いて「2 + 3 = 5」と表
示する。
3)改行しながら、以下のように表示する。
今日の話題
大学祭について
4)変数 x に 3 を代入し、 y = x + x + x + 1 の答えを計算して以下のように表示する。
3
2
x = 2 のとき
y =××
2
2.2 入力とフォーマット付き出力
例1
1)上のようなフォームを作り、データを入力するテキストボックスのオブジェクト
名を data、結果を表示させるテキストボックスを ans、実行のコマンドボタンを
run にする。ans の MultiLine プロパティを true にしておく。
2)プログラムの記述
3)プログラムは vb12a.frm と vb12a.vbp で保存する。
Private Sub run_Click()
x = Val(data.Text)
st = x & Chr(13) & Chr(10)
st = st & Format(x) & Chr(13) & Chr(10)
st = st & Format(x, "0") & Chr(13) & Chr(10)
st = st & Format(x, "0.0000")
ans.Text = st
End Sub
例2
3
1)上のようなフォームを作り、身長を入力するテキストボックスのオブジェクト名
を data1、体重を入力するテキストボックスを data2、結果を表示させるテキスト
ボックスを ans、実行のコマンドボタンを run にする。ans の MultiLine プロパテ
ィを true にしておく。
2)プログラムの記述
3)プログラムは vb12b.frm と vb12b.vbp で保存する。
Private Sub run_Click()
h = Val(data1.Text)
w = Val(data2.Text)
'標準体重の計算
hyojun = (h - 100) * 0.9
'肥満度の計算
himan = w / hyojun
st = "標準体重 " & Format(hyojun, "0.0") & Chr(13) & Chr(10)
st = st & "肥満度 " & Format(himan, "0.00")
ans.Text = st
End Sub
問題
上の図のように、テキストボックスに英語、数学、国語の点数を入力し、実行ボタ
ンを押すと、結果表示用のテキストボックスに合計点と平均点を改行して出力するプ
ログラムを作れ。プログラムは vbex12.frm と vbex12.vbp で保存せよ。
4
3.条件判断
書式1
If 条件式 Then
処理
ElseIf 条件式 Then
処理
・・・・・
Else
処理
End If
書式2
If 条件式 Then 処理 Else 処理
例
1)タイトルのラベル、入力用のラベルとテキストボックス、3つのコマンドボタン、
表示用のテキストボックスを以下の図のように貼り付け、コマンドボタンのオブ
ジェクト名を rei1, rei2, rei3、入力用のテキストボックスを data、表示用のテ
キストボックスを ans にする。
2)プログラムを記述する。
3)プログラムは vb13.frm と vb13.vbp に保存する。
'点数を入力し、成績を表示する。
Private Sub rei1_Click()
x = Val(data.Text)
If x >= 80 Then
ans.Text = "優"
ElseIf x >= 70 Then
ans.Text = "良"
ElseIf x >= 60 Then
ans.Text = "可"
Else
ans.Text = "不可"
End If
End Sub
5
'0 以上 100 以下なら範囲内、それ以外は範囲外と答える。
Private Sub rei2_Click()
x = Val(data.Text)
If x >= 0 And x <= 100 Then
ans.Text = "範囲内です。"
Else
ans.Text = "範囲外です。"
End If
End Sub
'性別の入力により、確認を行なう。
Private Sub rei3_Click()
If data.Text = "男" Or data.Text = "男性" Then
ans.Text = "男の方ですね。"
ElseIf data.Text = "女" Or data.Text = "女性" Then
ans.Text = "女の方ですね。"
Else
ans.Text = "入力の間違いです。"
End If
End Sub
問題
y
第2象限
軸上
第1象限
x
第3象限
第4象限
上のようなフ ォームで以下 の問題に解 答するプログ ラムを作れ。 プログラム は
vbex13.frm と vbex13.vbp に保存せよ。
1)xdata に数字を入力し、100 以上か 100 未満か表示する。
2)xdata に数字を入力し(例えば-2)
、その絶対値を例えば│-2│ = 2 の形で表示する。
3)xdata(x 軸の値)と ydata(y 軸の値)に数字を入力し、第1象限∼第4象限また
は軸上を判定する。
6
4.繰り返し1
書式
For i = 初期値 To 最終値 [Step 変動幅]
処理
Next i
注)変数名 i は自由に変えてよい
例
1)タイトルのラベル、4つのコマンドボタ
ン、表示用のテキストボックスを以下の
図のように貼り付け、コマンドボタンの
オブジェクト名を rei1, rei2, rei3、
rei4、表示用のテキストボックスを ans
に す る 。 テ キ ス ト ボ ッ ク ス ans の
MultiLine プロパティを True にする。
2)プログラムを記述する。
3)プログラムは vb14.frm と vb14.vbp に保存する。
'1 から 10 まで 1 桁空けて表示
Private Sub rei1_Click()
st = ""
For i = 1 To 10
st = st & Format(i) & " "
Next i
ans.Text = st
End Sub
'2 から 20 まで1つ飛ばしに 4 桁右詰で表示
Private Sub rei2_Click()
s4 = "0000"
st = ""
For i = 2 To 20 Step 2
RSet s4 = Format(i)
st = st & s4
Next i
ans.Text = st
End Sub
'1 から 100 までの合計を求める
Private Sub rei3_Click()
7
total = 0
For i = 1 To 100
total = total + i
Next i
ans.Text = "合計 = " & Format(total)
End Sub
'九九の表を描く
Private Sub rei4_Click()
s4 = "0000"
st = ""
For i = 1 To 9
For j = 1 To 9
RSet s4 = Format(i * j)
st = st & s4
Next j
st = st & Chr(13) & Chr(10)
Next i
ans.Text = st
End Sub
問題
1)自分の名前を改行しながら 10 個表示する。
2)10 から 1 まで横に表示する。
3)3 から 30 まで 3 の倍数を 4 桁右詰で表示する。
4)1 から 99 まで奇数の合計を表示する。(2500)
5)1 から 10 までの積を表示する。(3628800)
6)1+1/2+1/3+ ・・・ +1/10 の合計を小数点以下 5
桁で表示する。(2.92897)
7)1/2+2/3+3/4+ ・・・ +10/11 の合計を小数点以下
5 桁で表示する。(7.98012)
8)5・6+6・7+7・8+ ・・・ +99・100 の合計を表示する。(333260)
9)a1=1, an=2an-1+1 のとき a10 の値を表示する。(1023)
10)自分の名前を横に 4 列、縦に 5 行、行列のように表示する。
11)1 から 100 までの数を並べて 4 桁右詰で 10 行 10 列に表示する。
12)九九の答えの合計を表示する。(2025)
プログラムは vbex14.frm と vbex14.vbp で保存する。
8
5.繰り返し2
書式
Do While 条件式
処理
Loop
例
1)タイトルのラベル、3つのコマンドボタン、入力
用と表示用のテキストボックスを図のように貼
り付け、コマンドボタンのオブジェクト名を rei1, rei2, rei3、入力用のテキス
トボックスを data、表示用のテキストボックスを ans にする。テキストボックス
ans の MultiLine プロパティを True にする。
2)プログラムを記述する。
3)プログラムは vb15.frm と vb15.vbp に保存する。
'1 から 100 までの合計を求める
Private Sub rei1_Click()
total = 0
i = 1
Do While i <= 100
total = total + i
i = i + 1
Loop
ans.Text = "合計 = " & Format(total)
End Sub
'1 から入力値まで表示、50 を超えると打ち切り
Private Sub rei2_Click()
st = ""
mx = Val(data.Text)
i = 1
Do While i <= mx
If i > 50 Then
Exit Do
End If
st = st & Format(i) & " "
i = i + 1
Loop
ans.Text = st
9
End Sub
'1+2+3+ … +n<500 となる最大の n を求める
Private Sub rei3_Click()
total = 0
n = 0
Do While total < 500
n = n + 1
total = total + n
Loop
st = " n = " & Format(n - 1) & Chr(13) & Chr(10)
st = st & "合計 = " & Format(total - n)
ans.Text = st
End Sub
問題
1)Do Loop を用いて 1 から 10 まで 1 桁空けて横に表示する。
2)y=x2+x+1 の関数で、x=1,2,3,… のときの y の値を y が 100 未満の範囲で 1 桁空け
て横に表示する。(3 7 13 21 31 43 57 73 91)
3)y=x2-5x の関数で、y<1000 の範囲で y が最大になる x と y を求める。(34,986)
4)a1=1, an=3an-1-1 の数列の項で 5000 未満のものを順に以下のように表示する。
プログラムは vbex15.frm と vbex15.vbp で保存する。
10
6.算術関数
関数 Abs(式)
機能 式の絶対値
関数 Sin(式), Cos(式), Tan(式)
機能 三角関数の値
関数 Int(式)
機能 式の値を超えない最大整数値
関数 Atn(式)
機能 y=arctan x の値(y=tan x の逆関数)
関数 Rnd
機能 0 以上 1 未満の小数乱数値
関数 Exp(式)
機能 y=ex の値,e=2.71828… Napier の数
関数 Randomize 式
機能 式の値に応じた乱数の初期化
関数 Log(式)
機能 y=logex の値(y=ex の逆関数)
関数 Timer
機能 00:00:00 からの秒数
例
1)タイトルのラベル、4つのコマンドボタン、表示
用のテキストボックスを図のように貼り付け、コ
マンドボタンのオブジェクト名を rei1, rei2,
rei3, rei4、表示用のテキストボックスを ans に
する。テキストボックス ans の MultiLine プロパ
ティを True に、Font を MS ゴシックする。
2)プログラムを記述する。
3)プログラムは vb16.frm と vb16.vbp に保存する。
'Int()関数で小数を整数化する
Private Sub rei1_Click()
X1 = Int(3.6)
X2 = Int(-3.6)
ans.Text = Format(X1) & " " & Format(X2)
End Sub
'Abs()関数で絶対値を求める
Private Sub rei2_Click()
X1 = Abs(2)
X2 = Abs(-2)
ans.Text = Format(X1) & " " & Format(X2)
End Sub
'乱数を発生させる(0 以上 1 未満と 20 以上 30 未満)
Private Sub rei3_Click()
11
st = ""
Randomize 1
For i = 1 To 20
x = Rnd
st = st & Format(x, "0.000") & " "
Next i
st = st & Chr(13) & Chr(10)
For i = 1 To 20
x = 10 * Rnd + 20
st = st & Format(x, "0.00") & " "
Next i
ans.Text = st
End Sub
'Sin()関数の関数表
Private Sub rei4_Click()
pi = 3.1415926
s3 = "000"
s8 = "00000000"
st = "角度 Sin" & Chr(13) & Chr(10)
For i = 0 To 360 Step 30
x = pi * i / 180
y = Sin(x)
RSet s3 = Format(i)
RSet s8 = Format(y, "0.000")
st = st & s3 & s8 & Chr(13) & Chr(10)
Next i
ans.Text = st
End Sub
問題
1)500 以上 800 未満の整数乱数を 50 個横に並べて表示
する。但し、シードはテキストボックスに入力する。
2)tan 関数の値を 0°から 30°毎に 360°まで表示する。
但し、tan を計算した結果の絶対値が 100 を超える場合は、OVER と表示する。
3)乱数を用いてπの値(半径 1 の円の面積)の概数を求める。モンテカルロ法
x と y、2つの 0 以上 1 未満の乱数を各 10000 個発生させながら、半径 1 の円内に
入っているものの数 n を求める(If x^2+y^2<1 Then n=n+1)。n/10000 は円の第 1
象限部分の面積に相当するので、4*n/1000 がπの値の概数である。シードには
Timer 関数を用いる。プログラムは vbex16.frm と vbex16.vbp に保存する。
12
7.配列
例
1)タイトルと問題を表示するラベル、3つのコマ
ンドボタン、入力用と表示用のテキストボック
スを図のように貼り付け、コマンドボタンのオ
ブジェクト名を rei1, rei2, rei3、入力用と表
示用のテキストボックスをそれぞれ data, ans
にする。テキストボックス ans の MultiLine プ
ロパティを True にする。
2)プログラムを記述する。
3)プログラムは vb17.frm と vb17.vbp に保存する。
'配列を利用した並べ替え
Private Sub rei1_Click()
st = ""
Dim a(10)
For i = 1 To 10
a(i) = i
st = st & Format(a(i)) & " "
Next i
st = st & Chr(13) & Chr(10)
For i = 10 To 1 Step -1
st = st & Format(a(i)) & " "
Next i
ans.Text = st
End Sub
'文字列配列
Private Sub rei2_Click()
Dim city(5)
city(1) = "岡山": city(2) = "倉敷": city(3) = "福山"
city(4) = "尾道": city(5) = "広島"
x = Val(data.Text)
If x >= 1 And x <= 5 Then
st = city(x) & "市に住みたいんですね。"
Else
st = "入力が間違っています。"
End If
ans.Text = st
13
End Sub
'最大を求める
Private Sub rei3_Click()
st = ""
Dim a(20)
For i = 1 To 20
a(i) = Int(100 * Rnd + 1)
st = st & Format(a(i)) & " "
Next i
st = st & Chr(13) & Chr(10)
x = a(1)
For i = 1 To 20
If x < a(i) Then
x = a(i)
End If
Next i
st = st & "最大 = " & Format(x)
ans.Text = st
End Sub
問題
1)1 から 100 までの整数乱数を 20 個配列に保存しながら表示し、その中で最小のも
のとその表示順を求めて以下のように表示する。
71 54 58 29 31 78 2 77 82 71 5 42 87 80 38 97 88 6 95 37
最小は 7 番目で 2
2)1 から 100 までの整数乱数を 20 個配列に保存しながら表示し、その平均値を小数
点以下 2 桁で以下のように表示する。
71 54 58 29 31 78 2 77 82 71 5 42 87 80 38 97 88
6 95 37
平均 = 56.40
3)1 から 100 までの整数乱数を 30 個配列に保存しな
がら表示し、図のように 50 未満と 50 以上に分けて
表示する。
プログラムは vbex17.frm と vbex17.vbp に保存する。
14
8.文字列処理
関数 Asc(文字)
機能 文字のアスキーコードを与える
関数 Chr(式)
機能 式で与えられるアスキーコードの
文字を与える
関数 Len(文字列)
機能 文字列の長さを与える
関数 Left(文字列,式)
機能 文字列の左から式文字分切取る
関数 Mid(文字列,式 1,式2)
機能 文字列の式1字目から式2文字分
切取る
関数 Right(文字列,式)
機能 文字列の右から式も自分切取る
関数 Instr(式,文字列1,文字列2)
機能 文字列1の式文字目から文字列2
を探して、先頭から何文字目にある
かを与える。但し文字列2がない場
合は 0 となる
関数 Hex(式)
機能 式の 16 進数表示の文字列を与える
例
1)タイトルのラベル、3つのコマンドボタン、表
示用のテキストボックスを図のように貼り付け、
コマンドボタンのオブジェクト名を rei1, rei2,
rei3、表示用のテキストボックスを ans にする。
テキストボックス ans の MultiLine プロパティ
を True にする。
2)プログラムを記述する。
3)プログラムは vb18.frm と vb18.vbp に保存する。
'文字列の切取り
Private Sub rei1_Click()
a = "Iloveyou"
a1 = Left(a, 1)
a2 = Mid(a, 2, 4)
a3 = Right(a, 3)
st = a & Chr(13) & Chr(10)
st = st & a1 & " " & a2 & " " & a3
ans.Text = st
End Sub
'文字のアスキーコードを調べる
Private Sub rei2_Click()
a = "abcdeABCDE"
15
st = a & Chr(13) & Chr(10)
alen = Len(a)
For i = 1 To alen
a1 = Mid(a, i, 1)
x = Asc(a1)
st = st & Format(x) & " "
Next i
ans.Text = st
End Sub
'文字列を検索する
Private Sub rei3_Click()
a = "A canner can can anything he can."
b = "can"
st = a & Chr(13) & Chr(10)
n = InStr(1, a, b)
Do While n > 0
st = st & Format(n) & " "
n = InStr(n + 1, a, b)
Loop
ans.Text = st
End Sub
問題
1)
「平成福山大学」という文字列を「平成」
、
「福山」
、
「大学」と切取って、並べ替えて「福山平成大学」
と表示する。
2)アルファベット「abcdefghijklmnopqrstuvwxyz」
のうち、文字入力のテキストボックスに入力した文
字を検索し、その文字だけ飛ばして表示する。
3)問題3コマンドボタンの右のテキストボックスに
入力した英文字列で、小文字をすべて大文字に変え
て表示する。
ヒント:小文字のアスキーコードから 32 を引くと大文字のアスキーコードになる。
また、アスキーコードを文字に直す関数は Chr(式)である。
プログラムは vbex18.frm と vbex18.vbp に保存する。
16
9.ファイル処理
命令 Open ファイル名 For モード As #ファイル番号
機能 ファイルのオープン(読み書きの準備)
モード Input, Output, Append
命令 Close #ファイル番号
機能 ファイルのクローズ(読み書き終了処理)
命令 Print #ファイル番号[,出力並び,…]
機能 ファイルへの出力
命令 Input #ファイル番号, 変数[,変数,…]
機能 ファイルからの読み込み
区切り記号 改行,カンマ 数字の場合はさらに[スペース,タブ]
命令 Line Input #ファイル番号, 変数
機能 ファイルからの1行分の読み込み
関数 EOF(N)
機能 ファイル番号 N のファイルの終りで真を返す。
例
1)タイトルのラベル、3つのコマンドボタン、表示用のテキストボックスを図のよ
うに貼り付け、コマンドボタンのオブジェクト名を rei1, rei2, rei3、表示用のテ
キストボックスを ans にする。テキストボックス ans の MultiLine プロパティを
True にする。
2)プログラムを記述する。
3)プログラムは vb19.frm と vb19.vbp に保存する。
'ファイル出力とファイル入力
Private Sub rei1_Click()
st = ""
Dim a(20)
Open "a:¥data1.txt" For Output As #1
For i = 1 To 20
x = Int(100 * Rnd + 1)
Print #1, Format(x); ",";
Next i
Close #1
Open "a:¥data1.txt" For Input As #1
For i = 1 To 20
Input #1, x
a(i) = x
17
st = st & Format(a(i)) & " "
Next i
Close #1
ans.Text = st
End Sub
'データ数不明の場合のファイル入力
Private Sub rei2_Click()
st = ""
n = 0
Open "a:¥data1.txt" For Input As #1
Do While Not EOF(1)
Input #1, x
st = st & Format(x) & " "
n = n + 1
Loop
Close #1
ans.Text = "データ数 " & Format(n) & Chr(13) & Chr(10) & st
End Sub
'区切記号のある文字列をそのまま読み込む
Private Sub rei3_Click()
Open "a:¥data2.txt" For Output As #1
Print #1, "1,000 万円"
Print #1, "2,000 万円"
Close #1
Open "a:¥data2.txt" For Input As #1
Line Input #1, a
Line Input #1, b
Close #1
ans.Text = a & Chr(13) & Chr(10) & b
End Sub
問題
1)1 から 100 までの整数乱数を 50 個カンマ区切りでファイル a:¥data3.txt に出力し、
それを読み込んで、その平均を表示する。
2)問題1)で作ったファイルを読み込んでデータを配列に保存し、それを逆順に表
示する。
3)テキストボックス ans に書かれた文字列をファイル a:¥data4.txt に保存し、それ
を 1 行ずつ読み込んで、図のように並べて表示する。
プログラムは vbex19.frm と vbex19.vbp に保存する。
18
10.サブルーチンと関数
例
1)上のようなフォームを作り、実行ボタンの名前を run,入力用のテキストボックス
の名前を data,表示用のテキストボックスの名前を ans にする。
2)テキストボックス ans の Multiline プロパティを True に、Font を MS ゴシックに
する。
2)プログラムを書く。
3)プログラムは vb20.frm と vb20.vbp に保存する。
Dim a()
Private Sub run_Click()
n = Val(data.Text)
ReDim a(n)
dset n
x = average(n)
disp n, x
End Sub
Private Sub dset(n)
For i = 1 To n
a(i) = Int(100 * Rnd + 1)
Next i
End Sub
Private Function average(n)
total = 0
For i = 1 To n
total = total + a(i)
19
Next i
average = total / n
End Function
Private Sub disp(n, x)
st = ""
For i = 1 To n
st = st & Format(a(i)) & " "
Next i
st = st & Chr(13) & Chr(10)
st = st & "平均 = " & Format(x, "0.00")
ans.Text = st
End Sub
問題
上のようなフォームで順列 nPr と組み合わせ nCr を計算するプログラムを作る。但
し、それぞれの計算は独自に関数 npr(n,r)と ncr(n,r)を作り、その中から n の階乗
(n!=1×2×3×…×n)の計算をする関数 fact(n)を呼び出して利用するものとする。
また nPr と nCr は以下のように求められる。
nPr = n!/(n-r)!,
nCr=n!/r!/(n-r)!
プログラムは vbex20.frm と vbex20.vbp に保存する。
20
11.マルチフォーム
例
1)kitune1.gif, kitune2.gif, tanuki1.gif, tanuki2.gif を予め自分のフォルダー
に読み込んでおく。
2)上のような3種類のフォームをメニュー[プロジェクト−フォームモジュールの
追加]によって作り、フォームの名前を MainForm, RedForm, GreenForm とする。
3)MainForm のコマンドボタンを cmdRed, cmdGreen、RedForm のイメージを kitune1,
kitune2, kitune(絵のないもの)、GreenForm のイメージを tanuki1, tanuki2,
tanuki(絵のないもの)とする。
4)RedForm と GreenForm の Timer コントロールの Interval プロパティを 500 にする。
5)各フォームについて以下のプログラムを書く。
6)保存は、MainForm を vb21-1.frm、RedForm を vb21-2.frm、GreenForm を vb21-3.frm
とし、プロジェクト名を vb21.vbp とする。
'MainForm
Private Sub cmdGreen_Click()
GreenForm.Show
End Sub
Private Sub cmdRed_Click()
RedForm.Show
End Sub
'RedForm
Private Sub Form_Load()
kitune1.Visible = False
kitune2.Visible = False
End Sub
21
Private Sub Timer1_Timer()
If kitune.Picture = kitune1.Picture Then
kitune.Picture = kitune2.Picture
Else
kitune.Picture = kitune1.Picture
End If
End Sub
'GreenForm
Private Sub Form_Load()
tanuki1.Visible = False
tanuki2.Visible = False
End Sub
Private Sub Timer1_Timer()
If tanuki.Picture = tanuki1.Picture Then
tanuki.Picture = tanuki2.Picture
Else
tanuki.Picture = tanuki1.Picture
End If
End Sub
問題
右図のように1つのフォームから過去の例題を呼び出し
て表示するプログラムを以下の手順に従って作る。
1)呼び出すプログラムのフォームの名前を変えて保存し直
しておく。例えば、vb1, vb2 等(現在はすべて Form1
で、同じ名前のものがあると読み込めない)
2)呼び出すフォームに終了ボタンがあり、プログラムが
End となっている場合は、Unload Me に変えておく。
(で
ないと、呼び出したプログラムを終了したらすべて終了
してしまう)
3)後は上の例題と同じ。
4)MainForm を vbex21.frm、プロジェクトを vbex21.vbp の名前で保存する。
22
12.再度グラフィックスで楽しもう
フォームやピクチャーボックスには、簡単な描画も可能です。ここでは、この機能
について学習します。基本的には、コントロール名.命令 引数 という形で利用しま
すが、フォームを画面として描く場合は、コントロール名を省略できます。
主な命令
Cls 画面を消去します。
PSet (x,y),色 画面に点を打つ。
Line(x1,y1)-(x2,y2),色[,b(bf)] 2点を結んで線を引く(b:四角 BF:塗りつぶし)
Circle(x,y),半径,色[,開始位置,終了位置,縦横比]
開始位置と終了位置はラジアン表示,半径を描くならマイナスを付ける。
色の指定:QBColor(0)∼QBColor(15), RGB(赤,緑,青) 各色 0∼255
DrawStyle = 0:実線(既定値) 1:鎖線 2:点線 3:1点鎖線 4:2点鎖線
DrawWidth = 線の太さ
FillStyle = 0:塗りつぶし 1:透明(既定値) 2:横線 3:縦線 4:斜線(左上右下)
5:斜線(右上左下) 6:クロス(縦横) 7:網掛け(斜め)
FillColor = 色
問題
動く年賀状プログラムを仕上げましょう。データはホームページなどから取ってき
てもいいです。
前期に見たヒントプログラム(意味が分かるようになっていますか)
Dim no
Dim sx, sy
Private Sub Form_Resize()
'星空を描く (0,0)-(8000,6000)の領域に白色の点を 1000 個描く。
'砂浜にも応用可能
X1 = 0: Y1 = 0
X2 = 8000: Y2 = 6000
For i = 1 To 1000
x = X1 + (X2 - X1) * Rnd
y = Y1 + (Y2 - Y1) * Rnd
PSet (x, y), QBColor(15)
Next i
23
'月を描く
FillStyle = 0
FillColor = QBColor(14)
Circle (7000, 1000), 500, QBColor(14)
'流れ星準備
no = 0
sx = 300
sy = 300
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
'3 秒後に流れ星
If no = 30 Then
star.Visible = True
ElseIf no > 30 And no < 40 Then
star.Move star.Left + sx, star.Top + sy
ElseIf no = 40 Then
star.Visible = False
Timer1.Enabled = False
End If
no = no + 1
End Sub
24
13.総合演習
13.1 総合演習1
以下のようなプログラムを作れ。
問題1
データのテキストボックスが空なら「データはなし」
、何か文字列が入っていれば「デ
ータはXXX」のようにその文字列を下のテキストボックスに表示する。
問題2
チェックボックスがチェックされていなければ「未チェック」
、チェックされていれ
ば「チェック済み」と下のテキストボックスに表示する。
問題3
どのオプションオプションボタンが選択されているかによって、「オプションXを
選択」のようにその番号を下のテキストボックスに表示する。
問題4
For ループを使って自分の名前を以下のように表示する。
25
問題5
ボタンを押すと以下のようにサルが表示され、2秒後消えるようにする。
拡大
下のテキストボックスの文字を2ポイント拡大する。
縮小
下のテキストボックスの文字を2ポイント縮小する。但し9ポイントより小さくは
しない。
プログラムは enshu1.frm と enshu1.vbp に保存する。
26
12.2 総合演習2
以下の図のような形式のフォームを作り、プログラムを作成せよ。
右のテキストボックスのスクロールバーはプロパティ ScrollBars で設定する。
データ設定
1 から 100 までの整数乱数 200 個をフォーム全体で使える配列 a(1)∼a(200)に入れ、
テキストボックスに 1 桁空白を入れながら値を表示する。ここでは最初にこの処理
を行なうものとする。
問題1
配列に保存されたデータから、1 番目,5番目,9番目…のように4つ飛ばしで下
のテキストボックスに表示する。
問題2
配列に保存されたデータからその平均値を求めて表示する。
27
問題3
配列に保存されたデータを 50 以上と 50 未満に分け、それぞれ幾つずつあるのか表
示する。
問題4
右のテキストボックスに表示された数字の並びの中に1という文字が幾つあるの
か調べて結果を表示する。
問題5
右のテキストボックスに表示された数字の並びの文字列から、先頭の 20 文字分を
切り取り、それを以下のように文字の順番をひっくり返して表示する。
71 54 58 29 31 78 2
2 87 13 92 85 45 17
問題6
以下の仕様の delspace(文字列)関数を作成する。
機能 引数で与えられた文字列の空白を取り除き、結果を戻り値として返す。
次に右のテキストボックスに表示された数字の並びの文字列から、先頭の 20 文字
分切り取り、delspace()関数で空白を取り除いて以下のように表示する。
71 54 58 29 31 78 2
7154582931782
プログラムは enshu2.frm と enshu2.vbp に保存する。
参考
関数 Asc(文字)
機能 文字のアスキーコードを与える
関数 Chr(式)
機能 式で与えられるアスキーコードの
文字を与える
関数 Len(文字列)
機能 文字列の長さを与える
関数 Left(文字列,式)
機能 文字列の左から式文字分切取る
関数 Mid(文字列,式 1,式2)
機能 文字列の式1字目から式2文字分
切取る
関数 Right(文字列,式)
機能 文字列の右から式も自分切取る
関数 Instr(式,文字列1,文字列2)
機能 文字列1の式文字目から文字列2
を探して、先頭から何文字目にある
かを与える。但し文字列2がない場
合は 0 となる
関数 Hex(式)
機能 式の 16 進数表示の文字列を与える
28