# call_a_root.pl
# サブルーチンのテスト(1)
$num = 80 ; # ルート計算を行う数
require "mysub/a_root_b.pl" ; # サブルーチンを呼ぶ
@ax = &a_root_b($num) ; # サブルーチンの結果を引き継ぐ
print "\n √$num = $ax[0] √$ax[1] \n" # 結果の出力
# a_root_b.pl
# ルートを整理するサブルーチン
# √A = m√n なる m と n を引数として返す。
# 入力時の引数は $a
# 出力時の引数は ($m, $n)
sub a_root_b # サブルーチンの宣言
{
my $a, $b, $m, $n, $sq, $sq2 ; # ローカル変数の指定
$a = shift @_ ; # 入力数を $a に設定
$sq = int sqrt $a ; # 平方根のガウス[ ]を A の仮数にセット
$m = $a ;
$n = $a ;
# 割り切れる最大平方数を探す
while ($sq >= 1)
{
$sq2 = $sq**2 ;
if (($a % $sq2) == 0)
{$m = $sq ; $n = $a/$sq2 ; last}
--$sq
}
# 最終的な戻し引数
($m, $n)
}
1 ; # サブルーチン終了
# pytha.pl
# ピタゴラスの定理
# 入力方法の説明
print "\n" ; print " *" x 20 ;
print <<EOF ;
\n 1-a-b : a, bより斜辺 c を求める
2-c-a : c > a より斜辺でない b を求める
終 了 : Enter Key
EOF
print " *" x 20 ; print "\n" ;
while(1)
{
# 辺の入力
print "\n 入力(例 1-30-50):" ;
$ax = <STDIN>;
if ($ax eq "\n") {last}
chomp $ax ;
($dx, $px, $qx) = split /-/, $ax ;
# タイプ1の補助計算
if ($dx == 1)
{
$rx = $px**2 + $qx**2 ;
$x = "c"
}
# タイプ2の補助計算
elsif ($dx == 2)
{
# 入力ミス処理
unless ($px > $qx)
{print "\n ** c > a です! ** \n" ; redo}
$rx = $px**2 - $qx**2 ;
$x = "b"
}
# タイプ外の再入力
else {redo}
# サブルーチンの呼び出し
require "mysub/a_root_b.pl" ;
@sx = &a_root_b($rx) ;
# 結果の出力
print "\n $x = $sx[0] √ $sx[1] \n" ;
}
print "\n おしまい! \(^o^)/ またね...\n"