敬老の日の今日、このコンサートに行ってきた。オリジナル作品を演奏するピアノのYOUTAさんは4歳の時に失明した、という。しかしステージへの出入り時に(たぶん安全のため?)介助がつく以外、ピアノが手で触れられる範囲内ではすべて普通にお辞儀し、演奏する。プログラムに載っているプロフィールを見なければそうとは気が付かない完璧な演奏である。
山田耕筰の歌曲を歌ったソプラノの林こと子さんは小学校教員を定年退職後から声楽を習い始め、現在84歳とのことである。しかし「野薔薇」「からたちの花」の高音部の長音の響きは現役声楽科音大生?と思ったほど済んでいて、かつパワーのあるものだった。
私も自分のピアノ演奏力の衰えをいつまでも脳梗塞の後遺症のせいにしてはいけないな、と頭を強く殴られた気持ちになった。
手作り雑貨、お菓子、コーヒー、キッチンカーなどで、
普段はネットで販売中心の作者さんたちの
合同販売会という感じのイベントでした。
主催団体は#アオイマルシェ
↑クリックすると拡大します
今日の会場は富山市水橋会館多目的ホール。
パッと見た感じけっこう大きな神社の社務所かと思った。
この中に、ホールと児童館がある。
↑クリックすると拡大します↑
こういうイベント、けっこう好きです。
次は3/25~26イオンタウン金沢示野。富山は
4/1~3砺波のチューリップ四季彩館だそうです。
また行きたいな。
これで当カテゴリーでお話ししたいことはすべてお話しました。とはいっても当カテゴリーの目的は「平易なプログラミングを通してコンピュータの基本を学ぶこと」、主としてコンピュータのプログラミング入門者を対象としているので、コンピュータについての全てをお話しているわけではありません。また当カテゴリーの実習で使用したTiny Basic for Windowsについても、その全ての機能を網羅したわけではありません。
当カテゴリーの実習がきっかけでTiny Basic for Windowsをもっと深く勉強してみようという方は、ぜひ制作者のtakeuchiさんのサイトで勉強してください(下記リンクから行かれます)。
Tiny Basic for Windows
そしてコンピュータについてもっと専門的な知識を身に付けたいという方は、ぜひ機械語によるプログラミングに挑戦してください。演算、条件判断、繰り返し処理などをコンピュータがどうこなしているのかがわかります。
最後になりますが、ここまで頑張って読んでくださった皆様にこういうことを申し上げてたいへん申し訳ありません。プログラミング言語を覚えてプログラムが書けるようになっただけでは実用的なシステムが構築できるようにはなりません。システム構築ができるようになるためには、この後、システム設計の勉強をする必要があります。システム設計の第1歩は現状分析からですが、現状分析ができるようになるには、コンピュータの知識以前に対象の業務についての知識が必要です(筆者は昔、これで大っ恥かいた経験があります)。
そして出来あがったプログラムが目的通りに正しく動くかどうか、システムが目的どおりに間違いなく効率良く稼働するかどうか、これらが出来るようになるにはプログラムテスト、システム評価についての知識も必要です。これから職業プログラマ、SE(システムエンジニア)を目指そうと思っている方は、それらについて勉強していってください。
当カテゴリーがきっかけでふだんword、excelなどで使っているパソコンがどういう機械なのかということに皆様が目を向けてくだされば、コンテンツ制作者としてこれ以上の喜びはありません。
前章ではキーボードから入力したデータをファイルに書き込むプログラムを作りました。この章では前章で作成したファイルを読み込むプログラムと複数のファイルを使うプログラムを作ります。第11章でやった試験の成績処理のプログラムを完成させます。
【ファイルを読み込むプログラム】
前章で作成した meibo.txt というファイルを読み込んで内容を表示するプログラムを作ります。meibo.txt は seiseki_shoriフォルダに保存されています。このプログラムも seiseki_shoriフォルダに保存するとします。手順は
①ファイルをINPUTモードで開く
②ファイルの内容を1行(1レコード)ずつ読み込み内容を表示する
③ファイルを閉じる
となります。プログラムは図17-1のようになります。2行目が手順①、3~6のWHILEブロックが手順②、7行目が手順③になります。
1:PRINT "*****名簿ファイル読み込み*****"
2:OPEN "meibo.txt" FOR INPUT AS #1
3:WHILE NOT EOF(1)
4: INPUT #1,BANGO,NAMAE$,KANA$
5: PRINT BANGO$;TAB(8);NAMAE$;TAB(20);KANA$
6:WEND
7:CLOSE #1
8:END
図17-1.ファイルを読み込むプログラム
ファイルの終わりを検知する
3行目にEOFというのが新しく出てきました。これはファイルの内容を1行ずつ読み込んでいって最後の行を読み終わったときtrue(真)となる関数です。End Of Fileの意味です。
EOF(ファイル番号)
のように書きます。
したがって、3~6行目のWHILEブロックは「ファイル番号1のファイル中のレコードをすべて読み込み終わるまで」ということになります。
ファイルの中身を読み込むにはINPUT #命令を使います。INPUTの後ろに#ファイル番号を付けます(4行目)。次のように書きます。
INPUT #ファイル番号,変数,変数・・・・変数
図17-2.meibo.txtの内容
meibo.txtの中身は図17-2のようになっていました。1レコードのアイテムは番号(ストリング),名前(ストリング),ヨミガナ(ストリング)の順に並んでいるので、INPUT #1以後の変数の並びもこの型のとおりに合わせます(4行目)
5行目は読み込んだレコードの内容を表示しています。
これで最初の相沢 義明さんから最後の増川 幸雄さんまで名簿ファイル中のすべてのレコードを読み込んで表示します(図17-3)。レコードを読み込んだところで、次のレコードがもうない(今読み込んだレコードが最後)だとEOFの値はtrue(真)になります。よって3行目のWHILE文に戻ったとき繰り返し終了条件は満たしたと判断され、WHILEブロックを抜けて7行目以降に移ります。ここで今使用したファイルを閉じてプログラム終了です。
図17-3.ファイルを読み込むプログラム実行結果
【ファイルを使うプログラムの怖さ】
プログラムの論理エラー、オペレータの誤操作は深刻なトラブルにつながることはよくきく話ですが、ファイルを使うプログラムではとくにそうです。典型的なものとして
①ファイルを作成してはいけない場所(ドライブ/フォルダ)に作成してしまい情報が漏洩してしまった
②システム全体で共有するファイルに対して編集・削除プログラムを実行してしまいシステム全体がダウンしてしまった
③データが蓄積していたファイルを OUTPUT モードで OPEN してしまい長年の苦労が一瞬にして水の泡になった
④データ誤入力が原因で誤った処理結果をファイルに書き込んでしまい多くのお客様に被害が及んだ
などです。こういうことを防止するためには日頃から大切なファイルはバックアップ(ファイルのコピー)をとることを習慣づけることも大切ですが、プログラムにも誤実行・誤操作防止を施しておくに越したことはありません。ここで作るプログラムではこのようなシステムトラブルを極力防止することも考えます。といってもいきなり今までやってなかった命令や関数が出てくるわけではありません。ここまでで学んだ知識を組み合わせでできることです。
【複数のファイルを使うプログラム】
本カテゴリーも終着駅に近づいてきました(また鉄道ネタ💦)。ここでは複数のファイルを使うプログラムをやってみましょう。
クラス名簿マスタファイルを読み込み、各々の生徒の試験の点数を入力し、試験データファイルを作成するプログラムを作ります。
マスタファイルとは大元のファイルで内容が変わることは滅多にないもの、これに対し、試験の成績は内容が変動することが頻繁にあるファイルです。このようなファイルのことをトランザクションファイルという場合もありますが今日ではトランザクションとは「取引」「商売」の意味ですが、今日のITの世界ではでは「ここからここまで一連の処理」の意味で使われるのが普通なので、当カテゴリーではデータファイルとよぶことにします。
[ファイル・レコードの形式]
名簿マスタファイル
番号(数値),名前(ストリング),ヨミガナ(ストリング)
試験データファイル
番号(数値),氏名(ストリング),ヨミガナ(ストリング),点数(数値)
※普通に考えれば試験データファイルには氏名、ヨミガナは書き込む必要はありません。後で試験の結果を見る時は出席番号で名簿マスタファイルを検索するようにすればよいからです(たとえば1年1組1番という生徒は1人しかいません)。ここではマスタファイルの内容も試験データファイルに書き込むようにしています。これは万一マスタファイルが破損する事故が発生した場合、データファイルから復旧するのが簡単にできるようにするためです。
[入力データ]
試験の点数は0点以上100点以下とする
図17-4.ファイルを複数使うプログラムのイメージ
このプログラムではWHILE~WEND制御文のネスティングとIF制御文で実現します。プログラムの詳細な流れは次のようになります。
プログラム開始部分
IF プログラム開始OKでなければプログラム実行終了(誤実行防止)
プログラムメイン部分
WHILE① マスタファイルの全レコードを読み込み終わるまで
読み込んだデータを表示(誤入力防止)
WHILE② 入力した点数を確認してOKになるまで(誤入力防止)
WHILE③ 正しいデータが入力されるまで(誤データ防止)
点数入力
WEND③
入力した点数表示
WEND②
WEND①
プログラム終了
これに基づいて作ったプログラムは次のようになります。
1:' ***********************************
2:' * 試験の成績入力プログラム *
3:' * ver.1.0()2023/05/07) *
4:' * (制作責任者) *
5:' * ○○市立凸凹中学校 *
6:' * 徳川 卑弥子 *
7:' * himiko@example.co.jp *
8:' ***********************************
9:' *** 初期処理 ***
10:PRINT "***** 試験の点数入力 *****"
11:' 実行可否確認
12:INPUT "開始しますか(YES=1)",STARTOK$
13: IF STARTOK$<>"1" THEN
14: END
15: END IF
16:' ファイルOPEN
17:OPEN "meibo.txt" FOR INPUT AS #1 :' 名簿マスタファイル
18:OPEN "shiken.txt" FOR OUTPUT AS #2 :' 試験データファイル
19:' *** メイン処理 ***
20:WHILE NOT EOF(1)
21: INPUT #1,BANGO,NAMAE$,KANA$
22: ' 入力内容がOKになるまで
23: YN$=""
24: WHILE YN$<>"1"
25: PRINT BANGO;" ";NAMAE$,KANA$
26: ' 正しいデータが入力されるまで
27: DATAOK=0
28: WHILE DATAOK<>1
29: INPUT "点数(0-100)",TEN
30: ' 入力内容チェック
31: IF TEN=>0 AND TEN<=100 THEN
32: ' 0点以上100点以下ならOK
33: DATAOK = 1
34: ELSE
35: ' 0~100以外が入力されたとき
36: PRINT "点数は0から100までです"
37: END IF
38: WEND
39: ' 入力内容の確認
40: PRINT BANGO,NAMAE$,KANA$,TEN
41: INPUT "これでよろしいですか(YES=1)",YN$
42: WEND
43: PRINT #2,BANGO;",";NAMAE$;",";KANA$;",";TEN
44:WEND
45:' プログラム終了
46:CLOSE #1,#2
47:END
図17-5.試験の成績入力プログラム
[プログラムの説明]
1~5行目 プログラムの説明
このプログラムを使う人がプログラム作成者1人だけならともかく、みんなで使うプログラムなら、どういうプログラムで、ver.情報、プログラム制作者(問い合わせ先)などの情報を注釈文で載せるようにしましょう。
10~15行目 誤実行防止
本当に実行してよいかオペレーターに確認します。実行してよければ 1 を入力します。これ以外の文字が入力された場合は安全のため実行を中止するようにしています。
17行目 名簿マスタファイルを入力専用、ファイル番号1で開く
18行目 試験データファイルを出力専用、ファイル番号2で開く
ファイル番号が異なっていれば複数のファイルを同時に OPEN できます。使用モードが異なっていてもOKです。
20~44行目 名簿マスタファイルの全レコードを読み終わるまで繰り返す
21行目 名簿マスタファイルのレコード1件分の読み込み
23~42行目 入力した試験の点数が間違いなくなるまで繰り返す
25行目 今読み込んだレコードの内容を表示
27~38行目 入力した点数が正しくなるまで(0~100点の範囲内)になるまで繰り返す
41行目 入力した点数の確認
43行目 試験データファイルに出力
46行目 使用したファイル閉じる
実行すると次のようになります。
図17-6.実行可否の確認
プログラムが開始されると最初に実行してよいかどうかの確認を求められます(図17-6)。ここでOK(=1)以外を応答するとプログラムの実行を中止します(試験データファイルは新規作成されません)。
図17-7.メイン処理
*1)実行可否の確認(誤実行防止)
*2)マスタファイルから読み込んだ内容を表示(誤入力防止)
*3)誤データ防止
*4)入力やり直し
*5)入力内容確認したところ間違っていたのでYes(=1)以外を応答
*6)正しいデータを入力し直し再度確認
*7)書き込み完了し、次のデータ入力へ
このようにして試験の成績をファイルに書き込んでおけば、今度はこのファイルを読み込んで、平均点を求めたり、各々の生徒の点数が平均点とどれだけ離れているかなどを求めることができます。プログラムは次のようになります。このプログラムでは試験データファイルから平均点を求めた後、いったんファイルをCLOSE(19行目)、その後ファイルを再OPEN(27行目)し、もう一度各自の点数を読み込みながら、平均点との差を求めています。このように1つのファイルはCLOSEすれば再オープンしてデータを始めから読み込み直すことができます。
1:' ***********************************
2:' * 試験の結果分析プログラム *
3:' * ver.1.0(2023/05/08) *
4:' * (制作責任者) *
5:' * ○○市立凸凹中学校 *
6:' * 徳川 卑弥子 *
7:' * himiko@example.co.jp *
8:' ***********************************
9:' *** 初期処理 ***
10:PRINT "***テストの結果分析***"
11:GOKEI=0
12:NINZU=0
13:OPEN "shiken.txt" FOR INPUT AS #1
14:WHILE NOT EOF(1)
15: INPUT #1,NUM,SHIMEI$,KANA$,TEN
16: GOKEI=GOKEI+TEN
17: NINZU=NINZU+1
18:WEND
19:CLOSE #1
20:' いったん試験データファイルをCLOSE
21:' 平均点と、各自の得点と平均点の差を求めて表示
22:HEIKIN=INT(GOKEI/NINZU)
23:PRINT USING "受験者は ###人";NINZU
24:PRINT USING "平均点は ###点";HEIKIN
25:PRINT
26:' 各自の得点と平均点との差を求める
27:OPEN "shiken.txt" FOR INPUT AS #1 ' 試験データファイルを再OPEN
28:WHILE NOT EOF(1)
29: INPUT #1,NUM,SHIMEI$,KANA$,TEN
30: TENSA=TEN-HEIKIN
31: PRINT USING " ### ";NUM;
32: PRINT SHIMEI$;" (";KANA$;")"; ' 出席番号、氏名、ヨミガナを表示
33: PRINT TAB(32);
34: PRINT USING " ### (###)";TEN;TENSA ' 得点と平均点との差を表示
35:WEND
36:CLOSE #1
37:END
図17-8.試験データファイルを読み込んで平均点等を求めるプログラム
図17-9.図17-8のプログラム実行結果
図17-9を見てあれっと思った方もいらっしゃるでしょう。これは第11章でやったプログラムと結果は同じです。また図17-5のプログラムならマスタファイルを作らなくても第12章で覚えたDATA文でプログラム中に置いた名簿データを遣えばわくね?はい、もっともな疑問です。どうしてわざわざファイルを使うのでしょう。
ここで思い出していただきたいのは、主記憶装置に記憶された内容は、コンピュータを再起動するかシャットダウンすればすべて消えてしまうということです。配列(配列変数)に代入された内容もまた主記憶装置に記憶されているものです。またDATA文もプログラム中に置かれているものです。また他のプログラムとDATA文の内容を共有するというのも、かなりやっかいです。
しかし補助記憶装置にファイルとして記憶されたデータは、その補助記憶媒体を破損しない限り、半永久的に保存・再利用が可能です。たとえばここで入力した試験の点数が中間試験のもので期末試験の点数をこれに書き加えて、三者面談の時、保護者に渡す資料を作りたいという場合、中間試験の点数が保存されていてこれが再利用できれば簡単にできます。>b?ファイルに保存したデータは半永久的に再利用ができる、といすうことを覚えておきましょう。
【この章のまとめ】
ファイルからデータを読み込むには入力モード(INPUT)で開く
ファイルからデータを読み込むときは INPUT #(ファイル番号)命令を使う
ファイルを使うプログラムでは誤実行・誤操作・誤データなどが深刻なシステム障害につながることが多い
ファイル(補助記憶装置)に書き込んだデータは半永久的に保存・再利用が可能である