成績処理のプログラムを作成した話 その1

目次

公開日 2023-03-20 更新日 2023-06-10

コンピュータがあるので

まず、コンピュータを購入したのはコンピュータが目的というのが本音でしょう。もちろん、理科や数学などのいろいろな教材を用意できたり、成績処理ができるかもという理由も付きますが、それは後付の理由だったと思います。まだ8ビットCPUの時代ですから、64ビットの今のコンピュータを考えてはいけません。

高校の教員となって成績処理というものがかなりの作業量になります。試験や課題を採点して点数化したものを学期ごとに合算して評価点にして担任教師に報告する。担任はHR生徒の成績一覧に転記して平均などを計算する。通知表を作成してまた転記。学年末には指導要録に転記をする。3学年では大学や就職先に提出する調査書と呼ばれる書類にまた転記することになります。この合算や平均計算、なによりも間違えずに転記するという作業がかなり気を使う作業となります。

教員になりたてでは、試験や課題を採点して点数化しか見えていないものの、コンピュータがあるのでコンピュータにやらせたいということになります。ここで注意。1981年ですから、まだ、EXCELのような表計算ソフトは世の中にありません。

市販のプログラム

株式会社アスキーが販売していたプログラム集の中に「成績処理」というものがありました。BASICで書かれたプログラム集の一つで、カセットテープでの販売でした。

期待はしませんでしたが、使ってみました。人数と科目数を入力して、指示されるままに点数をひたすら入力すると、①一覧表を印刷します。科目ごとの合計と平均、個人ごとの合計と平均そして順位が入っています。次に②成績順の一覧を印刷します。次は③ヒストグラムで、100-91, 90-81, ... と平均点の範囲ごとの人数のグラフを印刷して終わります。データの保存は無し。

これは使い物になりません。まず、ひたすら入力する部分で間違えると訂正が大変(できなかったかも?)。

ただ、何をすればよいかの見通しができました。まず、入力の部分を考える必要があります。

1キー入力

N88-BASICの系統には、INPUT$(1)という関数があります。入力されたキーの一文字を文字として返す関数です。"1"には取得する文字数が入りますが、"1"しか使ったことはありません。入力がなければ、何もせずに待ち続けます。英字や数字でないキーも制御コードとして取得できます。改行はCHR$(13), 上矢印はCHR$(30)という具合です。

こうして、2桁入力すればEnterなしで次にうつり、1桁は0を先行させるかEnterを入れるかで入力し、矢印キーで入力する場所を移動したり、ins, del キーですでに入力位置がずれた点数を訂正するとができるようにしました。また、英字キーで表として印刷したり、成績順で印刷したりという機能を呼び出す仕様にしてゆきます。

プログラム:INPUT$(1)を使った入力の一部(N88-BASIC)
1960 *INPK
1970   PRINT STRING$(3+IK,29);:I$="":CT=0
1980   S$=INPUT$(1)
1990   IF S$>="0" AND S$=<"9" THEN I$=I$+S$:CT=CT+1:PRINT S$;:GOTO 2150
2010   LOCATE TX,TY:PRINT DMARK$;:COLOR@ (TX,TY)-(TX+5,TY),-PC*(N=1) :GOTO *PRMK  'up
2040    IF S$=DN$ THEN N=N-(N<50):GOTO *PRMK  'down
2050    IF S$=RT$ THEN N=N-(N<41)*10:GOTO *PRMK 'right
2060    IF S$=LT$ THEN N=N+(N>10)*10:GOTO *PRMK 'left
2070    IF S$=CR$ THEN *PRMK
2080    IF S$="*" THEN *PRMK
2090    IF S$="." THEN ELSE 2130
2100       PRINT STRING$(IK,LT$);:INPUT "+ ",S$
2110       S=INSTR(S$+" "," "):S$=LEFT$(S$,S-1):TN(N)=TN(N)+VAL(S$):SVFLG=-1
2120       GOTO *DNXT
2130    IF S$="+" THEN INPK=FALSE:SM=INITSM:CLS:GOTO *INDIC
2140   GOTO *NNML
2150   WHILE CT="0" AND S$=<"9" THEN I$=I$+S$:CT=CT+1:PRINT S$;
2180     IF S$>=RT$ AND S$=0 THEN CT=CT-1:I$=LEFT$(I$,LEN(I$)-1):PRINT LT$;" ";LT$;
2220   WEND
2230   TN(N)=VAL(I$):SVFLG=-1
2240   IF S$DN$ THEN *DNXT
2250   IF N>NMAX AND I$<>"" THEN NMAX=N
2260   LOCATE TX,TY:J=N:GOSUB *DSP1
2270   GOTO 2010

N88-BASICにもいくつかのバージョンアップがあって、行番号の代わりにラベル(*INPKなど)を使えるようになり、WHILEを使えるようになり変わっていっています。GOTOからGOSUBへ構造を変えてゆく機運もあったのですが、入力のコアな部分はGOTOの方が複雑な分岐を表現しやすく、最後までこれで通しています。

N88-BASICの最大の欠点はIF文が1行に限られることでした。複数の行にまたがるときはTHENやELSEの先に行番号やラベルを書いてその間の行に入れます。ENDIF文はありません。

実際の画面

紆余曲折があって学校中で使われるようになったあたりの最終形態に近い画面です。下部の水色の四角はファンクションキーの割当を表しています。当時好きだった管理工学研究所が出していた「松」というワープロの影響を受けています。スタートがフロッピーディスクさえなかった時代である関係で、マウスも使えませんが、年が経つにつれて下部の四角をマウスでクリックする人が増えてきました。

画面では24人目を入力中。1列に10人で、5と6の間には隙間が入る。5列で50人まで入るようになっている。40人も入れると一人飛ばしたりしてずれることがあるので、5人ずつのブロックを作るように設計してある。

点数入力欄が上にあって教科名がその下という配置だが、点数を入れて科目(教科)を確認して保存という一連の流れに従っている。点数の入力前に科目を確定したいならそれも可能。というか科目名の変更はいつでもできる。

表計算になれている今の人は縦に生徒が並び、横に科目が並ぶ入力画面がほしいというが、この画面はどうしても残したい。

しかし、一覧表のままの入力がないのは欠点ではある。欠席などで後から追加で成績が入る生徒がいると科目毎に点数を追加して保存するのは煩わしい。

一般的にならなかった機能

このプログラムは私の個人用から始まっている。やらなければならない採点や入力をちょっと止めて、プログラムの改良をしていくのは息抜きであり、逃避行動でもあった。

その中で私は便利に使うけれども他の教員には使えないものも若干あった。

その1 加算減算入力

採点のあと、配点ごとに丸の数を数えて点数を計算するのが結構面倒だ。そこで、数字キーを押すたびにその数値が加算されるような入力を選択できるようにした。加算減算入力と名前をつけた。答案の丸を目で追いながら配点を押してゆく。2 2 3 3 3 4 3 で下書き入力欄に 20 となっている。ここでEnterを押せば確定。0を押せば下書き入力欄で改行してもう一度はじめから入力して確認できる。+キーで加算と減算を切り替え可能で、正解の多い答案は満点からの減算でも出すことができる。

その2 レコード間の加減乗除

もともとこのプログラムは教科担任として使用するのがメインであった。つまり複数の試験の点数を合計したり、重みをつけて(ある試験結果を2倍するとか)合計したりの作業が必要となる。

この画面で入力される50人までの点数が1レコードとして保存されている。試験を3回おこなって、1:試験A, 2:試験B, 3:試験C となっている場合は、

1*2+2/2+3

とすることで、画面には 試験A×2 + 試験B÷2 + 試験C の値が表示される。割り算結果は四捨五入される。これを名前をつけて保存すると、レコードが追加されるという仕組みである。

数式として見たときの、各項の最初の数字はレコード番号でそれ以外は掛ける数や割る数になる。よって全員に2点をプラスするといったことは表現できない。そんな必要がなかったからだが、全部1のレコードを作って2倍して足せばよい。

学期の成績は100点満点の20段階、つまり5点刻みで出すことになっていた。これは1点刻みの点数を5で割って5を掛けることで得られる。これは点数を整数で扱っていてこのBASICが整数の割り算をするときに結果を四捨五入する仕様であることによる。結果、四捨五入ならぬ二捨三入になる。

校内での公開

当初、周りの理科や数学の先生に見せて、説明したけれどもあまり好評ではなかったので、広く使ってもらうのは無理だと思っていた。ある時、数学出の教務主任から勧めてもらい認知されることになったが、そもそも普及にはコンピュータが必要なわけで、お金がない学校としては、よくある上からの一声で一気にコンピュータ化されるということはなく、何年もかけて少しずつ広がっていくという状況になった。学校の校務の電子化ということを考えるとこれはこれでよい進め方であったと思う。

成績処理は、点数の集計に始まって、出欠統計、通知表、調査書、指導要録などやれることが増えていきます。これについては別に書く予定。

移植

OSもプログラム言語も変化していくので、何回かの移植が必要になった。遡るほど記憶があいまいだけれども、大雑把にはこんな感じ。

OS 言語システム 時期
BASIC N88-BASIC 1981年にPC-8801で始まり、1985年からPC-9801で開発。
MS-DOS N88-BASIC(DOS版) 1990年あたりに移植・移行
Windows F-BASIC 2004年度内に順次移植
JVM Java 8 2016年度あたりで順次移植

MS-DOS以前は、「DATA文にデータを保存した話」で紹介した様に初代のBASICから始まり、PC9800シリーズのN88-日本語BASIC(86)まで何世代かあるが、詳細は確かではない。元祖N88-BASICはOSを含むソフトウェアで、フロッピーディスク起動の場合には、N88-DISKBASICからの起動も、MS-DOSからの起動も利用者にとってはあまり変わらない。

校内で教員に公開されたのは、生徒用にPC-9801UV21が導入された1988年以降になるが、このときはフロッピー起動であった。

教員室にハードディスクが入るのは1993年だが、N88-日本語BASIC(86) MS-DOS版を使用するようになったのがいつかは定かではない。プログラムの中に残した変更記録の最古の日付が1990年なのでそのころではないか。DOS版にするときにはファイル入出力を中心に若干の手直しがあったけれども、内容の改良に比べれば、大した量の改変ではなかったと記憶します。

N88-BASICはWindows上でもDOS窓(仮想端末)で動いていたが、DOS/V機と呼ばれるIBM互換機が普及してきたので、これに対応するためにFujitsuのF-BASICに移植した。これには大幅な改変が必要であった。データ形式は変更することを避けた。

F-BASICは最終バージョンがV6.3でWindows2000やMeまでしか正式には対応していない。しかし不具合の出るのはエディタ部分だけで、別のエディタで編集しコンパイルも実行も問題なかった。2006年に販売は停止になったが、2016年にJavaに移植したときも使えている。Windows8まで使えたことは確認できている。

Javaにした理由はOSSで構築したかったことと、UNICODEでないと使用できる漢字に制約があるからです。

訂正・追記

「N88-日本語BASIC(86)MS-DOS版コンパイラで".exe"ファイル化して使用するようになった」と書いていましたが、記憶違いでMS-DOS版でもインタプリタで動かしていました。".exe"ファイルになったのはF-BASIC移行後です。(2023-06-10)

フロッピー起動でDOS版を使用していた時代があるので、ハードディスク導入が切り替えとはならない。しかし、残っている古いプログラムはハードディスク上にバックアップしたものだけで、フロッピーベースのものが失われているので残っている最古のプログラムは1995年のタイムスタンプで、プログラム中のメモで辿れるものは1989年である。