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
を実行すると確かめることができる.
オプション課題
この課題ではもの足りない人は,以下のような拡張をした電卓プログラムに
挑戦してみると良いだろう
- 1行に式すべてを書ける(この場合は最後の=は指定しなくても良い).
- 括弧付きの式を扱える.
- 四則演算の優先順位に従って括弧をつけなくても適切な順序で計算する.
- 関数(sin, cos, log)を扱える(入力形式は任意).
当然,全部を満たすプログラムを作るのは難しいので,自分で満足がいくものが
できたら,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