68
プログラミング基礎(蒔苗)資料 1 プログラミング基礎 [担当教員] 蒔苗 耕司 [年次・学期] 1年次 前期開講 1単位 [授業概要] 今日の社会においてコンピュータは欠くことのできないものとなっているが,コンピュータを効率的に 動作させるためには,その動作手順を示したコンピュータプログラムから成るコンピュータソフトウェア が必要不可欠である.本演習では,入門用のプログラミング言語(Microsoft VisualBasic)を用いて,パー ソナルコンピュータ上で動作するプログラムを作成しながら,コンピュータソフトウェアの基本的な仕組 みを知る. [授業計画] [1] 4/14 コンピュータプログラムとは [2] 4/21 基本的な入出力 -Hello World- [3] 4/28 プロパティ・メソッド・イベント [4] 5/12 変数と演算子 [5] 5/19 制御構造(1) IF..THEN [6] 5/26 制御構造(2) Do..Loop [7] 6/2 制御構造(3) For..Next [8] 6/9 配列と構造体(1)―配列内の数値の和- [9] 6/16 配列と構造体(2)-配列内の最大・最小,構造体を知る- [10] 6/23 ファイル入出力と文字列の処理 [11] 6/30 グラフィックス [12] 7/7 乱数を用いたゲームプログラミング(1) [13] 7/21 乱数を用いたゲームプログラミング(2) (7/7 休講予定) [評価方法] 出席状況・課題・試験による [教科書・参考書] 教科書:プリントを配布する. 参考書:適宜指示する. [備考]

プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

1

プログラミング基礎

[担当教員] 蒔苗 耕司

[年次・学期] 1年次 前期開講 1単位

[授業概要]

今日の社会においてコンピュータは欠くことのできないものとなっているが,コンピュータを効率的に

動作させるためには,その動作手順を示したコンピュータプログラムから成るコンピュータソフトウェア

が必要不可欠である.本演習では,入門用のプログラミング言語(Microsoft VisualBasic)を用いて,パー

ソナルコンピュータ上で動作するプログラムを作成しながら,コンピュータソフトウェアの基本的な仕組

みを知る.

[授業計画]

[1] 4/14 コンピュータプログラムとは

[2] 4/21 基本的な入出力 -Hello World-

[3] 4/28 プロパティ・メソッド・イベント

[4] 5/12 変数と演算子

[5] 5/19 制御構造(1) IF..THEN

[6] 5/26 制御構造(2) Do..Loop

[7] 6/2 制御構造(3) For..Next

[8] 6/9 配列と構造体(1)―配列内の数値の和-

[9] 6/16 配列と構造体(2)-配列内の最大・最小,構造体を知る-

[10] 6/23 ファイル入出力と文字列の処理

[11] 6/30 グラフィックス

[12] 7/7 乱数を用いたゲームプログラミング(1)

[13] 7/21 乱数を用いたゲームプログラミング(2)

(7/7 休講予定)

[評価方法]

出席状況・課題・試験による

[教科書・参考書]

教科書:プリントを配布する.

参考書:適宜指示する.

[備考]

Page 2: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

2

コンピュータプログラムとは

コンピュータプログラムは,コンピュータを動かすための命令を記述したものである.

コンピュータは基本的に電気の流れの ON/OFF により制御される. したがって命令は電気信号の ON/OFF を規定するものである. コンピュータを制御するために,電気的な ON/OFF の制御として記述し,コンピュータを制御する

のは非効率である. あらかじめ CPU(中央処理装置)に命令が組み込まれ(命令セット),その命令を用いることによっ

て,ある程度,容易にコンピュータを制御することができる. しかし命令セットはコンピュータが理解しやすいように作られたものであり,それを用いれば命令の

手順を記述することが可能である(アセンブリ言語).しかし,人間が容易に制御をその記述するに

は難しいという問題がある. そこで,人間に近い言葉で命令を記述できるように,コンピュータ言語が開発されている. 主なプログラミング言語としては, C, C++, C# FORTRAN (Formula Translator) COBOL (COmmon Business Oriented Language) PASCAL (Philips’ Automatical Sequence Calculator) BASIC (Beginners’ All-purpose Symbolic Instruction Code) Java

などがある. 本講義では,Basic 系言語である Microsoft Visual Basic を用いて,プログラミングの基礎について

学習する.

Page 3: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

3

VisualBasic のインストール

1.VisualBasic とは? ・Microsoft 社が開発 ・Windows 環境におけるプログラミング言語 ・BASIC 系言語 ・オブジェクト指向 ・構造化言語 ・略称 VB

2.VisualBasic のインストール (1)VisualBasic のバージョン

授業で利用可能な Visual Basic のバージョンは以下の通りである. Visual Basic 5.0(製品版)

Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0 及び 6.0 評価版 Visual Basic 5.0 Control Creation Edition(無料で利用可能) (2)VisualBasic5.0 評価版のダウンロードとインストール

●Visual Basic 5.0 CCE は以下よりダウンロード可能. 学内のみ: http://www.campus.myu.ac.jp/~makanae/vb/ ●VB5CCEIN.EXE - 7,593 Kb を適当な場所(デスクトップ等)にダウンロード. ダウンロードしたファイルをダブルクリックするとインストールできる.

●HELP ファイルもダウンロード・インストールしておくこと.(CCEHELP.EXE - 3,216 Kb) 3.Visual Basic の起動 スタート>>すべてのプログラム>>VisualBasic5.0CCE を選択.

以下のような画面が表示されれば OK.

Page 4: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

4

最も簡単なプログラムの作成

(1)起動

スタート>>すべてのプログラム>>Visual Basic を選択する. 「標準 EXE」を選択し,OK ボタンを押す.

Form1 のウィンドウ(フォームウィンドウ)が作成するプログラムのウィンドウとなる. (2)コントロールボタンの貼り付け

左のコントロールウィンドウから任意のコントロールを選択し,Form1 上に貼り付ける.

コマンドボタン

テキストボックス

ツールボックス コントロールを選択し,Form1 上でドラッグする.

Page 5: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

5

(3)Command1 ボタンをダブルクリックすると,以下のようなコードウィンドウが表示される.

(4)Command1 がクリックされたときのプログラムを記載する.

「Command1 ボタンがクリックされたときに Text1 に「宮城大学」と表示する」 Private Sub Command1_Click() Text1.Text = "宮城大学" ←この行を追加する. End Sub

(5)プログラムの実行

プログラムの実行ボタンを押す(または F5 キーを押す)

コードウィンドウ

Command1 ボタンがクリックさ

れたときのプログラムをここに

書く

実行ボタン

終了ボタン

Page 6: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

6

●プログラムが実行される.

●Command1 ボタンをクリックすると,Text ボックスの表示が「宮城大学」に変わる.

(8)終了ボタンまたは Form1 上の□×ボタンを押し,プログラムを終了する.

【演習】 Command1 ボタンを押したときに,自分の名前を表示するようにプログラムを変更しなさい.

【プログラムの保存】 プロジェクトファイル(.vbp)とフォーム(.frm)のファイルの2種類のファイルを保存する必要がある. ①まずフォームのファイルを保存する.

(ファイル>>名前をつけて Form1 の保存>>任意の名前(半角英数字)を用いる) ②プロジェクトファイルの保存

(ファイル>>名前をつけてプロジェクトの保存>>任意の名前(半角英数字)を用いる)

Page 7: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

7

基本的な入出力―Hello World-

1.入力と出力

入力(INPUT)とは,パソコンにデータを入れること. 入力装置 input device:キーボード,マウスなど 出力(OUTPUT)とは,パソコンからデータを出すこと 出力装置 output device:ディスプレイ,プリンタなど

2.入出力プログラム (1)画面への出力 Print 命令 Print “出力文字列” または Print 変数名

例 1) Print 命令を用いたプログラムの例 'Form 上に Command ボタン Command1 を配置する.

Private Sub Command1_Click() Print "Hello World!" End Sub

(2)キーボードからの入力 変数 = InputBox(“入力画面に表示する文字列”) 入力した文字列は変数(後に説明)に入る.

例 1) 入力した文字列が画面上に出力されるプログラム 'Form 上に Command ボタン Command1 を配置する. Private Sub Command1_Click() Dim a As String a = InputBox("入力してください") Print a End Sub

演習問題 (1) Command1 ボタンを押すと自分の名前が表示されるプログラムを作成しなさい. (2) 入力画面(InputBox)に表示される文字列を任意の文字列に変えなさい. (3) 入力した文字がテキストボックス Text1 に表示されるプログラムを考えなさい.

Page 8: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

8

プロパティとメソッド

● コントロール(Form 上に貼り付けた部品)及び Form はオブジェクトとも呼ばれる. ● オブジェクトはプロパティ(属性)とメソッドをもつ. 【プロパティ】

● 各オブジェクトのプロパティは,オブジェクトを選択したときに画面右下のプロパティウィンドウに表

示される. 例)Form1 上に貼り付けたテキストボックス Text1 のプロパティを表示する.

●プロパティの値はプロパティウィンドウから変更することができる. 例 1)テキストボックス Text1 の表示内容を変更する.(次図の左参照) Text1 を選択し,プロパティウィンドウから Text を選択する. 右欄のウィンドウに任意の文字を入力する. 例 2)コマンドボタン Command1 上の表示文字を変更する.(次図の右参照) Command1 を選択し,プロパティウィンドウから Caption を選択する. 右欄のウィンドウに任意の文字を入力する.

プロパティ ウィンドウ

Text1 を選択

Page 9: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

9

● プロパティの値はプログラムの内部からも変更が可能である. 例 1)Command1 が押されたときに Text1 の Text というプロパティの値を変える.

Private Sub Command1_Click() Text1.Text = "ボタンが押されたような気がします" End Sub

初期状態 ボタンをクリックすると

注)文字列(複数の文字の列)はダブルクォーテーション ” で くくる.

Page 10: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

10

例 2) Private Sub Command1_Click() Text1.FontSize = 36 Text1.Text = "ボタンが押されたような気がします" Command1.Caption = "押された!" End Sub

● プログラムの読み方 上述の例 2 のプログラムは以下のように日本語に訳される. サブプロシージャ Command1がクリックされたら, Text1 の FontSize を 36 にしなさい. Text1 の Text を“ボタンが押されたような気がします” にしなさい. Command1 の Caption を”押された!” にしなさい. サブプロシージャ 終わり

等号 = は「右辺から左辺に代入しなさい」 という意味である. プロパティを読むときには, .を「の」と読むとよい. Text1.Text Text1 の Text

【メソッド】

● メソッドはオブジェクトに対する命令である. 例 1)Form1 に Print メソッドで文字を書かせる

Private Sub Command1_Click() Form1.Print "Form1 に対する Print メソッドで書いてみました" End Sub

[プログラムの読み方] Form1 に,”Form1 に対する Print メソッドで書いてみました”と Print(表示)しなさい.

Page 11: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

11

例 2)Form1 に Circle メソッドで円を書かせる. Private Sub Command1_Click() Form1.Print "Form1 に対する Print メソッドで書いてみました" Form1.Circle (300, 300), 400 End Sub

[プログラムの読み方] Form1 に中心(300,300), 半径 400 の Circle(円)を書きなさい.

例 3)Text1 を動かす Private Sub Command1_Click() Text1.Move 10, 10 End Sub

(Text1 の場所が変わっていることに注意)

[プログラムの読み方] Text1 を(10,10)に動かしなさい.

● あらかじめオブジェクトに定められたメソッド以外の命令はすることができない.

Page 12: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

12

イベント

● VisualBasic はイベントドリブン(イベント駆動)型プログラミング言語である. ● イベントとは,プログラム自身に対して生じる出来事(イベント)である. ● プログラムは自分自身に起こった出来事(イベント)を監視している.

(どこで何が起こったか??) ● プログラムのユーザーが引き起こすイベントの例としては,

・ Command1 上でマウスをクリックした. ・ Text1 に表示されている文字を変えた. ・ ウィンドウを最小化した などでさまざまである.

● プログラムでは,イベントに対応したサブプロシージャが呼び出される. [サブプロシージャ] Private Sub…….. (ここに処理を記述する) End Sub

● イベントに対応したサブプロシージャ名は以下の記述方法となる.

Private Sub 対象オブジェクト名_イベント(引数) …… End Sub 例) Private Sub Command1_Click() ‘Command1 上でマウスがクリックされた Private Sub Text1_Change() ‘Text1 上で文字が変更された Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ‘Form 上でマウスが押された. ‘どのボタンが押されたか,シフトキーが押されていたか,またその座標を入手することができる.

注)各行のシングルクォーテーション ‘ は以下 注釈でありプログラムではないという意味. ● プログラムを起動すると自動的に引き起こされるイベントもある.

例)Form_Load など

Page 13: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

13

● プログラムが感知できるイベントの種類はあらかじめ決まっている. コードウィンドウで確認可能である.

オブジェクトを選択 イベントを選択

注)サブプロシージャ名は自分で入力せずに,上図のようにオブジェクト名,イベントを選択して

定義するようにすること. ●プログラムの処理の流れ ①プログラムの起動 ②イベント Form_Load が発生 ③イベント監視 ④イベント発生⇒処理⇒③へ戻る ● Form_Load を用いたプログラムの例

Private Sub Form_Load() Text1.ForeColor = vbRed Text1.BackColor = vbGreen Text1.Text= ”Form_Load では通常,プログラムの初期設定などを行う” End Sub Private Sub Command1_Click() Form1.Print "Form1 に対する Print メソッドで書いてみました" Form1.Circle (300, 300), 400 Text1.Move 10, 10 End Sub

Page 14: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

14

変数

● 変数は数字,文字等を入れる器である.

● 変数名は以下の条件を満たせば,任意である.

・ 変数名の先頭文字には,数字および記号は使えない。 ・ 変数名には,ピリオド (.) や型宣言文字は使えない。 ・ 変数名は,255 文字以内 (半角の場合) で指定する必要がある. ・ 同じ "適用範囲 (スコープ)" 内で,同じ変数名を複数使うことはできない.

適用範囲とは,プロシージャ,フォームなど,変数が参照される範囲のことである. 上図では,左の変数名は hensuu_A, 右の hensuu_B となっている. VB の場合,変数名は大文字と小文字で区別されない. 例 hensuu_A == HENSUU_a ● 器(変数)の種類にはいくつかの種類がある. ◆整数だけが入る器(変数) ①Integer 型(2バイト整数型)

②Long 型(4バイト整数型)

227

hensuu_A

227

Long 型

hensuu_B

宮城大学 宮城大学

-2,147,483,648~

2,147,483,647

Integer 型

-32,767~32,767

Page 15: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

15

◆小数点付きの数字が入る器(変数) ①Single 型(単精度浮動小数点数型;4 バイト)

②Double 型(倍精度浮動小数点数型;8 バイト)

◎ 文字が入る器(変数) String 型 (可変長)

◎ 数字・文字列何でも入る器(変数) Variant 型 (可変長)

Double 型

Single 型

String 型

7 桁の符号・小数点付き

数字

15 桁の符号・小数点付き

数字

1 ~ 32767 文字の 文字列

Variant 型

数値・文字列

Page 16: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

16

注)変数宣言をしない場合には,自動的に Variant 型になる. ● 変数を定義する.

Dim 変数名 As 型 例) Dim hensuu_A As Integer Dim hensuu_B As Single Dim Mojiretsu As String ● 変数の有効範囲

Dim A As Integer Public Sub Command1_Click()

A は共通の変数として使える End Sub Pirvate Sub Text1_Click() A は共通の変数として使える. End Sub

Public Sub Command1_Click()

Dim A As Integer ... A は Command1_Click の中でしか 使えない. Text1_Click()の A とは別物.

End Sub Pirvate Sub Text1_Click() Dim A As Integer

A は Text1_Click()でしか使えない. Command1_Click()の A とは 別物である.

End Sub

Aの

Aの

Aの

Page 17: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

17

演算子

演算子 意味 例 1 例1の結果 例 2

+ 加算 2+5 7 A+B - 減算 10–5 5 A-B * 乗算(掛け算) 2*5 10 A*B / 除算(割り算) 10/3 3.33333333333333 A/B ¥ 商 10¥3 3 A¥B

MOD 余り 10 MOD 3 1 A MOD B ^ 累乗 2^8 256 A^B

& または + 文字列の連結 “Miy” & “agi” Miyagi A& B 例 1) Command1 ボタンを押すと,Text1 に 2+5 の答が出力される. Private Sub Command1_Click() Text1.Text = 2 + 5 End Sub 例 2) Command1 ボタンを押すと,Text1 に 28の答が出力される. Private Sub Command1_Click() Text1.Text = 2 ^ 8 End Sub 例 3) Command1 ボタンを押すと,Text1 に”Miyagi”とが出力される. Private Sub Command1_Click() Text1.Text = "Miy" & "agi" End Sub

例 1)コマンドボタン Command1 を押すと a+b の計算が行われる. Dim a As Integer Dim b As Integer

Page 18: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

18

Dim Wa As Integer Private Sub Command1_Click() a = 2 b = 5 Wa = a + b Text1.Text = Wa End Sub 例2)

コマンドボタンを2つ配置する(Command1,Command2 ボタン). ①変数の適用範囲(A)

Dim MojiA As String Dim MojiB As String Private Sub Command1_Click() MojiA = "宮城県" MojiB = "仙台市" Text1.Text = MojiA + MojiB End Sub Private Sub Command2_Click() Text1.Text = MojiA + MojiB End Sub

Page 19: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

19

②変数の適用範囲(B) Private Sub Command1_Click() Dim MojiA As String Dim MojiB As String MojiA = "宮城県" MojiB = "仙台市" Text1.Text = MojiA + MojiB End Sub Private Sub Command2_Click() Text1.Text = MojiA + MojiB End Sub

【問題】 ①2つのテキストボックスに入力した整数の足し算の結果をもうひとつのテキストボックスに出力するプ

ログラムを作成しなさい.(コマンドボタンを押したときに計算結果が出力されるものとする.) ②2つのテキストボックスに入力した整数の和,差,積,商,を一度に表示するプログラムを作成しなさ

