小学4年生の算数の宿題をSwiftを使って片付ける

みなさん、算数を楽しく学んでいますか？

算数は、パズルのような楽しさがありますが、それをプログラミングで解こうとすると、さらにパズルみたいで楽しいです。

#問題
A君が今持っているお金は1234円です。
A君は、友だちのB君に、「今，お金いくら持ってる?」と聞かれたので、だいたいの金額で答えることにしました。

Aくんは、 はんぱな数を数えるのがめんどうです。ざっくりした数で答えてください。

百の位で切り捨てて，千の位までにした場合
十の位で切り捨てて，百の位までにした場合
一の位で切り捨てて，十の位までにした場合

#答え
百の位で切り捨てて，千の位までにした場合 ⇒ 「1000円」
十の位で切り捨てて，百の位までにした場合 ⇒ 「1200円」
一の位で切り捨てて，十の位までにした場合 ⇒ 「1230円」


#プログラミングで解決する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68314/cb821120-2c94-cb4e-ea7e-b327d744b89b.png)


この小学4年生の最初に学ぶ算数の問題を、MacのPlaygroundを使って、対話型アプリケーションにしてみましょう。

```swift
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`を使います

```swift
let 定数名 = 値 //型を指定しない場合
//例
let num = 1
let str = "あいうえお"

let 定数名:型 = 値 //型を指定する場合
//例
let num:Int = 1
let str:String = "あいうえお"
```

##変数の宣言方法
`var`を使います

```swift
var 変数名 = 値 //型を指定しない場合

//例
var num = 1
var str = "あいうえお"

var 変数名:型 = 値 //型を指定する場合
//例
var num:Int = 1
var str:String = "あいうえお"
```

#型変換
[型](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B)というのは、例えば文字という型や、数字という型です。具体的に言えば、文字の１は"１"＋"１"をすると、１１という文字になりますが、数字の1+1は1+1=2と計算されて２という数字になります。

今回の、「切り捨て」のメインの計算は、以下になります。

```swift
    var DoubleNum = Double(Int(number)/1000)
    DoubleNum *= 1000
    let intNum = Int(DoubleNum)
    let strNum = String("\(intNum)")
    show("ざっくり " + strNum + "円くらいだよ" )
```

ここでは、数字で計算して、文字で出力する必要があるので、型変換をしました。
実際に、数字がどうなるかは、show で中身のデータを見ながら確認してみましょう
（実際に＋している０や””に文字を入れてみましょう）

デバッグ用のプログラム

```swift
    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 + "円くらいだよ" )
```
このような形で、文字と数字を扱うためには、型変換が必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68314/7eb27bc5-6d3d-b880-8f34-8fc3258928b0.png)

#型変換方法
型変換の例を以下に示します。

##Int → String

```swift
var intNum: Int = 11
var str: String = String(intNum)
show(str + "という文字です")
```
出力結果：
11という文字です

##Int → Double

```swift
var intNum: Int = 37
var doubleNum: Double = Double(intNum)
show(doubleNum)
```
出力結果：
37.0

##Double → String

```swift
var doubleNum: Double = 1.234
var str: String = String("\(doubleNum)")
show(str + "という文字です")

```
出力結果：
1.234という文字です

##Double → Int

```swift
var doubleNum: Double = 1.234
var intNum: Int = Int(doubleNum)
show(intNum)
```
出力結果：
1

##String → Double

```swift
var str: String = "10.1"
var doubleNum: Double = atof(str)
show(doubleNum + 1.1)
```
出力結果：
11.2

##String → Int

```swift
var str : String = "1234"
var num : Int = Int(str)!
show(num + 1)
```
出力結果：
1235


##文字列の比較とIf-elseによる条件分岐
文字列を比較する場合は、if文用います。
elseと組み合わせることで、条件分岐を組み上げることができます。

```swift
//ここの文字を変えてみてください
let string = "C"

if  string == "A" {
    show("Aです")
} else if  string == "B"{
    show("Bです")
}else{
    show("Cです")
}
```

小学生の問題をプログラミングで解くと、とっても勉強になりますね。