ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Java のプログラム (5)

2011-06-29 22:27:49 | 暮らし
記事一覧


P20: 逆ポーランド記法の計算
//-------------------------------------------
package chk;
class Stack {
    int[] data; int sp;
    Stack(int n) {data = new int[n]; sp=0;}
    void err(){System.out.println("?");}
    void push(String s){
        if(sp >= data.length){err(); return;}
        data[sp] = Integer.parseInt(s); sp++;
    }
    void push(int i){
        if(sp >= data.length){err(); return;}
        data[sp] = i; sp++;
    }
    int pop(){
        if(sp <=0){err(); return 0;}
        sp--; return data[sp];
    }
}
public class Main {
    public static void main(String[] args) {
        Stack stk = new Stack(10);
        String[] x = {"12", "34", "+",
                      "10", "*"};
        int i, j, k; char c;
        for(i=0; i < x.length; i++){
            System.out.println(x[i]);
        }
        for(i=0; i < x.length; i++){
            c = x[i].charAt(0);
            if('0' <= c && c <= '9'){
                stk.push(x[i]);
            }else{
                k = stk.pop(); j = stk.pop();
                switch(c){
                    case '+': j += k; break;
                    case '-': j -= k; break;
                    case '*': j *= k; break;
                    case '/': j /= k; break;
                }
                stk.push(j);
            }
        }
        if(stk.sp != 1) stk.err();
        else System.out.println(stk.data[0]);
    }
}
//-------------------------------------------
run:
12
34
+
10
*
460
構築成功 (合計時間: 0 秒)
//-------------------------------------------

 
2. 基本クラス

「Cから見たC++」で述べたように,基本クラスは
構造体にメンバ関数を付加したものです.Java の
場合は「メンバ関数」を「メソッド」といいます.

P20 は逆ポーランド記法で書かれた式を計算するプ
ログラムなので,まず逆ポーランド記法について説
明します[2-1].プログラムで使う通常の計算式
  (12 + 34) * 10
は,逆ポーランド記法では
  12  34  +  10  *
となります.逆に逆ポーランド記法の
  1  2  3  4  5  +  +  +
は
  1 + (2 + (3 + (4 + 5))) 
であり,
  1  2  +  3  +  4  +  5  +
は
  (((1 + 2) + 3) + 4) + 5
を意味します.[2-1]で説明されているように逆ポ
ーランド記法で書かれた数式は 通常スタックを用
いて計算します.

P20 の Stack クラスを見てください.以下に補足
説明を記します.
・data は整数の配列への参照.サイズはコンスト
  ラクタの引数で指定.
・sp はスタックポインタで,プッシュ後に sp++.
  x[sp] を見たいときは仕様変更が必要です.
・文字列を引数とする push() は入力用.整数を
  引数とする push() は計算結果格納用です.

main() では逆ポーランド記法の式は字句解析済み
のデータが String型 のデータの配列にあるとして
手抜き処理をしています.
・式に誤りがあっても例外処理はせずに"?"を表示
  して処理を続行します.また,誤りを見逃すこと
  もあります.
・計算結果は一般の整数ですが,入力データは負で
  ない整数に限定しています.「-123」を入力した
  いときは「0 - 123」を使います.
・"12 34 + 10 *" のような文字列を {"12", "34",
  "+", "10", "*"} のように分解する関数は自分で
  考えてください.


[2-1] 逆ポーランド記法 - Wikipedia
  http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95
[2-2] とほほのJava入門/クラス
  http://www.tohoho-web.com/java/class.htm
  デストラクタは不要と考えられています。
[2-3] スタック - Wikipedia
  http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF


progCpp.pdf

2011-06-23 22:42:17 | 暮らし

Java の基本クラス,派生クラスの話の前に「Cから見たC++」の復習用に progCpp-0.html ~ progCpp-7.html から  progCpp.pdf を作って upload しました.「記事一覧」の「Cから見たC++」をクリックすれば表示されます.

プログラムはブログに書き込むとき「<」を「&lt;」にしていますが,説明文等を修正したとき「&lt;」に戻し忘れ,「<」で始まる部分がHTMLのタグとみなされて消滅していることがあります(<stdio.h>等,「Java のプログラム (4)」でも「i<m.length;」の「<」以降が消えました.) <-- 画面コピーでそのままソースファイルとして使えるように半角の「<」で頑張っています.(ただし,この文の「<」は全角)

例示したプログラムがうまく動作しない場合,ご一報頂ければ幸いです.


Java のプログラム (4)

2011-06-20 18:26:18 | 暮らし
記事一覧


P15: 多重定義
//-------------------------------------------
package chk;
public class Main {
    public static void main(String[] args) {
        int x[] = {30, 11, 42, 83, 24, 75};
        System.out.println(maxi(x[1], x[2]));
        System.out.println("x[i]<=" + maxi(x));
    }
    public int maxi(int m, int n){
        if(m>n) return m; else return n;
    }
    public int maxi(int[] m){
        int i, n;
        n=m[0];
        for(i=1; i<m.length; i++){
            if(m[i]>n) n = m[i];
        }
        return n;
    }
}
//-------------------------------------------
run:
42
x[i]<=83
構築成功 (合計時間: 0 秒)
//-------------------------------------------

 
C++ や Java には異なる関数に同じ関数名を用いる
ことができます.オーバーライドについては「派生
クラス」で説明します.P15 はオーバーロードの例
です.maxi(x[1], x[2]) のときは maxi(int, int)
が,maxi(x) のときは maxi(int[]) が呼ばれます.
・m が配列の参照のとき,配列の長さは m.length
  です.Cのポインタと異なり実行時も長さの情報
  をもっているので,「i<m.length」を「i <= m.
  length」に変更すると例外が発生します.
//-------------------------------------------
run:
42
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
        at chk.Main.maxi(Main.java:15)
        at chk.Main.main(Main.java:6)
Java Result: 1
構築成功 (合計時間: 0 秒)
//-------------------------------------------


[1-17] 多重定義 - Wikipedia
  http://ja.wikipedia.org/wiki/%E5%A4%9A%E9%87%8D%E5%AE%9A%E7%BE%A9
[1-18] Javaの道:クラス(8.オーバーライドとオーバーロード)
  http://www.javaroad.jp/java_class8.htm
---------------------------
[1-19] 9.4 Abstract Method Declarations
  http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.4
・9.4 抽象メソッドの宣言,9.4.1 継承とオーバーライド, 9.4.2 オーバーロード(Google翻訳)
  http://translate.google.co.jp/translate?hl=ja&langpair=en%7Cja&u=http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
・The Java Language Specification, Third Edition 目次 
  http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html