1.ファイルへの書き込み |
---|
【問題】
(1)あらかじめRnd関数で0〜3の数字を用意し、(2)それ数字をユーザに予想してもらって入力してもらい、ユーザが当てるまで(1)(2)を繰り返すプログラムを作ってみましょう。 ただし、プログラムが終わるまでの(1)の数字と(2)の数字を全て、各行「(1)の数字,(2)の数字」という形で"LetsTry5-1.txt"に書き込むようにしましょう。 [ファイル書き込みの例]1,3 |
【解答例】
#console ' 変数名等は適当に Dim true_ans As Integer Dim user_ans As Integer Open "LetsTry1-5-1.txt" For Output As #1 ' このようにユーザに何をやるかを表示すると分かりやすいと思います。 ' 書かなくても構いません。 Print "今からコンピューターが0〜3の中のどれかを選ぶのでそれを当ててください。" '乱数を使う場合これを入れておいた方がいいです。 Randomize While -1 true_ans = Fix(Rnd() * 4) Input user_ans ' 数字・コンマの間にスペースを入れないようにするにはこの方法がベストです。 Print #1, true_ans; Print #1, ","; Print #1, user_ans If true_ans = user_ans Then Exit While Else ' 書く必要はありませんが書いたほうがユーザに分かりやすいです。 Print "ハズレ" End If WEnd Close #1 Exec "LetsTry1-5-1.txt" End |
【解説】
まず一番重要なのはファイルがきちんと扱えているかということです。 ポイントは「きちんとファイルが開けているか」「ファイルを閉じ忘れていないか」「ファイルにきちんと書き込めているか」という3点です。 まず「ファイルを開く」ところですが、今回はプログラムと同じ場所のファイルに書き込むのでパスを書く必要はありません。 それから「ファイルへの書き込み」は、コンソールウィンドウに表示するのと同じ要領なので結構簡単だったかと思います。 ただし「#1」(ファイル番号が違う場合は「#」+「そのファイル番号」)は忘れないようにしてください。 あと今回は「書く必要はありませんが……」という文章が多いですが、これからは与えられた指示以外にもユーザが使いやすくなるようにご自分で考えていただきたいと思ったので問題の指示以外の記述も多くなっています。 |
2.ファイルの読み込み |
---|
【問題】
ここに某年、某都市の各月の平均気温のリストがあります。→[ LetsTry1-5-2.txt ](右クリックしてダウンロードしてください。) このファイルには各行にそれぞれの月の平均気温が書かれています。 これを利用して某年、某都市の一年間の平均気温を求め、それをファイルの最後に追加して書き込み、最後にそのファイルを表示するプログラムを作ってみましょう。 |
【解答例】
' 今回は入力や表示が無いので#consoleはなくても構いません。 #console ' 変数名等は適当に Dim temp[11] As Single '温度は小数なのでSingleかDoubleを推奨 Dim i As Integer Dim ave As Single Open "LetsTry1-5-2.txt" For Input As #1 ' 各月のデータだと最初から分かっているのでForループで0〜11を使って読み込むなどしても構いません。 Do Input #1, temp[i] i = i + 1 Loop Until Eof(1) = -1 '「Loop Until Eof(1)」でも構いません。 Close #1 ' 平均の求め方はこれ以外にもいろいろ方法はあると思います。 For i = 0 To 11 ave = ave + temp[i] Next ave = ave / 12 Open "LetsTry1-5-2.txt" For Append As #1 Print #1, ave Close #1 Exec "LetsTry1-5-2.txt" End |
【解説】
今回は「読み込み」と「追加書き込み」をやっていますが、やはりポイントちゃんとモードを選んで開けているかということと、InputとPrintでうまくファイルの読み書きができているかです。 あとは問題文に従ってプログラムを組んでいけばできると思います。 ちなみに平均温度の正解は"16.5249996185303℃"です。 |
3.バイナリファイルの読み書き |
---|
【問題】
【数当てゲームを作ろう】
乱数を用いて毎回1〜3の数字を用意し、それをユーザに当ててもらうゲームを作りましょう。 条件は次の通りです。
《ヒント》
|
【解答例】
#console ' 変数の宣言 (変数名などは自由) Dim data As String Dim usr_win As Integer Dim usr_loose As Integer Dim true_ans As Integer Dim usr_ans As Integer Dim continue_yn As String Dim new_data As String ' 対戦結果ファイルを読み出す Open "LetsTry1-5-3.txt" As #1 Field #1, Lof(1) Get #1, 1, data ' ファイルがなかったときはdata[1]がエラーになる可能性があるので、 ' ファイルがあるときだけ読み込んだデータを代入する If Lof(1) <> 0 Then usr_win = data[0] usr_loose = data[1] End If Close #1 ' 今までの記録を表示 Print "今までの対戦結果:"; usr_win; "勝"; usr_loose; "敗" ' ゲーム本体 Randomize Do ' 正解の数字は乱数で true_ans = Fix(Rnd() * 3) + 1 Input "数を当ててください(1〜3)", usr_ans If true_ans = usr_ans Then Print "当たり" usr_win = usr_win + 1 Else Print "はずれ" usr_loose = usr_loose + 1 End If Input "続けますか?[Y/N]", continue_yn Loop Until continue_yn = "N" or continue_yn = "n" ' 対戦結果の更新 (文字列変数「data」に上書きしても可) new_data = String$(2, Chr$(0)) new_data[0] = usr_win new_data[1] = usr_loose Print "累計対戦結果:"; usr_win; "勝"; usr_loose; "敗" ' 対戦結果をファイルに保存 ' ファイルサイズが同じなのでKillはしてもしなくても可 Kill "LetsTry1-5-3.txt" Open "LetsTry1-5-3.txt" As #1 Field #1, Len(new_data) Put #1, 1, new_data Close #1 Sleep(3000) End |
【解説】
今回は基本編の最後ということで少し本格的なゲームを出してみましたがいかがだったでしょうか? ポイントは何といっても「バイナリファイル」の扱いです。 この「バイナリファイル」がきちんと扱えていれば合格です。 バイナリファイルを読み書きするための命令語に「Field」「Put」「Get」などがありましたがちゃんと使えていますか? あと、バイナリファイルを使うのは二つ理由があります。 一つは「ファイルサイズが小さくて済む」ことです。 例えば「10勝10敗」を記録しようとすれば、バイナリファイルは文字コード「10」を二つ並べるだけですから2バイトで済みますが、普通のファイルの場合は「10,10」と5バイト必要になります。 もう一つは他人が見ても簡単にわからないということです。 今回のファイルもメモ帳で開いたら分かると思いますが、少なくとも素人には分かりません。 なのでなるべく隠したい情報を記録するのには適しています。 最後に、バイナリファイルを扱うのには「バイナリエディタ」という種類のソフトがあると便利です。 私が使っているのは、後藤和重さんが作られているStirlingというソフトです。 このような「バイナリエディタ」というソフトを使えばバイナリファイルの内容も見ることができるで、バイナリファイルを扱うときには一緒に使うことをお勧めします。 |