い. (コマンドボタンを押したときに計算結果が出力されるものとする.) ③以下のようなプログラムを作成しなさい. ・ 4つのテキストボックスに都道府県,市区郡,町名,番地を入力する ・ コマンドボタン「表示」のボタンを押す. ・ 入力した住所が自動的に結合されて出力される. 入力画面 実行画面

(「都道府県」「市区郡」等の文字は Label の caption プロパティによる) (注意)プロパティウィンドウからフォントを変えようとすると,VB が動かなくなる場合がある.

こまめにプログラムを保存するなど,十分に注意すること.

Page 20: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

20

カウンタ(計数器)を作る

1.カウンタ(計数器)とは 数を数えるための機器をカウンタ(計数器)という.

2.カウンタの作成 -コマンドボタン- ここではコマンドボタンを押すことにより,数を数えるカウンタを作成する. (1)Form の定義

数えた数を表示するためのテキストウィンドウ(Text1)と数を数えるため

のボタン(Command1)を Form1 上に配置する.

(2)プログラムの流れ

カウント変数を定義(カウント変数は整数) 初期設定

・カウント変数の初期値は_______________ ・テキストボックスに初期値を表示する. コマンドボタン(Command1)がクリックされたら

・カウンタに________を加える ・カウンタをテキストボックス(Text1)に表示する. 【演習】

(2)のプログラムの流れをもとにカウンタのプログラムを作成しなさい.

Page 21: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

21

【演習1の回答】

Dim Counter As Integer ‘カウンタ変数(Counter)を整数型で定義 '32767 を超えない場合,それ以上とある場合には Long Private Sub Form_Load() ‘プログラム Form1 が起動すると自動的に動く Counter = 0 ‘カウンタ変数を初期値0にする. Text1.Text = Counter ‘カウンタ変数の値をテキストボックスに表示. End Sub Private Sub Command1_Click() ‘コマンドボタン(Command1)がクリックされたら動く Counter = Counter + 1 Counter 変数に1を加える. Text1.Text = Counter Counter 変数の値をテキストボックスに表示 End Sub 【演習2】

道路における通行量を計測するために,コンピュータを用いたカウンタ(計数器)を作成しなさい.

なお,通行量は,自動車,オートバイ,自転車,歩行者に分類し,観測者が対応する画面上のボタン

を押すことにより計数するものとする. [Form のデザイン]

[実行イメージ]

Page 22: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

22

【演習2の回答】

‘変数の定義 Dim car As Integer ‘自動車の台数のカウンタ変数 Dim motorbike As Integer ‘オートバイの台数のカウンタ変数 Dim bicycle As Integer ‘自転車の台数のカウンタ変数 Dim walker As Integer ‘歩行者のカウンタ変数 Private Sub Form_Load() '変数の初期化 car = 0 motorbike = 0 bicycle = 0 walker = 0 'テキストボックスの初期化 Text1.Text = car Text2.Text = motorbike Text3.Text = bicycle Text4.Text = walker 'コマンドボタンの Caption プロパティ変更 Command1.Caption = "自動車" Command2.Caption = "オートバイ" Command3.Caption = "自転車" Command4.Caption = "歩行者" End Sub Private Sub Command1_Click() 'Command1 がクリックされたら car = car + 1 '変数 car に 1 を加え Text1.Text = car 'Text1.Text に出力 End Sub Private Sub Command2_Click() motorbike = motorbike + 1 Text2.Text = motorbike End Sub Private Sub Command3_Click()

Page 23: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

23

bicycle = bicycle + 1 Text3.Text = bicycle End Sub Private Sub Command4_Click() walker = walker + 1 Text4.Text = walker End Sub 【問題】

演習2のプログラムにリセットボタンを追加しなさい. (リセットボタン:ボタンを押すとすべての台数が0にリセットされるボタン)

Page 24: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

24

3.カウンタの作成 -キーボード入力- ここではキーボード入力によるカウンタの作成を行う. (1)キーボードからの入力を受け付けるプログラムを作成する.

[Form のデザイン]

[コード] 'Command1 ボタンがアクティブ(フォーカスを得る)になっていないと 'カウントできない. ‘Command1 がフォーカスを得たとき Private Sub Command1_GotFocus() Command1.Caption = "カウントしています" End Sub ‘Command1 のフォーカスが失われたとき Private Sub Command1_LostFocus() Command1.Caption = "カウント中断しています" End Sub Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Print "おい!何かキーを押しただろ?" End Sub

Page 25: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

25

(2)押されたキーの番号を表示する.

押されたキーの番号は,Command1_KeyDown の中の KeyCode という変数に格納される. (注意:KeyCode という変数は Command1_KeyDown の中でしか使えない) サブプロシージャ Command1_KeyDown のプログラムを以下のように変える. [コード(Command1_KeyDown 部分のみを変更する)] Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls Form1.Print "おい!"; KeyCode; "番のキーを押しただろ?"

End Sub ・入力は半角にして行うこと. ・Form1.Cls は画面の描画を消去しなさいの意味である.(Cls = Clear Screen) ・Print 文における文字を改行せずに出力する場合には ; (セミコロン)で接続する. 【演習3】 上のプログラムを用いて,以下のキーの KeyCode を調べなさい. C B M W すべて半角とする.大文字・小文字は問わない.

Page 26: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

26

【演習3の回答】

結果は以下の通りとなる. C:67 M:77 B:66 W:87

その他のキーの KeyCode についてはヘルプを参照すること. (3)キーボードの入力値を判断する.

