# 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"