11/2 課題問題

以下のような簡単な電卓プログラムを書きなさい.ファイルは,自分のホー ムディレクトリの下に java というディレクトリを作成して,その下に Kadai1102.java という名前で作成すること(クラス名もKadai1102という名前 で作成すること). 実行例を示す.人間による入力は下線をつけて表わす.
dell.tanaka.ecc.u-tokyo.ac.jp% java Kadai1102
10
10.0
*
+
次は数字を入力してください.
3
30.0
1
次は演算子を入力してください.
+
4
34.0
/
4
8.5
-
0.5
8.0
=

プログラムがちゃんと動くことを確かめたら,

/home08/ktanaka/bin/report1102 1
を実行すること.このプログラムは,~/java/Kadai1102.javaの有無,コンパ イル,実行できるかどうかなどをチェックする(実行結果が正しいかどうかは チェックしない).なお,自分の名前,学生証番号,プログラムに関する説明 をKadai1102.java の先頭にコメントとして入れること.
課題の提出期限は11月16日(火)の21:00.それ以前であれば,何度でも再提出できる.
自分が課題を提出したかどうかは,
/home08/ktanaka/bin/report1102
を実行すると確かめることができる.

オプション課題

この課題ではもの足りない人は,以下のような拡張をした電卓プログラムに 挑戦してみると良いだろう 当然,全部を満たすプログラムを作るのは難しいので,自分で満足がいくものが できたら,
ktanaka-cp1@lecture.ecc.u-tokyo.ac.jp
に送ると良い.良い ものは講義で紹介して,加点する.なお,オプション課題は本課題よりも1週間早い11月9日(火)に締切を設定する.

オプション課題に関するヒント(1)

1行に書いた式を「+-*/%()」などの記号と,それ以外の数字に分けるには, java.util.StringTokenizerを使うのが簡単である.以下に例を示す.
Macintosh:/tmp ktanaka$ cat Test.java
// StringTokenizerを使うため
import java.util.*;
// BufferedReaderを使うため
import java.io.*;

class Test{
    public static void main(String[] args) throws IOException{
        // キーボードから読み込むためのBufferedReaderの作成
	BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
	String s=null;
        // 1行読み込み
	while((s=r.readLine())!=null){
            // 記号を切れ目にして字句(token)を読むtokenizerを作成
	    StringTokenizer st=new StringTokenizer(s,"*%/+-()=",true);
            // まだtokenが残っている間
	    while(st.hasMoreTokens()){
		String token=st.nextToken();
		System.out.println("token="+token);
	    }
	}
    }
}
Macintosh:/tmp ktanaka$ java Test
34*213+333%5
token=34
token=*
token=213
token=+
token=333
token=%
token=5

オプション課題に関するヒント(2)

括弧を正しく取り扱ったり,演算子の優先順位を正しく扱って式を入力するた めのプログラムはパーサ(parser)と呼ばれる.実用的なコンパイラで使われる パーサの多くは yacc や bison などのパーサジェネレータを用いて,文法の形 式的な定義から自動的に生成されたものだが,簡単な文法のパーサを作る場合は, 再帰下降パーサ(Recursive Descent Parser)が向いている. 再帰下降パーサの実現に関しては, 琉球大の河野先生のページが参考になるだろう.
ktanaka-cp1@lecture.ecc.u-tokyo.ac.jp