プログラミング初級1
文字数カウント・プログラム(ステップ4)


行数のわからないファイルをオープンし、全部の行とその文字数および文字数の合計を表示する。


お待たせしました(?)。 ここさえやれば、一応の目的(ファイルの文字数ゲット)は果たせるという、 初級1メインのステップ4に入ります。
ステップ3までにわからないところは、ありませんか? わからなくても、もうどんどんやっちゃう? とにかく目的が果たせるのですから。(笑)

さて、今回はループが出てきます。ひょっとして苦手な人がいるかも? でも難しく考えないでくださいね。いつも言っているように「慣れる」ことが大切です。 では、リラックスして(?)、力を抜いてまず読んでみましょう。




ステップ4の仕様


  1. マイ ドキュメントのフォルダにあるテキストファイル mojisu.txt をオープンする。
  2. mojisu.txt の最後になるまで、以下の処理を繰り返す。
      (1) mojisu.txt を1行読み込む。
      (2) 文字数の計算(合計)をする。
      (3) 読み込んだ内容と文字数を、メッセージボックスで表示する。
  3. mojisu.txt の全文字数を、メッセージボックスで表示する。
  4. mojisu.txt を閉じる。



ステップ4のプログラム・ソース



  1. Sub Count4()
  2. '文字数カウント・プログラム
  3. 'ステップ4:行数のわからないファイルをオープンし、全部の行とその文字数
  4. ' および文字数の合計を表示する。
  5. Dim gyo As String '読み込んだ行を入れておく変数を宣言
  6. Dim moji_su As Long '1行の文字数用変数を宣言
  7. Dim gokei As Long 'ファイルの文字数用変数を宣言
  8. Dim gyo_no As Integer '行番号用変数を宣言
  9. gokei = 0 '合計用変数の初期化
  10. gyo_no = 0 '行番号用変数の初期化
  11. Open "C:\My Documents\mojisu.txt" For Input As #1 'ファイルのオープン
  12. Do Until EOF(1) 'ループ:条件EOF(1)になるまで、ここからの処理を繰り返す
  13. Line Input #1, gyo 'ファイルから1行読み込む
  14. moji_su = Len(gyo) '読み込んだ行の長さ(文字数)を '変数 moji_su へ入れる
  15. gokei = gokei + moji_su '合計用変数 gokei に文字数を加算する
  16. gyo_no = gyo_no + 1 '行番号を1アップ
  17. MsgBox gyo_no & "行目は 「" & gyo & "」" '読み込んだ行の中身を表示する
  18. MsgBox "文字数は " & moji_su '行の文字数を表示する
  19. Loop 'ループ:ここまでの処理を繰り返す
  20. MsgBox "ファイルの文字数は " & gokei '合計用変数 gokei の値を表示する
  21. Close #1 'ファイルのクローズ
  22. End Sub




解       説


