第84回全国算数数学教育研究大会(兵庫大会)
高等学校部会 第11B分科会 コンピュータ・教育機器

「MathCalc」「MathTeX」を開発・活用してみて

2002.8.1(2002.10.10 更新)
北海道滝川工業高等学校
畑   仁

このレポートで使用されている『MathCalc』と『MathTeX』をダウンロードすることができます。

  1. はじめに
  2.  今、教員という仕事をしていて感じることは、とても忙しいということである。日々の授業はもちろんのこと、その教材研究、分掌や委員会の仕事、部活動の指導などなど、息つく暇もないくらい次から次へと仕事が舞い込んでくる。本末転倒であることはわかっていながらも、教材研究は教科書をパラパラとめくった程度で終わらせ、他の雑務に時間をかけることも少なくない。

     そういった忙しさからか、反復練習するためのプリントを作るときやその解答を作るとき、煩わしさを感じることがある。また、毎日数学の授業をやっていて、「自分が解いた答えは本当にあっているのだろうか」と思ったりすることがある。そんなとき、それらの問題点を解消するようなパソコンソフトがないか,市販品やオンラインソフトを探してみたことがある。

     しかしその結果は、『Mathematica』(Wolfram Research社)や教科書会社から配布されるWordや一太郎形式のプリント用ファイル程度であった。いずれも、私にとってはあまり使い勝手が良いとはいえず、本校の生徒の実態に合っていないものであった。

     それであれば、「自分が使いやすいようなソフトを作ってしまおう!」と思い、「MathCalc」や「Math\TeX 」の開発に至った。

  3. 個々のソフトの機能
  4. 2.1 MathCalc

     MathCalcは高校数学レベルの簡単な計算問題を解くことができるソフトである。現在、以下の計算を行う機能がある。いずれについても、係数は 分数に対応しており、当然答えも分数で表示される。MathCalcを起動すると図\ref{}のような画面が現われ、それぞれのボタンを押すことによって、図2 〜 3のような画面が現われ、計算することになる。

    1.整式の四則演算


    図1:MathCalcを起動すると

    2.整式の因数分解
    3.連立方程式(2元1次方程式)
    4.2次方程式
    5.高次方程式(4次方程式まで)
    6.内分・外分

    7.微分(有理整関数のみ) 8.定積分(有理整関数のみ)
    9.n! 、n P rn C rの計算(500桁まで対応)
    10.Σの計算(最終値は自然数かnのついた式)


    図2:因数分解のボタンを押すと


    図3:定積分のボタンを押すと

     また、係数などを入力するにあたり、[Enter]キーを押すことによって次の係数の欄にカーソルを移動することができる。さらに、必要な 数値が入力されれば、[計算]ボタンをクリックしなくても、[Enter]キーを押すだけで答えが表示される。

    2.2 MathTeX

     MathTeX は高校数学レベルの簡単な計算問題を自動的に作成するソフトで、同時にその答えも求めてくれる。出力形式は、TeX*1 形式のファイルとなるため、通常の形式で出力するためには、別途TeX のシステムで処理しなければならない。

    *1 テフまたはテックと読む。フリーの組版ソフトで、数式のきれいな出力が特徴としてあげられる。アメリカのStanford大学のDonald E.Knuth教授が開発。その後、(株)アスキーが日本語化し、マクロを組み込んだ pLaTeX2e が広く普及している。ちなみに、この資料も TeX で書かれている。

     現在、以下の問題が作成可能である。

    1.各種計算

    2.多項式の計算 3.方程式 4.2次関数 5.平面図形と式 6.微分 7.積分 8.数列

     MathTeX を起動すると図4のような画面が現われ、作る問題の種類、問題数、用紙の大きさなどを選択し、[問題作成]ボタンを押すことによって、図5のように、左側には問題が、右側には答えが作成される。

     その後、TeX のシステムで処理することによって、見慣れた形での問題と解答ができあがる。


    図4:MathTeX を起動すると


    図5:問題作成ボタンを押すと

  5. データ構造とアルゴリズム
  6. 3.1 開発環境

     MathCalcとMathTeX は、Object Pascalで記述されており、『Delphi』(Borland社)で処理されている。コンパイラにDelphiを選んだ理由は、『MathCalc Ver1.00』がPascalという言語で書かれてあったからで、それにオブジェクト指向的*2な拡張を施したObject PascalのWindows版コンパイラだったからである。

     知っての通り、プログラミング言語には、BASICを始め、Fortran、COBOL、C、LISP、Prolog、Ada、Javaなど、数え切れないほどあるが、学生時代よく使っていた言語であるということと、当時(今から20年ほど前)、構造化プログラミング*3ができる言語は、PascalかCしかなかったからである。

    ここで、どちらかといえばマイナーな感じを受けるPascalのことについて、若干説明を加えたい。

     Pascalは、1968年にスイス連邦工科大学のNiklaus Wirth教授がAlgolの後継として開発した言語で、一般的にはプログラミング教育のために用いられることが多い。しかし、市販されている(いた)コンパイラ『TURBO Pascal』(Borland社)は多くの拡張が加えられており、C言語ほど低級な記述はできないものの、アマチュアプログラマーが、ちょっとしたソフトウェアを作るには十分過ぎる機能を持つものである。

     また、今回使用した『Delphi』はVer6.0になって、Personal版は商用・業務アプリケーションの開発でなければ、フリーで使用することができるようになった。*4

     言語仕様についての詳細は割愛するが、C言語のそれと似通っているところがある。たとえば、プログラムの始まりと終わりを表す begin...end は、Cでいう{ … }であるし、if 式 then … else … ; は、Cでいう if (式) … ; else … ; である。その他の違いについて、いくつかの例を表にのせた。

      Pascal C
    変数の宣言 var Data:Integer; int Data;
    代入文 a:=1; a=1;
    while文 While (式) do begin … end; While (式)} { … }
    for文 for i:=1 to 10 do begin … end; for (i=1; i<=10; i++)} { … }
    論理演算子 and &&
    関数 function abc(a:Integer):Integer; int abc(int a)
    手続き procedure abc(a:Integer); void abc(int a)

    *2 ソフトウェアの設計や開発において、操作手順よりも操作対象に重点を置く考え方。関連するデータの集合と、それに対する手続き(メソッド)を「オブジェクト」と呼ばれる一つのまとまりとして管理し、その組み合わせによってソフトウェアを構築する。
    *3 すべてのロジックを、順次、選択(if文)、繰り返し(while文)の3つのフローチャートの組み合わせによって処理することができるもので、goto文を使わないので、すっきりした読みやすいプログラムを書くことができる。
    *4 59MBほどあるが、http://www.borland.co.jp/delphi/personal/からダウンロード可能である
    3.2 データ構造

     特に、プログラムの中で、整式や分数がどう表されているかというと、


    Pol=Record
      Degree:Integer;
      Up,Down:array[0..Max] of Integer;
    end;
    

    という風に構造体を用いて、それをPol型と定義した。Degreeはその整式の次数、Upは係数の分子、Downは係数の分母を意味し、それぞれ係数は0次からMax次までの配列となって表されている。なお、整式の最大次数はMax(10に設定)としている。

     ちなみに、C言語風に書くと、


    struct Pol{
      int Degree;
      int Up[Max];
      int Down[Max];
    }; 
    

     また、BASIC風に書くと


    Type Pol
      Degree As Integer
      Dim Up(Max) As Integer
      Dim Down(Max) As Integer
    End Type
    

    となる。

    3.3 アルゴリズム

     まず、Pol型変数にかかわり、以下の関数及び手続きを作成した。

    {最大公約数を求める}
    function Gcd(A,B:Integer):Integer;

    {最小公倍数を求める}
    function Lcm(A,B:Integer):Integer;

    {Pol型変数を初期化する}
    procedure ClearPol(var A:Pol);

    {係数を約分し、次数の適正な値にする}
    procedure ReducePol(var A:Pol);

    {整数型をPol型0次式に変換する}
    function IntToPol(N:Integer):Pol;

    {Pol型0次式を整数型に変換する}
    function PolToInt(A:Pol):Integer;

    {式が 0 かどうか判定する}
    function ZeroPol(A:Pol):Boolean;

    {式が 1 かどうか判定する}
    function OnePol(A:Pol):Boolean;

    {式が x かどうか判定する}
    function XPol(A:Pol):Boolean;

    {同じ式かどうか判定する}
    function EqPol(A,B:Pol):Boolean;

    {式同士を加算する}
    procedure AddPol(A,B:Pol; var C:Pol);

    {式同士を減算する}
    procedure SubPol(A,B:Pol; var C:Pol);

    {式同士を乗算する}
    procedure MulPol(A,B:Pol; var C:Pol);

    {式同士を除算する}
    procedure DivPol(A,B:Pol; var Q,R:Pol);

    {式を微分する}
    procedure DifPol(A:Pol; var C:Pol);

    {式を積分する}
    procedure IntPol(A:Pol; var C:Pol);

    {式をべき乗する}
    procedure PowerPol(A,B:Pol; var C:Pol);

    {式に値を代入する}
    procedure EnterPol(A,B:Pol; var C:Pol);

    {式同士の最大公約数を求める}
    procedure GcdPol(A,B:Pol; var C:Pol);

    {式同士の最小公倍数を求める}
    procedure LcmPol(A,B:Pol; var C:Pol);

    {式を文字列に変換する}
    function PolToString(var A:Pol):String;

    {有理数文字列をPol型に変換する}
    function RatStringToPol(S:String):Pol;

    3.3.1 MathCalcの場合

     これらを基本関数とし、それぞれの問題に応じた関数や手続きを組み合わせ、計算処理をした。

     定積分を例にとれば、以下のような手順に従い処理を行っている。

    1. RatStringToPol(S)により、各係数、上端(TPol)、下端(UPol)を読み込む。
    2. 各係数を元に、Pol型変数Aを作る。
    3. IntPol(A,C)により、Aを積分し、それをCとする。
    4. EnterPol(C,TPol,C1)により、Cに上端(TPol)を代入し、C1とする。
    5. EnterPol(C,UPol,C2)により、Cに下端(UPol)を代入し、C2とする。
    6. SubPol(C1,C2,Ans)により、C1-C2を計算し、解答とする。

    3.3.2 MathTeX の場合

     新たに、

    function PolToTeXString(A:Pol ; ch:char):String;
    なる関数を作成し、Pol型の変数をTeX の記述方式に従ってString型に変換する関数を作成した。

     そして、その問題の係数に適した乱数を発生させ、それを組み合わせて問題を作成し、それをMathCalcで使用した処理法で解答を作成した。問題の種類によっては、答えを先に作ったほうが簡単な場合があったので、そうやって処理している問題もある。

     因数分解を例にとれば、以下のような手順に従い処理を行っている。

    1. -9〜9(ただし0は除く)乱数を発生させ、それを定数項にした因数A、Bを作る。(これが解となる)
    2. MulPol(A,B,C)により処理し、A \times Bを計算し、それをC(これが問題となる)とする。
    3. 問題用紙の体裁を整えながら、PolToTeXString(C)を用いて問題を記述する。

    3.4 Windowsプログラミングの考え方

     従来の、MS-DOS上のプログラムは、メインルーチンがあり、そこに主たるプログラムを記述し、キーの入力などに応じてサブルーチンを呼び出し、処理を行っていく考え方であった。

     しかし、Windowsの普及からCUI(Character User Interface)環境からGUI(Graphical User Interface)環境に移行し、操作方法も複雑化 していった。たとえば、「ボタンをクリックする」、「メニューを押す」、「キーを押す」、「右クリックする」、「左クリックする」などが そうである。また、Windows独自の現象(「Windowが開く」、「Windowが閉じる」、「Windowの大きさを変える」など)も起こってくる。

     従来のプログラミング技術でも対応できないことはないだろうが、コードは複雑化極まりなくなることは、容易に想像できるだろうし、私のような素人にはとても対応しきれるものではない。

     そこで登場したのが、Delphiのような、イベント駆動(Event Driven)の考え方が盛り込まれたコンパイラ*5である。イベント駆動というのは、何らかのイベント(たとえば、ボタンをクリックする、など)が発生した時に、それに応じた一定の処理手順(たとえば、新たなWindowが開く、など)を実行するというプログラム概念で、イベント単位で個別にプログラムを作り、全体としてうまく動作するようにプログラムを組み立てていくものである。

     また、オブジェクト指向の考え方から、Delphiには、フォームやコンポーネントという形で、たくさんのオブジェクトがすでに宣言されており、私たちは、それらをフォーム上にマウスを使って貼り付けるだけで、基本的なWindowsの機能*6を持ったフォームを作成できる。さらに、各コンポーネントのプロパティ*7を変更することによって、市販されているソフトのようなフォームを作成することも可能である。

     また、多くのコンポーネントは、WindowsのAPI(Application Programming Interface)をクラスライブラリとして持っており、簡単なプログラムによって、それらを呼び出すことができる。

     たとえば、ファイルを開くときによく目にする図6は、フォーム上にOpenDialogコンポーネントを貼り付け、


    図6:MOpenDialog使用例


    procedure TForm1.OpenButtonClick(Sender: TObject);
    begin
      with OpenDialog1 do begin
        Filter:='TeX(*.tex)|*.tex|All(*.*)|*.*';
        if Execute=True then begin
          Memo1.Lines.LoadFromFile(FileName);
          FFileName:=FileName;
        end;
      end;
    end;
    

    と記述するだけで、ファイルを選択し、読み込むことができる。同様に、ファイルのセーブやフォントの変更(図7)、プリンターの設定なども、簡単なプログラムの記述により実行することができる。このように、現在のWindowsコンパイラは、すでにたくさんのコンポーネントが組み込まれており、私たちは、それらをフォーム上に配置・デザインすることからプログラミングを始めることになる。また、アイコンの作成、ビットマップボタン*8の設計などの点からも、これからのプログラミングは、美術的なセンスも必要になってくると思われる。


    図7:FontDialog使用例


    procedure TForm1.FontMenuClick(Sender: TObject);
    begin
      FontDialog1.Options:=[fdEffects];
      FontDialog1.Font:=Label1.Font;
      if FontDialog1.Execute then begin
        Label1.Font:=FontDialog1.Font;
        Label1.Font.Style:=FontDialog1.Style;
        Label1.Font.Size:=FontDialog1.Size;
      end;
    end;
    

    *5 Visual BasicやVisual C++などもそう
    *6 マウスの操作によってWindowの大きさが変わる、ボタンが押されたような動作をする、メニューがドロップダウンする、など
    *7 大きさや色、メニューの内容など、各コンポーネントの細部を定義するもの
    *8 ビットマップのイメージを表示できるボタン

  7. 実際に使用してみて
  8.  まだ、MathCalcを生徒に対して使用したことはないが、MathTeX を用いて作成した練習問題を何回か解かせたことはあった。そのときの生徒の方から、「先生、これとこれ、同じ問題です」という指摘を何回か受けた。その部分をチェックする機能は付けていないので、現時点では同じ問題がでないことを祈るしかないのだが、早急に対応した方がいいと思った。

     また、因数分解の問題をやらせているときのことであるが、本校の場合、クラス内の生徒の学力差が著しく、50分で10問が解けるかどうかわからない生徒もいれば、10分もあれば30問くらい解けてしまう生徒もいる。そんな場合、表にはとりあえず20問の問題を載せ、裏に30問くらいの問題を載せて、「表が終わって、時間が余った者は、裏の問題にも挑戦してみること。裏まで手が回らなかった生徒は、家でやってみるように」として、取り組ませたことがあった。

     結果として、20分くらいですべて終わった生徒もいたが、そんなにたくさんの時間を持て余す生徒もおらず、また終わってしまった生徒の中には 友達に教えている者もいて、おおむねいい状況で授業ができた。

     また、定期考査前には、希望者に対し、家庭学習用プリントとして1枚に50問くらいの問題を出力して配布したこともあり、生徒の家庭学習の意欲を喚起できたと思う。

     本校において、基本的な計算力が身についていない生徒はかなりの数に上り、小学校や中学校時代、十分な反復学習を怠ってきたのではないかと推測される。しかし、高校に入学し、同じような問題を何回もやらせることによって、「解けるようになった」、「わかるようになった」、「数学っておもしろい」などという生徒も現われてきた。基本的な計算力が数学のすべてではないし、反復練習をさせることがいい授業展開かというと、必ずしもそうではないと思うが、基本的な計算力がないことには、数学を勉強してもいっこうに理解が進まないと思うし、その力をつけるためには反復練習が大切であると思う。

     そのためには今回開発したMathTeX が有効であると自負するものである。MathTeX が幅広く活用され、一人でも多く数学嫌いの生徒が減ってくれることを祈るものである。また、これらに対する要望や疑問点、ソースファイルの希望があれば、hata.h@nifty.ne.jpまでメールを下されば幸いである。多くの先生方が利用しやすくなるよう、改良に努めてまいりたい。

  9. 今後のこと
  10. 5.1 MathCalcの場合

     2000年7月1日にWindows版が完成してから、いくつかのバグの修正と、n! 、n P rn C r の多桁計算(500桁まで対応)、Σ の計算、いままで解けなかった因数分解(x4+3x2+2、等)が解けるようになるなど、改良を重ねて現在Ver2.03となっている。このバグについては、使用している方からメールで指摘があったものが大半である。

     また、2000年8月17日付のメール版「窓の杜」*9}で紹介されたり、雑誌『DOS/V POWER REPORT 2002年7月号』(インプレス)、 『PC Life+DVD 2002年7月号』(SOFTBANK Publishing)に収録されるなど、私の予想を上回る反響があった。今後は以下の点についての機能拡張を考えていきたい。

    *9 (株)インプレス発行のメールニュースで、主にオンラインソフトの情報を扱っている。http://www.forest.impress.co.jp/mail/200008/20000817.txt
    5.2 MathTeX の場合

     2001年1月20日にWindows版が完成してから、これも使用している方からメールで機能拡張の要望やバグ報告があり、以下のように改良を加え、現在Ver2.14となっている。

     また、2002年7月9日にオンラインソフト紹介サイト「窓の杜」(http://www.forest.impress.co.jp/article/2002/07/09/mathtex.html)で紹介された。

    Ver2.05

    Ver2.10

    Ver2.11

    Ver2.12

    Ver2.13

    Ver2.14

     今後は以下の点についての機能拡張を考えていきたい。

     機能拡張が出来次第、随時「Vector」(http://www.vector.co.jp/)にアップロードする予定であり、MathCalc、MathTeX を始め私の拙作は、

    http://www.vector.co.jp/vpack/browse/person/an008927.html

    に登録されているので、ダウンロードし、使用していただければ幸いである。

     また同様に、「数学のいずみ」*10http://www.nikonet.or.jp/spring/)にも掲載してもらっているので、何かの機会に訪れていただければ幸いである。

    *10 北海道算数数学教育会高等学校部会研究部(数学教育実践研究会と代数解析研究部)が作っているホームページ

    参考文献

    [1]『改訂版Delphi入門』(SOFTBANK)
    [2]『Borland Delphi3.1 リファレンスガイド』(秀和システム)
    [3]『ここまでできる Delphi4 パワーガイド』(秀和システム)
    [4]『これで完璧!Delphi5裏技170選』(エーアイ出版)
    [5]『[改訂版]\LaTeXe 美文書作成入門』(技術評論社、奥村晴彦著)