11/1 Java プログラミング入門(4)


前回までの補足


前回の課題について

10/25 課題

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

解答例(1)
//名前 XXXXX
//学生証番号 XXXXXX

//a,rは変数,bは記号に使いました。
//まずaに数字を入力します。
//その後ループに入り,記号、数字、記号のように入力していきます。
//ループは無限に続き,=を入力することで終了し,結果を返します。

import java.io.*;
class Kadai1025{
  public static void main(String[] args) throws IOException{
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("数字の入力");
    double r=Double.parseDouble(d.readLine());
    for (;;){
      System.out.println("四則演算記号または等号の入力");
      String b=d.readLine();
      if(b.equals("=")){
        System.out.println("終了しました");
        System.out.println("結果は"+r+"です");
        break;
      }
      else{
        System.out.println("数字の入力");
        double a=Double.parseDouble(d.readLine());
        if(b.equals("+"))
          r=r+a;
        else if(b.equals("-"))
          r=r-a;
        else if(b.equals("*"))
          r=r*a;
        else if(b.equals("/"))
          r=r/a;
        else System.out.println("四則演算記号の入力が間違っています");
        System.out.println(r);
      }
    }
  }
}

解答例(2
//名前:XXXX
//学生証番号:XXXX
//入力した演算子に応じて変数modeが変化し,modeの値によって数字入力直後に
//分岐するようにしました。ただ、数字入力の時に数字以外のものを入力すると
//エラーが起きるのに対して,どのように対応したらいいのか良くわかりません(
//わかれば再提出します)。
import java.io.*;
class Kadai1025{
  public static void main(String[] args) throws IOException{
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    String num;
    int mode=0;
    double result=0;
  toploop: for(;;){
      System.out.print("数字を入力してください(=を入力すると終了します)>");
      num=d.readLine();
      if(num.equals("=")) break;
      switch(mode){
        case 0:
          result=result+Double.parseDouble(num);   
          break;
        case 1:
          result=result-Double.parseDouble(num);
          break;
        case 2:
          result=result*Double.parseDouble(num);
          break;
        case 3:
          result=result/Double.parseDouble(num);
          break;
      }
      System.out.println(result);
      for(;;){
        System.out.print("演算子(+,-,*,/)を入力してください(=を入力すると終了し
ます)>");
        mode=5;
        num=d.readLine();
        if(num.equals("=")) break toploop;
        if(num.equals("+")) mode=0;    
        if(num.equals("-")) mode=1;   
        if(num.equals("*")) mode=2; 
        if(num.equals("/")) mode=3;
        if(mode!=5) break;
        if(mode==5)System.out.println("適切な演算子が入力されませんでした。");
      }    
    }
  }
}

解答例(3)
/* 簡易電卓プログラム

   学生番号 : XXXXX
   氏名 : XXXXX

コンストラクタを使って本格的なものにしようと思いましたが、時間がなくて
こんなモノになってしまいました(泣
月曜のオプションでリベンジします(笑

*/

import java.io.*;

class Kadai1025 {
  public static void main(String args[]) throws IOException {

    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      double answer;
      dentaku den = new dentaku();
      System.out.println("Please input a number!");
      answer = den.keisan(br , Double.parseDouble(br.readLine()));
      System.out.println("Final answer: " + answer);
    }

    catch (IOException e) {
      System.err.println("Error!");
    }
  }
}

class dentaku {
  double keisan(BufferedReader br , double val) throws IOException {
 
    try {
      System.out.println("answer: " + val);
      String s = br.readLine();
      char c = s.charAt(0);

      if ((Character.isDigit(c)) == true)
        val = keisan(br , (Double.parseDouble(s)));

      else if (c != '=') {

        switch (c) {
        case '+':
          val = keisan(br , (val + Double.parseDouble(br.readLine())));
          break;

        case '-':
          val = keisan(br , (val - Double.parseDouble(br.readLine())));
          break;

        case '*':
          val = keisan(br , (val * Double.parseDouble(br.readLine())));
          break;

        case '/':
          val = keisan(br , (val / Double.parseDouble(br.readLine())));
          break;

        default:
          System.err.println("Error!");
          break;
        }
      }
    }

    catch (IOException e) {
      System.err.println("Error!");
    }

    return val;
  }
}

