このレポートで使用されている『MathCalc』と『MathTeX』をダウンロードすることができます。 |
そういった忙しさからか、反復練習するためのプリントを作るときやその解答を作るとき、煩わしさを感じることがある。また、毎日数学の授業をやっていて、「自分が解いた答えは本当にあっているのだろうか」と思ったりすることがある。そんなとき、それらの問題点を解消するようなパソコンソフトがないか,市販品やオンラインソフトを探してみたことがある。
しかしその結果は、『Mathematica』(Wolfram Research社)や教科書会社から配布されるWordや一太郎形式のプリント用ファイル程度であった。いずれも、私にとってはあまり使い勝手が良いとはいえず、本校の生徒の実態に合っていないものであった。
それであれば、「自分が使いやすいようなソフトを作ってしまおう!」と思い、「MathCalc」や「Math\TeX 」の開発に至った。
MathCalcは高校数学レベルの簡単な計算問題を解くことができるソフトである。現在、以下の計算を行う機能がある。いずれについても、係数は 分数に対応しており、当然答えも分数で表示される。MathCalcを起動すると図\ref{}のような画面が現われ、それぞれのボタンを押すことによって、図2 〜 3のような画面が現われ、計算することになる。
1.整式の四則演算
2.整式の因数分解
3.連立方程式(2元1次方程式)
4.2次方程式
5.高次方程式(4次方程式まで)
6.内分・外分
また、係数などを入力するにあたり、[Enter]キーを押すことによって次の係数の欄にカーソルを移動することができる。さらに、必要な 数値が入力されれば、[計算]ボタンをクリックしなくても、[Enter]キーを押すだけで答えが表示される。
2.2 MathTeX
MathTeX は高校数学レベルの簡単な計算問題を自動的に作成するソフトで、同時にその答えも求めてくれる。出力形式は、TeX*1 形式のファイルとなるため、通常の形式で出力するためには、別途TeX のシステムで処理しなければならない。
*1 テフまたはテックと読む。フリーの組版ソフトで、数式のきれいな出力が特徴としてあげられる。アメリカのStanford大学のDonald E.Knuth教授が開発。その後、(株)アスキーが日本語化し、マクロを組み込んだ pLaTeX2e が広く普及している。ちなみに、この資料も TeX で書かれている。
現在、以下の問題が作成可能である。
1.各種計算
MathTeX を起動すると図4のような画面が現われ、作る問題の種類、問題数、用紙の大きさなどを選択し、[問題作成]ボタンを押すことによって、図5のように、左側には問題が、右側には答えが作成される。
その後、TeX のシステムで処理することによって、見慣れた形での問題と解答ができあがる。
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.2 データ構造
*3 すべてのロジックを、順次、選択(if文)、繰り返し(while文)の3つのフローチャートの組み合わせによって処理することができるもので、goto文を使わないので、すっきりした読みやすいプログラムを書くことができる。
*4 59MBほどあるが、http://www.borland.co.jp/delphi/personal/からダウンロード可能である
特に、プログラムの中で、整式や分数がどう表されているかというと、
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;
これらを基本関数とし、それぞれの問題に応じた関数や手続きを組み合わせ、計算処理をした。
定積分を例にとれば、以下のような手順に従い処理を行っている。
3.3.2 MathTeX の場合
新たに、
function PolToTeXString(A:Pol ; ch:char):String;なる関数を作成し、Pol型の変数をTeX の記述方式に従ってString型に変換する関数を作成した。
そして、その問題の係数に適した乱数を発生させ、それを組み合わせて問題を作成し、それをMathCalcで使用した処理法で解答を作成した。問題の種類によっては、答えを先に作ったほうが簡単な場合があったので、そうやって処理している問題もある。
因数分解を例にとれば、以下のような手順に従い処理を行っている。
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コンポーネントを貼り付け、
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の設計などの点からも、これからのプログラミングは、美術的なセンスも必要になってくると思われる。
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 ビットマップのイメージを表示できるボタン
また、因数分解の問題をやらせているときのことであるが、本校の場合、クラス内の生徒の学力差が著しく、50分で10問が解けるかどうかわからない生徒もいれば、10分もあれば30問くらい解けてしまう生徒もいる。そんな場合、表にはとりあえず20問の問題を載せ、裏に30問くらいの問題を載せて、「表が終わって、時間が余った者は、裏の問題にも挑戦してみること。裏まで手が回らなかった生徒は、家でやってみるように」として、取り組ませたことがあった。
結果として、20分くらいですべて終わった生徒もいたが、そんなにたくさんの時間を持て余す生徒もおらず、また終わってしまった生徒の中には 友達に教えている者もいて、おおむねいい状況で授業ができた。
また、定期考査前には、希望者に対し、家庭学習用プリントとして1枚に50問くらいの問題を出力して配布したこともあり、生徒の家庭学習の意欲を喚起できたと思う。
本校において、基本的な計算力が身についていない生徒はかなりの数に上り、小学校や中学校時代、十分な反復学習を怠ってきたのではないかと推測される。しかし、高校に入学し、同じような問題を何回もやらせることによって、「解けるようになった」、「わかるようになった」、「数学っておもしろい」などという生徒も現われてきた。基本的な計算力が数学のすべてではないし、反復練習をさせることがいい授業展開かというと、必ずしもそうではないと思うが、基本的な計算力がないことには、数学を勉強してもいっこうに理解が進まないと思うし、その力をつけるためには反復練習が大切であると思う。
そのためには今回開発したMathTeX が有効であると自負するものである。MathTeX が幅広く活用され、一人でも多く数学嫌いの生徒が減ってくれることを祈るものである。また、これらに対する要望や疑問点、ソースファイルの希望があれば、hata.h@nifty.ne.jpまでメールを下されば幸いである。多くの先生方が利用しやすくなるよう、改良に努めてまいりたい。
2000年7月1日にWindows版が完成してから、いくつかのバグの修正と、n! 、n P r 、n 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.txt5.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 を始め私の拙作は、
に登録されているので、ダウンロードし、使用していただければ幸いである。
また同様に、「数学のいずみ」*10(http://www.nikonet.or.jp/spring/)にも掲載してもらっているので、何かの機会に訪れていただければ幸いである。
*10 北海道算数数学教育会高等学校部会研究部(数学教育実践研究会と代数解析研究部)が作っているホームページ