SlideShare a Scribd company logo
Java初心者勉強会
電卓を作ってJavaを学ぼう 2015/08/07(金)
目的
●
Javaを基礎から習得する
●
実際に手を動かして理解を深める
●
アプリ作成を通じプログラムを学ぶ
今日の内容
●
逆ポーランド記法の説明
●
足し算を作る
●
掛け算を追加
●
休憩
●
計算処理を追加しやすい形にする
逆ポーランド記法の説明
●
3 + 4 を 3 4 + と書く
●
( 1+5) * ( 2+3) を 1 5 + 2 3 + * と書く
●
詳しくは...
https://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
1 2 + の場合
1
2 31
1を
PUSH
2を
PUSH
1
2 POP
計算結果を
PUSH
2 + 1 => 3
3 2 1 + * の場合
3
2 33
1を
PUSH
2を
PUSH
3
2
POP
計算結果を
PUSH
1 + 2 => 3
2
1
3を
PUSH
3
1
3
3
3
POP
3 * 3 => 9
9
計算結果を
PUSH
まずは
足し算のみで作る
プログラム開始を記述
public class Main {
public static void main(String... args) {
System.out.println("Hello Calculator!");
}
}
Main.java
mainメソッド から始まります
Main.java を新規作成してください。
(補足: public 外から見える static 一つしかない)
実行結果
Hello Calculator!
コマンドプロンプトの場合は Javac Main.java でコンパイルします
java Main で実行します
計算クラスを作る(中は適当
import java.util.Stack;
public class Calculator {
public Calculator() {
}
public int execute(String input) {
Stack<Integer> stack = new Stack<>();
stack.push(Integer.valueOf("1"));
stack.push(Integer.valueOf("2"));
return stack.pop();
}
}
Calculator.java
1
2
1、2と数値の入った箱を積む(PUSHする)プログラムを書きます
上から取り出します(POPする)
計算クラスを呼び出す
public class Main {
public static void main(String... args) {
System.out.println("Hello Calculator!");
Calculator cal = new Calculator();
String test = "";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
Main.java
クラス(Calculator)をnewするとインスタンス(cal)が作れます。
クラス classnew!
実行結果
Hello Calculator!
= 2
計算クラスを呼び出す
public class Main {
public static void main(String... args) {
System.out.println("Hello Calculator!");
Calculator cal = new Calculator();
String test = "1 2 +";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
Main.java
[1] [2] [+] を Calculatorクラスのインスタンスに計算させて 3 を返します
計算クラスを作る
import java.util.Stack;
public class Calculator {
public Calculator() {
}
public int execute(String input) {
Stack<Integer> stack = new Stack<>();
for (String s : input.split("s")) {
if ("+".equals(s)) {
Integer num1 = stack.pop();
Integer num2 = stack.pop();
stack.push(Integer.valueOf(num1 + num2));
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}
Calculator.java
1
2
1 2 +
実行結果
Hello Calculator!
1 2 + = 3
掛け算の処理を追加する
掛け算処理を追加
public class Main {
public static void main(String... args) {
System.out.println("Hello Calculator!");
Calculator cal = new Calculator();
String test = "3 2 1 + *";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
Main.java
[3] [1] [2] [+] [*] を Calculatorクラスのインスタンスに計算させて 9 を返します
掛け算処理を追加
for (String s : input.split("s")) {
if ("+".equals(s)) {
Integer num1 = stack.pop();
Integer num2 = stack.pop();
stack.push(Integer.valueOf(num1 + num2));
} else if ("*".equals(s)) {
Integer num1 = stack.pop();
Integer num2 = stack.pop();
stack.push(Integer.valueOf(num1 * num2));
} else {
stack.push(Integer.valueOf(s));
}
}
Calculator.java
Calculatorクラスに [*] が来た場合の処理を追加します
実行結果
Hello Calculator!
3 2 1 + * = 9
- 休憩 -
処理の追加を分業可能にする
インターフェースを作る
for (String s : input.split("s")) {
if ("+".equals(s)) {
Integer num1 = stack.pop();
Integer num2 = stack.pop();
stack.push(Integer.valueOf(num1 + num2));
} else if ("*".equals(s)) {
Integer num1 = stack.pop();
Integer num2 = stack.pop();
stack.push(Integer.valueOf(num1 * num2));
} else {
stack.push(Integer.valueOf(s));
}
}
Integer execute(Integer num1, Integer num2);
処理が増える度に
条件分岐を
増やすと大変
処理は共通して
二つの数字を引数に
一つの数字を返す
Calculator.java
起動クラスの修正
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String... args) {
System.out.println("Hello Calculator!");
Map<String, Operator> operators = new HashMap<>();
operators.put("+", new Add());
operators.put("*", new Multi());
Calculator cal = new Calculator(operators);
String test = "3 2 1 + *";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
処理が増えると
ここが増える
Main.java
インターフェースを作る
public interface Operator {
Integer execute(Integer num1, Integer num2);
}
処理は共通して
二つの数字を引数に
一つの数字を返す
Operator.java
足し算と掛け算クラス
public class Add implements Operator {
@Override
public Integer execute(Integer num1, Integer num2) {
return Integer.valueOf(num1 + num2);
}
}
public class Multi implements Operator {
@Override
public Integer execute(Integer num1, Integer num2) {
return Integer.valueOf(num1 * num2);
}
}
Add.java
Multi.java
計算クラスを修正import java.util.*;
public class Calculator {
private final Map<String, Operator> operators;
public Calculator(Map<String, Operator> operators) {
this.operators = operators;
}
public int execute(String input) {
Stack<Integer> stack = new Stack<>();
for (String s : input.split("s")) {
Operator operator = operators.get(s);
if (operator != null) {
Integer num1 = stack.pop();
Integer num2 = stack.pop();
stack.push(operator.execute(num1, num2));
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}
処理が増えても
条件分岐を
増やさなくてもよく
なりました
Calculator.java
実行結果
Hello Calculator!
3 2 1 + * = 9
匿名クラスで追加
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.out.println("Hello Calculator!");
Map<String, Operator> operators = new HashMap<>();
operators.put("+", new Add());
operators.put("*", new Multi());
operators.put("-", new Operator() {
@Override
public Integer execute(Integer num1, Integer num2) {
return num2 - num1;
}
});
Calculator cal = new Calculator(operators);
String test = "15 3 2 1 + * -";
System.out.format(" %s = %d ", test, cal.execute(test)); }
}
処理を匿名クラスで
追加する
Main.java
実行結果
Hello Calculator!
15 3 2 1 + * - = 6
Java8のラムダで書くと
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.out.println("Hello Calculator!");
Map<String, Operator> operators = new HashMap<>();
operators.put("+", new Add());
operators.put("*", new Multi());
operators.put("-", (Integer num1, Integer num2) -> {
return num2 - num1;
});
Calculator cal = new Calculator(operators);
String test = "15 3 2 1 + * -";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
短くシンプルに
Main.java
もう少し短く
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.out.println("Hello Calculator!");
Map<String, Operator> operators = new HashMap<>();
operators.put("+", new Add());
operators.put("*", new Multi());
operators.put("-", (num1, num2) -> num2 - num1);
Calculator cal = new Calculator(operators);
String test = "15 3 2 1 + * -";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
もっと短くシンプルに
Main.java
実行結果
Hello Calculator!
15 3 2 1 + * - = 6
割り算を加えて完成
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.out.println("Hello Calculator!");
Map<String, Operator> operators = new HashMap<>();
operators.put("+", new Add());
operators.put("*", new Multi());
operators.put("-", (num1, num2) -> num2 - num1);
operators.put("/", (num1, num2) -> num2 / num1);
Calculator cal = new Calculator(operators);
String test = "12 15 3 2 1 + * - /";
System.out.format(" %s = %d ", test, cal.execute(test));
}
}
Main.java
実行結果
Hello Calculator!
12 15 3 2 1 + * - / = 2
- 本日はここまでです。お疲れ様でした -

More Related Content

PDF
Java電卓勉強会資料
Toshio Ehara
 
PDF
関数型プログラミング in javascript
Ryuma Tsukano
 
KEY
Clojure programming-chapter-2
Masao Kato
 
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
 
PPTX
機械学習
ssusere8ae711
 
PDF
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
 
PDF
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
Java電卓勉強会資料
Toshio Ehara
 
関数型プログラミング in javascript
Ryuma Tsukano
 
Clojure programming-chapter-2
Masao Kato
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
 
機械学習
ssusere8ae711
 
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 

What's hot (19)

PPTX
メタプログラミング C#
Fujio Kojima
 
PDF
What is template
Akira Takahashi
 
PDF
error handling using expected
Akira Takahashi
 
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Fujio Kojima
 
PDF
JavaScript入門
Ryo Maruyama
 
PPTX
for関数を使った繰り返し処理によるヒストグラムの一括出力
imuyaoti
 
PPTX
Map
kikairoya
 
PDF
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
 
PPTX
ぱっと見でわかるC++11
えぴ 福田
 
PDF
JavaScript 講習会 #1
Susisu
 
PDF
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
 
PDF
Emcjp item21
MITSUNARI Shigeo
 
PDF
命令プログラミングから関数プログラミングへ
Naoki Kitora
 
PPTX
競技プログラミングのためのC++入門
natrium11321
 
PDF
研究生のためのC++ no.2
Tomohiro Namba
 
PDF
Aedlabo program 20150125
としゆき 高橋
 
PDF
研究生のためのC++ no.4
Tomohiro Namba
 
PDF
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
TanUkkii
 
PDF
Processing
Akifumi Nambu
 
メタプログラミング C#
Fujio Kojima
 
What is template
Akira Takahashi
 
error handling using expected
Akira Takahashi
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Fujio Kojima
 
JavaScript入門
Ryo Maruyama
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
imuyaoti
 
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
 
ぱっと見でわかるC++11
えぴ 福田
 
JavaScript 講習会 #1
Susisu
 
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
 
Emcjp item21
MITSUNARI Shigeo
 
命令プログラミングから関数プログラミングへ
Naoki Kitora
 
競技プログラミングのためのC++入門
natrium11321
 
研究生のためのC++ no.2
Tomohiro Namba
 
Aedlabo program 20150125
としゆき 高橋
 
研究生のためのC++ no.4
Tomohiro Namba
 
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
TanUkkii
 
Processing
Akifumi Nambu
 
Ad

Similar to Java初心者勉強会(2015/08/07)資料 (20)

PDF
Programming24 第3回Androidアプリ勉強会
codeal
 
PDF
型超ざっくり入門@ハンズラボ社内勉強会
Yusuke Usui
 
PDF
[コデアル][Programming24]Androidアプリ勉強会01
codeal
 
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
PPTX
2018/2/20 Kotlin勉強会
虎の穴 開発室
 
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
 
PPTX
第1回Java講義資料
XMLProJ2014
 
PDF
Javaセキュアコーディングセミナー東京第4回講義
JPCERT Coordination Center
 
PDF
たのしい関数型
Shinichi Kozake
 
PDF
第2回関数型言語勉強会 大阪
Naoki Kitora
 
PDF
【LiT Leaders】Android0309
Ryo Yamamoto
 
PPTX
Javaプログラミング入門【第3回】
Yukiko Kato
 
PDF
Material
_TUNE_
 
PDF
Javaセキュアコーディングセミナー東京第1回 演習
JPCERT Coordination Center
 
PDF
Ruby4章後半(演算子)
Hiroshi Isimaru
 
PDF
Programming24 第2回androidアプリ勉強会
codeal
 
PDF
JavaScript 基礎文法のまとめ
Yossy Taka
 
PPTX
Javaプログラミング入門【第2回】
Yukiko Kato
 
PPTX
Project lambda
Appresso Engineering Team
 
PPTX
Javaプログラミング入門【第4回】
Yukiko Kato
 
Programming24 第3回Androidアプリ勉強会
codeal
 
型超ざっくり入門@ハンズラボ社内勉強会
Yusuke Usui
 
[コデアル][Programming24]Androidアプリ勉強会01
codeal
 
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
2018/2/20 Kotlin勉強会
虎の穴 開発室
 
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
 
第1回Java講義資料
XMLProJ2014
 
Javaセキュアコーディングセミナー東京第4回講義
JPCERT Coordination Center
 
たのしい関数型
Shinichi Kozake
 
第2回関数型言語勉強会 大阪
Naoki Kitora
 
【LiT Leaders】Android0309
Ryo Yamamoto
 
Javaプログラミング入門【第3回】
Yukiko Kato
 
Material
_TUNE_
 
Javaセキュアコーディングセミナー東京第1回 演習
JPCERT Coordination Center
 
Ruby4章後半(演算子)
Hiroshi Isimaru
 
Programming24 第2回androidアプリ勉強会
codeal
 
JavaScript 基礎文法のまとめ
Yossy Taka
 
Javaプログラミング入門【第2回】
Yukiko Kato
 
Javaプログラミング入門【第4回】
Yukiko Kato
 
Ad

More from Toshio Ehara (20)

PDF
iPhoneアプリを Javaで書くよ?
Toshio Ehara
 
PDF
BABELで、ES2015(ES6)を学ぼう!
Toshio Ehara
 
PDF
AngularJSで業務システムUI部品化
Toshio Ehara
 
PDF
traceur-compilerで ECMAScript6を体験
Toshio Ehara
 
PDF
traceur-compilerで未来のJavaScriptを体験
Toshio Ehara
 
PDF
AngularJS入門の巻2
Toshio Ehara
 
PDF
JenkinsをJava開発でこんな感じで使っています
Toshio Ehara
 
PDF
AngularJS入門の巻
Toshio Ehara
 
PDF
AngularJS+TypeScriptを試してみた。
Toshio Ehara
 
PDF
AngularJSのDirectiveで俺俺タグつくっちゃお
Toshio Ehara
 
PDF
HTML5のCanvas入門 - Img画像を編集してみよう -
Toshio Ehara
 
PDF
BACKBONEJS+SCSS+JavaEE(JAX-RS) 今風のWebアプリをNetBeansで入門!
Toshio Ehara
 
PDF
福岡のIT勉強会情報の集め方(LT資料)
Toshio Ehara
 
PDF
BACKBONE.JSによるWebアプリケーション開発について
Toshio Ehara
 
PDF
BACKBONE.JSにJasmineでテストコード書いてみた (LT資料)
Toshio Ehara
 
PDF
JavaScriptのテストコード 一緒に勉強しませんか??
Toshio Ehara
 
PDF
【未発表】Backbone.jsとJavaEE7でWebアプリを作ろう!(第1回) 〜GETで一覧編〜
Toshio Ehara
 
PDF
LT Leap MotionとJavaScriptで遊ぼう!
Toshio Ehara
 
PDF
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
Toshio Ehara
 
PDF
BACKBONE.JSでMVC始めませんか?
Toshio Ehara
 
iPhoneアプリを Javaで書くよ?
Toshio Ehara
 
BABELで、ES2015(ES6)を学ぼう!
Toshio Ehara
 
AngularJSで業務システムUI部品化
Toshio Ehara
 
traceur-compilerで ECMAScript6を体験
Toshio Ehara
 
traceur-compilerで未来のJavaScriptを体験
Toshio Ehara
 
AngularJS入門の巻2
Toshio Ehara
 
JenkinsをJava開発でこんな感じで使っています
Toshio Ehara
 
AngularJS入門の巻
Toshio Ehara
 
AngularJS+TypeScriptを試してみた。
Toshio Ehara
 
AngularJSのDirectiveで俺俺タグつくっちゃお
Toshio Ehara
 
HTML5のCanvas入門 - Img画像を編集してみよう -
Toshio Ehara
 
BACKBONEJS+SCSS+JavaEE(JAX-RS) 今風のWebアプリをNetBeansで入門!
Toshio Ehara
 
福岡のIT勉強会情報の集め方(LT資料)
Toshio Ehara
 
BACKBONE.JSによるWebアプリケーション開発について
Toshio Ehara
 
BACKBONE.JSにJasmineでテストコード書いてみた (LT資料)
Toshio Ehara
 
JavaScriptのテストコード 一緒に勉強しませんか??
Toshio Ehara
 
【未発表】Backbone.jsとJavaEE7でWebアプリを作ろう!(第1回) 〜GETで一覧編〜
Toshio Ehara
 
LT Leap MotionとJavaScriptで遊ぼう!
Toshio Ehara
 
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
Toshio Ehara
 
BACKBONE.JSでMVC始めませんか?
Toshio Ehara
 

Java初心者勉強会(2015/08/07)資料