解答例(4)
//名前: XXXXX
//学生証番号: XXXXX

//とりあえず配列を使ってみようとしてこういう形になりました。
//if~elseの羅列にしたくなかったのでswitchを使ったのですが
//caseの値にstringが使えないことから下のような回りくどい
//プログラムになってしまいました。
//配列を使用しない方がスマートに書けたかもしれません。

//それともう一つ。
//入力の順番に関して、下記(a)の行がなかったとき
//(最初に入力されるのが演算子の場合)には、プログラムは
//正常動作しているにも関わらず課題提出でエラーが出て
//困ってしまいました。入力サンプルを良く見れば
//すぐ気づいたのでしょうが、思わぬところで
//足をすくわれてしまいました。

import java.io.*;
class Kadai1025
{
  public static void main(String[] args) throws IOException
  {
    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
    double tmp = 0;
    String a , b;
    String s[] = {"+","-","*","/","="};
    boolean state = true;

    tmp = Double.parseDouble(buf.readLine()); //(a)
    while(state)
    {
      System.out.println(tmp);
      a = buf.readLine();
      b = buf.readLine();
      //if~elseを羅列するのがいやだったのでこんなやってみました
      //でも回りくどいですねぇ
      for(int i=0;i<5;i++)
      {
        if(a.equals(s[i]))
        {
          switch(i)
          {
            case 0:
              tmp+=Double.parseDouble(b);
              break;
            case 1:
              tmp-=Double.parseDouble(b);
              break;
            case 2:
              tmp*=Double.parseDouble(b);
              break;
            case 3:
              tmp/=Double.parseDouble(b);
              break;
            case 4:
              state = false;
          }
        }
      }
    }
  }
}


講評

解答例(1)の解答がこちらの想定した解答です.解答例(2)は,演算子を読ん だ直後に整数値 mode にしてswitch文を使っています.解答例(3)は文字列で はなく最初の文字を取り出すことにより switch文を使っています.解答例(4) はなかなか凝ったプログラムですが,演算子を見つけた後も,iのループを回 り続ける所など,ラベルつきbreak, continue文を使うともっとすっきりかけ るでしょう. report1025を実行できた人に関してはすべて,正しい解答になっていました.

オプション課題

上の課題だけでは満足できない人は,オプションとして,自分が使いやすい ように仕様を変更した電卓プログラムを作成するという課題も解答して, 10/30(月)の21:00までに,lectures.g00.cp1-ktanaka-W-Wed-5 のニュースグ ループに投稿すること.

解答例(1)

