プログラミング事始め - 大阪大学素粒子論研究室

理数オナープログラム
プログラミング事始め
野間 唯
大阪大学理学研究科 特任研究員
2008年4月14日
1
1.1
Introduction
はじめに
これは理数オナープログラムでのプログラムの勉強のイントロダクションとして書かれたもの
である。私の様な素人が描いたものなので、もちろんこれで必要最低限の勉強ができるわけで
はない。今後プログラムの勉強をしたいなら、読者は自ら勉強をすべきである。その際に、こ
れが読者の助けになれば幸いである。なお本書では、ところどころ命令形で書いてあるが、別
に私が偉いと思っているわけでなく、下手にへりくだらない方が良いのではないかと思ってい
るからである。端々に文体が変わっているが、気にしないでほしい。
本書の構成は以下の通りである。まず C 言語を学ぼうと思う。C 言語は古い言語であるが、
物理を勉強するのにニュートン力学をやらないことはないのと同様、勉強すべき言語であると
考える。また C 言語は最近ほとんど全ての言語で採用しているオブジェクト指向は採用してい
ないため、複雑な構造はもっていなく、私としても説明が楽である。次に Visual Basic .Net を
学ぼうと思う。Visual Basic .Net を学ぶ理由は、理数オナープログラムで扱う DA/AD ボード
が Visual Studio 対応だからである。
Visual C++を使わない理由を以下に述べる。C++は C をオブジェクト指向へ拡張した言
語である。開発当初は C 言語との下位互換を持たせていたようだが、現在に至っては完全な互
換性は失われているようだ。Visual C++は Microsoft が提供する C++開発環境である。しか
し C++で動作するものが、Visual C++で動作しないことがあり、純粋な C++環境ではないよ
うだ。
個人的な意見だが、本書を終えた後、理数オナープログラムに関係なくプログラミングを
勉強したい読者には、VB.Net 以外では C, C++, Java を勉強することをお勧めする。またスク
リプト言語としては perl, Ruby を勉強することをお勧めする。これらは将来の仕事の糧になる
と期待される。
1.2
参考図書
下手にコンピューターに詳しいと、「これこれに関する良い本を知らないか」と聞かれること
がある。しかし、コンピューターの世界など日進月歩であり、
「良い本」というのはすぐに古く
1
なってしまう。評価が時の流れによらない本など、それに関するマニュアルか技術的なことが
専門用語で書いてある本しかないであろう。私は「良い本」とは、実際に手を動かして学ぶこ
とができる本だと考える。しかし、これもまた質問者の理解度に応じて適切なレベルの本が異
なる。結局、自分で大きめの本屋に行き、手にとって中身を読むしかないであろう。さらに、
それぐらいの「教科書」は自分で買って、誰にはばかれることなく読むのがよいだろう。よっ
て参考図書は挙げない。
2
2.1
C 言語
開発環境インストール
極端に言ってしまえば、プログラムを書くには、エディターがあれば十分である。しかしその
プログラムを実際にコンパイル (リンク) するにはコンパイラー (リンカー) と呼ばれるものが必
要である。今回は C 言語のコンパイラーとして、主に Linux 上で用いられている gcc を使おう
と思う。
gcc を Windows 上で使うにはいくつか方法があるが、今回は Cygwin とよばれるものを用
いる。Cygwin は Linux のアプリケーションを Windows 上で動かすために開発されたものであ
る。Cygwin を用いる理由は、著者が普段 Linux と Windows を併用しているからである。もち
ろん Cygwin は無料である。
ます、C ドライブに cygwin というディレクトリを作ってください。そして Cygwin をググっ
てオフィシャルサイトに行き、インストーラー (setup.exe) をそこへダウンロードしてください。
setup.exe を起動し、適当に「次へ」をクリックしていく。ダウンロードするサーバーを聞かれ
たらなるべく日本のサーバーを選ぼう。インストールするパッケージを選ぶ画面になったらデ
フォルトのままにしておこう。一通りインストールが終わったらデスクトップに cygwin への
ショートカットができていると思う。それで cygwin が立ち上がったらひとまずインストールは
完了である。$マークの横で白いのがチカチカしているのが通常の状態である。この状態をプロ
ンプトが来てるとか戻ってるとかいう(と思う)。
たぶん今の環境では gcc がインストールできてはないとおもうので、もう一度 setup.exe を
立ち上げる。実は cygwin にアプリを追加するには setup.exe から行うのが一般的である。先ほ
どインストールするパッケージを選択するところで gcc を見つけ、くるっとなっているところ
をクリックし、インストールできそうになったら次へを押す。最後までいったら gcc がインス
トールされているはずである。チェックの方法は、cygwin を立ち上げ gcc とタイプしてみること
だ。もしインストールされていなければそんなものはないと言われ、そうでなければコンピュー
ターが怒ってるはずだ。もしプロンプトが戻ってなければコントロールを押しながら C をタイ
プすればよい。このような操作はよく Ctr-C もしくは C-C と書かれる(と思う)。
2.2
CUI の操作
ここでついでに CUI の操作について超基本の所を述べておく。Windows のコマンドプロンプト
でも Linux(cygwin) のターミナルでも、文字列をキーボードから打って操作するインターフェー
スをコマンドラインユーザーインターフェース (CUI) という。これに対しマウスでクリクリす
るのはグラフィカルユーザーインターフェース (GUI) という。たまに GUI をグイという人が
いるが、CUI をチュイという人は見たことがない。
2
さて CUI を使うには、そのコマンドを知っておく必要がある。Linux と Window のコマン
ドを(分かる限り)併記しておく。(基本 Linux のコマンドである。)
ls(dir) ディレクトリの中身を表示
cd ディレクトリを移動
mkdir ディレクトリを作る
使い方は
$ ls
とすれば今いるディレクトリの中身を表示しする。ちなみに、$はコマンドプロンプトの意味。
$ ls hoge
とすれば hoge というディレクトリの中身を表示する。
問題:
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
ls
pwd
mkdir temp
ls
cd temp
ls
pwd
cd ..
ls
pwd
cd temp
pwd
cd
ls
pwd
cd ..
ls
pwd
cd
として何が起こったか考えてみよ。
2.3
相対 path 絶対 path の理解
今いるディレクトリから考えてファイルを言うのが相対パス。Windows なら C ドライブからど
こにいるのかをいうのが絶対パス。
たとえば今いるディレクトリに foo というファイルがあるなら、
$ ls .
3
で見れる。hoge というディレクトリに foo というファイルがいたら
$ ls hoge
で見れる。またひとつ上のディレクトリにあれば
$ ls ..
で見れる。
2.4
2.4.1
C 言語
Hell World.
例題: 次のプログラムをメモ帳も用いて書いて、C:\cygwin/home/USENAME
に hello.c という名で保存してみよ。ちなみに USERNAME はユーザーの名前で、人によっ
て異なる。
/* hello.c */
#include <stdio.h>
int main(){
printf("Hello World.");
return 0;
}
保存ができたら、cygwin 上で
$ gcc hello.c
としてみる。エラーがでたら、なにがおかしいか出てるはずなのでがんばって読んでみる。た
ぶん全角か ; が抜けているものとおもわれ。うまくいっていれば a.exe ができているはず。これ
がいまソースをコンパイルしてできた実行ファイルである。
$ ./a.exe
とすれば Hello World. と出てくるであろう。
hello.c の説明をする。まず一行目の/* */ はコメントである。この中身に何を書いてもプ
ログラムの動作は変わらない。#include <stdio.h>は、とりあえずおまじないとしておく。
int main(){ の main は C 言語に於けるプログラムが始まるところである。printf("Hello World.");
は、なんかプリントしてるところです。はい。return 0; はお約束。
問題:
printf("Hello World.");
を
printf("Hello World.\n");
として何が起こるか見てみよ1 。
1
答え:改行
4
2.4.2
四則演算
例題: とりあえずこれを書いて動かしてみよ。
/* calc1.c */
#include <stdio.h>
int main(){
int x;
int y;
int z;
x=1;
y=2;
z=x+y;
printf("%d\n", z);
return 0;
}
3 が出てくれば正解。
解説。 int x; は変数 x を宣言しているところ。これから変数 xっていうのを使いますよと
コンピューターにわからせるためのもの。ためしに int x; を抜いてコンパイルすると、んな
もんねーよと言われるはず。ためしてみよ。次に x=1; だがここは見た目通りである。しかし
実はここには普段使う数学との違いがあるが、それは後述する。 z=x+y; は x と y を足して z
に代入してるところ。 printf("%d\n", z); は、変数 z を表示するお約束の書き方である。
例題: printf の前に z=z+1; と書いてみよ。実行結果は4が出る。
解説。 z=z+1; は数学の式としてはおかしいが、プログラムの中ではよく出てくる式であ
る。この場合=は、右辺を左辺に代入せよ、と理解するのが正しい。 z=z+5; としてみたら8
が出るはずである。試してみよ。
実は変数の値をひとつ上げるのは、もっと簡単な記述がある。 z++; としても4が出る。試
してみよ。
例題: calc1.c で x=1; は単に x の初期値を決めているだけである。初期値を決めるだけな
ら、変数の宣言時に決められる。
/* calc2.c */
#include <stdio.h>
int main(){
int x=1;
int y=2;
5
int z;
z=x+y;
printf("%d\n", z);
return 0;
}
より短く
/* calc3.c */
#include <stdio.h>
int main(){
int x=1, y=2;
int z;
z=x+y;
printf("%d\n", z);
return 0;
}
ともできる。
さていままで触れなかった int x; の int であるがこれは integer(整数)のことである。
つまり変数 x は整数しか扱えない。これは変数の型と呼ばれる。試しに次を実行してみよ。
/* calc4.c */
#include <stdio.h>
int main(){
int x=5, y=3;
int z;
z = x + y;
printf("%d\n", z);
z = x - y;
printf("%d\n", z);
z = x * y;
6
printf("%d\n", z);
z = x / y;
printf("%d\n", z);
return 0;
}
上から順に足し算、引き算、掛け算および割り算である。最後の割り算は 5 割る 3 で 1.6666· · ·
となるはずだが、整数のため 1 が返ってくる。試しに x = 4, y = 2 でやってみよ。それなりにま
ともな値をほしいときは、変数の型を小数まで扱えた方がよい。その時は変数の型を double
型にすればよい。もう一つ小数を出すには printf を変えなければならない。たとえば答えは次
のようになる。
/* calc5.c */
#include <stdio.h>
int main(){
double x=5, y=3;
double z;
z = x + y;
printf("%f\n", z);
z = x - y;
printf("%f\n", z);
z = x * y;
printf("%f\n", z);
z = x / y;
printf("%f\n", z);
return 0;
}
小数ででてれば正解。ちなみに型が違うものは代入できないので、z も double にしておいた。
2.4.3
if 文
コンピューターに場合分けをしてもらって、別々の処理をしたいきがあるとする。もちろんそ
んな状況はしょっちゅうある。例題:
/* if1.c */
7
#include <stdio.h>
int main(){
double x=20;
if(x > 10){
printf("BIG\n");
}
return 0;
}
BIG と出れば正解。読めばわかるが、x が10より出かかったら BIG と出す。では10より低
かったらどうするのか。そんなときは else を使う。
/* if2.c */
#include <stdio.h>
int main(){
double x=20;
if(x > 10){
printf("BIG\n");
}else{
printf("small\n");
}
return 0;
}
x の値を変えて遊んでみよ。もっと細かく5と10の間の時はどうのこうのとやりたいときは
/* if3.c */
#include <stdio.h>
int main(){
double x=20;
if(x > 10){
printf("BIG\n");
}else if(x > 5){
printf("Middle\n");
8
}else{
printf("small\n");
}
return 0;
}
問題: x の値を変えて遊んでみよ。
2.4.4
for 文
コンピューターに(単純な)計算を何度もやってもらいたい時がある。そんなとき役に立つの
は for 文や while 文である。
例題: 次を実行せよ。
/* for1.c */
#include <stdio.h>
int main(){
int i;
for(i=1; i< 10; i++){
printf("%d\n", i);
}
return 0;
}
1から9がでれば正解。
解説。for(i=1; i< 10; i++){ の i=1 はそのままの意味。二個目の引数は条件式、i が1
0を超えないとき True(正しい)と判断し{}の中を処理する。そして最後に i をひとつ上げる
(i++)。
ではこれを用いて、先の if3.c と組み合わせてみよう。
/* for2.c */
#include <stdio.h>
int main(){
int i;
for(i=1; i<= 15; i++){
if(i > 10){
printf("BIG\n");
}else if(i > 5){
9
printf("Middle\n");
}else{
printf("small\n");
}
}
return 0;
}
small, Middle, BIG となれば正解。ちなみに i <= 15 と i が15まで走るようにした。
printf をいじくって、もう少し何が起こってるのか分かりやすくするとこうなる。
/* for2.c */
#include <stdio.h>
int main(){
int i;
for(i=1; i<= 15; i++){
if(i > 10){
printf("BIG i= %d\n", i);
}else if(i > 5){
printf("Middle i= %d\n", i);
}else{
printf("small i= %d\n", i);
}
}
return 0;
}
small の横に i の値が出れば正解。
2.4.5
華氏摂氏
さて今まで習ったことを用いて、華氏と摂氏の変換をしてみよう。変換式は C を摂氏、F を華
氏として F = 1.8* C + 32 らしい。これを for 文を用いて摂氏0度から100度までの変換
表を書いてみよ。for 文の変数の始まりと終わりに注意せよ。
答えは次のページ。
10
/* FandC1.c */
#include <stdio.h>
int main(){
double i;
for(i=0; i<= 100; i++){
printf("C= %f, F= %f \n", i, 1.8 * i+ 32);
}
return 0;
}
2.4.6
関数
ある決まった処理をするのに関数を定義しておくのが便利である。関数の定義の仕方、使い方
は以下の例題を見てもらえば分かるであろう。
/* FandC2.c */
#include <stdio.h>
double fahrenheit(double cel){
double fah;
fah = 1.8 * cel + 32;
return fah;
}
int main(){
double i;
for(i=0; i<= 100; i++){
printf("C= %f, F= %f \n", i, fahrenheit(i));
}
return 0;
}
上のソースで初めて main 以外の関数が出てきた。fahrenheit がそれである。fahrenheit は double
型の変数と引数にとり、double 型の値を変えす。上の例で言うと、最初の double が戻り値の型
11
を宣言していて、括弧のなかの double cel というところで double 型の変数を引数にとると言っ
ている。そして cel という変数名でその引数をどう扱うかを書いている。最後に return で double
型の変数 fah の値を返している。
こういったよく使う関数をどっかにまとめて置いてあるのがライブラリーである。ずっと
おまじないとして書いてきた stdio.h は、printf などが宣言、定義されているライブラリーであ
る。だから我々は printf の定義を書かなくても使えたのである。ためしに一番最初の hello.c の
stdio.h の行を消してコンパイルしてみよ。
Visual Basic .Net 言語
3
VB の使い方
3.1
3.1.1
VB.Net Express edition のインストール
ググれ。
3.1.2
画面の見方
口頭で説明する。
3.2
コンソールアプリ
Module Module1
Sub Main()
Console.WriteLine("Hello world.")
End Sub
End Module
一瞬出て終わる。名前を付けて保存しているなら Projects/PROJECTNAME/bin/Debug/ に
exe ファイルがあるはず。それを Dos 窓で実行すると Hellow world. と言われる。
もう少しゆっくり見たいなら
Imports System.Threading
Module Module1
Sub Main()
Console.WriteLine("Hello world.")
Thread.Sleep(3000)
End Sub
End Module
12
3000ミリ秒止まる。
vbCrLf をつけると改行する。
Imports System.Threading
Module Module1
Sub Main()
Console.WriteLine("Hello world."& vbCrLf)
Thread.Sleep(3000)
End Sub
End Module
以下の様に書くとインプットした文字列を唱えてくれる。
Imports System.Threading
Module Module1
Sub Main()
Dim test As String
test = Console.ReadLine
Console.WriteLine(test)
Thread.Sleep(3000)
End Sub
End Module
3.3
GUI アプリ
3.3.1
Hello world.
口頭で説明する。
• ソースの見方
• ボタンの配置
• ラベルの配置
13
• プロパティーのいじり方
• イベントドリブン
• コメントアウト
例題: ボタンをクリックすると Hello world. というプログラムボタンを配置して、ボタンを
ダブルクリック MsgBox(”Hello world”) と記入。動いたら成功。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
MsgBox("Hello world.")
End Sub
End Class
3.3.2
ボタンを押すとテキストボックスに Hello world.
ボタンとテキストボックスを配置して
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
TextBox1.Text = "Hello World."
End Sub
End Class
テキストボックスに Hello world. と出れば成功。
ボタンとテキストボックスを配置して
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
TextBox1.Text = "Hello" & " World."
End Sub
End Class
でも出る。
テキストボックスをマルチラインにし、ボタンを押すたんびに Hello world.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
TextBox1.Text = TextBox1.Text & "Hello World." & vbCrLf
End Sub
End Class
14
3.4
変数の宣言と表示
変数の宣言の仕方、初期化、使い方や型は c 言語とほぼ同じである。ボタンとテキストボック
スを配置して
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
Dim x As Integer = 3
Dim y As Integer = 5
TextBox1.Text = x + y
End Sub
End Class
3.5
四則演算
簡易計算機を作る。ボタンを一つ (Button plus)、テキストボックス二個 (TextBox1, TextBox2)
およびラベル一つ (Label1) を配置する。二つのテキストボックスに数字を入れるてそれぞれの
ボタンを押すとラベルに計算結果を返してくるもの。
Public Class Form1
Private Sub Button_plus_Click(ByVal sender As System.Object, ByVal e As System.Event
Dim x, y As Double
x = TextBox1.Text
y = TextBox2.Text
Label1.Text = x + y
End Sub
End Class
いまここでテキストボックスに数字以外を入れるとエラーがでる。
IsNumeric というものを使って数字かどうか判別し、数字なら処理を、それ以外ならゴラァ!
を出す。
Public Class Form1
Private Sub Button_plus_Click(ByVal sender As System.Object, ByVal e As System.Event
Dim x, y As Double
If IsNumeric(TextBox1.Text) AndAlso IsNumeric(TextBox2.Text) Then
x = TextBox1.Text
y = TextBox2.Text
15
Label1.Text = x + y
Else
MsgBox("ゴラァ!")
End If
End Sub
End Class
難しめの宿題: 上の if 文の中の AndAlso について仮説をたてそれを調べる手段を考え実行
せよ。
問題: 先の足し算計算機を発展させ、四則演算計算機を作れ。
(コラム TextBox1.Text の「.Text」): TextBox1.Text の「.Text」ってなんやねんと思
われたかもしれないが、ここでその意味を書いてみる。VB.Net 言語がオブジェクト指向言語
であるから、オブジェクト指向言語がどういうものか分かればなんとかなるんじゃないかと期
待できる。著者もプログラムに関する教育をちゃんと受けた訳ではないが、オブジェクト指向
言語について書いてみようと思う。一週間独学で勉強しただけなので誤りも多分に含まれてい
ると思う。ちゃんと個々人で勉強するように。
オブジェクト指向言語では、あるなんか塊があり、その中に変数の値やその変数に関する操
作の方法が入っている、そういうものを扱う。オブジェクトの中の変数をメンバ変数、変数に
関する操作のことをメンバ関数やメソッドと呼ばれる。メンバ関数には、メンバ変数の値を一
増やしたり、ただメンバ変数の値を返すものもある。
一般にオブジェクト指向言語ではメンバ変数は外から見えない様にプログラムされ、メン
バ変数へはメンバ関数のみがアクセスできる。となると、ただメンバ変数の値を知りたいのに、
それのメソッドが必要になる。またメンバ変数の値を定めるメソッドも必要になる。メンバ変
数を定義するとそれに関する値を返したり、値を定めるメソッドが必要になるわけだ。そういっ
たメソッドはメソッドの中でも特徴的なものでプロパティーと呼ばれる。
先の TextBox1 の例では TextBox1 というオブジェクト(インスタンスとも呼ばれる)を定
義している。
(VB.Net のコードの中には書かれている箇所は見つけられないが、裏でゴニョゴ
ニョやっているのであろう。)では TextBox1 のメンバ変数やメソッドはどうやって指定したら
よいだろうか。それは TextBox1 の後に「.」をつけてメソッドの名前を言えばよい。というわ
けで、
「TextBox1.Text」は「TextBox1」のメソッドかプロパティーか知らないが何かなんであ
ろう。(分かったら教えてほしい。)
なお C 言語では printf を使うのに stdio.h をインクルードしていたが、VB.Net の場合は特
に呼ばなくても TextBox とか使えてる。これは多分裏で宣言してあるライブラリーをちゃんと
インクルードしてるんでしょう。
3.6
For 文
例によって例の如く、For 文のみ紹介する。c 言語で学んだことがあるなら、次のコードは理解
できるであろう。テキストボックスをマルチラインにしておく。ボタンを押すと摂氏と華氏の
表をテキストボックスに出す。
Public Class Form1
16
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
Dim fah As Double
For i As Double = 1 To 100
fah = 1.8 * i + 32
TextBox1.Text = TextBox1.Text & "C= " & i & ", F=" & fah & vbCrLf
Next
End Sub
End Class
3.7
入れ子
If 文や For 文は入れ子にできる。If 文の AndAlso も入れ子を使えばかける。先ほどの足し算計
算機は次の様にも書ける。
Public Class Form1
Private Sub Button_plus_Click(ByVal sender As System.Object, ByVal e As System.Event
Dim x, y As Double
If IsNumeric(TextBox1.Text) Then
If IsNumeric(TextBox2.Text) Then
x = TextBox1.Text
y = TextBox2.Text
Label1.Text = x + y
Else
MsgBox("ゴラァ!")
End If
Else
MsgBox("ゴラァ!")
End If
End Sub
End Class
For 文も同じ。For 文の中で For 文が回せる。
17
3.8
世界のナベアツ
中間試験: ボタンを押すと1から40までを数えて、3の倍数と3のつく数字のときにバカに
なるプログラムを作る。
ヒント:整数型の変数に対し
\ は割り算の商を返す。
Mod は割り算の余りを返す。
18
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
For i As Integer = 1 To 40
’If i = 3 Then
’If i <> 3 Then
If (i Mod 3) = 0 Then
MsgBox(i & " (バカ) ")
ElseIf (i Mod 10) = 3 Then
MsgBox(i & " (バカ) ")
ElseIf (i \ 10) = 3 Then
MsgBox(i & " (バカ) ")
Else
MsgBox(i)
End If
Next
End Sub
End Class
宿題: 世界のナベアツで3の倍数と3がつく数字の時だけバカになって、さらに4の倍数の
時犬っぽくなるプログラムを書いてみよ。ヒント:If 文の入れ子。
落穂拾い
3.9
3.9.1
数学関数
ボタンとテキストボックス(マルチライン)を置く。ボタンを押すと sin 関数を吐くサンプル
プログラム。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
Dim temp1 As Double
For i As Double = 0 To 100
temp1 = System.Math.Sin(2 * 3.14 * i / 100)
TextBox1.Text = TextBox1.Text & temp1 & vbCrLf
Next
19
End Sub
End Class
3.9.2
Exit while, Exit For, Exit sub
ループに入っている時、予定していたループの回数より早く出たい時があると思う。たとえば
どこかの入力電圧をずっとモニターしていて、その電圧が変化したときに測定を開始するため
モニターしているループから抜け出るなどあるだろう。そのような場合、Exit の後にどの処理
を抜け出いか書けばよい。
3.9.3
配列
同じような変数を扱うのに、例えば a1, a2, · · · と宣言していくのはあまり賢くない。三個ぐら
いならまだいいが、それが百個や千個になったら、もうタイプするだけで腱鞘炎クラスである。
そこで配列について説明しよう。ここでは VB.Net の配列について説明するが、もちろん C 言
語にも配列は存在する。
百聞は一見にしかず、実際のコードを見た方が早い。いつもの様にボタン一つとマルチライ
ンテキストボックスを用意する。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
Dim temp_array() As Double = {1, 3, 5}
For i As Integer = 0 To (temp_array.Length - 1)
TextBox1.Text = TextBox1.Text & temp_array(i) & vbCrLf
Next
End Sub
End Class
解説。 Dim temp_array() As Double で temp array という配列を定義し、さらに同じ行で
初期化をしている。temp array.Length で配列の要素の数を表している。うえの例では配列の要
素の数は3である。しかし注意してほしいのは配列の要素は0番から始ま。上の例では、
temp_array(0) = 1
temp_array(1) = 3
temp_array(2) = 5
である。なので For 文の中では終了時をマイナス一している。
もちろん初期化をしないで、ただある長さの配列を用意することもできる。例えば、こんな
こともできる
20
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
Dim temp_array(5) As Integer
For i As Integer = 0 To (temp_array.Length - 1)
temp_array(i) = i ^ 2
TextBox1.Text = TextBox1.Text & temp_array(i) & vbCrLf
Next
End Sub
End Class
3.9.4
変数のスコープ
変数を宣言し使ってきたが、実は変数には使える範囲(スコープ)が決まっている。要は宣言
した範囲内でした使えないのである。例えば For 文の中で宣言したなら For 文の外では使えな
い。 Private Sub Button1_Clic· · · の範囲内で宣言したなら End Sub までしか使えない。
なお外で宣言されたものと内側で宣言されたものでは、内側の変数の方が優先されるらし
い。どちらにしても紛らわしい名前は付けないに限る。
3.9.5
データ型変換関数
よく変数の型が違って代入ができない等の症状で困ることがある。そこで出てくるのがデータ
型変換関数である。例えば double 型の変数の値を integer 型の変数へ代入しようとするときに
は、CInt を使えばよい。残りはヘルプを見てくれ。
3.9.6
ファイル操作
筆者の経験上ファイル操作に関しては、定型処理をするのが早い。
ボタン一つとマルチラインテキストボックス、ボタンを押すとファイルの中身をテキスト
ボックスに表示する。
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
FileOpen()
End Sub
Private Sub FileOpen()
21
OpenFileDialog1.Filter = "すべてのファイル| *.*"
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
Using reader As New StreamReader(OpenFileDialog1.FileName)
TextBox1.Text = reader.ReadToEnd
End Using
End If
End Sub
End Class
ここでは FileOpen という関数を用意して、そこで処理を行わせている。というのもファイルを
開くというのは、よく使われる関数になるであろうからである。
ファイルオープンとほぼ同じように、ボタン一つとマルチラインテキストボックスを配置。
テキストボックスの内容をファイルに入れる。
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
FileSave()
End Sub
Private Sub FileSave()
SaveFileDialog1.Filter = "すべてのファイル| *.*"
If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
Using writer As New StreamWriter(SaveFileDialog1.FileName)
writer.Write(TextBox1.Text)
End Using
End If
End Sub
End Class
ある配列 array1 の値を、一つずつファイルに保存。
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
FileSave()
22
End Sub
Private Sub FileSave()
Dim array1() As Integer = {1, 3, 6, 19}
SaveFileDialog1.Filter = "すべてのファイル| *.*"
If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
Using writer As New StreamWriter(SaveFileDialog1.FileName)
For i As Integer = 0 To (array1.Length - 1)
writer.Write("array1(" & i & ") = " & array1(i) & vbCrLf)
Next
End Using
End If
End Sub
End Class
3.9.7
時間処理
タイマー
ここら辺はいろいろマニュアルやら入門書を読むとよい。一応サンプルコードを載せてお
く。ボタン一個、テキストボックス一個、ラベル二個タイマーを一個おく。タイマーのプロパ
ティーの Enabled を True にしておく。Form1 がロードされたときに TextBox1.Text に60を入
れておく。あとでこれがタイマーの時間(秒)になる。Label1 には現在の時が入る。Button1
がクリックされると timeron が True になって Time1 Tick の if 文が実行される。後はがんばっ
て理解してくれ。
Public Class Form1
Private timeron As Boolean = False
Private startsec As DateTime = DateTime.Now
Private endsec As DateTime = DateTime.Now
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) H
TextBox1.Text = 60
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim nowtime As DateTime
23
nowtime = DateTime.Now
Label1.Text = nowtime.ToString
If timeron = True Then
Dim diffsec As Integer
diffsec = CInt(endsec.Subtract(nowtime).TotalSeconds)
Label2.Text = "残り時間 " & diffsec & "seconds"
If diffsec < 0 Then
timeron = False
MsgBox("終わったぞゴラァ!")
Label2.Text = "終わり"
End If
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs
timeron = True
startsec = DateTime.Now
endsec = startsec.AddSeconds(CInt(TextBox1.Text))
End Sub
End Class
24