Let's try programming

さくら電卓

  • HOME »
  • さくら電卓
sakura2電卓アプリは、Javaを学習始めの頃に一度チャレンジしたのですが挫折しました(´ω`;)
完成はしたのですが、実行してみると不具合の嵐。
コードの中身の大半は、サイトに載ってるサンプルコードを切り取ってパッチワークしたので、私自身読んでも理解できないものなってしまいました。
中身が理解できてないので結局、不具合もどこで発生してるか把握もできない状況になった苦い記憶があります。
今回はそのリベンジ。
Android_Javaで作成してます。
画像は電卓のレイアウト画像。
デザインはさくらです(*´ェ`*)
 
 
 
 
 (機能&特徴)
StringBuilderを使い、押された数字を追加していく
テキスト表示の数字と演算に使用する数値を使い分け、型を変換させる。
押された演算子を表示させる。
 
コードはこちらです。
私がわかるコードを書くとこうなりました。
冗長なのはわかってるのですが、上手い方法が思いつかず。
今後、修正していかないといけない課題です。
 
※変数名に使ってるは、大体英単語の略です。
operand(演算)→opeなど
MyCalc.java
package com.example.sampe.mycalc;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;



public class MyCalc extends ActionBarActivity {

    private StringBuilder sb;                      //数字をつなげる為の変数
    private double totalNum;                       //電卓の計算結果をストックする変数
    private double addNum;                         //追加する数値
    private double ans;                            // 計算結果変数
    private double s = 8;                          //消費税率
    private int ope = 0;                           //演算子識別コード
    private boolean push = false;                  //演算子ボタンを押したかを判別する真偽
    private TextView tv;                           //表示画面のテキスト宣言
    private TextView tvOpe;             //演算子の押下確認がわからなく不便だった為、追加。


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_calc);

        sb = new StringBuilder();
        tv = (TextView) findViewById(R.id.textLabel);
        tvOpe = (TextView)findViewById(R.id.textLabelOpe);
    }

    public void button1(View view) {
        if (push == true) {

            sb.append("1");        
      
  /* 1回目入力と2回目入力の数字がつながる問題が起こる。
   tvじゃなくてsbを消す必要があった。演算子処理にsb.delete(0,9)を入れたら解決*/

                  tv.setText(sb);
        } else {
            sb.append("1");
            tv.setText(sb);
        }
    }

    public void button2(View view) {
        if (push == true) {

            sb.append("2");
            tv.setText(sb);
        } else {
            sb.append("2");
            tv.setText(sb);

        }
    }

    public void button3(View view) {
        if (push == true) {

            sb.append("3");
            tv.setText(sb);
        } else {
            sb.append("3");
            tv.setText(sb);

        }
    }

    public void button4(View view) {
        if (push == true) {

            sb.append("4");
            tv.setText(sb);
        } else {
            sb.append("4");
            tv.setText(sb);

        }
    }

    public void button5(View view) {
        if (push == true) {

            sb.append("5");
                 tv.setText(sb);
        } else {
            sb.append("5");
            tv.setText(sb);

        }
    }

    public void button6(View view) {
        if (push == true) {

            sb.append("6");
                   tv.setText(sb);
        } else {
            sb.append("6");
            tv.setText(sb);

        }
    }

    public void button7(View view) {
        if (push == true) {

            sb.append("7");
                tv.setText(sb);
        } else {
            sb.append("7");
            tv.setText(sb);

        }
    }

    public void button8(View view) {
        if (push == true) {

            sb.append("8");
                  tv.setText(sb);
        } else {
            sb.append("8");
            tv.setText(sb);

        }
    }

    public void button9(View view) {
        if (push == true) {

            sb.append("9");
              tv.setText(sb);
        } else {
            sb.append("9");
            tv.setText(sb);

        }
    }


    public void button0(View view) {

        if (0 == sb.length()) {
            tv.setText("0");
        } else {
            sb.append("0");
            tv.setText(sb);
        }
    }

    public void button00(View view){
        if (0 == sb.length()) {
            tv.setText("0");
        } else {
            sb.append("00");
            tv.setText(sb);
        }
    }

    //----特殊ボタン処理----
    //小数点                                       
    public void button_com(View view) {
        if (0 == sb.length()) {
            tv.setText("0");

 /*indexOfで.を文字列から検索。
存在しない場合は-1を返すので-1を比較設定にする。
*/
        } else if (-1 == sb.indexOf(".", 0)) {    
            sb.append(".");
            tv.setText(sb);

            }
        }


    public void buttonP(View view){
            if (0 == sb.length()) {
                tv.setText("0");
            } else {

                String num = sb.toString();
                addNum = Double.parseDouble(num);
                ans = (addNum + totalNum) / 100;
                tv.setText(String.valueOf(ans));

            }
        }
    //税込みボタン
    public void buttonT(View view) {
        if (0 == sb.length()) {
            tv.setText("0");
        }else{
            String num = sb.toString();
            addNum = Double.parseDouble(num);
            if (push == false) {
                ans = (addNum * (100 + s)) / 100;
                tv.setText(String.valueOf(ans));
            }
        }
    }

    //CEボタン
    public void buttonCE(View view) {
        tv.setText("0");
        tvOpe.setText("");
        addNum = 0;
        totalNum = 0;
        ope = 0;
        push = false;
        /* sb = null;                  
    問題発生したのでsb.deleteを使う
	*/
        sb.delete(0, 9);

    }

    //アプリ終了ボタン
    public void buttonOff(View view) {
        finish();
    }

    //左側削除ボタン
    public void buttonR(View view) {
    //文字列以上に削除するとエラーが発生した為、if文を入れる。
        if (0 == sb.length()) {             
            tv.setText("0");

        } else {
            sb.deleteCharAt(0);
            tv.setText(sb);

        }
    }

	
        //----ここから演算子----
    public void button_a(View view) {
        ope = 1;                             
 	 // =ボタン押下した時に判断できるよう、演算子識別コードを設定
        if (0 == sb.length()) {                
	// 初めに演算子を押された時のエラー回避の為のif文。

        } else {
 // StringBuilder型を直接数値化できなかったので一度String型にする
            String num = sb.toString();                
            addNum = Double.parseDouble(num);     // Stringを数値化

            if (push == true) {
                ans = addNum + totalNum;
                tv.setText(String.valueOf(ans));
                totalNum = ans;
                sb.delete(0, 9);

            } else {
                tvOpe.setText("+");
                totalNum = addNum;
                addNum = 0;
                push = true;
                sb.delete(0, 9);         
 //この位置にsb消去処理を挿れる事でtv文字を消去できるようになった

            }
        }
    }

    // マイナス処理
    public void button_s(View view) {
        ope = 2;
        if (0 == sb.length()) {

        } else {
            String num = sb.toString();
            addNum = Double.parseDouble(num);     
      
    /*※Double型に変換。最初、計算に使う変数をint型にしていたのでInteger.parseIntの
	まましてしまっていた。  小数点の計算でエラーが起こった為に直し忘れに気づく。解決。*/

            if (push == true) {
                ans = totalNum - addNum;

                tv.setText(String.valueOf(ans));
                totalNum = ans;
                sb.delete(0, 9);

            } else {
                tvOpe.setText("-");
                totalNum = addNum;
                addNum = 0;
                push = true;
                sb.delete(0, 9);

            }
        }
    }

    //割り算処理
    public void button_d(View view) {
        ope = 3;
        if (0 == sb.length()) {

        } else {
            String num = sb.toString();
            addNum = Double.parseDouble(num);

            if (push == true) {
                ans = totalNum / addNum;
                // ans2 = addNum % totalNum;

                tv.setText(String.valueOf(ans));

                totalNum = ans;
                sb.delete(0, 9);

            } else {
                tvOpe.setText("÷");
                totalNum = addNum;
                addNum = 0;
                push = true;
                sb.delete(0, 9);

            }
        }
    }

    //掛け算処理
    public void button_m(View view) {
        //ope = 4;
        if (0 == sb.length()) {

        } else {
            String num = sb.toString();
            addNum = Double.parseDouble(num);

            if (push == true) {
                ans = addNum * totalNum;
                tv.setText(String.valueOf(ans));
                totalNum = ans;
                sb.delete(0, 9);

            } else {
                tvOpe.setText("×");
                totalNum = addNum;
                addNum = 0;
                push = true;
                sb.delete(0, 9);

            }
        }
    }

    //イコール処理
    public void button_e(View view) {
        if (0 == sb.length()) {

        } else {
            String num = sb.toString();
            addNum = Double.parseDouble(num);

            if (ope == 1) {
                ans = totalNum + addNum;
                tvOpe.setText("=");
                tv.setText(String.valueOf(ans));
                sb.delete(0, 9);                           //sbの中身削除
                push = false;                              //リセット処理
                addNum = 0;
                totalNum = 0;
                ope = 0;

            } else if (ope == 2) {
                ans = totalNum - addNum;
                tvOpe.setText("=");
                tv.setText(String.valueOf(ans));
                sb.delete(0, 9);
                push = false;
                addNum = 0;
                totalNum = 0;
                ope = 0;

            } else if (ope == 3) {
                ans = totalNum / addNum;
                tvOpe.setText("=");
                tv.setText(String.valueOf(ans));
                sb.delete(0, 9);
                push = false;
                addNum = 0;
                totalNum = 0;
                ope = 0;

            } else {                               
                ans = totalNum * addNum;
                tvOpe.setText("=");
                tv.setText(String.valueOf(ans));
                sb.delete(0, 9);
                push = false;
                addNum = 0;
                totalNum = 0;
                ope = 0;

            }
        }
    }
}
 
