プログラムの流れの制御&関数
1. 課題の提出
•
• 1つの課題につき、1つのプログラムファイルを使ってください。
• 課題の出力画面、グラフをWordにまとめてください。
•
2. *事前作業:フォルダーの作成、作業空間の変更
(1) 実習課題用のフォルダーの作成
• 各自の
• フォルダー名は任意です。(既存のものを使ってもOK)
(2) cd で作業空間の変更
• Julia ターミナル(REPL)を開き、下記のとおりに、
julia> cd("U:\\Documents\\あなたのフォルダー名" )
ターミナルの出力の例:

作業空間が確実に変更されたかどうか次のコマンドで確認できる。
julia> pwd()
表示されたフォルダー名が、あなたが作ったものと一致すれば大丈夫です。
例:

(3) Visual Studio Code (vscode)

• Visual studio code は無料でダウロードできるフリーなプログラム編集ツール(コードエディタ)です。
• 公式サイトはこちら:https://code.visualstudio.com/
• 普通のメモ帳より、Syntax highlighting (構文着色)の機能が付いているので、プログラム言語の文法ミスを防ぐことができる。
今回の授業では、そのWeb 版を使って実習を行う
•
vscode (Web 版)の最初の画面:

(4) テスト用の .jl ファイルの作成
手順:
• 左の
► 読み取りの許可のメセージがあったら、許可を与えてください。
• 「新しいファイル」をクリックして、新規ファイルを開きます。
• ファイル名は任意ですが、拡張子は
► 例:topic_8_kadai_0.jl
• ファイルの保存先は今回の作業フォルダーです。
• 下記のコードをそのファイルに書き込みます。
print("hello\nこんにちは\n" )
x = 2
print("x^5 = " , x^5 )
• 左上の「≡」のマークをクリックして、「ファイル」> 「保存」 にしてください。(または Ctrl-S)

(5) include 関数で .jl ファイルを実行する
• Julia端末で
julia> include("あなたのファイル名.jl" )
実行例:

上記のような出力が出たらOKです。
次の実習課題に使うコードはこの方法で実行してください。
3. 条件式 Conditional Expression
• 数式に似ているが、その結果が
• つまり、条件式の型は Boolean ブリアンである。
\[ \begin{matrix}プログラミング &~ &数学\\\texttt{x > y} &~ &x > y & \\\texttt{x < y} &~ &x < y & \\\texttt{x >= y} &~ &x \geq y & \\\texttt{x <= y} &~ &x \leq y & \\\texttt{x == y} &~ &x = y & \\\texttt{x != y} &~ &x \neq y & \\\end{matrix}\]
例:
julia> x = 3 ; y = 4 ; z = 3 ;
julia> x > y
false
julia> x == z
true
julia> y != z
true
julia> x <= z
true
4. if-文:条件評価
Flow chart (if の流れ図)

練習:if - else - end
x = 2
y = 3
if x > y
println("x は y より大きい。" )
z = 1
else
println("x は y より小さいかもしれない。" )
z = -1
end
println("z = " , z)
x は y より小さいかもしれない。
z = -1
*実習課題 1:if - elseif - else - end
x と yの数値を変えてみてください。
x = 2
y = 3
if x > y
println("x は y より大きい。" )
z = 1
elseif x < y
println("x は y より小さい。" )
z = -1
else
println("その他。つまり x = y" )
z = 0
end
println("z = " , z)
x は y より小さい。
z = -1
5. for-文
同じ処理を for のループ内に繰り返して実行することができる。
練習:同じ処理 N 回 行う
for x in 1:5
print("これは " , x)
print(" 回目です。\n" )
end
これは 1 回目です。
これは 2 回目です。
これは 3 回目です。
これは 4 回目です。
これは 5 回目です。
練習:配列の要素を抽出して同じ処理を行う。
A = [12 , 34 , 56 , 78 ]
for x in A
println("要素 = " , x)
end
要素 = 12
要素 = 34
要素 = 56
要素 = 78
*実習課題 2 :ターミナルの表示制御
• 下記プログラムを完成させ。
• プログラムファイル .jl を提出してください。
• ファイル名に課題番号を記入してください。
• 出力画面を説明付きで Word に添付してください。
N = 6 #任意の値
println("これは例です" )
for n in 1 :N
println("+" ^n)
end
println("\nこれは実習課題です" )
for ❓❓❓
❓❓❓ #hint:「文字の結合」と「スペース」を使う。
end
出力
これは例です
+
++
+++
++++
+++++
++++++
これは実習課題です
+
++
+++
++++
+++++
++++++
More Hint:
例:
julia> println("+" * " " ^3 * "+" ^2 )
+ ++
6. for-for文
• for ループのなかで、 さらに for ループを実行する。
• 「多重ループ」とも言われる。
• 2次元 or 3次元配列の処理によく使われている。
練習:二重ループ
println("- Start ---" )
for i in 1:3
for j in 1:2
println("This is i = " , i, " j = " , j)
end
end
println("- End ---" )
T- Start ---
This is i = 1 j = 1
This is i = 1 j = 2
This is i = 2 j = 1
This is i = 2 j = 2
This is i = 3 j = 1
This is i = 3 j = 2
- End ---
*実習課題 3:行列の要素の抽出
• 次のプログラムを完成させ。
• プログラムファイル .jl を提出してください。
• ファイル名に課題番号を記入してください。
• 出力画面を説明付きで Word に添付してください。
A = rand(0:9 , (3,4 )) #ランダム整数の行列
println("行列を print で表示する" )
println("A = " , A)
println("\n自己流で行列を表示する" )
M = length(A[:,1 ]) # 行数
N = length(A[1 ,:]) # 列数
print("┌ " * " " ^(N*2 ) * "┐\n" )
for m in 1 : M
print("| " )
for n in 1 : N
print(A[❓ , ❓])
print("❓" )
end
print("|\n" )
end
print("└ " * ❓ * "┘\n" )
行列を print で表示する
A = [7 2 4 0; 0 4 7 7; 7 3 4 2]
自己流で行列を表示する
┌ ┐
| 7 2 4 0 |
| 0 4 7 7 |
| 7 3 4 2 |
└ ┘
7. function-文:関数の定義
関数を定義するには最も標準的な書き方はこちら:
function 関数名(入力)
計算・実行内容
return 計算結果
end
例:
function myf(x, y)
print("計算始め\n" )
Z = x^2 + y^2
Z = sqrt(Z)
return Z
end
print("結果:" , myf(3 , 4 ))
計算始め
結果:5.0
計算結果が関数ブロックの最終行であれば,
function myf(x, y)
print("計算始め\n" )
Z = x^2 + y^2
Z = sqrt(Z)
end
上記と等価な代入形式はこちら:
julia> f(x, y) = sqrt(x^2 + y^2 )
f (generic function with 2 methods)
julia> print("結果:" , f(3 , 4 ) )
結果:5.0
デフォルト値を持つ引数
• 関数を定義する段階で、引数のデフォルト値の定義もできる。
• 引数の初期値・デフォルト値があれば、関数を実行する時にその引数を入力しなくても良い。
function myg(x, y = 1 )
return x^2 + y^2
end
println("myg(2,2) = " , myg(2,2 ))
println("myg(2) = " , myg(2 ))
myg(2,2) = 8
myg(2) = 5
8. 応用編1:愚数・奇数の数を数える
愚数は 2 で割り切れる整数です。あまり=0
奇数は 2 で割り切れない整数です。あまり=1
練習:計算例
julia> 4%2
0
julia> 55%2
1
julia> 0%2
0
*実習課題 4:配列内の要素の分析
• 次のプログラムを完成させ。
• プログラムファイル .jl を提出してください。
• ファイル名に課題番号を記入してください。
• 出力画面を説明付きで Word に添付してください。
function Analyse(A)
Gusu = 0
Kisu = 0
for a in A
if ❓❓❓
Gusu += 1
else
Kisu += 1
end
end
println("愚数 = $(Gusu) 個" )
println("奇数 = $(Kisu) 個" )
end
Analyse(rand(0:10 , 100 )) #もっと大きい数値を使っても良い
愚数 = 63 個
奇数 = 37 個
9. 応用編2:ランダムウォーク Random Walk 2D
• 別名:乱歩(らんぽ)、酔歩(すいほ)
• 高分子の幾何学的構造のモデルとして利用されている。
目的:次の 関数を作成する
RandomWalk(N, dTheta = pi/100 , R = 1 , xo = 0 , yo=0 )
•
•
•
•
•
• 注意点:「歩数」と「点の数」は同じではない。
出力の例:





*実習課題 5:乱歩
• 上記のグラフを作成するために、下記のプログラムを完成させ。
• プログラムファイル .jl を提出してください。
• ファイル名に課題番号を記入してください。
• プログラムが完成したら, 上記の例みたいに、引数を変えてみて、説明付きでWord にまとめてください。
function RandomWalk(N, dTheta = pi/100 , R = 1 , xo = 0 , yo=0 )
X = zeros(N)
Y = zeros(N)
X[1 ] = xo
Y[1 ] = yo
for n in 1 :N-1
#-pi から piまで、dTheta 刻みで乱数を作成
theta = rand(-pi: dTheta: pi)
dx = R * cos(theta)
dy = R * sin(theta)
X[❓] = X[n] + dx
Y[❓] = Y[n] + dy
end
gmax = maximum([maximum(X), maximum(Y)])
gmin = minimum([minimum(X), minimum(Y)])
println("最大値 = " , gmax)
println("最小値 = " , gmin)
println("始点-終点距離 = " , sqrt((X[end]-xo)^2 + (Y[end]-yo)^2 ))
plot(X, Y, legend = false, marker = 1 ,
xlims=(gmin,gmax), ylims = (gmin, gmax))
#始点と終点を繋ぐ
plot!(X[[1 ,end]],Y[[1 ,end]], marker = 4 ,
linestyle = :dash, size = (300,300 ),
title = "N = $(N)" )
end
RandomWalk(50 , pi/100 )
成功したグラフは、savefig で保存する。
julia> savefig("任意のファイル名.png" )
10. 応用編3:Multi 複数のY軸グラフ
*実習課題 6:Plot!を用いて複数のグラフを作成
「第6回の授業資料」または「共通plotの簡易マニュアル」を参考にして、自分なりの複数のグラフを作成する。
グラフの種類、数式、テーマは自由
例:

例:

例:

例:

*実習課題 7:Plot!を用いて多数の線形写像を作成
第7回の授業の実習課題:
例:矢印(頂点を60度回転。変換したものを繰り返して回転する。全体6回)

例:矢印(10度回転 × 20回)

例:国(60度回転 × 6回)

例:矢印(頂点の行列かける1.2倍 × 10回)

例:矢印([頂点の行列をY軸反転+かける1.2倍] × 20回

11. Plot & Plot!で作成したグラフの表示に関する注意点
グラフが自動的に表示される場合
using Plots
print("はじめ\n" )
plot(rand(100 )) #グラフの新規作成
plot!(title = "Random" , legend = false) #グラフの属性を追加
上記のコード例の
最後の指令は、plot または plot! であれば、作成したグラフは自動的に表示される。
plot & plot!を実行したが、グラフが表示されない場合
下記のコード例の最後指令は plot または plot! ではないので、作成したグラフは自動的に表示されない。
using Plots
print("はじめ\n" )
plot(rand(100 )) #グラフの新規作成
plot!(title = "Random" , legend = false) #グラフの属性を追加
print("終わり" ) #最後の指令は plot または plot!ではない。
解決方法
方法1:コードの最後に plot!() を追加する。
using Plots
print("はじめ\n" )
plot(rand(100 ))#グラフの新規作成
plot!(title = "Random" , legend = false) #グラフの属性を追加
print("終わり" )
plot!() #最後の行に dummy の plot!を追加。
方法2:最後の plot! の結果を強制表示する。
using Plots
print("はじめ\n" )
plot(rand(100 ))#グラフの新規作成
display( plot!(title = "Random" , legend = false) ) #強制表示
print("終わり" )