[コード 1(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls If KeyCode = 66 Then Form1.Print "おい!B のキーを押しただろ?" End If End Sub 半角で B のキーを押すと,「おい!B のキーを押しただろ?」と出力する. その他の場合には何も表示しない. 【重要】If~~~Then~~~End If

もし 条件文が正しかったら,命令文1を実行する If 条件文 Then 命令文1 End If [コード 2(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls If KeyCode = 66 Then Form1.Print "おい!B のキーを押しただろ?" Else Form1.Print "B 以外のキーを押したのか?" End If End Sub

Page 27: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

27

【重要】If~~~Then~~~Else~~~End If もし 条件文が正しかったら,命令文1を実行する.それ以外の場合には,命令文2を実行する. If 条件文 Then 命令文1 Else 命令文2 End If [コード 3(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls If KeyCode = 66 Then Form1.Print "おい!B のキーを押しただろ?" ElseIf KeyCode = 67 Then Form1.Print "おい!C のキーを押しただろ?" Else Form1.Print "B, C 以外のキーを押したのか?" End If End Sub 【重要】If~~~Then~~~ElseIf~~~Else~~~End If

もし 条件文 1 が正しかったら,命令文1を実行,条件文2が正しかったら命令文2を実行, それ以外の場合には,命令文3を実行する. If 条件文1 Then 命令文1 ElseIf 条件文2 Then 命令文2 ・・・・・・ Else 命令文3 End If 【問題】

道路における通行量を計測するために,コンピュータを用いたカウンタ(計数器)を作成しなさい. なお,通行量は,自動車(C),オートバイ(M),自転車(B),歩行者(W)に分類し,観測者がキーボードか

ら,( )内のアルファベットのキーを押したときにカウントできるようにすること.

Page 28: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

28

【演習4】

テキストボックスに入力した自然数 X を奇数か偶数かを判定し,奇数の場合には,「X は奇数です」,偶

数の場合には「X は偶数です」と表示するプログラムを作成しなさい. (テキストボックスには自然数以外の数字が入力されることがないと考えてよい.) 【回答例】

Private Sub Form_Load() Text1.Text = "" End Sub Private Sub Text1_Change() Dim n As Integer n = Int(Val(Text1.Text)) If n Mod 2 = 0 Then Label1.Caption = Str(n) + "は偶数です." Else Label1.Caption = Str(n) + "は奇数です." End If End Sub

Page 29: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

29

【練習問題】

テキストボックスに入力した数値が100以上であるか否かを判断し, 100以上である場合には「入力した数値は100以上です.」 100より小さい場合には「入力した数値は100より小さいです.」

するプログラムを作成しなさい. ●等号・不等号の使い方

If n >= 10 Then….. もし n が 10 以上であるなら If n > 10 Then .. もし n が 10 より大きいなら If n <= 10 Then….. もし n が 10 以下であるなら If n < 10 Then .. もし n が 10 より小さいなら If a > b then もし a が b より大きかったら(両方とも変数でもよい) 【練習問題】

テキストボックスに入力した数値が50以上かつ100より小さいかどうかを判定し,条件に合致した

場合には,「条件に合致しました」と表示するプログラムを作成しなさい. ●複合条件 AND(かつ) OR (または)の使い方

If n >= 5 And n < 10 Then もし n が 5 以上かつ 10 より小さいならば If a=b And b=c Then もし a=b かつ b = c であるならば If n < 5 Or n > 100 Then もし n が 5 より小さい,または 100 より大きいならば If a=b Or a=c Then もし a=b または a=c であるならば 【演習5:IF 文の利用例】

あらかじめプログラム内にパスワードを記憶させておき, 入力したパスワードが一致したか否かを判定するプログラムを作成しなさい.

Page 30: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

30

【演習5:If 文の利用例】

あらかじめプログラム内にパスワードを記憶させておき, 入力したパスワードが一致したか否かを判定するプログラムを作成しなさい. 【回答例1】

Dim password As String Private Sub Command1_Click() Dim inputpass As String inputpass = InputBox("パスワードを入力してください") If password = inputpass Then MsgBox "パスワードが合致しました." Else MsgBox "不正アクセスです.プログラムを終了します." End End If Command1.Visible = False Form1.Print "おめでとうございます.アクセスに成功しました" End Sub Private Sub Form_Load() Command1.Caption = "パスワード入力" password = "miyagi" End Sub 【回答例2】

Dim password As String Private Sub Command1_Click() Dim inputpass As String inputpass = InputBox("パスワードを入力してください") If password <> inputpass Then MsgBox "不正アクセスです.プログラムを終了します." End End If Command1.Visible = False Form1.Print "おめでとうございます.アクセスに成功しました" End Sub Private Sub Form_Load() Command1.Caption = "パスワード入力" password = "miyagi" End Sub

Page 31: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

31

単純な繰り返し Do… Loop

Do …Loop :Do と Loop の間で繰り返す(ループ).

Do 命令ブロック Loop 【Do..Loop の例】

Private Sub Command1_Click() Dim a As Integer a = 0 Do a = a + 1 Text1.Text = Str(a) ‘ DoEvents ‘強制的に処理を実行 Loop End Sub (上のプログラムでは,a の値が Integer の範囲+32767 を超えた段階でエラーが生じる.) ●無限ループ:プログラムが無限にループすること.

Private Sub Command1_Click() Do Form1.Print “無限ループ実行中” Loop End Sub

● 自分で作成したプログラムが無限ループに陥ったら,

Ctrl キーを押しながら Pause キー(Break)を押すと停止できる.

Page 32: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

32

ループからの脱出(1)

Do If 条件文 Then Exit Do Loop 【IF 文を用いた Do..Loop からの脱出】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Dim a As Long Do a = a + 1 Text1.Text = a DoEvents If a = 100 Then Exit Do Sleep 100 '100 ミリ秒スリープ Loop Form1.Print "a の値が 100 に達したのでループから脱しました" End Sub ループからの脱出(2)

Do [While | Until (条件文)] 命令ブロック Loop [While | Until (条件文)] 【Do….Loop Until の使用例】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Dim a As Long Do a = a + 1 Text1.Text = a DoEvents Sleep 100 '100 ミリ秒スリープ Loop Until a >= 100 ‘a が 100 以上になるまでループしなさい Form1.Print "a の値が 100 に達したのでループから脱しました" End Sub

Page 33: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

33

【問題1】

1.100から0までカウントダウンを行い,0になったときに 「ゼロになったのでループから脱出しました」

と表示するプログラムを作成しなさい. 2.1のプログラムに0になったら音が鳴る機能を追加しなさい.

音(警告音)を鳴らす命令は Beep 【参考】

‘コマンドボタンを押すと音が鳴る. Private Sub Command1_Click() Beep End Sub 【問題2】

Do…Loop を用いて1+2+3+...+999+1000までの足し算を行い,その結果を表示するプ

ログラムを作成しなさい. 【問題3】

Do…Loop を用いて1+2+3+・・の足し算を行い,その結果が1000を超えた時点でループから

脱出し,いくつまで足したときに1000を超えたのかを表示するプログラムを作成しなさい.

Page 34: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

34

【Do..Loop の応用プログラム】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Dim value As Integer value = 0 Do Form1.BackColor = RGB(value, 0, 0) DoEvents Sleep 10 value = (value + 1) Mod 256 Loop End Sub 【応用問題】

上の応用プログラムは赤のみの色の変化を示すものであるが,さらに緑,青を加え,赤・緑・青の順で

繰り返す機能を加えたプログラムを作成しなさい. 【参考:二重ループ】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Dim n as Inteter Do Form1.Cls n = 0 Do While n <= 10 Form1.Print n n = n + 1 Sleep 100 Loop Loop End Sub

Page 35: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

35

For..Next ループによる繰り返し

For….Next ループ

For ループ変数 = 開始値 To 終了値 Step 刻み値 命令ブロック Next

【For..Next のプログラム例】

Private Sub Command1_Click() Dim n As Integer For n = 1 To 10 Step 1 Form1.Print "現在の n の値は"; n; "です." Next End Sub 【Sleep を加えた場合】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Dim n As Integer For n = 1 To 10 Step 1 Form1.Print "現在の n の値は"; n; "です." Sleep 100 ‘100 ミリ秒スリープ Next End Sub 【練習問題】上のプログラム例をもとに以下のプログラムを作成しなさい. 1.現在のnの値が 2, 4, 6,・・, 20 と表示されるようにしなさい. 2.現在のnの値が 3, 6, 9, ・・・, 30 と表示されるようにしなさい. 3.現在のnの値が 1, 2, 3, ・・・, 14,15 と表示されるようにしなさい. 4.現在の n の値が 5, 6, 7, ・・・・・, 19, 20 と表示されるようにしなさい.

Page 36: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

36

For..Next を用いた∑の計算

【演習】∑の計算

∑=

100

1kkの計算をしなさい.

【重要】∑=

100

1kkは 1+2+3+・・・+99+100 の意味である.

Private Sub Command1_Click() Dim k As Integer Dim Sigma As Integer Sigma=0 For k = 1 To 100 Step 1 Sigma = Sigma + k Next Form1.Print Sigma End Sub 【練習問題】For..Next 文を用いて以下の計算をしなさい.

(1) ∑=

1000

1kk

(2) ∑=

500

50kk

(3) ∑=

500

12

kk

(4) ∑=

250

13

kk

Page 37: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

37

For..Next 文を用いた関数グラフの描画

【演習】

y = x2のグラフを書きなさい. 【回答例】 ‘初期設定 Private Sub Form_Load() Form1.ScaleMode = vbPixels ‘Form1 の座標単位をピクセル単位にする. Picture1.Width = 200 ‘Picture1 の幅を 200 ピクセルにする Picture1.Height = 200 ‘Picture1 の高さを 200 ピクセルにする Picture1.Scale (-5, 5)-(5, -5) ‘Picture1の左右上の座標を(-5,5),右下隅の座標を(5,-5)にする. End Sub Private Sub Command1_Click() Dim x As Single Picture1.Line (-10, 0)-(10, 0), vbRed Picture1.Line (0, -10)-(0, 10), vbRed For x = -5 To 5 Step 0.1 y = f(x) ‘関数 f( )を呼び出し,戻ってきた値を y に代入. If x = -5 Then ‘最初の一点は点を描画する. Picture1.PSet (x, y) Else ‘次の点からは線でつなぐ. Picture1.Line -(x, y) End If Next End Sub ‘関数 f(x)の定義 Private Function f(x As Single) As Single f = x ^ 2 End Function 【練習問題】

1. 3

301 xy = のグラフを-10≦x≦10 の範囲で書きなさい.

2. 132 2 ++= xxy のグラフを書きなさい. 3.sin x 及び cos xのグラフを描画しなさい. sin x は sin(x) ただし xの単位はラジアン(180°=π = 3.1415) cos x は cos(x) ただし xの単位はラジアン(180°=π = 3.1415)

Page 38: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

38

配 列

配列の定義

Dim 配列名(最大インデックス) または Dim 配列名(最小インデックス To 最大インデックス) ‘最小インデックスは負でも良い 配列の使い方

戻り値 = 配列名(インデックス) 表の数値をコンピュータプログラムに記憶する場合には,配列を用いる.

名前 ゲームの得点 まかなえ 35 たしろ 75

てらしま 55 みついし 65

【コード1】

Dim Tokuten(0 To 3) As Integer 配列 Tokuten ( )内の数字はインデックス

Private Sub Form_Load() Tokuten(0) = 35 Tokuten(1) = 75 Tokuten(2) = 55 Tokuten(3) = 65 End Sub 0 1 2 3 Private Sub Command1_Click()

Form1.Print “配列の 0 番目の要素は”; Tokuten(0) Form1.Print “配列の 1 番目の要素は”; Tokuten(1) Form1.Print “配列の 2 番目の要素は”; Tokuten(2) Form1.Print “配列の 3 番目の要素は”; Tokuten(3)

End Sub

(0) (1) (2) (3)

35 75 55 65

Page 39: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

39

【コード2】コード1に For..Next を適用した例(Command1_Click())のみ変更) Private Sub Command1_Click() Dim n As Integer For n = 0 To 3 Form1.Print "配列の”; n ;“番目の要素は"; Tokuten(n) Next End Sub 【重要】配列の利点は,配列のインデックスに変数が使えることである.

【コード3】文字列の配列 Dim Tokuten(0 To 3) As Integer

Dim Namae(0 To 3) As String 配列 Namae Private Sub Form_Load() Tokuten(0) = 35 Tokuten(1) = 75 Tokuten(2) = 55 Tokuten(3) = 65 Namae(0) = "まかなえ" Namae(1) = "たしろ" Namae(2) = "てらしま" Namae(3) = "みついし" End Sub 0 1 2 3 Private Sub Command1_Click() Dim n As Integer For n = 0 To 3 Form1.Print Namae(n); "の得点は"; Tokuten(n) Next End Sub 【演習】 コード 3 を基に,4 人の得点の合計を求めなさい.

(0) (1) (2) (3)

まかなえ てらしま たしろ みついし

Page 40: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

40

【コード4(回答例)】(コード3の Command1_Click()のみ変更) Private Sub Command1_Click() Dim n As Integer Dim Sum As Integer Sum = 0 For n = 0 To 3 Form1.Print Namae(n); "の得点は"; Tokuten(n) Sum = Sum + Tokuten(n) Next Form1.Print "合計点は"; Sum End Sub 【演習】最大値を求める. コード3を基に,得点の最高点を抽出し表示するプログラムを作成しなさい. 【コード5(回答例)】

Private Sub Command1_Click() Dim n As Integer Dim max As Integer For n = 0 To 3 Form1.Print Namae(n); "の得点は"; Tokuten(n) Next For n = 0 To 3 If n = 0 Then max = Tokuten(n) ElseIf Tokuten(n) > max Then max = Tokuten(n) End If Next Form1.Print "最高点は"; max; "です." End Sub 【問題】最小値を求める. コード3,4を基に,得点の最低点を抽出し表示するプログラムを作成しなさい. 【演習】

Page 41: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

41

コード3・4をもとに,最高得点及び最高得点者を表示するプログラムを作成しなさい. (ただし最高得点者が2名以上いる場合には,すべての最高点者名を表示せずに, 得点者が2名以上います”とするだけでよい.)

Private Sub Command1_Click() Dim n As Integer Dim max As Integer Dim maxn As Integer Dim flag As Boolean For n = 0 To 3 Form1.Print Namae(n); "の得点は"; Tokuten(n) Next flag = False For n = 0 To 3 If n = 0 Then max = Tokuten(n) maxn = n ElseIf Tokuten(n) = max Then flag = True max = Tokuten(n) ElseIf Tokuten(n) > max Then flag = False max = Tokuten(n) maxn = n End If Next If flag = False Then Form1.Print "最高点は"; Namae(maxn); "の"; max; "です." Else Form1.Print "最高点は"; max; "で2名以上います." End If End Sub

Page 42: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

42

【問題】

ある会社の社員 A~J の10人の年収が以下の通りであったとする. A:1230 万円,B:760 万円,C:600 万円,D:700 万円,E:780 万円, F:980 万円,G:880 万円,H:920 万円,I:850 万円,J:550 万円 これらの年収の値を任意に定義した配列に入れた上で,以下のプログラムを作成しなさい. (1)コマンドボタンを押すことにより,社員A~Jの年収を表示するプログラムを作成しなさい. (2)社員の年収の合計を表示しなさい. (3)社員の年収の平均を表示しなさい (4)社員の年収の最大値,最小値を求め,表示しなさい. (応用)社員の年収の標準偏差を出力しなさい.

Page 43: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

43

構 造 体

Private[または Public] Type 構造体名 属性名 As 型 属性名 As 型 End Type Dim 変数名 As 構造体名 構造体を用いることにより,より高度なデータ構造を定義できる. CONST numOfMember=3 Private Type tMember ‘tMember という名前は任意. Namae As String Tokuten As Integer End Type Dim Member(0 To numOfMember) As tMember Private Sub Form_Load() Member(0).Namae = "まかなえ" Member(0).Tokuten = 35 Member(1).Namae = "たしろ" Member(1).Tokuten = 75 Member(2).Namae = "てらしま" Member(2).Tokuten = 55 Member(3).Namae = "みついし" Member(3).Tokuten = 65 End Sub Private Sub Command1_Click() Dim n As Integer For n = 0 To numOfMember Form1.Print Member(n).Namae; "の得点は"; Member(n).Tokuten Next End Sub

名前 Namae得点 Tokuten

Member(0)

名前 Namae得点 Tokuten

Member(1)

名前 Namae得点 Tokuten

Member(2)

名前 Namae得点 Tokuten

Member(3)

Page 44: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

44

ファイル入出力

ファイルへの出力 プログラムに入力したデータを保存,あるいは結果や設定をファイルに保存しておきたいときには, ファイル出力を用いる.

(以下のコマンドはアスキーファイル(テキストファイル),カンマ区切りを用いる場合) Open ファイル名 For Output As #ファイル番号 Write #ファイル番号, 変数名 1, 変数名 2, 変数名 3, ・・・・ Close #ファイル番号 【例】ファイル出力のサンプルプログラム Private Sub Command1_Click() Dim a As String Dim b As Integer Dim c As Single a = "ミヤギダイガク" b = 9999 c = 3.1415 Open "C:¥test.txt" For Output As #1 ‘←ファイル”C:¥test.txt”を開く Write #1, a ‘←ファイルに a の内容を出力+改行 Write #1, b ‘←ファイルに b の内容を出力+改行 Write #1, c ‘←ファイルに c の内容を出力+改行 Write #1, a, b, c ‘←ファイルに a,b,c の内容を出力(カンマ区切り)+改行 Write #1, “大和町”, 1 ,1 ‘←変数を介さずにデータを出力 Close #1 ‘←使い終わったファイルは必ず閉じる End Sub 上記プログラムにより,C ドライブのルート(¥)に test.txt というテキストファイルが作成される. (メモ帳で開くことができる.)

[作成された test.txt の内容] "ミヤギダイガク" 9999 3.1415 "ミヤギダイガク",9999,3.1415 "大和町",1,1

Page 45: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

45

ファイルの読込み. プログラムで出力したデータ(アスキーファイル)を読み込む場合に用いる. Open ファイル名 For Input As #ファイル番号 Input #ファイル番号, 変数名 1, 変数名 2, 変数名 3, ・・・・ Close #ファイル番号 【例1】 ①ファイルを作成する. Private Sub Command1_Click() Dim namae As String Dim tokuten As Integer namae = "Makanae" tokuten = 36 Open "c:¥test.dat" For Output As #1 Write #1, namae, tokuten Close #1

End Sub ②ファイルを読み込む. Private Sub Command2_Click() Dim namae As String Dim tokuten As Integer Open "c:¥test.dat" For Input As #1 Input #1, namae, tokuten Close #1 Print namae, tokuten

End Sub

【例2】ファイルのデータ数・長さが未知の場合の例

Private Sub Command3_Click() Dim buf As String Open "C:¥test.txt" For Input As #1 Do Until EOF(1) Input #1, buf Print buf Loop Close #1 End Sub

【問題】 (1)1から1000までの数字をカンマ区切りで任意のファイルに出力するプログラムを作成しなさい. (改行しない場合には,write 文の末尾に ; (セミコロン)を付する) (2)作成したファイルの数字を読取り,表示するプログラムを作成しなさい.

Page 46: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

46

文字列処理

文字列の抽出関数:

Mid(文字列, 開始文字位置,文字数) Mid(“ABCDE 2, 3) “ABCDE”の 2 文字目から 3 字を抽出 → BCD

Left(文字列, 文字数) Left(“ABCDE”, 3) “ABCDE”の左から 3 字を抽出 → ABC

Right(文字列,文字数) Right(“ABCDE”, 3) “ABCDE”の右から 3 字を抽出 → CDE 文字列の検索 Instr(対象文字列,検索文字列)

Instr(“ABCDE”, “CD”) “ABCDE”の”CD”の文字位置を返す → 3 (見つからない場合は 0 を返す)

【例】文字列処理プログラム Private Sub Command1_Click() Dim a As String Dim char As String Dim num As Integer a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" char = Mid(a, 3, 5) Print "Mid(a,3,5)で取り出した文字列は"; char char = Left(a, 6) Print "Left(a,6)で取り出した文字列は"; char char = Right(a, 3) Print "Right(a,3)で取り出した文字列は"; char num = InStr(1, a, "JK") Print "JK は"; num; "文字目で見つかりました" num = InStr(11, a, "JK") Print "JK は"; num; "文字目で見つかりました” End Sub 【問題】 テキストボックス Text1 に入力した文章から,Text2 で指定した文字列を探し,その位置(何文字目か)

を表示するプログラムを作成しなさい.

Page 47: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

47

乱数 Randomize 乱数を使う前に乱数を初期化する. Rnd 乱数を発生させる(0~1未満の値) 任意の範囲の整数の乱数を生成させるには Int((upperbound - lowerbound + 1) * Rnd + lowerbound) (変数 upperbound には範囲の上限の値を指定,変数 lowerbound には範囲の下限の値を指定) 【例1】さいころの目

Dim さいころの目 As Integer Private Sub Command1_Click() さいころの目 = Int(Rnd* 6 + 1) Form1.Print さいころの目 End Sub Private Sub Form_Load() Randomize '乱数の初期化 End Sub

【例2】トランプ

‘ジョーカーがない場合 Dim マーク As Integer Dim 数 As Integer Dim カードチェック(0 To 51) As Boolean Dim 残枚数 As Integer Private Sub Command1_Click() Dim 乱数 As Integer If 残枚数 = 0 Then MsgBox "カード終了" Exit Sub End If Do 乱数 = Int(Rnd * 52) Loop While カードチェック(乱数) = True カードチェック(乱数) = True 残枚数 = 残枚数 - 1 マーク = 乱数 ¥ 13 数 = 乱数 Mod 13 + 1 Select Case マーク Case 0 Form1.Print "スペード";

Page 48: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

48

Case 1 Form1.Print "クラブ"; Case 2 Form1.Print "ダイヤ"; Case 3 Form1.Print "ハート"; End Select Print 数 End Sub Private Sub Form_Load() シャッフル

End Sub Private Sub シャッフル() Randomize 残枚数 = 52 For n = 0 To 51 カードチェック(n) = False Next End Sub

【問題】 1.サイコロの一面をグラフィカルに表示するプログラムを作成しなさい. 2.3つの 1 桁の数をランダムに表示するプログラムを作成しなさい. 3.コンピュータとじゃんけんをするプログラムを作成しなさい. 4.サイコロまたはトランプを用いたゲームを作成しなさい. 5.1で出た数字をもとにしたスロットマシンを作成しなさい.

スロットマシンのためのヒント ●Timer コントロール Timer1.Interval = 100 Timer1_Timer()の動作間隔(ミリ秒単位) Timer1.Enabled = True Timer1 を ON にする. Timer1.Enabled = Not Timer1.Enabled (Not 演算は Boolean 変数の値を逆転させる True を False に または False を True に) ●コントロール配列 コントロールを配列として扱うことができる.Command1(n) や Text1(n) など コントロール配列を作成するには, ①コントロールを貼り付ける. ②コントロールを Form 上でコピー(Ctrl+C) ③コントロールを Form 上で貼り付け(Ctrl+V) ④「コントロール配列にしますか?」と聞いてくるので「はい」を選択する. ⑤必要な数だけ貼り付ける. 【例1】ワンスロットマシン

Dim Slot As Integer Private Sub Command1_Click() Timer1.Enabled = Not Timer1.Enabled End Sub

Page 49: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

49

Private Sub Form_Load() Randomize Timer1.Enabled = False Timer1.Interval = 100 Slot = Int(Rnd * 10) End Sub Private Sub Timer1_Timer() Slot = (Slot + 1) Mod 10 Label1.Caption = Slot End Sub

【例2】コントロール配列 ‘Text1 をコピー・貼り付けによりコントロール配列にする. ‘Command1 を貼り付ける. Private Sub Command1_Click() Dim n As Integer For n = 0 To 3 Text1(n).Text = n Next End Sub

【補足1】プログラムのインデント(字下げ)は Tab キーで行う.(Shift キー+Tab で逆方向)

Private Sub Command1_Click() (→Tab→)Dim a As Integer (→Tab→)Dim n As Integer (→Tab→)a=0 (→Tab→)For n = 1 to 1000 (→Tab→) (→Tab→)a = a+n (→Tab→) (→Tab→)If a > 100 Then (→Tab→) (→Tab→) (→Tab→) Exit For (→Tab→) (→Tab→)End If (→Tab→)Next (→Tab→)Print n; a End Sub

【補足2】シングルクオーテーション(‘)以下は注釈(コメント)として扱われる.

Page 50: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

50

日付・時刻の扱い方 Now 現在の日時,時刻を返す関数 Date 日時を返す関数 Year(Now) 現在の西暦年を返す Month(Now) 現在の月を返す Day(Now) 現在の日を返す Hour(Now) 現在の時を 0~23 の範囲で返す Minute(Now) 現在の分を 0~59 の範囲で返す Second(Now) 現在の秒を 0~59 の範囲で返す 【例1】 Private Sub Command1_Click() Print Now Print Time Print Year(Now) Print Month(Now) Print Day(Now) Print Hour(Now) Print Minute(Now) Print Second(Now) End Sub 【例2】デジタル時計(Label1~3 と Timer1 を貼り付ける) Private Sub Form_Load() Timer1.Interval = 1000 '1000 ミリ秒ごとに Timer1_Timer が動く Timer1.Enabled = True 'Timer1 を有効にする. End Sub Private Sub Timer1_Timer() Dim h As Integer Dim m As Integer Dim s As Integer h = Hour(Now) m = Minute(Now) s = Second(Now) Label1.Caption = h Label2.Caption = m Label3.Caption = s End Sub

Page 51: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

51

配列を用いたゲームプログラミング 【マインスイーパー】

【Form の設定】

【コード】 Option Explicit Dim Bakudan(4, 4) As Boolean '5×5の配列を定義 Private Sub Command1_Click(Index As Integer) 'Index は配列の番号 Dim x As Integer Dim y As Integer x = Index ¥ 5 '整数除算で縦方向の X を求める y = (Index) Mod 5 'Mod を用いて5で割った余りを求める(横方向) If Bakudan(x, y) = True Then MsgBox "Bomb!" Else Command1(Index).Caption = BakudanNoKazu(x, y) End If End Sub

貼り付けたコントロール(Command1)を

編集>>コピー>>ペースト (または Ctrl+C)

「コントロール配列にしますか?」と

聞いてくるので「はい」を選択する.

この操作を繰り返し,25 個のコントロールを

作成・配置する.

コントロールの名前は

Command1(0)から Command1(24)

となる

0 1 2 3 4

Command2

Command1

Page 52: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

52

Private Sub Command2_Click() Dim kagen As Integer Dim johgen As Integer Dim bakudanKosuu As Integer Dim tate As Integer Dim yoko As Integer Dim m As Integer, n As Integer kagen = 0 johgen = 4 bakudanKosuu = 3 '爆弾配列初期化 For n = 0 To 4 For m = 1 To 4 Bakudan(n, m) = False Next Next 'ボタンの表示初期化 For n = 0 To 24 Command1(n).Caption = "?" Next For n = 1 To bakudanKosuu tate = Int((johgen - kagen + 1) * Rnd + kagen) yoko = Int((johgen - kagen + 1) * Rnd + kagen) Bakudan(tate, yoko) = True '重複した場合は考慮していない Print tate, yoko 'デバッグ用 実際のプログラムでは削除 Next End Sub Private Function BakudanNoKazu(x As Integer, y As Integer) '関数の定義 Dim m As Integer Dim n As Integer BakudanNoKazu = 0 For n = x - 1 To x + 1 If n >= 0 And n <= 4 Then '範囲外を除く For m = y - 1 To y + 1 If m >= 0 And m <= 4 Then '範囲外を除く If Bakudan(n, m) = True Then BakudanNoKazu = BakudanNoKazu + 1 End If End If Next End If Next '上記の計算により,関数 BakudanNoKazu に周辺の爆弾の個数が返される. End Function Private Sub Form_Load() '乱数初期化 Randomize End Sub

Page 53: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

53

グラフィックスを用いたゲームプログラミング

1.Form の設定

2.宇宙の描画(点の描画)

Rnd: 乱数関数 Rnd は0以上1未満の乱数(Single)を戻す. Randomize: 乱数関数の初期化 Picture1.Pset (x, y), Color (x,y)に Color で指定した色の点を描画する. 点の大きさは Picture1.DrawWidth プロパティ Const は定数(プログラム内において変化することの無い数) 【コード1】 Const CStars = 100 '星の数 '2次元座標のための構造体を定義する. Private Type tPoint x As Single y As Single End Type Private Type tStar pos As tPoint End Type Dim Star(0 To CStars) As tStar '星型で配列 Star を定義

Page 54: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

54

Private Sub Command1_Click() If Timer1.enabled = False Then Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub Private Sub Form_Load() Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする. 'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" '背景(星)の初期化 makeStars End Sub Private Sub Timer1_Timer() Dim n As Integer Picture1.Cls 'Picture1 の描画をクリアする. drawStars End Sub '星を作る Private Sub makeStars() Dim n As Integer Randomize For n = 0 To CStars Star(n).pos.x = Rnd * 300 Star(n).pos.y = Rnd * 300 Next End Sub '星の描画 Private Sub drawStars() For n = 0 To CStars

Page 55: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

55

Star(n).pos.y = (Star(n).pos.y + 1) Mod 300 Picture1.PSet (Star(n).pos.x, Star(n).pos.y), vbWhite Next End Sub 3.描画ウィンドウ端で跳ね返るボールの描画

Picture1.Circle (x,y), r ‘Picture1 に中心座標(x,y),半径 r の円を描く 【コード2】 Const CBalls = 10 'ボールの数 '2次元座標のための構造体を定義する. Private Type tPoint x As Single y As Single End Type '構造体(ボール型)の定義 Private Type tBall enabled As Boolean 'ボールが生きているか否か(True or False) pos As tPoint '位置(2次元座標型) direction As Integer '方向 radius As Single '半径 color As Long '色 speed As Single 'ボールの速度 End Type Private Type tStar pos As tPoint End Type Dim ball(0 To CBalls - 1) As tBall 'ボール型で配列 Ball を定義 'ボールの作成(初期化) Private Sub makeBall() Dim n As Integer '乱数の初期化 Randomize '乱数発生関数 Rnd は 0 以上、1 未満の範囲の値を返す(Single) For n = 0 To CBalls - 1 'ボールの位置を決定する. ball(n).pos.x = Rnd * Picture1.ScaleWidth ball(n).pos.y = Rnd * Picture1.ScaleHeight - 100 'ボールの色を決める. 'QBColor 関数は 0 から 15 までの値を引数にできる. ball(n).color = QBColor(Int(Rnd * 16)) 'ボールの初期方向を決める. d = Int(Rnd * 2) If d = 0 Then ball(n).direction = -1

Page 56: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

56

Else ball(n).direction = 1 End If ball(n).radius = Rnd * 10 + 5 'ボールの半径 ball(n).speed = Rnd * 10 'ボールの速度 ball(n).enabled = True 'ボールを有効にする Next End Sub Private Sub Command1_Click() If Timer1.enabled = False Then Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub Private Sub Form_Load() Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする. 'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" 'ボールの初期化 makeBall 'makeBall を呼び出す End Sub Private Sub drawBall(obj As tBall) 'ボールの描画 Picture1.FillColor = obj.color 'ボールの塗りつぶし色 Picture1.FillStyle = vbFSSolid 'ボールの塗りつぶしスタイル 'Picture1 に円を描く Picture1.Circle (obj.pos.x, obj.pos.y), obj.radius, obj.color End Sub

Page 57: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

57

Private Sub Timer1_Timer() Dim n As Integer Picture1.Cls 'Picture1 の描画をクリアする. For n = 0 To CBalls - 1 'ボールが生きているものについて If ball(n).enabled = True Then 'ボールが画面端に行ったら逆に進むようにする. If ball(n).pos.x > Picture1.ScaleWidth - ball(n).radius Then ball(n).direction = -1 ElseIf ball(n).pos.x < ball(n).radius Then ball(n).direction = 1 End If ball(n).pos.x = ball(n).pos.x + ball(n).direction * ball(n).speed 'ボールの描画 drawBall ball(n) End If Next End Sub 4.宇宙船

Picture1.Line (x1, y1)-(x2, y2), color (x1,y1)と(x2, y2)を結ぶ直線を描く 線の太さは DrawWidth プロパティ Picture1.Line –(x1, y1), color 直前の描画点と(x, y)を結ぶ線を描く FloodFill Picture1.hDC, x, y, crColor (WindowsAPI 関数) Picture1 の(x, y)から境界色(crColor)まで塗りつぶす. 塗りつぶしの色は Picture1.FillColor で指定できる. 塗りつぶしのスタイルは Picture1.FillStyle で指定できる.

FloodFill 関数を用いる場合,コードの一行目に以下を必ず入れること. Private Declare Sub FloodFill Lib "GDI32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long)

改行無しで入れる.大文字・小文字も区別されるので十分に注意すること. やむなく改行する場合には, (スペース)+_ でつなぐ(コード参照)

Select Case X ‘X は変数 Case A ‘変数 X が A のとき (実行文) Case B ‘変数 X が B のとき (実行文) ・・・ Case Else [Case Else は省略可能] ‘その他の場合 (実行文)

End Select 【コード3】 Private Declare Sub FloodFill Lib "GDI32" _ (ByVal hDC As Long, _

Page 58: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

58

ByVal x As Long, ByVal y As Long, _ ByVal crColor As Long) '2次元座標のための構造体を定義する. Private Type tPoint x As Single y As Single End Type Private Type tShip pos As tPoint '位置(2次元座標型) speed As Single '宇宙船の速度 End Type Private Type tMissile enabled As Boolean 'ミサイルが生きているか否か(True or False) pos As tPoint 'ミサイルの位置(2次元座標型) length As Single 'ミサイルの長さ speed As Single 'ミサイルの速度 color As Long '宇宙船の色 End Type Dim ship As tShip '宇宙船型で ship を定義 Dim missile As tMissile 'ミサイル型でミサイルを定義 '宇宙船の初期化 Private Sub makeShip() ship.pos.x = 150 ship.pos.y = 250 ship.speed = 10 End Sub 'ミサイルの作成(初期化) Private Sub makeMissile() With missile .enabled = True .pos = ship.pos .color = vbYellow .speed = 5 .length = 20 End With drawMissile missile End Sub 'ミサイルの描画 Private Sub drawMissile(obj As tMissile) Picture1.DrawWidth = 2 Picture1.Line (obj.pos.x, obj.pos.y + obj.length)-(obj.pos.x, obj.pos.y), missile.color Picture1.DrawWidth = 1 End Sub '宇宙船の描画 Private Sub drawShip(obj As tShip) Picture1.Line (obj.pos.x, obj.pos.y)-(obj.pos.x + 20, obj.pos.y + 20), vbWhite

Page 59: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

59

Picture1.Line -(obj.pos.x - 20, obj.pos.y + 20), vbWhite '直前の描画点との間で直線を描く Picture1.Line -(obj.pos.x, obj.pos.y), vbWhite Picture1.FillColor = RGB(255, 0, 0) FloodFill Picture1.hDC, obj.pos.x, obj.pos.y + 5, vbWhite '2 点を対角線とする四角形を書く,BF は四角形塗りつぶし(塗りつぶさない場合は B のみ) Picture1.Line (obj.pos.x - 20, obj.pos.y + 20)-(obj.pos.x + 20, obj.pos.y + 40), vbWhite, BF End Sub Private Sub Command1_Click() If Timer1.enabled = False Then Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub Private Sub Form_Load() Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする. 'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" missile.enabled = False '船の初期化 makeShip 'makeShip を呼び出す End Sub Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode 'KeyCode に応じて条件分け Case 39 'KeyCode39(→キー)の場合 ship.pos.x = ship.pos.x + ship.speed drawShip ship Case 37 'KeyCode39(←キー)の場合 ship.pos.x = ship.pos.x - ship.speed drawShip ship

Page 60: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

60

Case 32 'KeyCode32(スペースキー)の場合 If missile.enabled = False Then missile.pos = ship.pos '船の位置をミサイルの位置に makeMissile 'ミサイルの初期化 End If End Select End Sub Private Sub Timer1_Timer() Dim n As Integer Picture1.Cls 'Picture1 の描画をクリアする. '生きているミサイルがある場合には If missile.enabled = True Then 'ミサイルの位置計算 missile.pos.y = missile.pos.y - missile.speed 'ミサイル描画 drawMissile missile '画面から外れたらミサイルを否に If missile.pos.y < 0 Then missile.enabled = False End If drawShip ship End Sub 5.ミサイルとボールの衝突検知を加えたゲームプログラム 関数定義の例

'距離計算関数(2次元座標型の2つの引数間の距離を測定) Private Function distance(pa As tPoint, pb As tPoint) 'Sqr は√の値,distance は戻り値 distance = Sqr((pa.x - pb.x) ^ 2 + (pa.y - pb.y) ^ 2) End Function

関数の呼び出し例

'衝突検知 Private Sub checkCollision() Dim n As Integer For n = 0 To CBalls - 1 'ボールとミサイルの位置を距離がボールの半径より小さかったら, If distance(ball(n).pos, missile.pos) < ball(n).radius Then ball(n).enabled = False 'ボール使用不可に End If Next End Sub

Page 61: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

61

【コード4】ゲームプログラム(総合) Private Declare Sub FloodFill Lib "GDI32" _ (ByVal hDC As Long, _ ByVal x As Long, ByVal y As Long, _ ByVal crColor As Long) Const CBalls = 50 'ボールの数 Const CStars = 50 '星の数 '2次元座標のための構造体を定義する. Private Type tPoint x As Single y As Single End Type '構造体(ボール型)の定義 Private Type tBall enabled As Boolean 'ボールが生きているか否か(True or False) pos As tPoint '位置(2次元座標型) direction As Integer '方向 radius As Single '半径 color As Long '色 speed As Single 'ボールの速度 End Type '構造体(宇宙船型)の定義 Private Type tShip pos As tPoint '位置(2次元座標型) speed As Single '宇宙船の速度 End Type Private Type tMissile enabled As Boolean 'ミサイルが生きているか否か(True or False) pos As tPoint 'ミサイルの位置(2次元座標型) length As Single 'ミサイルの長さ speed As Single 'ミサイルの速度 color As Long '宇宙船の色 End Type Private Type tStar pos As tPoint End Type Dim ball(0 To CBalls - 1) As tBall 'ボール型で配列 Ball を定義 Dim ship As tShip '宇宙船型で ship を定義 Dim missile As tMissile 'ミサイル型でミサイルを定義 Dim Star(0 To CStars) As tStar '星型で配列 Star を定義 'ボールの作成(初期化) Private Sub makeBall() Dim n As Integer '乱数の初期化 Randomize '乱数発生関数 Rnd は 0 以上、1 未満の範囲の値を返す(Single)

Page 62: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

62

For n = 0 To CBalls - 1 'ボールの位置を決定する. ball(n).pos.x = Rnd * Picture1.ScaleWidth ball(n).pos.y = Rnd * Picture1.ScaleHeight - 100 'ボールの色を決める. 'QBColor 関数は 0 から 15 までの値を引数にできる. ball(n).color = QBColor(Int(Rnd * 16)) 'ボールの初期方向を決める. d = Int(Rnd * 2) If d = 0 Then ball(n).direction = -1 Else ball(n).direction = 1 End If ball(n).radius = Rnd * 10 + 5 'ボールの半径 ball(n).speed = Rnd 'ボールの速度 ball(n).enabled = True 'ボールを有効にする Next End Sub 'ミサイルの作成(初期化) Private Sub makeMissile() With missile .enabled = True .pos = ship.pos .color = vbYellow .speed = 5 .length = 20 End With drawMissile missile End Sub '宇宙船の初期化 Private Sub makeShip() ship.pos.x = 150 ship.pos.y = 250 ship.speed = 10 End Sub 'ミサイルの描画 Private Sub drawMissile(obj As tMissile) Picture1.DrawWidth = 2 Picture1.Line (obj.pos.x, obj.pos.y + obj.length)-(obj.pos.x, obj.pos.y), missile.color Picture1.DrawWidth = 1 End Sub '宇宙船の描画 Private Sub drawShip(obj As tShip) Picture1.Line (obj.pos.x, obj.pos.y)-(obj.pos.x + 20, obj.pos.y + 20), vbWhite Picture1.Line -(obj.pos.x - 20, obj.pos.y + 20), vbWhite '直前の描画点との間で直線を描く Picture1.Line -(obj.pos.x, obj.pos.y), vbWhite Picture1.FillColor = RGB(255, 0, 0) FloodFill Picture1.hDC, obj.pos.x, obj.pos.y + 5, vbWhite

Page 63: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

63

'2 点を対角線とする四角形を書く,BF は四角形塗りつぶし(塗りつぶさない場合は B のみ) Picture1.Line (obj.pos.x - 20, obj.pos.y + 20)-(obj.pos.x + 20, obj.pos.y + 40), vbWhite, BF End Sub Private Sub Command1_Click() If Timer1.enabled = False Then Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub Private Sub Form_Load() Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする. 'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" missile.enabled = False 'ボールと船の初期化 makeBall 'makeBall を呼び出す makeShip 'makeShip を呼び出す '背景(星)の初期化 makeStars End Sub Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode 'KeyCode に応じて条件分け Case 39 'KeyCode39(→キー)の場合 ship.pos.x = ship.pos.x + ship.speed drawShip ship Case 37 'KeyCode39(←キー)の場合 ship.pos.x = ship.pos.x - ship.speed drawShip ship Case 32 'KeyCode32(スペースキー)の場合 If missile.enabled = False Then missile.pos = ship.pos '船の位置をミサイルの位置に

Page 64: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

64

makeMissile 'ミサイルの初期化 End If End Select End Sub Private Sub drawBall(obj As tBall) 'ボールの描画 Picture1.FillColor = obj.color 'ボールの塗りつぶし色 Picture1.FillStyle = vbFSSolid 'ボールの塗りつぶしスタイル 'Picture1 に円を描く Picture1.Circle (obj.pos.x, obj.pos.y), obj.radius, obj.color End Sub Private Sub Timer1_Timer() Dim n As Integer Picture1.Cls 'Picture1 の描画をクリアする. drawStars checkCollision 'ミサイルとボールの衝突検知 For n = 0 To CBalls - 1 'ボールが生きているものについて If ball(n).enabled = True Then 'ボールが画面端に行ったら逆に進むようにする. If ball(n).pos.x > Picture1.ScaleWidth - ball(n).radius Then ball(n).direction = -1 ElseIf ball(n).pos.x < ball(n).radius Then ball(n).direction = 1 End If ball(n).pos.x = ball(n).pos.x + ball(n).direction * ball(n).speed 'ボールの描画 drawBall ball(n) End If Next '生きているミサイルがある場合には If missile.enabled = True Then 'ミサイルの位置計算 missile.pos.y = missile.pos.y - missile.speed 'ミサイル描画 drawMissile missile '画面から外れたらミサイルを否に If missile.pos.y < 0 Then missile.enabled = False End If drawShip ship End Sub '衝突検知 Private Sub checkCollision() Dim n As Integer For n = 0 To CBalls - 1 'ボールとミサイルの位置を距離がボールの半径より小さかったら, If distance(ball(n).pos, missile.pos) < ball(n).radius Then ball(n).enabled = False 'ボール使用不可に End If Next End Sub

Page 65: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

65

'星を作る Private Sub makeStars() Dim n As Integer Randomize For n = 0 To CStars Star(n).pos.x = Rnd * 300 Star(n).pos.y = Rnd * 300 Next End Sub '星の描画 Private Sub drawStars() For n = 0 To CStars Star(n).pos.y = (Star(n).pos.y + 1) Mod 300 Picture1.PSet (Star(n).pos.x, Star(n).pos.y), vbWhite Next End Sub '距離計算関数(2次元座標型の2つの引数間の距離を測定) Private Function distance(pa As tPoint, pb As tPoint) 'Sqr は√の値,distance は戻り値 distance = Sqr((pa.x - pb.x) ^ 2 + (pa.y - pb.y) ^ 2) End Function 【補足1】色の指定方法 RGB(r, g, b) :r, g, b で指定した数値の色(r,g,b はそれぞれ 0~255) QBColor(col) :col で指定した色(col は 0~15)

0:黒 1:青 2:緑 3:シアン 4:赤 5:マゼンタ 6:黄 7:白 8:灰色 9:明るい青 10:明るい緑 11:明るいシアン 12:明るい赤 13:明るいマゼンタ 14:明るい黄 15:明るい白

色定数: vbBlack 0x0 黒 vbRed 0xFF 赤 vbGreen 0xFF00 緑 vbYellow 0xFFFF 黄

vbBlue 0xFF0000 青 vbMagenta 0xFF00FF マゼンタ vbCyan 0xFFFF00 シアン vbWhite 0xFFFFFF 白

Page 66: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

66

コンパイル

コンパイルとは,作成したコードをコンピュータが理解できる機械語に一括して翻訳することをいう. コンパイルすることにより,以下の利点がある. ・ Visual Basic が無くても,作成したプログラムを動作させることができる. ・ ソースコードを非公開とすることができる.(著作権の保護) ・ インタープリタを介することがないので処理速度が向上する. など

コンパイルの方法:

VisualBasic6.0 の場合 1.ファイル >> ○○○○○.exe の作成(○○○○○はプロジェクト名) 2.EXE ファイルを作成するフォルダ,ファイル名を指定

VisualBasic6.0 で作成した exe ファイルを使用する場合には,vb6jp.dll などのファイル(ランタイムラ

イブラリと呼ばれる)が含まれている必要がある. 1.VisualBasic6.0 のインストールされているコンピュータの場合には, ランタイムライブラリは既にインストールされている. 2.ネットワークからインストールする場合には,以下などにより入手可能である. 例えば,http://www.vector.co.jp/soft/win95/util/se152941.html 3.インストール用のパッケージを作ることにより,必要なライブラリを自動的にインストールする

ことができる.

Page 67: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

67

Excel VBA(マクロ)

1.Excel のマクロ Visual Basic の起動 ツール>>マクロ>>Visual Basic Editor

2.プログラムの作成 ・挿入>>ユーザーフォームでフォームが表示される. ・コマンドボタン,テキストボックスなどの部品を貼り付ける. ・ コードを記述する.

プログラミング環境は Visual Basic とほぼ同様.(ただし制約事項あり) 3.プログラムの例 フォーム上に CommandButton1 を貼り付ける.

Private Sub CommandButton1_Click() Sheet1.Cells(1, 1) = "Excel マクロの作成" For n = 2 To 100 Sheet1.Cells(n, 2) = n Sheet1.Cells(n, 3) = n * 3 Sheet1.Cells(n, 4) = Sheet1.Cells(n, 2) * Sheet1.Cells(n, 3) Next End Sub

Page 68: プログラミング基礎 - MYUmakanae/p-kiso/p-kiso05.pdfVisual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0及び6.0

プログラミング基礎(蒔苗)資料

68

プログラミング基礎-まとめ-

1.プログラミングの基礎 ・ Visual Basic のプログラミング環境 ・ イベント ・ プロパティとメソッド ・ 変数 ・ 分岐構造

If ….Then ElseIf ….Then….EndIf Select Case …..End Select

・ ループ構造 Do….Loop For….Next

・ 配列 ・ ファイル入出力 ・ 文字列処理 ・ 乱数 ・ グラフィックス ・ 2.アルゴリズム(算法) ・ ∑の計算

1+2+3+・・・ 配列の要素の∑と平均

・最大値,最小値を求める. 3.プログラミングの応用 ・ゲーム ・統計処理 ・マクロプログラム(各種アプリケーションの制御,Excel・Word などの VBA) ・シミュレーション(コンピュータ上での模擬実験) 物理現象のシミュレーション

http://www.myu.ac.jp/~makanae/CG/http://www.myu.ac.jp/~makanae/CG/cg1_10.htm 災害被害シミュレーション など 【試験対策】 ・ ∑,最大値,最小値 ・ 配列の要素の和とその平均 ・ 乱数