ステップ3に比べて短くなりましたね。♪ これぞプログラミングの醍醐味(?)。
難しく思える処理が、簡単で短く済んだときには、るん♪ってなるんです。(^^ゞ
今回は、この「同じことの繰り返し」をまとめて書いちゃう方法、つまりループがメインです。
- 1行目は、Count4() という
サブルーチン の開始です。
今回はステップ4なので、Count4 という名前にしてサブルーチンを作成しています。
って、そろそろ、この説明も必要ないでしょうか?
- 2〜4行目は、コメントです。
コメント
にはどんなことを書いても構いません。
でも普通はそのプログラムの内容やら、処理の説明やら、変数の説明をします。
変数にはわかり易い名前を付けますが、それでもやっぱり何のためにあるのか
わからなくなってくるものなのです。
今は「お勉強」用に、1行ごとにコメントを付けていますが、
もちろんこんな大変なことは、実際の仕事のときはやりません。
要所、要所に、的確なコメントを書くことが、望ましいですね。
ところでこのソースの行末のコメントは、' の位置がそろっていません。
これは、画面の横幅を余り広げたくないのと、左側の命令から離れていると
どれについてのコメントかわかりにくいのが理由で、そろえていないのです。
でも、皆様がプログラムを書くときには、コメントの開始位置をそろえた方が美しいです。
美しいプログラムは、必ずしも良いプログラムとは限りませんが、
「良いプログラムは必ず美しい」というのが私の持論です。(^^)
- 5行目は、変数の宣言です。
Dim は何でしたか?
どういう意味でしたか? Dim の次は、何が来ましたか?
Dim 変数名 As データ型
という構文でしたね。
5行目は、テキストファイル mojisu.txt を1行ずつ読み込むたびに、
その行の内容を入れておくための変数 gyo を文字列型で宣言しています。
- 6行目も、変数の宣言です。
6行目の変数は、moji_su という名前で、Long(長整数型)で宣言しています。
この変数 moji_su は、入力された文字列の文字数を入れるために用意しました。
どうして長整数型にしているのでしたか?
思い出せない人は、ステップ3を見てみましょうね。
- 7行目も、変数の宣言です。
文字数合計用の変数を、gokei という名前で、Long(長整数型)で宣言しています。
一応 moji_su とデータ型を合わせています。
- 8行目も、変数の宣言です。
変数が1つ増えましたね。行番号用の変数を、gyo_no という名前で、Integer(整数型)で宣言しています。
どうして整数型かと言うと、整数型は -32,768 〜 32,767 の間の値を設定できます。
この範囲を超えた(あるいは下回った)値を代入しようとすると、エラーになります。
しかし 32,767 行を超えるファイルが、そうそうあるとは思えないので・・・。
「いや、きっとある」と思う人は、Long(長整数型)で宣言してくださいね。
こういうのは「仕様の問題」で、きっと一人一人意見が異なることでしょう。
「根拠」をはっきり示すことができれば、皆さんは自分の考えで、自分の仕様を決めてくださって結構です。
- 9行目は、変数の初期化です。
「初期化」って、何でしたか?
変数を、使用前に一定の値を入れて「クリア」しておくことでしたね。
通常、数字には 0 を、文字列には "" を入れます。
9行目は、合計用変数 gokei をゼロクリアしています。
- 10行目も、変数の初期化です。
行番号用変数の gyo_no をゼロクリアしています。
gokei と gyo_no だけ初期化しているのは、相変わらず私(講座作成者)のズボラです。(^^;
本当は、全変数を初期化しておいたほうがいいです。
moji_su と gyo の初期化は、どうしますか?
「数字には 0 を、文字列には "" を入れます。」でしたね。
- 11行目は、仕様の 1.の部分にあたります。
マイ ドキュメントのフォルダにある
テキストファイル
mojisu.txt をオープンします。
Open ファイル名 For Input As #1
が構文です。ファイル名は必ず " ではさんでください。
ちょっとおまじないみたいに、5回ほど唱えてみてください。
「オープン ファイルめい フォー インプット アズ シャープ いちっ!」 (笑)
- 12行目は、ループの開始と条件を設定します。
「ループ」とは?
「ぐるぐる回る」ことです。「環状線」なんていうのも、ループでしたね。
「入門編」では、「無限ループ」という恐ろしげ(?)なものも、体験していただきました。
ここの構文は、次のものを使っています。
Do Until 条件
ステートメント(命令)・・・
Loop
これは、「条件を満たすまで、ステートメントを繰り返し実行すること」という意味です。
今回の「条件」は、EOF(1) の部分です。
EOF は、ファイルの終わりのことです。EOF(1) は、現在開いているファイルの終わりです。
EOF:End Of File
つまり、Do Until EOF(1) は、「現在開いているファイルの終わりになるまで、
以下の処理を繰り返せ」という意味になります。
これは、仕様の 2. にあたりますね。
- 13行目は、ファイルから入力(読み込み)された文字列を gyo という変数に入れます。
仕様の 2.の(1) 「mojisu.txt を1行読み込む。」にあたります。
ここからは、繰り返し処理(実行)される部分です。
つまり、ここが実行されるたびに、ファイルから1行ずつ入力(読み込み)されるわけです。
それが、ファイルの終わりになるまで繰り返されるのですから、
結局ファイルの全部の行を読み込むことになります。
Line Input # の構文
Line Input #1, 文字型変数名
- 14行目は、入力された文字列の文字数を計算するところです。
ここも、繰り返し処理(実行)される部分です。
Len 関数の構文
長整数型変数名 = Len(文字列)
- 15行目は、ファイルの全文字数の計算です。
仕様の 2.の(2)「文字数の計算(合計)をする。」にあたります。
ここも、繰り返し処理(実行)される部分です。
さて、ステップ3の場合は、ファイルの1行目は gokei = moji_su と、
合計用変数に文字数用変数の値を代入していました。
でも gokei = moji_su を何回繰り返してやっても、各行の文字数の合計にはなりませんね。
こういう場合は、gokei = gokei + moji_su を繰り返していきます。
ただし、初回(ファイルの1行目)だけは、gokei にゼロを入れてから計算しないといけません。
gokei = 0 ならば、gokei = gokei + moji_su と gokei = moji_su は、同じことになりますね。
つまり、ここで「変数の初期化」を行ったことが生きてきます。
gokei は使用前にゼロクリアしていますね。
- 16行目は、行番号の計算です。
ここも、繰り返し処理(実行)される部分です。
今 読み込んだ行が先頭から何行目かを、読み込むたびに gyo_no に 1 を足して計算しています。
ここも15行目と同様に、最初に gyo_no をゼロクリアしてから、gyo_no + 1 を gyo_no に入れ直しています。
こういうのって一つの「テクニック」のようなものなので、慣れるまで「こうするもの」と考えてください。
行番号は、メッセージボックス表示用で、文字数の計算には関係がありません。
- 17行目と18行目は、仕様の 2.の(3)「読み込んだ内容と文字数を、メッセージボックスで表示する。」にあたります。
ここも、繰り返し処理(実行)される部分です。
- 19行目は、繰り返す範囲を指定します。
「Do から始まる繰り返し処理は、ここまでですよ。」という意味です。
- 20行目は、「ファイルの文字数は」という文字と、ファイルの全文字数とを表示します。
仕様の 3.
「mojisu.txt の全文字数をメッセージボックスで表示する。」
にあたります。
「ファイルの文字数は」という文字と、ファイルの全文字数とを
& でつないでいます。
- 21行目は、使用したファイルを閉じます。
仕様の 4.の部分にあたります。開いたものは、必ず閉じてくださいね。
Close #1
が構文です。いまのところは、#1 のままで覚えましょう。
ファイルは使用前には必ず開いて、使用後は必ず閉じないと、エラーになります。
これは、「コンパイルエラー」でなく、「実行時エラー」になります。
- 22行目は、サブルーチンの終了を表します。
これも、もう説明がいりませんね。次ステップから省きます。
|