時間があったので少し改良してみました。
今度は関数電卓のように答えを覚えれるようにしました。
まだまだ三角関数などは入れることができますが同じ繰り返しなので省きました。
説明書
使える記号は+,-,*,/,log,e,pow1,pow2です。
logは自然対数値を e は自然対数の巾乗をpow1はAnsの〜乗をpow2は〜のAns乗を計算します。
log,eは
Ans=2.0       Ans=1.0
+             log
log     とも  Ans=0.0  使えます。
1
Ans=2.0
一度 = を入力するとAns[1]を覚えれます。
覚えたすぐ後にまた = を入力すると答えを覚えるのをやめ
答え同士の計算になります。ここでは 1 は Ans[1]のことです。
使える演算子はさっきまでと同じです
終了はもう一度 = を入力します。
プログラム
import java.io.*; 
class keisan{
  public static void main(String[] args) throws IOException{ 
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    int x;
    double y[]=new double[10000];
    toploop: for(x=1;;x++){
      double Ans;
      for(;;){
        String a=d.readLine();
        if(a.equals("="))break toploop;
        try{
	  Ans=Double.parseDouble(a);
        } 
        catch(java.lang.NumberFormatException e){
          System.out.println("数字を入力してください");
          continue;
        } 
        break;
      }
      System.out.println("Ans="+Ans);
      for(;;){
        String sign,suji;
        sign=d.readLine();
        double fig;
        if(sign.equals("="))break;     
        if(sign.equals("+")){
          for(;;){
            suji=d.readLine();
            if(suji.equals("log")){
              suji=d.readLine();
              try{
                fig=Double.parseDouble(suji);
              } 
              catch(java.lang.NumberFormatException e){
                System.out.println("数字を入力してください");
                continue;
              } 
              Ans=Ans+Math.log(fig);
              System.out.println("Ans="+Ans);
              break;
            }
            else if(suji.equals("e")){
              suji=d.readLine();
              try{
                fig=Double.parseDouble(suji);
              } 
              catch(java.lang.NumberFormatException e){
                System.out.println("数字を入力してください");
                continue;
              } 
              Ans=Ans+Math.exp(fig);
              System.out.println("Ans="+Ans);
              break;
            }
            else{
              try{
                fig=Double.parseDouble(suji);
              } 
              catch(java.lang.NumberFormatException e){
                System.out.println("数字を入力してください");
                continue;
              } 
              Ans=Ans+fig;
              System.out.println("Ans="+Ans);
              break;
            }
          }
        }
        else if(sign.equals("-")){
          for(;;){
            suji=d.readLine();
            if(suji.equals("log")){
              suji=d.readLine();
              try{
                fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans-Math.log(fig);
            System.out.println("Ans="+Ans);
            break;
          }
          else if(suji.equals("e")){
            suji=d.readLine();
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans-Math.exp(fig);
            System.out.println("Ans="+Ans);
            break;
          }
          else{
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans-fig;
            System.out.println("Ans="+Ans);
            break;
          }
        }
      }
      else if(sign.equals("*")){
        for(;;){
          suji=d.readLine();
          if(suji.equals("log")){
            suji=d.readLine();
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans*Math.log(fig);
            System.out.println("Ans="+Ans);
            break;
          }
          else if(suji.equals("e")){
            suji=d.readLine();
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans*Math.exp(fig);
            System.out.println("Ans="+Ans);
            break;
          }
          else{
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans*fig;
            System.out.println("Ans="+Ans);
            break;
          }
        }
      }
      else if(sign.equals("/")){
        for(;;){
          suji=d.readLine();
          if(suji.equals("log")){
            suji=d.readLine();
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans/Math.log(fig);
            System.out.println("Ans="+Ans);
            break;
          }
          else if(suji.equals("e")){
            suji=d.readLine();
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans/Math.exp(fig);
            System.out.println("Ans="+Ans);
            break;
          }
          else{
            try{
              fig=Double.parseDouble(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
            Ans=Ans/fig;
            System.out.println("Ans="+Ans);
            break;
          }
          }
        }
        else if(sign.equals("log")){
          Ans=Math.log(Ans);
          System.out.println("Ans="+Ans);
        }
        else if(sign.equals("e")){
          Ans=Math.exp(Ans);
          System.out.println("Ans="+Ans);
        } 
        else if(sign.equals("pow1")){
          for(;;){
            try{
              fig=Double.parseDouble(d.readLine());
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }        
            Ans=Math.pow(Ans,fig);
            System.out.println("Ans="+Ans);
            break;
	  }
        } 
	else if(sign.equals("pow2")){
          for(;;){
            try{
              fig=Double.parseDouble(d.readLine());
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }        
            Ans=Math.pow(fig,Ans);
            System.out.println("Ans="+Ans);
            break;
	  }
        }      
        else{
          System.out.println("記号を入力してください");
        }  
      }
      y[x]=Ans;
      System.out.println("Asn["+x+"]="+y[x]);
    }
    toploop: for(;;){
      double Ans;
      int n;          
      for(;;){
	String a=d.readLine();
	if(a.equals("="))break toploop;
        try{
          n=Integer.parseInt(a);
        } 
        catch(java.lang.NumberFormatException e){
          System.out.println("数字を入力してください");
          continue;
        } 
	if(n<1 || n >x-1){
          System.out.println("Ans["+n+"]は定義されてません"); 
	}
        else{
          Ans=y[n];
          break;
	}
      }
      System.out.println("Ans="+y[n]);
      for(;;){
        String sign,suji;
        sign=d.readLine();
        int fig;
        if(sign.equals("="))break toploop;     
        if(sign.equals("+")){
          for(;;){
            suji=d.readLine();
            if(suji.equals("log")){
              suji=d.readLine();
              try{
                fig=Integer.parseInt(suji);
              } 
              catch(java.lang.NumberFormatException e){
                System.out.println("数字を入力してください");
                continue;
              } 
              if(fig<1 || fig >x-1){
                System.out.println("Ans["+fig+"]は定義されてません"); 
	      }
              else{
                Ans=Ans+Math.log(y[fig]);
                System.out.println("Ans="+Ans);
                break;
	      }             
            }
            else if(suji.equals("e")){
              suji=d.readLine();
              try{
                fig=Integer.parseInt(suji);
              } 
              catch(java.lang.NumberFormatException e){
                System.out.println("数字を入力してください");
                continue;
              }
	      if(fig<1 || fig >x-1){
                System.out.println("Ans["+fig+"]は定義されてません"); 
	      }
              else{
                Ans=Ans+Math.exp(y[fig]);
                System.out.println("Ans="+Ans);
                break;
	      }       
            }
            else{
              try{
                fig=Integer.parseInt(suji);
              } 
              catch(java.lang.NumberFormatException e){
                System.out.println("数字を入力してください");
                continue;
              }
	      if(fig<1 || fig >x-1){
                System.out.println("Ans["+fig+"]は定義されてません"); 
	      }
              else{
                Ans=Ans+y[fig];
                System.out.println("Ans="+Ans);
                break;
	      }                           
            }
          }
        }
        else if(sign.equals("-")){
          for(;;){
            suji=d.readLine();
            if(suji.equals("log")){
              suji=d.readLine();
              try{
                fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans-Math.log(y[fig]);
              System.out.println("Ans="+Ans);
              break;
	    }                    
          }
          else if(suji.equals("e")){
            suji=d.readLine();
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans-Math.exp(fig);
              System.out.println("Ans="+Ans);
              break;
	    }             
          }
          else{
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans-y[fig];
              System.out.println("Ans="+Ans);
              break;
	    }             
          }
        }
      }
      else if(sign.equals("*")){
        for(;;){
          suji=d.readLine();
          if(suji.equals("log")){
            suji=d.readLine();
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans*Math.log(y[fig]);
              System.out.println("Ans="+Ans);
              break;
	    }             
          }
          else if(suji.equals("e")){
            suji=d.readLine();
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans*Math.exp(y[fig]);
              System.out.println("Ans="+Ans);
              break;
	    }             
          }
          else{
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans*y[fig];
              System.out.println("Ans="+Ans);
              break;
	    }             
          }
        }
      }
      else if(sign.equals("/")){
        for(;;){
          suji=d.readLine();
          if(suji.equals("log")){
            suji=d.readLine();
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans/Math.log(y[fig]);
              System.out.println("Ans="+Ans);
              break;
	    }             
          }
          else if(suji.equals("e")){
            suji=d.readLine();
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans/Math.exp(y[fig]);
              System.out.println("Ans="+Ans);
              break;
	    }
          }
          else{
            try{
              fig=Integer.parseInt(suji);
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Ans/y[fig];
              System.out.println("Ans="+Ans);
              break;
	    }           
          }
          }
        }
        else if(sign.equals("log")){
          Ans=Math.log(Ans);
          System.out.println("Ans="+Ans);
        }
        else if(sign.equals("e")){
          Ans=Math.exp(Ans);
          System.out.println("Ans="+Ans);
        } 
	else if(sign.equals("pow1")){
          for(;;){
            try{
              fig=Integer.parseInt(d.readLine());
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            } 
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Math.pow(Ans,y[fig]);
              System.out.println("Ans="+Ans);
              break;
	    }       
	  }
        } 
	else if(sign.equals("pow2")){
          for(;;){
            try{
              fig=Integer.parseInt(d.readLine());
            } 
            catch(java.lang.NumberFormatException e){
              System.out.println("数字を入力してください");
              continue;
            }
	    if(fig<1 || fig >x-1){
              System.out.println("Ans["+fig+"]は定義されてません"); 
	    }
            else{
              Ans=Math.pow(y[fig],Ans);
              System.out.println("Ans="+Ans);
              break;
	    }        
	  }
	}
        else{
          System.out.println("記号を入力してください");
        }  
      }    
    }      
  }
}

解答例(2)
10月25日のオプション課題:

電卓プログラムというと、改造していけば数式をそのまま計算できるようにな
り、変数が使えるようになり(bcコマンドみたいに)、果てはプログラム言語に
まで発展しかねませんが、ここでは「普通の」電卓(関数電卓でない)の便利さ
を活かしつつすこし発展させ、メモリを10個使えるようにしたプログラムをつ
くりました。

使い方は以下の通りです。

起動:

java OptKadai1025
java OptKadai1025 

2個目の例では、数値があらかじめ入力された状態で起動されます。

起動後の入力 (大文字と小文字は区別しないが、余計なスペースはだめ):

+<数値>     現在の数値に加算する
<数値>      現在の数値に加算する(省略形)
-<数値>     現在の数値に減算する
*<数値>     現在の数値に乗算する
/<数値>     現在の数値に除算する
r           現在の数値の正の平方根を取る
c           現在の数値を0.0にする
q           終了する
mp          メモリの内容を表示する
m=       番目のメモリを現在の数値に設定する
m+       番目のメモリに現在の数値を加算する
m-       番目のメモリに現在の数値を減算する
m*       番目のメモリに現在の数値を乗算する
m/       番目のメモリに現在の数値を除算する
mc       番目のメモリを0.0にする
mr       現在の数値を番目のメモリの値にする

 (は0から9までの数)

