基礎プロI 100本ノック 初級編

**以下の C による初歩の C プログラミング 100 本ノックを Julia で解いてみました。**

基礎プロI 100本ノック 初級編
http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html

各プログラムにおいて、特に指定が無い限りは入力値が指定された形式であるかどうかをチェックする必要はない（例えば整数型の値を入力させるところでアルファベットを入力された場合など）。

## No. 20 割って掛ける
整数値を2つ入力させ、1つめの値を2つめの値で割った結果を表示し、続けてその結果に2つめの値を掛けた結果を表示するプログラムを作成せよ。計算はすべて整数型で行うこと（割り切れない場合は自動的に小数点以下が切り捨てられる）。

```julia
print("input 1st value:")
i = parse(Int, readline())
print("input 2nd value:")
j = parse(Int, readline())
k = i ÷ j
l = k*j
println("result: $k\nresult: $l")
```

    input 1st value:
    stdin>  10
    input 2nd value:
    stdin>  3
    result: 3
    result: 9

## No. 21 5より大きく20より小さい
整数値を入力させ、その値が5よりも大きく、かつ、20よりも小さければOKと表示するプログラムを作成せよ。

```julia
print("input number:")
i = parse(Int, readline())
if 5 < i <  20  # 5 < i && i < 20 と書かなくてもよい
    println("OK")
end
```

    input number:
    stdin>  10
    OK

## No. 22 -10以下または10以上
整数値を入力させ、その値が-10以下、または、10以上であればOKと表示するプログラムを作成せよ。

```julia
print("input number:")
i = parse(Int, readline())
if i <= -10 || i >= 10  # この場合 abs(i) >= 10 でもよい
    println("OK")
end
```

    input number:
    stdin>  10
    OK

## No. 23 -5以上10未満
整数値を入力させ、その値が-5以上10未満であればOK、そうでなければNGと表示するプログラムを作成せよ。

```julia
print("input number:")
i = parse(Int, readline())
if -5 <= i < 10
    println("OK")
else
    println("NG")
end
```

    input number:
    stdin>  0
    OK

## No. 24 -10以上0未満、または、10以上
整数値を入力させ、その値が-10以上0未満、または、10以上であればOK、そうでなければNGと表示するプログラムを作成せよ。

```julia
print("input number:")
i = parse(Int, readline())
if -10 <= i < 0 || i >= 10
    println("OK")
else
    println("NG")
end
```

    input number:
    stdin>  5
    NG

## No. 25 -10未満?、-10以上0未満?、0以上?
整数値を入力させ、その値が-10未満ならrange 1、-10以上0未満であればrange 2、0以上であればrange 3、と表示するプログラムを作成せよ。

```julia
print("input number:")
i = parse(Int, readline())
if i < -10
    println("range 1")
elseif i < 0
    println("range 2")
else
    println("range 3")
end
```

    input number:
    stdin>  0
    range 3

## No. 26 switch-case
整数値を入力させ、その値が1ならone、2ならtwo、3ならthree、それ以外ならothersと表示するプログラムをswicth-case文を使って作成せよ。

```julia
print("input number:")
i = parse(Int, readline())
i == 1 && println("one")
i == 2 && println("two")
i == 3 && println("three")
if i != 1 &&  i != 2 && i != 3
    println("others")
end
```

    input number:
    stdin>  0
    others

注
Julia に switc-case 文はない。if-elseif-else を使う。最初の 3 つの文は if 文の簡略表示である。最後の if は「それ以外」であるがこれがないと，i = 1,2,3 のときには "one", "two", "three" が表示されたあと false も表示されてしまう。

@match マクロを使うことはできる（実際には if-elseif-else に展開される）

```julia
using Match

print("input number:")
i = parse(Int, readline())
j = @match i begin
   1 => "one"
   2 => "two"
   3 => "thtee"
   _ => "others"
end
println(j)
```

    input number:
    stdin>  0
    others

## No. 27 1からnまでの和
整数値を入力させ、1からその値までの総和を計算して表示するプログラムを作成せよ。ただし、0以下の値を入力した場合は0と表示する。

```julia
print("input number:")
n = max(0, parse(Int, readline()))
println(sum(1:n))
```

    input number:
    stdin>  -2
    0

## No. 28 nの階乗
整数値を入力させ、その値の階乗を表示するプログラムを作成せよ。ただし、0以下の値を入力した場合は1と表示する。

```julia
print("input number:")
n = max(0, parse(Int, readline()))
println(factorial(n))  # 大きな n に対応するには println(factorial(big(n)))
```

    input number:
    stdin>  -2
    1

## No. 29 5つの合計
整数値を5回入力させ、それらの値の合計を表示するプログラムを**繰り返しを使って**作成せよ。

```julia
s = 0
for i in 1:5
    print("input number:")
    k = parse(Int, readline())
    s += k
end
println("sum = $s")
```

    input number:
    stdin>  11
    input number:
    stdin>  22
    input number:
    stdin>  33
    input number:
    stdin>  44
    input number:
    stdin>  55
    sum = 165

## No. 30 棒グラフ
整数値を入力させ、その個数だけ*を表示するプログラムを作成せよ。入力値が0以下の値の場合は何も書かなくてよい。

```julia
print("input number:")
k = parse(Int, readline())
if k > 0
    println("*" ^ k)
end
```

    input number:
    stdin>  13
    *************

ヒント「*を改行せず入力値回だけ繰り返して表示し、繰り返しが終わったら改行\nだけ表示すればよい。」に従うなら以下のようにする。

```julia
print("input number:")
k = parse(Int, readline())
if k > 0
    for i in 1:k
        print("*")
    end
    println()
end
```

    input number:
    stdin>  20
    ********************

## No. 31 棒グラフ改
整数値を入力させ、その個数だけ*を、5個おきに空白（スペース）を入れて表示するプログラムを作成せよ。入力値が0以下の値の場合は何も書かなくてよい。

```julia
print("input number:")
k = parse(Int, readline())
if k > 0
    s = "*" ^ k
    s2 = replace(s, "*****" => "***** ")
    println(s2)
end
```

    input number:
    stdin>  13
    ***** ***** ***

```julia
print("input number:")
k = parse(Int, readline())
if k > 0
    for i in 1:k
        print("*")
        i % 5 == 0 && print(" ")
    end
    println()
end
```

## No. 32 5の倍数でbar
1から20まで順に表示するが、5の倍数の場合は数字の代わりにbarと表示するプログラムを作成せよ。

```julia
for i in 1:20
    if i % 5 == 0
        println("bar")
    else
        println(i)
    end
end
```

    1
    2
    3
    4
    bar
    6
    7
    8
    9
    bar
    11
    12
    13
    14
    bar
    16
    17
    18
    19
    bar

## No. 33 入力値抜き
整数値を入力させ、1から9まで、入力値以外を表示するプログラムを作成せよ。

```julia
print("input number:")
n = parse(Int, readline())
for i in 1:9
    i != n && println(i)
end
```

    input number:
    stdin>  7
    1
    2
    3
    4
    5
    6
    8
    9

## No. 34 入力値抜き改
整数値を入力させ、1から9まで、入力値と入力値+1以外を表示するプログラムを作成せよ。入力値が9の場合は9のみ表示しない。

```julia
print("input number:")
n = parse(Int, readline())
for i in 1:9
    i != n && i != n + 1 && println(i)
end
```

    input number:
    stdin>  7
    1
    2
    3
    4
    5
    6
    9

## No. 35 配列要素の参照
{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、整数値を入力させ、要素番号が入力値である配列要素の値を表示するプログラムを作成せよ。入力値が配列の要素の範囲外であるかどうかのチェックは省略してよい。
Juliaでは添字は1からはじまる。指定する添字はCに則って，0から始まるものとする。

```julia
m = [3, 7, 0, 8, 4, 1, 9, 6, 5, 2]
print("input index:")
index = parse(Int, readline()) + 1  # 1 始まりの添字
println(m[index])
```

    input index:
    stdin>  5
    1

## 17.　No. 36 続・配列要素の参照
{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、整数値を2つ入力させ、要素番号が入力値である2つの配列要素の値の積を計算して表示するプログラムを作成せよ。入力値が配列の要素の範囲外であるかどうかのチェックは省略してよい。

```julia
m = [3, 7, 0, 8, 4, 1, 9, 6, 5, 2]
print("input index1:")
index1 = parse(Int, readline()) + 1  # 1 始まりの添字
print("input index2:")
index2 = parse(Int, readline()) + 1  # 1 始まりの添字
println("$(m[index1]) * $(m[index2]) = $(m[index1]*m[index2])")
```

    input index1:
    stdin>  3
    input index2:
    stdin>  6
    8 * 9 = 72

## No. 37 続々・配列要素の参照
{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、整数値を入力させ、要素番号が入力値の配列要素の値を参照し、さらにその参照した値を要素番号とする配列要素の値を参照して表示するプログラムを作成せよ。入力値が配列の要素の範囲外であるかどうかのチェックは省略してよい。

```julia
m = [3, 7, 0, 8, 4, 1, 9, 6, 5, 2]
print("input index1:")
index = parse(Int, readline())
println(m[m[index + 1] + 1])  # 添字はそれぞれ +1 する
```

    input index1:
    stdin>  8
    1

## No. 38 さらに・配列要素の参照
{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、最初は参照する要素番号を0とし、この参照する要素番号の配列要素の値を表示し、次にその配列要素の値を次の参照する要素番号とし、この次の参照する要素番号の配列要素の値を表示し、さらにその配列要素の値を次の参照する要素番号とし、……を10回繰り返すプログラムを作成せよ。（具体的にどのような手順かは実行例を見て考えよう。）

```julia
m = [3, 7, 0, 8, 4, 1, 9, 6, 5, 2]
k = 0
for i in 1:10
    println(m[k + 1])
    k = m[k + 1]
end 
```

    3
    8
    5
    1
    7
    6
    9
    2
    0
    3

## No. 39 もっと・配列要素の参照
{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、最初は参照する要素番号を0とする。この参照する要素番号の配列要素の値から次の要素番号の配列要素の値を引いた値を表示し、参照する要素番号を1増やす。この手順を9回繰り返すプログラムを作成せよ。（具体的にどのような手順かは実行例を見て考えよう。）

```julia
m = [3, 7, 0, 8, 4, 1, 9, 6, 5, 2]
for i in 1:9
    println(m[i] - m[i + 1])
end
```

    -4
    7
    -8
    4
    3
    -8
    3
    1
    3

```julia
for k in diff(-m)
    println(k)
end
```

    -4
    7
    -8
    4
    3
    -8
    3
    1
    3