ステップ3に比べて短くなりましたね。♪ これぞプログラミングの醍醐味(?)。 難しく思える処理が、簡単で短く済んだときには、るん♪ってなるんです。(^^ゞ
今回は、この「同じことの繰り返し」をまとめて書いちゃう方法、つまりループがメインです。

  1. 1行目は、Count4() という サブルーチン の開始です。
    今回はステップ4なので、Count4 という名前にしてサブルーチンを作成しています。
    って、そろそろ、この説明も必要ないでしょうか?


  2. 2〜4行目は、コメントです。
    コメント にはどんなことを書いても構いません。 でも普通はそのプログラムの内容やら、処理の説明やら、変数の説明をします。 変数にはわかり易い名前を付けますが、それでもやっぱり何のためにあるのか わからなくなってくるものなのです。
    今は「お勉強」用に、1行ごとにコメントを付けていますが、 もちろんこんな大変なことは、実際の仕事のときはやりません。 要所、要所に、的確なコメントを書くことが、望ましいですね。
    ところでこのソースの行末のコメントは、' の位置がそろっていません。 これは、画面の横幅を余り広げたくないのと、左側の命令から離れていると どれについてのコメントかわかりにくいのが理由で、そろえていないのです。 でも、皆様がプログラムを書くときには、コメントの開始位置をそろえた方が美しいです。 美しいプログラムは、必ずしも良いプログラムとは限りませんが、 「良いプログラムは必ず美しい」というのが私の持論です。(^^)


  3. 5行目は、変数の宣言です。
    Dim は何でしたか? どういう意味でしたか? Dim の次は、何が来ましたか?
    Dim 変数名 As データ型
    という構文でしたね。 5行目は、テキストファイル mojisu.txt を1行ずつ読み込むたびに、 その行の内容を入れておくための変数 gyo を文字列型で宣言しています。


  4. 6行目も、変数の宣言です。
    6行目の変数は、moji_su という名前で、Long(長整数型)で宣言しています。
    この変数 moji_su は、入力された文字列の文字数を入れるために用意しました。 どうして長整数型にしているのでしたか?
    思い出せない人は、ステップ3を見てみましょうね。


  5. 7行目も、変数の宣言です。
    文字数合計用の変数を、gokei という名前で、Long(長整数型)で宣言しています。 一応 moji_su とデータ型を合わせています。


  6. 8行目も、変数の宣言です。
    変数が1つ増えましたね。行番号用の変数を、gyo_no という名前で、Integer(整数型)で宣言しています。 どうして整数型かと言うと、整数型は -32,768 〜 32,767 の間の値を設定できます。 この範囲を超えた(あるいは下回った)値を代入しようとすると、エラーになります。 しかし 32,767 行を超えるファイルが、そうそうあるとは思えないので・・・。
    「いや、きっとある」と思う人は、Long(長整数型)で宣言してくださいね。
    こういうのは「仕様の問題」で、きっと一人一人意見が異なることでしょう。 「根拠」をはっきり示すことができれば、皆さんは自分の考えで、自分の仕様を決めてくださって結構です。


  7. 9行目は、変数の初期化です。
    「初期化」って、何でしたか?
    変数を、使用前に一定の値を入れて「クリア」しておくことでしたね。 通常、数字には 0 を、文字列には "" を入れます。 9行目は、合計用変数 gokei をゼロクリアしています。


  8. 10行目も、変数の初期化です。
    行番号用変数の gyo_no をゼロクリアしています。 gokei と gyo_no だけ初期化しているのは、相変わらず私(講座作成者)のズボラです。(^^; 本当は、全変数を初期化しておいたほうがいいです。
    moji_su と gyo の初期化は、どうしますか?
    「数字には 0 を、文字列には "" を入れます。」でしたね。


  9. 11行目は、仕様の 1.の部分にあたります。
    マイ ドキュメントのフォルダにある テキストファイル mojisu.txt をオープンします。
    Open ファイル名 For Input As #1
    が構文です。ファイル名は必ず " ではさんでください。 ちょっとおまじないみたいに、5回ほど唱えてみてください。
       「オープン ファイルめい フォー インプット アズ シャープ いちっ!」 (笑)


  10. 12行目は、ループの開始と条件を設定します。
    ループ」とは?
    「ぐるぐる回る」ことです。「環状線」なんていうのも、ループでしたね。 「入門編」では、「無限ループ」という恐ろしげ(?)なものも、体験していただきました。
    ここの構文は、次のものを使っています。
    Do Until 条件
      ステートメント(命令)・・・
    Loop
    これは、「条件を満たすまで、ステートメントを繰り返し実行すること」という意味です。
    今回の「条件」は、EOF(1) の部分です。 EOF は、ファイルの終わりのことです。EOF(1) は、現在開いているファイルの終わりです。
    EOF:End Of File
    つまり、Do Until EOF(1) は、「現在開いているファイルの終わりになるまで、 以下の処理を繰り返せ」という意味になります。 これは、仕様の 2. にあたりますね。


  11. 13行目は、ファイルから入力(読み込み)された文字列を gyo という変数に入れます。
    仕様の 2.の(1) 「mojisu.txt を1行読み込む。」にあたります。
    ここからは、繰り返し処理(実行)される部分です。 つまり、ここが実行されるたびに、ファイルから1行ずつ入力(読み込み)されるわけです。 それが、ファイルの終わりになるまで繰り返されるのですから、 結局ファイルの全部の行を読み込むことになります。
    Line Input # の構文
    Line Input #1, 文字型変数名



  12. 14行目は、入力された文字列の文字数を計算するところです。
    ここも、繰り返し処理(実行)される部分です。
    Len 関数の構文
    長整数型変数名 = Len(文字列)



  13. 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 は使用前にゼロクリアしていますね。


  14. 16行目は、行番号の計算です。
    ここも、繰り返し処理(実行)される部分です。
    今 読み込んだ行が先頭から何行目かを、読み込むたびに gyo_no に 1 を足して計算しています。 ここも15行目と同様に、最初に gyo_no をゼロクリアしてから、gyo_no + 1 を gyo_no に入れ直しています。
    こういうのって一つの「テクニック」のようなものなので、慣れるまで「こうするもの」と考えてください。
    行番号は、メッセージボックス表示用で、文字数の計算には関係がありません。


  15. 17行目と18行目は、仕様の 2.の(3)「読み込んだ内容と文字数を、メッセージボックスで表示する。」にあたります。
    ここも、繰り返し処理(実行)される部分です。


  16. 19行目は、繰り返す範囲を指定します。
    「Do から始まる繰り返し処理は、ここまでですよ。」という意味です。


  17. 20行目は、「ファイルの文字数は」という文字と、ファイルの全文字数とを表示します。
    仕様の 3. 「mojisu.txt の全文字数をメッセージボックスで表示する。」 にあたります。
    「ファイルの文字数は」という文字と、ファイルの全文字数とを & でつないでいます。


  18. 21行目は、使用したファイルを閉じます。
    仕様の 4.の部分にあたります。開いたものは、必ず閉じてくださいね。
    Close #1
    が構文です。いまのところは、#1 のままで覚えましょう。 ファイルは使用前には必ず開いて、使用後は必ず閉じないと、エラーになります。 これは、「コンパイルエラー」でなく、「実行時エラー」になります。


  19. 22行目は、サブルーチンの終了を表します。
    これも、もう説明がいりませんね。次ステップから省きます。



ステップ4実行前の準備


ステップ2で使用したのと同じファイルを使います。 もしまだ準備していない方がいましたら、ステップ2を見て準備してください。 ファイルの中身は、こうなっています。
abcde
bcde
cde
de
e




実       行


    では動作(実行)確認してみましょう。

  1. カーソルの位置を確認してから、F8キーを押していってください。
    今回は、是非とも F8キーにしましょう。 「繰り返し実行」あるいは「ループ」の意味が納得できるまで、何回でも F8キーで実行してください。


  2. 結果は、ステップ3と同じです。
    実行結果は、ステップ3とまったく同じです。 ステップ3と違うのは、ファイルの行数が5行でなくてもよいという点です。 ですから、mojisu.txt と違うファイルで実行してみましょう。 ただし、あまり長いファイルだと、いちいちメッセージボックスのOKをクリックするのが大変ですから、 短いファイルを使ってください。 短いファイルのない人は、mojisu2.txt というのをこちらで用意してあります。
    ファイルの中身は、こうなっています。(行頭末に空白あり)
     1:これは、文字数カウントのテストです。
     2:abcdefg
     3:1234567890
     4:あいうえお
     5:あ い う え お
     6:Alphabet と 漢字をまぜます。
     7:これは、最終行です。 Bye !

    自分で作る自信がないと言う方は、 ここ をクリックすると新しい画面が開きます。
    「ファイル(F)」→「名前を付けて保存(A)」で、 マイ ドキュメントのフォルダに保存してください。


  3. ソースを変更してください。
    11行目の Open "C:\My Documents\mojisu.txt" For Input As #1 の mojisu.txt を mojisu2.txt に変更してください。


  4. カーソルの位置を確認してから、F8キーを押していってください。
    次から次へとメッセージボックスが現われますので、 順番にファイルの中身と文字数を確認してくださいね。

    今回はとにかく「F8 キーでぐるぐる」がメインです。





入れ替え1


果たして皆さんに楽しんでいただいているでしょうか?
ソースの行の順番をでたらめにしたやつを、ここに書いておきます。 正しい順番に並べ替えてください。もちろん、正解を見ずにね。 それで正しいと思ったやつをコピーして、エラーが出ないかどうか試してみてください。




'             および文字数の合計を表示する。
Line Input #1, gyo          'ファイルから1行読み込む
Close #1                    'ファイルのクローズ
Dim gyo_no  As Integer      '行番号用変数を宣言
Loop                        'ループ:ここまでの処理を繰り返す
gyo_no = 0                  '行番号用変数の初期化
Sub Count4()
Open "C:\My Documents\mojisu.txt" For Input As #1   'ファイルのオープン
MsgBox gyo_no & "行目は 「" & gyo & "」"   '読み込んだ行の中身を表示する
Dim gyo     As String       '読み込んだ行を入れておく変数を宣言
Do Until EOF(1)   'ループ:条件EOF(1)になるまで、ここからの処理を繰り返す
gokei = 0                   '合計用変数の初期化
MsgBox "ファイルの文字数は " & gokei    '合計用変数 gokei の値を表示する
Dim gokei   As Long         'ファイルの文字数用変数を宣言
'文字数カウント・プログラム
moji_su = Len(gyo)          '読み込んだ行の長さ(文字数)を
                            '変数 moji_su へ入れる
End Sub
gyo_no = gyo_no + 1         '行番号を1アップ
'ステップ4:行数のわからないファイルをオープンし、全部の行とその文字数
MsgBox "文字数は " & moji_su '行の文字数を表示する
Dim moji_su As Long         '1行の文字数用変数を宣言
gokei = gokei + moji_su     '合計用変数 gokei に文字数を加算する




入れ替え2


コメント抜きです。




MsgBox "ファイルの文字数は " & moji_su
Dim gyo_no  As Integer
Close #1
gokei = gokei + moji_su
Loop
gyo_no = 0
MsgBox gyo_no & "行目は 「" & gyo & "」"
Dim gyo     As String
gokei = 0
Dim gokei   As Long
moji_su = Len(gyo)
End Sub
Open "C:\My Documents\mojisu.txt" For Input As #1
Do Until EOF(1)
gyo_no = gyo_no + 1
Line Input #1, gyo
MsgBox "文字数は " & gokei
Sub Count4()
Dim moji_su As Long




戻る

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル