みなさん、算数を楽しく学んでいますか?
算数は、パズルのような楽しさがありますが、それをプログラミングで解こうとすると、さらにパズルみたいで楽しいです。
#問題
A君が今持っているお金は1234円です。
A君は、友だちのB君に、「今,お金いくら持ってる?」と聞かれたので、だいたいの金額で答えることにしました。
Aくんは、 はんぱな数を数えるのがめんどうです。ざっくりした数で答えてください。
百の位で切り捨てて,千の位までにした場合
十の位で切り捨てて,百の位までにした場合
一の位で切り捨てて,十の位までにした場合
#答え
百の位で切り捨てて,千の位までにした場合 ⇒ 「1000円」
十の位で切り捨てて,百の位までにした場合 ⇒ 「1200円」
一の位で切り捨てて,十の位までにした場合 ⇒ 「1230円」
#プログラミングで解決する
この小学4年生の最初に学ぶ算数の問題を、MacのPlaygroundを使って、対話型アプリケーションにしてみましょう。
show("こんにちは")
let name = ask("なまえ")
show("どうも " + name + "くん" )
show( name + "くん" + "今、いくらお金持っている?")
let number = askForNumber( name + "くん、あなたのお財布の中のお金を数えて、数字を入れてください")
show("はんぱな数を数えるのがめんどうです。何桁で回答しますか?")
var digits = askForChoice("何桁で回答しますか",
strings: [
"百の位で切り捨てて,千の位で答える",
"十の位で切り捨てて,百の位で答える",
"一の位で切り捨てて,十の位で答える",
"デバッグ用"]
)
if digits == "百の位で切り捨てて,千の位で答える"{
var DoubleNum = ceil(Double(number/1000))
DoubleNum *= 1000
let intNum = Int(DoubleNum)
let strNum = String("\(intNum)")
show("ざっくり " + strNum + "円くらいだよ" )
}else if digits == "十の位で切り捨てて,百の位で答える"{
var DoubleNum = Double(Int(number)/100)
DoubleNum *= 100
let intNum = Int(DoubleNum)
let strNum = String("\(intNum)")
show("ざっくり " + strNum + "円くらいだよ" )
}else if digits == "一の位で切り捨てて,十の位で答える"{
var DoubleNum = Double(Int(number)/10)
DoubleNum *= 10
let intNum = Int(DoubleNum)
let strNum = String("\(intNum)")
show("ざっくり " + strNum + "円くらいだよ" )
}else{
show("DoubleNumは小数点を含む数字なので、整数でも小数点がつきます")
show("整数を切り上げる関数はないので、一旦整数を小数点以下の数字にして、計算します")
var DoubleNum = Double(Int(number)/100)
show(DoubleNum + 0)
show("intNumを戻します")
DoubleNum *= 100
show(DoubleNum + 0)
show("intNumは数字なので、足すことができます")
let intNum = Int(DoubleNum)
show(intNum + 0)
show("strNumは文字なので、くっつけることができます")
let strNum = String("\(intNum)")
show(strNum + "")
show("ざっくり " + strNum + "円くらいだよ" )
}
さて、ここには、小学4年生が習う算数の初歩があるとともに、プログラミング初心者の基本が隠されていました。
#定数と変数
Swiftでは、「型推論」といって宣言時に設定された値を元に自動で型を推測して設定されます。
PHPなどと違い型が動的に変わる「動的型付け」ではなく、あくまで「静的片付け」なので、宣言時に設定された型以外の値を入れようとするとエラーになります。
##定数の宣言
let
を使います
let 定数名 = 値 //型を指定しない場合
//例
let num = 1
let str = "あいうえお"
let 定数名:型 = 値 //型を指定する場合
//例
let num:Int = 1
let str:String = "あいうえお"
##変数の宣言方法
var
を使います
var 変数名 = 値 //型を指定しない場合
//例
var num = 1
var str = "あいうえお"
var 変数名:型 = 値 //型を指定する場合
//例
var num:Int = 1
var str:String = "あいうえお"
#型変換
型というのは、例えば文字という型や、数字という型です。具体的に言えば、文字の1は"1"+"1"をすると、11という文字になりますが、数字の1+1は1+1=2と計算されて2という数字になります。
今回の、「切り捨て」のメインの計算は、以下になります。
var DoubleNum = Double(Int(number)/1000)
DoubleNum *= 1000
let intNum = Int(DoubleNum)
let strNum = String("\(intNum)")
show("ざっくり " + strNum + "円くらいだよ" )
ここでは、数字で計算して、文字で出力する必要があるので、型変換をしました。
実際に、数字がどうなるかは、show で中身のデータを見ながら確認してみましょう
(実際に+している0や””に文字を入れてみましょう)
デバッグ用のプログラム
show("DoubleNumは小数点を含む数字なので、整数でも小数点がつきます")
show("整数を切り上げる関数はないので、一旦整数を小数点以下の数字にして、計算します")
var DoubleNum = Double(Int(number)/100)
show(DoubleNum + 0)
show("intNumを戻します")
DoubleNum *= 100
show(DoubleNum + 0)
show("intNumは数字なので、足すことができます")
let intNum = Int(DoubleNum)
show(intNum + 0)
show("strNumは文字なので、くっつけることができます")
let strNum = String("\(intNum)")
show(strNum + "")
show("ざっくり " + strNum + "円くらいだよ" )
このような形で、文字と数字を扱うためには、型変換が必要になります。
#型変換方法
型変換の例を以下に示します。
##Int → String
var intNum: Int = 11
var str: String = String(intNum)
show(str + "という文字です")
出力結果:
11という文字です
##Int → Double
var intNum: Int = 37
var doubleNum: Double = Double(intNum)
show(doubleNum)
出力結果:
37.0
##Double → String
var doubleNum: Double = 1.234
var str: String = String("\(doubleNum)")
show(str + "という文字です")
出力結果:
1.234という文字です
##Double → Int
var doubleNum: Double = 1.234
var intNum: Int = Int(doubleNum)
show(intNum)
出力結果:
1
##String → Double
var str: String = "10.1"
var doubleNum: Double = atof(str)
show(doubleNum + 1.1)
出力結果:
11.2
##String → Int
var str : String = "1234"
var num : Int = Int(str)!
show(num + 1)
出力結果:
1235
##文字列の比較とIf-elseによる条件分岐
文字列を比較する場合は、if文用います。
elseと組み合わせることで、条件分岐を組み上げることができます。
//ここの文字を変えてみてください
let string = "C"
if string == "A" {
show("Aです")
} else if string == "B"{
show("Bです")
}else{
show("Cです")
}
小学生の問題をプログラミングで解くと、とっても勉強になりますね。