スクリプト2(どこでもまとめ計算)

このページは[url=https://www.geogebra.org/m/ddm5798j]マス旅[/url]の一部です。[br][br]PCがあればすぐできる「スクリプト」を使った数学を考えましょう。[br]今回は、PCで則プログラミングできる使い方をさぐる、「どこでもまとめ計算」。[br]
1.どこでもまとめ計算
[br]WindowsのコマンドプロンプトやLinuxのターミナルにも、プログラミング言語レベルの構文(繰り返し処理など)があることはあまり知られていません。[br]Chromebookでもメニューで選ぶだけでLinux環境が入ります。[br][br]Windows(PowerShell)を略して PS[br]Linux(LinuxのTerminalのbash)を略して BS とかきます。[br]プロンプトのあとに入力データを書いています。[br]出力は [OUT] からの行です。[br]// からはコメント行です。[br][br][b][size=150][br]変数を使って反復計算[/size][/b][br][br]メッセージなどがうっとうしかったら clear で画面をきれいにします。[br][br][b][size=150]<for文が使える>[br][/size][/b][br]/[b]/BS[/b][br]for i in {1..5}; do echo "回数: $i"; done[br][OUT][br]回数: 1[br]回数: 2[br]回数: 3[br]回数: 4[br]回数: 5[br][br]//[color=#0000ff][b][size=150]「; do ... ; done」がブロックの区切り(他言語の { ... } の代わり)[/size][/b][/color]ですね。[br]//for item in items の構文が使えて、変数指定で出力できるので、簡単なプログラミングが組めそうです。[br][br][b]//PS[br][/b]//PSは foreach を使い、変数名に $ をつけます。こちらは普通に中カッコ { } でブロック化できます。[br]foreach ($i in 1..5) { Write-Output "回数: $i" }[br][OUT][br]回数: 1[br]回数: 2[br]回数: 3[br]回数: 4[br]回数: 5[br][br]ただ連番を出力するだけでなく、計算処理を組み込めば大量の計算を一瞬でまとめて行えますね。ワクワクしてきます。[br][br][br][b][size=150]<Sum(総和)>[/size][/b][br][b]//BS[br][/b]//sum=0 で初期化し、ループ内で sum+=i を実行します。[br]//途中は表示せず、最後に echo $sum で結果を出力します。[br][b]sum=0; for i in {1..10}; do ((sum+=i)); done; echo $sum[br][/b][OUT] 55[br][b]//PS[br][/b]//変数には常に $ をつけます。最後に $sum とだけ書けば内容が表示されます。[br][b]$sum=0; foreach ($i in 1..10) {$sum += $i };$sum[br][/b][OUT] 55[br][br]※PSは記述ミスをしたときのエラー表示が真っ赤な文字で強烈です。タイピングには注意しましょう![br][br][b][size=150]<Product(総乗・階乗)>[br][/size][/b]//product=1 で初期化し、加算を乗算(*=)に変更します。[br][b]//BS[br]product=1; for i in {1..10}; do ((product*=i)); done; echo $product[br][/b][OUT] 3628800[br][b]//PS[br]$product=1; foreach ($i in 1..10) {$product *= $i };$product[br][/b][OUT] 3628800[br][br][br][b][size=150]<九九の表(2重ループ)>[br][/size][/b]今度は for を入れ子にして、九九の表を出力してみましょう。[br][b]//BS[br]for i in {1..9}; do for j in {1..9}; do echo -n "$((i*j)) "; done; echo ""; done[br][/b][OUT][br]1 2 3 4 5 6 7 8 9[br]2 4 6 8 10 12 14 16 18[br]3 6 9 12 15 18 21 24 27[br]4 8 12 16 20 24 28 32 36[br]5 10 15 20 25 30 35 40 45[br]6 12 18 24 30 36 42 48 54[br]7 14 21 28 35 42 49 56 63[br]8 16 24 32 40 48 56 64 72[br]9 18 27 36 45 54 63 72 81[br]//記号が増えてセミコロンだらけですね。[br]//「; do」がPythonの「:」や他言語の「{」にあたり、「; done」が「}」に相当します。[br]//echo -n は「改行なし出力」、最後の echo "" は「改行のみ」の処理です。[br][b]//PS[br][/b]//PSでは文字出力に Write-Host を使い、改行なし指定は -NoNewline にします。[br][b]foreach ($i in 1..9) { foreach ($j in 1..9) { Write-Host "$($i * $j) " -NoNewline }; Write-Host "" }[br][/b][OUT][br](九九表が出力される)[br][br][size=150][b]<平方数の表>[/b][br][/size]九九表のアレンジで、[b]$(10i + j)^2$ ($i$ は 1〜9、$j$ は 0〜9)[/b]の表を作ってみましょう。[br][b]//BS[br]for i in {1..9}; do for j in {0..9}; do echo -n "$(((10*i+j)**2)),"; done; echo ""; done[br]//PS[br]foreach ($i in 1..9) { foreach ($j in 0..9) { Write-Host "$([Math]::Pow(10*$i+$j,2))," -NoNewline }; Write-Host "" }[br][/b][br][OUT][br]100,121,144,169,196,225,256,289,324,361,[br]400,441,484,529,576,625,676,729,784,841,[br]...[br]8100,8281,8464,8649,8836,9025,9216,9409,9604,9801,[br][br][b][size=150]<小数の平方数表>[br][/size][/b]さらにアレンジして、[b]$\frac{(10i+j)^2}{100}$[/b] を計算し、桁を揃えてきれいに出力してみます。[br][b]//BS[br][/b]//[b]桁揃えに printf[/b] を使用します。[br][b]for i in {1..9}; do for j in {0..9}; do num=$(echo "scale=2;((10*$i+$j)*(10*$i+$j))/100" \vert{} bc); printf "\%s\t" $num; done; echo ""; done[br][/b][b]//PS[br][/b]//[b]"{0,7}" -f で7文字分・右揃え[/b]の書式を指定します。[br][b]foreach ($i in 1..9) { foreach ($j in 0..9) { $num = ((10*$i+$j)*(10*$i+$j))/100; Write-Host ("{0,7}" -f $num) -NoNewline }; Write-Host "" }[br][/b][br][OUT][br] 1.00 1.21 1.44 1.69 1.96 2.25 2.56 2.89 3.24 3.61[br] 4.00 4.41 4.84 5.29 5.76 6.25 6.76 7.29 7.84 8.41[br] ...[br] 81.00 82.81 84.64 86.49 88.36 90.25 92.16 94.09 96.04 98.01[br][br][br]
geogebraならfor文の入れ子をZipとSequenceで簡単に実現できる。
2.GeoGebraでのスマートなコード化
ターミナルでは手続き型(forループ)で泥臭く回した計算ですが、[br]われらがGeoGebraならどうでしょうか。[br][br]GeoGebraには `for` ループがありません。[br]その代わりに [b]Sequence(数列) [/b]や [b]Zip(リスト内包表記・写像)[/b]を使って、[br]エレガントに一括処理します。[br][br][b]# 計算部分[br][/b]nums = Sequence(k, k, 1, 9)[br]numT = Join(nums, {10})[br][br]SUM = Sum(numT) // 1から10の和 (55)[br]PROD = Product(numT) // 1から10の積 (3628800)[br][br]numZ = Join({0}, nums)[br]kuku = Zip(Zip(i * j, i, nums), j, nums)[br]sqrs = Zip(Zip((10*i + j)^2, i, nums), j, numZ)[br]decisqrs = Zip(Zip(s / 100, s, row), row, sqrs)[br][br][b]# 表示部分[br][/b]// FormulaText(decisqrs) を使うと、生成した2次元リストを一瞬で美しいLaTeX形式の行列・表として表示できます![br][br]【GeoGebraならfor文の入れ子もZipとSequenceで鮮やかに解決!】[br][br]手続き型プログラミング([b]PSやBS[/b])[b]で書いた2重ループ[/b]が、[br]GeoGebraでは数学的な「[b]集合・リストの変換(内包表記)[/b]」として非常にすっきりと記述できます。[br][br]裏で動く複雑な処理を気にせず、[br]直感的に数学オブジェクトとして表を生成できるGeoGebraの強力さが際立ちますね。[br][br]しかし、[br]現代的なgeogebraには負けますが、[br][b][color=#0000ff]地味でも1行で2重ループが回せるスクリプト[/color][/b]は何かのときに助かるでしょう。

Information: スクリプト2(どこでもまとめ計算)