以下、コードです。

########################## プログラムの始まり [OptKadai1025.java]

import java.io.*;

class OptKadai1025
{
  public static void main(String[] args) throws IOException
  {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      double acc = 0.0,
	mem[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };

      if (args.length > 1) // 引数は0個か1個
	{
	  System.err.println("Too many arguments; " +
			     "excessive arguments will be ignored.");
	}

      if (args.length >= 1) // 引数は数値と見做して累算器を初期化
	{
	  try
	    {
	      acc = Double.parseDouble(args[0]);
	    }
	  catch (NumberFormatException nfe)
	    {
	      System.err.println("Bad argument; ignored.");
	    }
	}

      while (true) // 無限ループ
      {
	System.out.print("[ " + acc + " ] "); // プロンプト表示
	System.out.flush();
	char inputChars[] = br.readLine().toCharArray();
	
	if (inputChars.length > 0) // 空行は無視
	  {
	    switch (inputChars[0])
	      {
	      case '+':
	      case '-':
	      case '*':
	      case '/':
		try
		  {
		    double inputNum = Double.parseDouble
		      (String.valueOf(inputChars, 1, inputChars.length - 1));
		    switch (inputChars[0])
		      {
		      case '+':
			acc += inputNum;
			break;
		      case '-':
			acc -= inputNum;
			break;
		      case '*':
			acc *= inputNum;
			break;
		      case '/':
			if (inputNum != 0.0)
			  // オーバーフローは強制終了にまかせるが0除算は確認
			  {
			    acc /= inputNum;
			  }
			else
			  {
			    System.err.println("Cannot divide by zero.");
			  }
			break;
		      }
		  }
		catch (NumberFormatException nfe)
		  {
		    System.err.println("Syntax error: bad number format.");
		  }
		break;
	      case 'R': // acc = sqrt(acc)
	      case 'r':
		if (inputChars.length == 1)
		  {
		    acc = Math.sqrt(acc);
		  }
		else
		  {
		    System.err.println("Syntax error.");
		  }
		break;
	      case 'C': // acc = 0.0
	      case 'c':
		if (inputChars.length == 1)
		  {
		    acc = 0.0;
		  }
		else
		  {
		    System.err.println("Syntax error.");
		  }
		break;
	      case 'M': // メモリ操作
	      case 'm':
		if (inputChars.length == 2)
		  {
		    switch (inputChars[1])
		      {
		      case 'P':
		      case 'p':
			System.out.print(" M0 = " + mem[0]);
			System.out.print("\tM1 = " + mem[1]);
			System.out.print("\tM2 = " + mem[2]);
			System.out.print("\tM3 = " + mem[3]);
			System.out.println("\tM4 = " + mem[4]);
			System.out.print(" M5 = " + mem[5]);
			System.out.print("\tM6 = " + mem[6]);
			System.out.print("\tM7 = " + mem[7]);
			System.out.print("\tM8 = " + mem[8]);
			System.out.println("\tM9 = " + mem[9]);
			break;
		      default:
			System.err.println("Syntax error.");
			break;
		      }
		  }
		else if (inputChars.length == 3)
		  {
		    try
		      {
			int memInd = Integer.parseInt
			  (String.valueOf(inputChars, 1, 1));
			switch (inputChars[2])
			  {
			  case '=':
			    mem[memInd] = acc;
			    break;
			  case '+':
			    mem[memInd] += acc;
			    break;
			  case '-':
			    mem[memInd] -= acc;
			    break;
			  case '*':
			    mem[memInd] *= acc;
			    break;
			  case '/':
			    if (acc != 0.0)
			      // オーバーフローは強制終了にまかせるが
			      // 0除算は確認
			      {
				mem[memInd] /= acc;
			      }
			    else
			      {
				System.err.println("Cannot divide by zero.");
			      }
			    break;
			  case 'C':
			  case 'c':
			    mem[memInd] = 0.0;
			    break;
			  case 'R':
			  case 'r':
			    acc = mem[memInd];
			    break;
			  default:
			    System.err.println("Syntax error.");
			    break;
			  }
		      }
		    catch (NumberFormatException nfe)
		      {
			System.err.println("Syntax error.");
		      }
		  }
		else
		  {
		    System.err.println("Syntax errer.");
		  }
		break;
	      case 'Q': // 終了
	      case 'q':
		if (inputChars.length == 1)
		  {
		    System.exit(0);
		  }
		else
		  {
		    System.err.println("Syntax error.");
		  }
	      default: // 数値だけなら加算
		try
		  {
		    double inputNum = Double.parseDouble
		      (String.valueOf(inputChars));
		    acc += inputNum;
		  }
		catch (NumberFormatException nfe)
		  {
		    System.err.println("Syntax error: bad number format.");
		  }
		break;
	      } // switch
	  } // if (inputChars.length > 0) 
      } // while (true)
  } // main()
} // class OptKadai1025

########################## プログラムの終り


講評

解答例(1)は500行を超える力作ですが,今日の講義で扱うメソッドを使って 書き直すとおそらく1/3程度の長さにすることができると思います. 解答例(2)は非常に綺麗で読みやすいプログラムになっています.

今日の課題

上のURLは,今日(11/1)の17:00 までは
Forbidden

You don't have permission to access /~ktanaka/programming00/kadai1101.html on this server.
とうメッセージが出てアクセ スできないはずである.17:00以降にも同様のエラーが出る時は,Shiftキーを 押しながら,再読み込み(Reload)を押してみること.
次へ進む