こちらがレイアウトのXMLのコードです。
activity_my_calc.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"

                android:orientation = "vertical"
                tools:context=".MyCalc">
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="wrap_content">


    <TextView
        android:id ="@+id/textLabel"
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:text ="0"
        android:gravity ="right"
        android:textSize ="64sp"
        android:textStyle="bold"
        android:background="#ffffd9e9"
        android:textColor="#ffff7c9d"
        android:layout_weight="20"/>

    <TextView
        android:id ="@+id/textLabelOpe"
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:text =" "
        android:gravity="center"
        android:textSize ="20sp"
        android:textStyle="bold"
        android:background="#ffffd9e9"
        android:textColor="#ffff7c9d"
        android:layout_weight="1"/>



    </LinearLayout>

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/primary_text_disabled_material_dark"
        android:columnCount="4"
        android:rowCount="6">
        android:columnCount="5"



    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="%"
        android:textSize ="25sp"
        android:onClick="buttonP"
        android:id="@+id/buttonP"
        android:background="@drawable/button_off"
        android:layout_column="1"
        android:layout_row="0"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="OFF"
        android:textSize ="25sp"
        android:background="@drawable/button_off"
        android:onClick="buttonOff"
        android:id="@+id/buttonOff"
        android:layout_column="0"
        android:layout_row="0"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="▶"
        android:textSize ="25sp"
        android:onClick="buttonR"
        android:id="@+id/buttonR"
        android:background="@drawable/button_off"
        android:layout_column="2"
        android:layout_row="0"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="税込み"
        android:textSize ="25sp"
        android:onClick="buttonT"
        android:id="@+id/buttonT"
        android:background="@drawable/button_off"
        android:layout_column="3"
        android:layout_row="0"/>


    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="7"
        android:textSize ="25sp"
        android:onClick="button7"
        android:id="@+id/button7"
        android:background="@drawable/button_num"
        android:layout_column="0"
        android:layout_row="1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="8"
        android:textSize ="25sp"
        android:onClick="button8"
        android:id="@+id/button8"
        android:background="@drawable/button_num"
        android:layout_column="1"
        android:layout_row="1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="9"
        android:textSize ="25sp"
        android:onClick="button9"
        android:id="@+id/button9"
        android:background="@drawable/button_num"
        android:layout_column="2"
        android:layout_row="1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="×"
        android:textSize ="25sp"
        android:onClick="button_m"
        android:id="@+id/button_m"
        android:background="@drawable/button_ope"
        android:layout_column="3"
        android:layout_row="2"/>



    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="4"
        android:textSize ="25sp"
        android:onClick="button4"
        android:id="@+id/button4"
        android:background="@drawable/button_num"
        android:layout_column="0"
        android:layout_row="2"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="5"
        android:textSize ="25sp"
        android:onClick="button5"
        android:id="@+id/button5"
        android:background="@drawable/button_num"
        android:layout_column="1"
        android:layout_row="2"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="6"
        android:textSize ="25sp"
        android:onClick="button6"
        android:id="@+id/button6"
        android:background="@drawable/button_num"
        android:layout_column="2"
        android:layout_row="2"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="÷"
        android:textSize ="25sp"
        android:onClick="button_d"
        android:id="@+id/button_d"
        android:background="@drawable/button_ope"
        android:layout_column="3"
        android:layout_row="1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="1"
        android:textSize ="25sp"
        android:onClick="button1"
        android:id="@+id/button1"
        android:background="@drawable/button_num"
        android:layout_column="0"
        android:layout_row="3"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="2"
        android:textSize ="25sp"
        android:onClick="button2"
        android:id="@+id/button2"
        android:background="@drawable/button_num"
        android:layout_column="1"
        android:layout_row="3"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="3"
        android:textSize ="25sp"
        android:onClick="button3"
        android:id="@+id/button3"
        android:background="@drawable/button_num"
        android:layout_column="2"
        android:layout_row="3"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="-"
        android:textSize ="25sp"
        android:onClick="button_s"
        android:id="@+id/button_s"
        android:background="@drawable/button_ope"
        android:layout_column="3"
        android:layout_row="3"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="0"
        android:textSize ="25sp"
        android:onClick="button0"
        android:id="@+id/button0"
        android:background="@drawable/button_num"
        android:layout_column="0"
        android:layout_row="4"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:text="."
        android:textSize ="25sp"
        android:onClick="button_com"
        android:id="@+id/button_com"
        android:background="@drawable/button_num"
        android:layout_column="1"
        android:layout_row="4"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="65dp"
            android:text="00"
            android:textSize ="25sp"
            android:onClick="button00"
            android:id="@+id/button00"
            android:background="@drawable/button_num"
            android:layout_column="2"
            android:layout_row="4"/>

    <Button
        android:layout_width="175dp"
        android:layout_height="65dp"
        android:onClick="button_e"
        android:id="@+id/button_e"
        android:text="="
        android:textSize ="25sp"
        android:background="@drawable/button_ope"
        android:layout_column="2"
        android:layout_row="5"
        android:layout_columnSpan="2"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="65dp"
        android:onClick="button_a"
        android:id="@+id/button_a"
        android:text="+"
        android:textSize ="25sp"
        android:background="@drawable/button_ope"
        android:layout_column="3"
        android:layout_row="4"/>

        <Button
            android:layout_width="175dp"
            android:layout_height="65dp"
            android:text="CE"
            android:textSize ="25sp"
            android:onClick="buttonCE"
            android:id="@+id/buttonCE"
            android:background="@drawable/button_ce"
            android:layout_column="0"

            android:layout_row="5"
            android:layout_columnSpan="2"/>


    </GridLayout>


</LinearLayout>
ボタン色を設定しているXMLファイルも載せると長くなるので省いてます。
もしコードを使われる奇特な方いらっしゃいましたら、実行時に各ボタンに設定してるandroid:background の行を消して実行して下さいね。
消さないとエラーになります^^;
 
今後、修正点。
※繰り返し文。重複している冗長コードを短くする。
※double型使ったので計算結果が.0となる。少数がつかない計算は.0を消したい。
※符号表示の上部分が白いので直したい。
 
 

 

PAGETOP
Copyright © Goran All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.