Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

電卓アプレットについてうまくいかない点が・・・

現在大学の授業課題で電卓アプレットを作成しています。
授業実施回数は5回で軽くアプレットやjavaについて
触れただけですので、かなりソースは荒いといいますか、
そこはご了承ください。

さて、本題ですがまずイコールの部分です。
イコールを押すと演算子の入力がある場合、演算を実行
して、その結果を表示するようにしているのですが
その結果が出てきません。演算前の格納されている値が
表示されてしまいます。
もうひとつは 1÷0 といった0での割り算を禁止する
ものです。割る値が0なら"can not divide by zero"
と表示するように組んでいるのですが、どうにも
そのif文に入らないようです。

どなたかご教授お願い致します。

----------以下ソースコード-------------------

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.applet.Applet.*;

public class dentaku extends Applet
    implements ActionListener{

    //  各ボタンの宣言
        JButton b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,bClear,
        bPlus, bMinus, bKakeru, bWaru, bIkoru,
        bAllclear, bSignchange,
        bX, bY;
    //  電卓の入力値や結果を出すテキストフィールド
    JTextField tf;
    //  電卓全体の構成をするパネル
    JPanel p_Border = new JPanel(new BorderLayout());
    //  電卓の各ボタンを構成するパネル
    JPanel p_Grid = new JPanel(new GridLayout(4,5));
        
    //  表示用文字列str,入力値を格納するstr0,str1
    //  尚,str0には演算結果も格納する
    String str = new String("0");
    String str0= new String("0");
    String str1= new String("0");

    //  変数lは文字列の長さ
    static int l=0;
    //  変数kは最初の演算子と次の演算子を格納する
    static int[] k = {0,0};
    //  変数dは文字列をdouble型に変換し格納する
    static double[] d = {0,0};
    //  変数zはエラー時、1を出す
    static int z=0;
    //  変数iはデータの数
    static int i=0;

    public void init(){
        //  ボタンと初期値設定
        tf=new JTextField(11);
        b0=new JButton("0");
        b1=new JButton("1");
        b2=new JButton("2");
        b3=new JButton("3");
        b4=new JButton("4");
        b5=new JButton("5");
        b6=new JButton("6");
        b7=new JButton("7");
        b8=new JButton("8");
        b9=new JButton("9");
        bClear=new JButton("C");
        bAllclear=new JButton("AC");
        bPlus=new JButton("+");
        bMinus=new JButton("-");
        bKakeru=new JButton("×");
        bWaru=new JButton("÷");
        bIkoru=new JButton("=");
        bSignchange=new JButton("+/-");
        bX=new JButton("null");
        bY=new JButton("null");

        //  全ボタンにアクションリスナー設定
        b0.addActionListener(this);
        b1.addActionListener(this);
        b2.addActionListener(this);
        b3.addActionListener(this);
        b4.addActionListener(this);
        b5.addActionListener(this);
        b6.addActionListener(this);
        b7.addActionListener(this);
        b8.addActionListener(this);
        b9.addActionListener(this);
        bClear.addActionListener(this);
        bAllclear.addActionListener(this);
        bPlus.addActionListener(this);
        bMinus.addActionListener(this);
        bKakeru.addActionListener(this);
        bWaru.addActionListener(this);
        bIkoru.addActionListener(this);
        bSignchange.addActionListener(this);

        //  グリッドレイアウト(p_Gridパネル)に各ボタンを配置
        p_Grid.add(b7);
        p_Grid.add(b8);
        p_Grid.add(b9);
        p_Grid.add(bClear);
        p_Grid.add(bAllclear);
        p_Grid.add(b4);
        p_Grid.add(b5);
        p_Grid.add(b6);
        p_Grid.add(bKakeru);
        p_Grid.add(bWaru);
        p_Grid.add(b1);
        p_Grid.add(b2);
        p_Grid.add(b3);
        p_Grid.add(bPlus);
        p_Grid.add(bMinus);
        p_Grid.add(b0);
        p_Grid.add(bX);
        p_Grid.add(bY);
        p_Grid.add(bSignchange);
        p_Grid.add(bIkoru);

        //  全体のパネルを構成
        p_Border.add(tf, BorderLayout.NORTH);
        p_Border.add(p_Grid, BorderLayout.CENTER);
        //  アプレット自身に張り付け
        add(p_Border);
    }

    public void actionPerformed(ActionEvent e){

        //  オールクリアが押された際、全データの初期化
        if(e.getSource() == bAllclear){
            str="0";
            str0="0";
            str1="0";
            k[0]=0;
            k[1]=0;
            d[0]=0.00;
            d[1]=0.00;
            z=0;
            i=0;
        }
        
        //  エラーコードが出ているならオールクリア以外反応させない
        if(z==1){
            return;
        }
        //  クリアの場合、現在の入力中文字列と演算子を初期化
        if(e.getSource() == bClear){
            str="0";
            if(i==0){}
            else{
                k[i-1]=0;
                i-=1;
            }
        }

        //  数値が押された時の動作 ※0から9
        //  初期値(0)がstrの場合 文字列を直接代入
        if(str.equals("0")){
            if(e.getSource() == b0)
                str=("0");
            else if(e.getSource() == b1)
                str=("1");
            else if(e.getSource() == b2)
                str=("2");
            else if(e.getSource() == b3)
                str=("3");
            else if(e.getSource() == b4)
                str=("4");
            else if(e.getSource() == b5)
                str=("5");
            else if(e.getSource() == b6)
                str=("6");
            else if(e.getSource() == b7)
                str=("7");
            else if(e.getSource() == b8)
                str=("8");
            else if(e.getSource() == b9)
                str=("9");
            tf.setText(str);
            return;
        }
        //  strに0以外の値がある場合、文字列追加
        else{
            if(e.getSource() == b0)
                str+=0;
            else if(e.getSource() == b1)
                str+=1;
            else if(e.getSource() == b2)
                str+=2;
            else if(e.getSource() == b3)
                str+=3;
            else if(e.getSource() == b4)
                str+=4;
            else if(e.getSource() == b5)
                str+=5;
            else if(e.getSource() == b6)
                str+=6;
            else if(e.getSource() == b7)
                str+=7;
            else if(e.getSource() == b8)
                str+=8;
            else if(e.getSource() == b9)
                str+=9;
            tf.setText(str);
        }

        //  オーバーフローの場合、zにエラーコード1を出す
        l=(str.length());
        if(l>10){
            str="Over flow";
            tf.setText(str);
            str="0";
            z=1;
            return;
        }
        if(e.getSource() == bIkoru){
        // ---------------------------ここが問題点1です-----------------------
            if(i==0)
                tf.setText(str);
            else if(i==1){
                enzan();
                tf.setText(str0);
            }
        }

        //  +の場合
        if(e.getSource() == bPlus){
            if(i==0)         // データ数が0ならstr0へ
                str0=str;
            else             // データ数が1ならstr1へ
                str1=str;
            k[i]=1;          // 演算子を表す数字を格納
            i+=1;            // データ数加
            str="";
        }
        if(e.getSource() == bMinus){
            if(i==0)
                str0=str;
            else
                str1=str;
            k[i]=2;
            i+=1;
            str="";
        }
        if(e.getSource() == bKakeru){
            if(i==0)
                str0=str;
            else
                str1=str;
            k[i]=3;
            i+=1;
            str="";
        }
        if(e.getSource() == bWaru){
            if(i==0)
                str0=str;
            else
                str1=str;
            k[i]=4;
            i+=1;
            str="";
        }
        // +/-が押された時
        if(e.getSource() == bSignchange){
            d[0] = Double.parseDouble(str);
            d[0] = d[0] * (-1);
            str = Double.toString(d[0]);
            tf.setText(str);
        }
        if(i==2)
            enzan();

    }
        //演算用メソッド
        public void enzan(){
            // 文字列としてあるデータstr0とstr1をdouble型へ変換、代入
            d[0] = Double.parseDouble(str0);
            d[1] = Double.parseDouble(str1);
            
            switch(k[0]){
            // 加算の場合
            case 1:
                // 加算を実行、strへ文字列に変換して格納
                d[0]=d[0]+d[1];
                str = Double.toString(d[0]);
                
                str0=str;  // 演算結果をstr0に保持
                i=1;       // データ数を1にセット
                k[0]=k[1]; // 次に指定されている演算子に更新
                
                str1="0";  // strの初期化
                k[1]=0;    // 演算子内容のk[1]を初期化
                tf.setText(str);
                str="";
                break;
                
            case 2:
                d[0]=d[0]-d[1];
                str = Double.toString(d[0]);
                
                str0=str;  // 演算結果をstr0に保持
                i=1;       // データ数を1にセット
                k[0]=k[1]; // 次に指定されている演算子に更新
                
                str1="0";  // strの初期化
                k[1]=0;    // 演算子内容のk[1]を初期化
                tf.setText(str);
                str="";
                break;
                
            case 3:
                d[0]=d[0]*d[1];
                str = Double.toString(d[0]);
                
                str0=str;  // 演算結果をstr0に保持
                i=1;       // データ数を1にセット
                k[0]=k[1]; // 次に指定されている演算子に更新
                
                str1="0";  // strの初期化
                k[1]=0;    // 演算子内容のk[1]を初期化
                tf.setText(str);
                str="";
                break;
                
            case 4:
                // -------------------このif文が問題点2です --------------------------
                if(str1.equals("0")){
                    tf.setText("Can not divide by zero");
                    z=1;
                    return;
                }
                d[0]=d[0]/d[1];
                str = Double.toString(d[0]);
                
                str0=str;  // 演算結果をstr0に保持
                i=1;       // データ数を1にセット
                k[0]=k[1]; // 次に指定されている演算子に更新
                
                str1="0";  // strの初期化
                k[1]=0;    // 演算子内容のk[1]を初期化
                tf.setText(str);
                str="";
                break;
            }
        }
}

1

回答

5742

閲覧

1件の回答

評価

0

例えば、System.out.println(???);を挟んで実行するだけで、その場所に到達しているか、その時点での変数や計算結果が何かを確認することができる。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。