ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの※製作途中 GUIを使った電卓の作り方

  • mixiチェック
  • このエントリーをはてなブックマークに追加
画像のようなGUIを使った電卓で

1 + 1 = 2
1 + 1 + 3 = 5
1 + 1 + 3 * 4 = 20 (数学的には14)

などの計算ができるようにせよ、という課題で

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import java.util.NoSuchElementException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
// レイアウトマネージャーを使用するため
// Swingパッケージを使用するために必要

public class S7512443_Kadai7_5 {

public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
}

class MyFrame extends JFrame implements ActionListener {
// ボタン
JPanel panel1, panel2;
JButton btn_0, btn_1, btn_2, btn_3, btn_4, btn_5;
JButton btn_6, btn_7, btn_8, btn_9, btn_dot;
JButton btn_plus, btn_minus, btn_mul, btn_div;
JButton btn_eql;
LinkedList<Double> fifo_operand = new LinkedList<Double>();

// コンストラクタ
MyFrame() {
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(4, 3));
panel1.add(btn_7 = new JButton("7"));
panel1.add(btn_8 = new JButton("8"));
panel1.add(btn_9 = new JButton("9"));
panel1.add(btn_4 = new JButton("4"));
panel1.add(btn_5 = new JButton("5"));
panel1.add(btn_6 = new JButton("6"));
panel1.add(btn_1 = new JButton("1"));
panel1.add(btn_2 = new JButton("2"));
panel1.add(btn_3 = new JButton("3"));
panel1.add(btn_0 = new JButton("0"));
panel1.add(btn_dot = new JButton("."));

// ボタンのリスナ登録
btn_0.addActionListener(this);
btn_1.addActionListener(this);
btn_2.addActionListener(this);
btn_3.addActionListener(this);
btn_4.addActionListener(this);
btn_5.addActionListener(this);
btn_6.addActionListener(this);
btn_7.addActionListener(this);
btn_8.addActionListener(this);
btn_9.addActionListener(this);
btn_dot.addActionListener(this);

JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(4, 1));
panel2.add(btn_plus = new JButton("+"));
panel2.add(btn_minus = new JButton("-"));
panel2.add(btn_mul = new JButton("*"));
panel2.add(btn_div = new JButton("/"));

// ボタンのリスナ登録
btn_plus.addActionListener(this);
btn_minus.addActionListener(this);
btn_mul.addActionListener(this);
btn_div.addActionListener(this);

getContentPane().add(panel1);
getContentPane().add(panel2);
getContentPane().add(BorderLayout.CENTER, panel1);
getContentPane().add(BorderLayout.EAST, panel2);
getContentPane().add(BorderLayout.SOUTH, btn_eql = new JButton("="));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(230, 300);
setVisible(true);

// ボタンのリスナ登録
btn_eql.addActionListener(this);
}

String op = "";
Double op1;
// ボタンが押された時の処理(リスナ)
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btn_0) {
op = op + "0";
System.out.print("0");
} else if(e.getSource() == btn_1) {
op = op + "1";
System.out.print("1");
} else if(e.getSource() == btn_2) {
op = op + "2";
System.out.print("2");
} else if(e.getSource() == btn_3) {
op = op + "3";
System.out.print("3");
} else if(e.getSource() == btn_4) {
op = op + "4";
System.out.print("4");
} else if(e.getSource() == btn_5) {
op = op + "5";
System.out.print("5");
} else if(e.getSource() == btn_6) {
op = op + "6";
System.out.print("6");
} else if(e.getSource() == btn_7) {
op = op + "7";
System.out.print("7");
} else if(e.getSource() == btn_8) {
op = op + "8";
System.out.print("8");
} else if(e.getSource() == btn_9) {
op = op + "9";
System.out.print("9");
} else if(e.getSource() == btn_dot) {
op = op + ".";
System.out.print(".");
} else if(e.getSource() == btn_plus) {
// 文字列をDouble型に変換
op1 = Double.parseDouble(op);
fifo_operand.offer(op1); // FIFOバッファへ数値を格納
fifo_operator.offer("+"); // FIFOバッファへ演算子を格納
op = ""; // 数値を初期化
System.out.print("+");
} else if(e.getSource() == btn_minus) {
// 文字列をDouble型に変換
op1 = Double.parseDouble(op);
fifo_operand.offer(op1); // FIFOバッファへ数値を格納
fifo_operator.offer("-"); // FIFOバッファへ演算子を格納
op = ""; // 数値を初期化
System.out.print("-");
} else if(e.getSource() == btn_mul) {
// 文字列をDouble型に変換
op1 = Double.parseDouble(op);
fifo_operand.offer(op1); // FIFOバッファへ数値を格納
fifo_operator.offer("*"); // FIFOバッファへ演算子を格納
op = ""; // 数値を初期化
System.out.print("*");
} else if(e.getSource() == btn_div) {
// 文字列をDouble型に変換
op1 = Double.parseDouble(op);
fifo_operand.offer(op1); // FIFOバッファへ数値を格納
fifo_operator.offer("/"); // FIFOバッファへ演算子を格納
op = ""; // 数値を初期化
System.out.print("/");
} else if(e.getSource() == btn_eql) {
// 文字列をDouble型に変換
op1 = Double.parseDouble(op);
fifo_operand.offer(op1); // FIFOバッファへ数値を格納
op = ""; // 数値を初期化
System.out.print("=");
Calc();
}
}
public void Calc() {
double op1=0.0, op2=0.0;
double result=0.0;
String operand;
try {
if(fifo_operand.size()>1) { // 最初の2つの数値を読み込む
op1 = fifo_operand.remove();
op2 = fifo_operand.remove();
} else if(fifo_operand.size()==1) {
result = fifo1.remove();
System.out.println(result);
return;
}

while(true) {
// 演算子をFIFOバッファから取り出す
operator = fifo_operator.remove();
if(operand.equals("+")) { // 演算子が加算の時
result = op1 + op2;
} else if(operand.equals("-")) { // 演算子が減算の時
result = op1 - op2;
} else if(operand.equals("*")) { // 演算子が乗算の時
result = op1 * op2;
} else if(operand.equals("/")) { // 演算子が徐算の時
result = op1 / op2;
}

op1 = result; // 最初の2項の演算結果をop1へ格納する
if(!fifo_operand.isEmpty()) {
op2 = fifo_operand.remove();
} else {
break;
}
}
System.out.println(result);

} catch(NoSuchElementException x) {
System.out.println(x);
}
}
}

というソースを書きましたが、うまく動きません。どこを直したらよいでしょうか。回答よろしくお願いいたします。

コメント(2)

処理をすべてみていませんが、四則演算を最初から順に処理しているため、思った通りの結果にたらないのです。
"逆ポーランド"で検索すると解決できると思います。
こんにちわ。勉強のため調べてみました。ネットにありました。以下のサイトをご覧ください。
http://msyk.net/keio/JavaBook/eclipse-indigo/ch12.html

手っ取り早く動かすには、最後の方に記述されているDentakuFrameをそのままコピペして
ソースの最後にmainを記述すれば、動作しますよ。

public class DentakuFrame extends JFrame {

  ・・・・・・・・・

  public static void main(String[] args) {
DentakuFrame df = new DentakuFrame();
}
}
参考になれば幸いです。ではまた。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング